blob: 14ff5d4b65f6911b2b6657d1c2ee9b05c41d6708 [file] [log] [blame]
/*==================================================
* 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();
}
};