| /*================================================== |
| * Timeline |
| *================================================== |
| */ |
| |
| Timeline.strings = {}; // localization string tables |
| |
| Timeline.create = function(elmt, bandInfos, orientation, unit) { |
| return new Timeline._Impl(elmt, bandInfos, orientation, unit); |
| }; |
| |
| Timeline.HORIZONTAL = 0; |
| Timeline.VERTICAL = 1; |
| |
| Timeline._defaultTheme = null; |
| |
| Timeline.createBandInfo = function(params) { |
| var theme = ("theme" in params) ? params.theme : Timeline.getDefaultTheme(); |
| |
| var eventSource = ("eventSource" in params) ? params.eventSource : null; |
| |
| var ether = new Timeline.LinearEther({ |
| centersOn: ("date" in params) ? params.date : new Date(), |
| interval: Timeline.DateTime.gregorianUnitLengths[params.intervalUnit], |
| pixelsPerInterval: params.intervalPixels |
| }); |
| |
| var etherPainter = new Timeline.GregorianEtherPainter({ |
| unit: params.intervalUnit, |
| multiple: ("multiple" in params) ? params.multiple : 1, |
| theme: theme, |
| align: ("align" in params) ? params.align : undefined |
| }); |
| |
| var layout = new Timeline.StaticTrackBasedLayout({ |
| eventSource: eventSource, |
| ether: ether, |
| showText: ("showEventText" in params) ? params.showEventText : true, |
| theme: theme |
| }); |
| |
| var eventPainterParams = { |
| showText: ("showEventText" in params) ? params.showEventText : true, |
| layout: layout, |
| theme: theme |
| }; |
| if ("trackHeight" in params) { |
| eventPainterParams.trackHeight = params.trackHeight; |
| } |
| if ("trackGap" in params) { |
| eventPainterParams.trackGap = params.trackGap; |
| } |
| var eventPainter = new Timeline.DurationEventPainter(eventPainterParams); |
| |
| return { |
| width: params.width, |
| eventSource: eventSource, |
| timeZone: ("timeZone" in params) ? params.timeZone : 0, |
| ether: ether, |
| etherPainter: etherPainter, |
| eventPainter: eventPainter |
| }; |
| }; |
| |
| Timeline.createHotZoneBandInfo = function(params) { |
| var theme = ("theme" in params) ? params.theme : Timeline.getDefaultTheme(); |
| |
| var eventSource = ("eventSource" in params) ? params.eventSource : null; |
| |
| var ether = new Timeline.HotZoneEther({ |
| centersOn: ("date" in params) ? params.date : new Date(), |
| interval: Timeline.DateTime.gregorianUnitLengths[params.intervalUnit], |
| pixelsPerInterval: params.intervalPixels, |
| zones: params.zones |
| }); |
| |
| var etherPainter = new Timeline.HotZoneGregorianEtherPainter({ |
| unit: params.intervalUnit, |
| zones: params.zones, |
| theme: theme, |
| align: ("align" in params) ? params.align : undefined |
| }); |
| |
| var layout = new Timeline.StaticTrackBasedLayout({ |
| eventSource: eventSource, |
| ether: ether, |
| theme: theme |
| }); |
| |
| var eventPainterParams = { |
| showText: ("showEventText" in params) ? params.showEventText : true, |
| layout: layout, |
| theme: theme |
| }; |
| if ("trackHeight" in params) { |
| eventPainterParams.trackHeight = params.trackHeight; |
| } |
| if ("trackGap" in params) { |
| eventPainterParams.trackGap = params.trackGap; |
| } |
| var eventPainter = new Timeline.DurationEventPainter(eventPainterParams); |
| |
| return { |
| width: params.width, |
| eventSource: eventSource, |
| timeZone: ("timeZone" in params) ? params.timeZone : 0, |
| ether: ether, |
| etherPainter: etherPainter, |
| eventPainter: eventPainter |
| }; |
| }; |
| |
| Timeline.getDefaultTheme = function() { |
| if (Timeline._defaultTheme == null) { |
| Timeline._defaultTheme = Timeline.ClassicTheme.create(Timeline.Platform.getDefaultLocale()); |
| } |
| return Timeline._defaultTheme; |
| }; |
| |
| Timeline.setDefaultTheme = function(theme) { |
| Timeline._defaultTheme = theme; |
| }; |
| |
| Timeline.loadXML = function(url, f) { |
| var fError = function(statusText, status, xmlhttp) { |
| alert("Failed to load data xml from " + url + "\n" + statusText); |
| }; |
| var fDone = function(xmlhttp) { |
| var xml = xmlhttp.responseXML; |
| if (!xml.documentElement && xmlhttp.responseStream) { |
| xml.load(xmlhttp.responseStream); |
| } |
| f(xml, url); |
| }; |
| Timeline.XmlHttp.get(url, fError, fDone); |
| }; |
| |
| |
| Timeline.loadJSON = function(url, f) { |
| var fError = function(statusText, status, xmlhttp) { |
| alert("Failed to load json data from " + url + "\n" + statusText); |
| }; |
| var fDone = function(xmlhttp) { |
| f(eval('(' + xmlhttp.responseText + ')'), url); |
| }; |
| Timeline.XmlHttp.get(url, fError, fDone); |
| }; |
| |
| |
| Timeline._Impl = function(elmt, bandInfos, orientation, unit) { |
| this._containerDiv = elmt; |
| |
| this._bandInfos = bandInfos; |
| this._orientation = orientation == null ? Timeline.HORIZONTAL : orientation; |
| this._unit = (unit != null) ? unit : Timeline.NativeDateUnit; |
| |
| this._initialize(); |
| }; |
| |
| Timeline._Impl.prototype.dispose = function() { |
| for (var i = 0; i < this._bands.length; i++) { |
| this._bands[i].dispose(); |
| } |
| this._bands = null; |
| this._bandInfos = null; |
| this._containerDiv.innerHTML = ""; |
| }; |
| |
| Timeline._Impl.prototype.getBandCount = function() { |
| return this._bands.length; |
| }; |
| |
| Timeline._Impl.prototype.getBand = function(index) { |
| return this._bands[index]; |
| }; |
| |
| Timeline._Impl.prototype.layout = function() { |
| this._distributeWidths(); |
| }; |
| |
| Timeline._Impl.prototype.paint = function() { |
| for (var i = 0; i < this._bands.length; i++) { |
| this._bands[i].paint(); |
| } |
| }; |
| |
| Timeline._Impl.prototype.getDocument = function() { |
| return this._containerDiv.ownerDocument; |
| }; |
| |
| Timeline._Impl.prototype.addDiv = function(div) { |
| this._containerDiv.appendChild(div); |
| }; |
| |
| Timeline._Impl.prototype.removeDiv = function(div) { |
| this._containerDiv.removeChild(div); |
| }; |
| |
| Timeline._Impl.prototype.isHorizontal = function() { |
| return this._orientation == Timeline.HORIZONTAL; |
| }; |
| |
| Timeline._Impl.prototype.isVertical = function() { |
| return this._orientation == Timeline.VERTICAL; |
| }; |
| |
| Timeline._Impl.prototype.getPixelLength = function() { |
| return this._orientation == Timeline.HORIZONTAL ? |
| this._containerDiv.offsetWidth : this._containerDiv.offsetHeight; |
| }; |
| |
| Timeline._Impl.prototype.getPixelWidth = function() { |
| return this._orientation == Timeline.VERTICAL ? |
| this._containerDiv.offsetWidth : this._containerDiv.offsetHeight; |
| }; |
| |
| Timeline._Impl.prototype.getUnit = function() { |
| return this._unit; |
| }; |
| |
| Timeline._Impl.prototype.loadXML = function(url, f) { |
| var tl = this; |
| |
| |
| var fError = function(statusText, status, xmlhttp) { |
| alert("Failed to load data xml from " + url + "\n" + statusText); |
| tl.hideLoadingMessage(); |
| }; |
| var fDone = function(xmlhttp) { |
| try { |
| var xml = xmlhttp.responseXML; |
| if (!xml.documentElement && xmlhttp.responseStream) { |
| xml.load(xmlhttp.responseStream); |
| } |
| f(xml, url); |
| } finally { |
| tl.hideLoadingMessage(); |
| } |
| }; |
| |
| this.showLoadingMessage(); |
| window.setTimeout(function() { Timeline.XmlHttp.get(url, fError, fDone); }, 0); |
| }; |
| |
| Timeline._Impl.prototype.loadJSON = function(url, f) { |
| var tl = this; |
| |
| |
| var fError = function(statusText, status, xmlhttp) { |
| alert("Failed to load json data from " + url + "\n" + statusText); |
| tl.hideLoadingMessage(); |
| }; |
| var fDone = function(xmlhttp) { |
| try { |
| f(eval('(' + xmlhttp.responseText + ')'), url); |
| } finally { |
| tl.hideLoadingMessage(); |
| } |
| }; |
| |
| this.showLoadingMessage(); |
| window.setTimeout(function() { Timeline.XmlHttp.get(url, fError, fDone); }, 0); |
| }; |
| |
| Timeline._Impl.prototype._initialize = function() { |
| var containerDiv = this._containerDiv; |
| var doc = containerDiv.ownerDocument; |
| |
| containerDiv.className = |
| containerDiv.className.split(" ").concat("timeline-container").join(" "); |
| |
| while (containerDiv.firstChild) { |
| containerDiv.removeChild(containerDiv.firstChild); |
| } |
| |
| /* |
| * inserting copyright and link to simile |
| */ |
| var elmtCopyright = Timeline.Graphics.createTranslucentImage(doc, Timeline.urlPrefix + (this.isHorizontal() ? "images/copyright-vertical.png" : "images/copyright.png")); |
| elmtCopyright.className = "timeline-copyright"; |
| elmtCopyright.title = "Timeline (c) SIMILE - http://simile.mit.edu/timeline/"; |
| Timeline.DOM.registerEvent(elmtCopyright, "click", function() { window.location = "http://simile.mit.edu/timeline/"; }); |
| containerDiv.appendChild(elmtCopyright); |
| |
| /* |
| * creating bands |
| */ |
| this._bands = []; |
| for (var i = 0; i < this._bandInfos.length; i++) { |
| var band = new Timeline._Band(this, this._bandInfos[i], i); |
| this._bands.push(band); |
| } |
| this._distributeWidths(); |
| |
| /* |
| * sync'ing bands |
| */ |
| for (var i = 0; i < this._bandInfos.length; i++) { |
| var bandInfo = this._bandInfos[i]; |
| if ("syncWith" in bandInfo) { |
| this._bands[i].setSyncWithBand( |
| this._bands[bandInfo.syncWith], |
| ("highlight" in bandInfo) ? bandInfo.highlight : false |
| ); |
| } |
| } |
| |
| /* |
| * creating loading UI |
| */ |
| var message = Timeline.Graphics.createMessageBubble(doc); |
| message.containerDiv.className = "timeline-message-container"; |
| containerDiv.appendChild(message.containerDiv); |
| |
| message.contentDiv.className = "timeline-message"; |
| message.contentDiv.innerHTML = "<img src='" + Timeline.urlPrefix + "images/progress-running.gif' /> Loading..."; |
| |
| this.showLoadingMessage = function() { message.containerDiv.style.display = "block"; }; |
| this.hideLoadingMessage = function() { message.containerDiv.style.display = "none"; }; |
| }; |
| |
| Timeline._Impl.prototype._distributeWidths = function() { |
| var length = this.getPixelLength(); |
| var width = this.getPixelWidth(); |
| var cumulativeWidth = 0; |
| |
| for (var i = 0; i < this._bands.length; i++) { |
| var band = this._bands[i]; |
| var bandInfos = this._bandInfos[i]; |
| var widthString = bandInfos.width; |
| |
| var x = widthString.indexOf("%"); |
| if (x > 0) { |
| var percent = parseInt(widthString.substr(0, x)); |
| var bandWidth = percent * width / 100; |
| } else { |
| var bandWidth = parseInt(widthString); |
| } |
| |
| band.setBandShiftAndWidth(cumulativeWidth, bandWidth); |
| band.setViewLength(length); |
| |
| cumulativeWidth += bandWidth; |
| } |
| }; |
| |
| /*================================================== |
| * Band |
| *================================================== |
| */ |
| Timeline._Band = function(timeline, bandInfo, index) { |
| this._timeline = timeline; |
| this._bandInfo = bandInfo; |
| this._index = index; |
| |
| this._locale = ("locale" in bandInfo) ? bandInfo.locale : Timeline.Platform.getDefaultLocale(); |
| this._timeZone = ("timeZone" in bandInfo) ? bandInfo.timeZone : 0; |
| this._labeller = ("labeller" in bandInfo) ? bandInfo.labeller : |
| timeline.getUnit().createLabeller(this._locale, this._timeZone); |
| |
| this._dragging = false; |
| this._changing = false; |
| this._originalScrollSpeed = 5; // pixels |
| this._scrollSpeed = this._originalScrollSpeed; |
| this._onScrollListeners = []; |
| |
| var b = this; |
| this._syncWithBand = null; |
| this._syncWithBandHandler = function(band) { |
| b._onHighlightBandScroll(); |
| }; |
| this._selectorListener = function(band) { |
| b._onHighlightBandScroll(); |
| }; |
| |
| /* |
| * Install a textbox to capture keyboard events |
| */ |
| var inputDiv = this._timeline.getDocument().createElement("div"); |
| inputDiv.className = "timeline-band-input"; |
| this._timeline.addDiv(inputDiv); |
| |
| this._keyboardInput = document.createElement("input"); |
| this._keyboardInput.type = "text"; |
| inputDiv.appendChild(this._keyboardInput); |
| Timeline.DOM.registerEventWithObject(this._keyboardInput, "keydown", this, this._onKeyDown); |
| Timeline.DOM.registerEventWithObject(this._keyboardInput, "keyup", this, this._onKeyUp); |
| |
| /* |
| * The band's outer most div that slides with respect to the timeline's div |
| */ |
| this._div = this._timeline.getDocument().createElement("div"); |
| this._div.className = "timeline-band"; |
| this._timeline.addDiv(this._div); |
| |
| Timeline.DOM.registerEventWithObject(this._div, "mousedown", this, this._onMouseDown); |
| Timeline.DOM.registerEventWithObject(this._div, "mousemove", this, this._onMouseMove); |
| Timeline.DOM.registerEventWithObject(this._div, "mouseup", this, this._onMouseUp); |
| Timeline.DOM.registerEventWithObject(this._div, "mouseout", this, this._onMouseOut); |
| Timeline.DOM.registerEventWithObject(this._div, "dblclick", this, this._onDblClick); |
| |
| /* |
| * The inner div that contains layers |
| */ |
| this._innerDiv = this._timeline.getDocument().createElement("div"); |
| this._innerDiv.className = "timeline-band-inner"; |
| this._div.appendChild(this._innerDiv); |
| |
| /* |
| * Initialize parts of the band |
| */ |
| this._ether = bandInfo.ether; |
| bandInfo.ether.initialize(timeline); |
| |
| this._etherPainter = bandInfo.etherPainter; |
| bandInfo.etherPainter.initialize(this, timeline); |
| |
| this._eventSource = bandInfo.eventSource; |
| if (this._eventSource) { |
| this._eventListener = { |
| onAddMany: function() { b._onAddMany(); }, |
| onClear: function() { b._onClear(); } |
| } |
| this._eventSource.addListener(this._eventListener); |
| } |
| |
| this._eventPainter = bandInfo.eventPainter; |
| bandInfo.eventPainter.initialize(this, timeline); |
| |
| this._decorators = ("decorators" in bandInfo) ? bandInfo.decorators : []; |
| for (var i = 0; i < this._decorators.length; i++) { |
| this._decorators[i].initialize(this, timeline); |
| } |
| |
| this._bubble = null; |
| }; |
| |
| Timeline._Band.SCROLL_MULTIPLES = 5; |
| |
| Timeline._Band.prototype.dispose = function() { |
| this.closeBubble(); |
| |
| if (this._eventSource) { |
| this._eventSource.removeListener(this._eventListener); |
| this._eventListener = null; |
| this._eventSource = null; |
| } |
| |
| this._timeline = null; |
| this._bandInfo = null; |
| |
| this._labeller = null; |
| this._ether = null; |
| this._etherPainter = null; |
| this._eventPainter = null; |
| this._decorators = null; |
| |
| this._onScrollListeners = null; |
| this._syncWithBandHandler = null; |
| this._selectorListener = null; |
| |
| this._div = null; |
| this._innerDiv = null; |
| this._keyboardInput = null; |
| this._bubble = null; |
| }; |
| |
| Timeline._Band.prototype.addOnScrollListener = function(listener) { |
| this._onScrollListeners.push(listener); |
| }; |
| |
| Timeline._Band.prototype.removeOnScrollListener = function(listener) { |
| for (var i = 0; i < this._onScrollListeners.length; i++) { |
| if (this._onScrollListeners[i] == listener) { |
| this._onScrollListeners.splice(i, 1); |
| break; |
| } |
| } |
| }; |
| |
| Timeline._Band.prototype.setSyncWithBand = function(band, highlight) { |
| if (this._syncWithBand) { |
| this._syncWithBand.removeOnScrollListener(this._syncWithBandHandler); |
| } |
| |
| this._syncWithBand = band; |
| this._syncWithBand.addOnScrollListener(this._syncWithBandHandler); |
| this._highlight = highlight; |
| this._positionHighlight(); |
| }; |
| |
| Timeline._Band.prototype.getLocale = function() { |
| return this._locale; |
| }; |
| |
| Timeline._Band.prototype.getTimeZone = function() { |
| return this._timeZone; |
| }; |
| |
| Timeline._Band.prototype.getLabeller = function() { |
| return this._labeller; |
| }; |
| |
| Timeline._Band.prototype.getIndex = function() { |
| return this._index; |
| }; |
| |
| Timeline._Band.prototype.getEther = function() { |
| return this._ether; |
| }; |
| |
| Timeline._Band.prototype.getEtherPainter = function() { |
| return this._etherPainter; |
| }; |
| |
| Timeline._Band.prototype.getEventSource = function() { |
| return this._eventSource; |
| }; |
| |
| Timeline._Band.prototype.getEventPainter = function() { |
| return this._eventPainter; |
| }; |
| |
| Timeline._Band.prototype.layout = function() { |
| this.paint(); |
| }; |
| |
| Timeline._Band.prototype.paint = function() { |
| this._etherPainter.paint(); |
| this._paintDecorators(); |
| this._paintEvents(); |
| }; |
| |
| Timeline._Band.prototype.softLayout = function() { |
| this.softPaint(); |
| }; |
| |
| Timeline._Band.prototype.softPaint = function() { |
| this._etherPainter.softPaint(); |
| this._softPaintDecorators(); |
| this._softPaintEvents(); |
| }; |
| |
| Timeline._Band.prototype.setBandShiftAndWidth = function(shift, width) { |
| var inputDiv = this._keyboardInput.parentNode; |
| var middle = shift + Math.floor(width / 2); |
| if (this._timeline.isHorizontal()) { |
| this._div.style.top = shift + "px"; |
| this._div.style.height = width + "px"; |
| |
| inputDiv.style.top = middle + "px"; |
| inputDiv.style.left = "-1em"; |
| } else { |
| this._div.style.left = shift + "px"; |
| this._div.style.width = width + "px"; |
| |
| inputDiv.style.left = middle + "px"; |
| inputDiv.style.top = "-1em"; |
| } |
| }; |
| |
| Timeline._Band.prototype.getViewWidth = function() { |
| if (this._timeline.isHorizontal()) { |
| return this._div.offsetHeight; |
| } else { |
| return this._div.offsetWidth; |
| } |
| }; |
| |
| Timeline._Band.prototype.setViewLength = function(length) { |
| this._viewLength = length; |
| this._recenterDiv(); |
| this._onChanging(); |
| }; |
| |
| Timeline._Band.prototype.getViewLength = function() { |
| return this._viewLength; |
| }; |
| |
| Timeline._Band.prototype.getTotalViewLength = function() { |
| return Timeline._Band.SCROLL_MULTIPLES * this._viewLength; |
| }; |
| |
| Timeline._Band.prototype.getViewOffset = function() { |
| return this._viewOffset; |
| }; |
| |
| Timeline._Band.prototype.getMinDate = function() { |
| return this._ether.pixelOffsetToDate(this._viewOffset); |
| }; |
| |
| Timeline._Band.prototype.getMaxDate = function() { |
| return this._ether.pixelOffsetToDate(this._viewOffset + Timeline._Band.SCROLL_MULTIPLES * this._viewLength); |
| }; |
| |
| Timeline._Band.prototype.getMinVisibleDate = function() { |
| return this._ether.pixelOffsetToDate(0); |
| }; |
| |
| Timeline._Band.prototype.getMaxVisibleDate = function() { |
| return this._ether.pixelOffsetToDate(this._viewLength); |
| }; |
| |
| Timeline._Band.prototype.getCenterVisibleDate = function() { |
| return this._ether.pixelOffsetToDate(this._viewLength / 2); |
| }; |
| |
| Timeline._Band.prototype.setMinVisibleDate = function(date) { |
| if (!this._changing) { |
| this._moveEther(Math.round(-this._ether.dateToPixelOffset(date))); |
| } |
| }; |
| |
| Timeline._Band.prototype.setMaxVisibleDate = function(date) { |
| if (!this._changing) { |
| this._moveEther(Math.round(this._viewLength - this._ether.dateToPixelOffset(date))); |
| } |
| }; |
| |
| Timeline._Band.prototype.setCenterVisibleDate = function(date) { |
| if (!this._changing) { |
| this._moveEther(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(date))); |
| } |
| }; |
| |
| Timeline._Band.prototype.dateToPixelOffset = function(date) { |
| return this._ether.dateToPixelOffset(date) - this._viewOffset; |
| }; |
| |
| Timeline._Band.prototype.pixelOffsetToDate = function(pixels) { |
| return this._ether.pixelOffsetToDate(pixels + this._viewOffset); |
| }; |
| |
| Timeline._Band.prototype.createLayerDiv = function(zIndex) { |
| var div = this._timeline.getDocument().createElement("div"); |
| div.className = "timeline-band-layer"; |
| div.style.zIndex = zIndex; |
| this._innerDiv.appendChild(div); |
| |
| var innerDiv = this._timeline.getDocument().createElement("div"); |
| innerDiv.className = "timeline-band-layer-inner"; |
| if (Timeline.Platform.browser.isIE) { |
| innerDiv.style.cursor = "move"; |
| } else { |
| innerDiv.style.cursor = "-moz-grab"; |
| } |
| div.appendChild(innerDiv); |
| |
| return innerDiv; |
| }; |
| |
| Timeline._Band.prototype.removeLayerDiv = function(div) { |
| this._innerDiv.removeChild(div.parentNode); |
| }; |
| |
| Timeline._Band.prototype.closeBubble = function() { |
| if (this._bubble != null) { |
| this._bubble.close(); |
| this._bubble = null; |
| } |
| }; |
| |
| Timeline._Band.prototype.openBubbleForPoint = function(pageX, pageY, width, height) { |
| this.closeBubble(); |
| |
| this._bubble = Timeline.Graphics.createBubbleForPoint( |
| this._timeline.getDocument(), pageX, pageY, width, height); |
| |
| return this._bubble.content; |
| }; |
| |
| Timeline._Band.prototype.scrollToCenter = function(date) { |
| var pixelOffset = this._ether.dateToPixelOffset(date); |
| if (pixelOffset < -this._viewLength / 2) { |
| this.setCenterVisibleDate(this.pixelOffsetToDate(pixelOffset + this._viewLength)); |
| } else if (pixelOffset > 3 * this._viewLength / 2) { |
| this.setCenterVisibleDate(this.pixelOffsetToDate(pixelOffset - this._viewLength)); |
| } |
| this._autoScroll(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(date))); |
| }; |
| |
| Timeline._Band.prototype._onMouseDown = function(innerFrame, evt, target) { |
| this.closeBubble(); |
| |
| this._dragging = true; |
| this._dragX = evt.clientX; |
| this._dragY = evt.clientY; |
| }; |
| |
| Timeline._Band.prototype._onMouseMove = function(innerFrame, evt, target) { |
| if (this._dragging) { |
| var diffX = evt.clientX - this._dragX; |
| var diffY = evt.clientY - this._dragY; |
| |
| this._dragX = evt.clientX; |
| this._dragY = evt.clientY; |
| |
| this._moveEther(this._timeline.isHorizontal() ? diffX : diffY); |
| this._positionHighlight(); |
| } |
| }; |
| |
| Timeline._Band.prototype._onMouseUp = function(innerFrame, evt, target) { |
| this._dragging = false; |
| this._keyboardInput.focus(); |
| }; |
| |
| Timeline._Band.prototype._onMouseOut = function(innerFrame, evt, target) { |
| var coords = Timeline.DOM.getEventRelativeCoordinates(evt, innerFrame); |
| coords.x += this._viewOffset; |
| if (coords.x < 0 || coords.x > innerFrame.offsetWidth || |
| coords.y < 0 || coords.y > innerFrame.offsetHeight) { |
| this._dragging = false; |
| } |
| }; |
| |
| Timeline._Band.prototype._onDblClick = function(innerFrame, evt, target) { |
| var coords = Timeline.DOM.getEventRelativeCoordinates(evt, innerFrame); |
| var distance = coords.x - (this._viewLength / 2 - this._viewOffset); |
| |
| this._autoScroll(-distance); |
| }; |
| |
| Timeline._Band.prototype._onKeyDown = function(keyboardInput, evt, target) { |
| if (!this._dragging) { |
| switch (evt.keyCode) { |
| case 27: // ESC |
| break; |
| case 37: // left arrow |
| case 38: // up arrow |
| this._scrollSpeed = Math.min(50, Math.abs(this._scrollSpeed * 1.05)); |
| this._moveEther(this._scrollSpeed); |
| break; |
| case 39: // right arrow |
| case 40: // down arrow |
| this._scrollSpeed = -Math.min(50, Math.abs(this._scrollSpeed * 1.05)); |
| this._moveEther(this._scrollSpeed); |
| break; |
| default: |
| return true; |
| } |
| this.closeBubble(); |
| |
| Timeline.DOM.cancelEvent(evt); |
| return false; |
| } |
| return true; |
| }; |
| |
| Timeline._Band.prototype._onKeyUp = function(keyboardInput, evt, target) { |
| if (!this._dragging) { |
| this._scrollSpeed = this._originalScrollSpeed; |
| |
| switch (evt.keyCode) { |
| case 35: // end |
| this.setCenterVisibleDate(this._eventSource.getLatestDate()); |
| break; |
| case 36: // home |
| this.setCenterVisibleDate(this._eventSource.getEarliestDate()); |
| break; |
| case 33: // page up |
| this._autoScroll(this._timeline.getPixelLength()); |
| break; |
| case 34: // page down |
| this._autoScroll(-this._timeline.getPixelLength()); |
| break; |
| default: |
| return true; |
| } |
| |
| this.closeBubble(); |
| |
| Timeline.DOM.cancelEvent(evt); |
| return false; |
| } |
| return true; |
| }; |
| |
| Timeline._Band.prototype._autoScroll = function(distance) { |
| var b = this; |
| var a = Timeline.Graphics.createAnimation(function(abs, diff) { |
| b._moveEther(diff); |
| }, 0, distance, 1000); |
| a.run(); |
| }; |
| |
| Timeline._Band.prototype._moveEther = function(shift) { |
| this.closeBubble(); |
| |
| this._viewOffset += shift; |
| this._ether.shiftPixels(-shift); |
| if (this._timeline.isHorizontal()) { |
| this._div.style.left = this._viewOffset + "px"; |
| } else { |
| this._div.style.top = this._viewOffset + "px"; |
| } |
| |
| if (this._viewOffset > -this._viewLength * 0.5 || |
| this._viewOffset < -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1.5)) { |
| |
| this._recenterDiv(); |
| } else { |
| this.softLayout(); |
| } |
| |
| this._onChanging(); |
| } |
| |
| Timeline._Band.prototype._onChanging = function() { |
| this._changing = true; |
| |
| this._fireOnScroll(); |
| this._setSyncWithBandDate(); |
| |
| this._changing = false; |
| }; |
| |
| Timeline._Band.prototype._fireOnScroll = function() { |
| for (var i = 0; i < this._onScrollListeners.length; i++) { |
| this._onScrollListeners[i](this); |
| } |
| }; |
| |
| Timeline._Band.prototype._setSyncWithBandDate = function() { |
| if (this._syncWithBand) { |
| var centerDate = this._ether.pixelOffsetToDate(this.getViewLength() / 2); |
| this._syncWithBand.setCenterVisibleDate(centerDate); |
| } |
| }; |
| |
| Timeline._Band.prototype._onHighlightBandScroll = function() { |
| if (this._syncWithBand) { |
| var centerDate = this._syncWithBand.getCenterVisibleDate(); |
| var centerPixelOffset = this._ether.dateToPixelOffset(centerDate); |
| |
| this._moveEther(Math.round(this._viewLength / 2 - centerPixelOffset)); |
| |
| if (this._highlight) { |
| this._etherPainter.setHighlight( |
| this._syncWithBand.getMinVisibleDate(), |
| this._syncWithBand.getMaxVisibleDate()); |
| } |
| } |
| }; |
| |
| Timeline._Band.prototype._onAddMany = function() { |
| this._paintEvents(); |
| }; |
| |
| Timeline._Band.prototype._onClear = function() { |
| this._paintEvents(); |
| }; |
| |
| Timeline._Band.prototype._positionHighlight = function() { |
| if (this._syncWithBand) { |
| var startDate = this._syncWithBand.getMinVisibleDate(); |
| var endDate = this._syncWithBand.getMaxVisibleDate(); |
| |
| if (this._highlight) { |
| this._etherPainter.setHighlight(startDate, endDate); |
| } |
| } |
| }; |
| |
| Timeline._Band.prototype._recenterDiv = function() { |
| this._viewOffset = -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1) / 2; |
| if (this._timeline.isHorizontal()) { |
| this._div.style.left = this._viewOffset + "px"; |
| this._div.style.width = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px"; |
| } else { |
| this._div.style.top = this._viewOffset + "px"; |
| this._div.style.height = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px"; |
| } |
| this.layout(); |
| }; |
| |
| Timeline._Band.prototype._paintEvents = function() { |
| this._eventPainter.paint(); |
| }; |
| |
| Timeline._Band.prototype._softPaintEvents = function() { |
| this._eventPainter.softPaint(); |
| }; |
| |
| Timeline._Band.prototype._paintDecorators = function() { |
| for (var i = 0; i < this._decorators.length; i++) { |
| this._decorators[i].paint(); |
| } |
| }; |
| |
| Timeline._Band.prototype._softPaintDecorators = function() { |
| for (var i = 0; i < this._decorators.length; i++) { |
| this._decorators[i].softPaint(); |
| } |
| }; |