import Ember from 'ember'; export default (function() { LinesSelector.prototype.Location = { getHash: function() { return window.location.hash; }, setHash: function(hash) { var path; path = "" + window.location.pathname + hash; return window.history.pushState({ path: path }, null, path); } }; LinesSelector.prototype.element = null; LinesSelector.prototype.scroll = null; LinesSelector.prototype.location = null; LinesSelector.prototype.view = null; LinesSelector.prototype.last_selected_line = null; function LinesSelector(element1, scroll, folder, location) { this.element = element1; this.scroll = scroll; this.folder = folder; this.location = location || this.Location; Ember.run.scheduleOnce('afterRender', this, function() { var ref; this.last_selected_line = (ref = this.getSelectedLines()) != null ? ref.first : void 0; return this.highlightLines(); }); this.element.on('click', 'a', (function(_this) { return function(event) { var element; element = $(event.target).parent('p'); _this.loadLineNumbers(element, event.shiftKey); event.preventDefault(); return false; }; })(this)); } LinesSelector.prototype.willDestroy = function() { this.location.setHash(''); return this.destroyed = true; }; LinesSelector.prototype.loadLineNumbers = function(element, multiple) { this.setHashValueWithLine(element, multiple); return this.highlightLines(); }; LinesSelector.prototype.highlightLines = function(tries) { var elements, lines; tries = tries || 0; this.removeAllHighlights(); if (lines = this.getSelectedLines()) { elements = this.element.find('p:visible').slice(lines.first - 1, lines.last); if (elements.length) { elements.addClass('highlight'); } else if (tries < 4) { Ember.run.later(this, (function() { if (!this.destroyed) { return this.highlightLines(tries + 1); } }), 500); return; } } this.scroll.tryScroll(); return this.unfoldLines(); }; LinesSelector.prototype.unfoldLines = function() { var index, l, line, lines, results; if (lines = this.getSelectedLines()) { results = []; for (index in lines) { l = lines[index]; line = this.element.find('p:visible').slice(l - 1, l); results.push(this.folder.unfold(line)); } return results; } }; LinesSelector.prototype.setHashValueWithLine = function(line, multiple) { var hash, line_number, lines; line_number = this.getLineNumberFromElement(line); if (multiple && (this.last_selected_line != null)) { lines = [line_number, this.last_selected_line].sort(function(a, b) { return a - b; }); hash = "#L" + lines[0] + "-L" + lines[1]; } else { hash = "#L" + line_number; } this.last_selected_line = line_number; return this.location.setHash(hash); }; LinesSelector.prototype.getLineNumberFromElement = function(element) { return this.element.find('p:visible').index(element) + 1; }; LinesSelector.prototype.removeAllHighlights = function() { return this.element.find('p.highlight').removeClass('highlight'); }; LinesSelector.prototype.getSelectedLines = function() { var first, last, match; if (match = this.location.getHash().match(/#L(\d+)(-L(\d+))?$/)) { first = match[1]; last = match[3] || match[1]; return { first: first, last: last }; } }; return LinesSelector; })();