﻿

/* band.js */
Timeline._Band=function(B,G,C){if(B.autoWidth&&typeof G.width=="string"){G.width=G.width.indexOf("%")>-1?0:parseInt(G.width);
}this._timeline=B;
this._bandInfo=G;
this._index=C;
this._locale=("locale" in G)?G.locale:Timeline.getDefaultLocale();
this._timeZone=("timeZone" in G)?G.timeZone:0;
this._labeller=("labeller" in G)?G.labeller:(("createLabeller" in B.getUnit())?B.getUnit().createLabeller(this._locale,this._timeZone):new Timeline.GregorianDateLabeller(this._locale,this._timeZone));
this._theme=G.theme;
this._zoomIndex=("zoomIndex" in G)?G.zoomIndex:0;
this._zoomSteps=("zoomSteps" in G)?G.zoomSteps:null;
this._dragging=false;
this._changing=false;
this._originalScrollSpeed=5;
this._scrollSpeed=this._originalScrollSpeed;
this._onScrollListeners=[];
var A=this;
this._syncWithBand=null;
this._syncWithBandHandler=function(H){A._onHighlightBandScroll();
};
this._selectorListener=function(H){A._onHighlightBandScroll();
};
var E=this._timeline.getDocument().createElement("div");
E.className="timeline-band-input";
this._timeline.addDiv(E);
this._keyboardInput=document.createElement("input");
this._keyboardInput.type="text";
E.appendChild(this._keyboardInput);
SimileAjax.DOM.registerEventWithObject(this._keyboardInput,"keydown",this,"_onKeyDown");
SimileAjax.DOM.registerEventWithObject(this._keyboardInput,"keyup",this,"_onKeyUp");
this._div=this._timeline.getDocument().createElement("div");
this._div.id="timeline-band-"+C;
this._div.className="timeline-band timeline-band-"+C;
this._timeline.addDiv(this._div);
SimileAjax.DOM.registerEventWithObject(this._div,"mousedown",this,"_onMouseDown");
SimileAjax.DOM.registerEventWithObject(this._div,"mousemove",this,"_onMouseMove");
SimileAjax.DOM.registerEventWithObject(this._div,"mouseup",this,"_onMouseUp");
SimileAjax.DOM.registerEventWithObject(this._div,"mouseout",this,"_onMouseOut");
SimileAjax.DOM.registerEventWithObject(this._div,"dblclick",this,"_onDblClick");
var F=this._theme!=null?this._theme.mouseWheel:"scroll";
if(F==="zoom"||F==="scroll"||this._zoomSteps){if(SimileAjax.Platform.browser.isFirefox){SimileAjax.DOM.registerEventWithObject(this._div,"DOMMouseScroll",this,"_onMouseScroll");
}else{SimileAjax.DOM.registerEventWithObject(this._div,"mousewheel",this,"_onMouseScroll");
}}this._innerDiv=this._timeline.getDocument().createElement("div");
this._innerDiv.className="timeline-band-inner";
this._div.appendChild(this._innerDiv);
this._ether=G.ether;
G.ether.initialize(this,B);
this._etherPainter=G.etherPainter;
G.etherPainter.initialize(this,B);
this._eventSource=G.eventSource;
if(this._eventSource){this._eventListener={onAddMany:function(){A._onAddMany();
},onClear:function(){A._onClear();
}};
this._eventSource.addListener(this._eventListener);
}this._eventPainter=G.eventPainter;
this._eventTracksNeeded=0;
this._eventTrackIncrement=0;
G.eventPainter.initialize(this,B);
this._decorators=("decorators" in G)?G.decorators:[];
for(var D=0;
D<this._decorators.length;
D++){this._decorators[D].initialize(this,B);
}};
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;
};
Timeline._Band.prototype.addOnScrollListener=function(A){this._onScrollListeners.push(A);
};
Timeline._Band.prototype.removeOnScrollListener=function(B){for(var A=0;
A<this._onScrollListeners.length;
A++){if(this._onScrollListeners[A]==B){this._onScrollListeners.splice(A,1);
break;
}}};
Timeline._Band.prototype.setSyncWithBand=function(B,A){if(this._syncWithBand){this._syncWithBand.removeOnScrollListener(this._syncWithBandHandler);
}this._syncWithBand=B;
this._syncWithBand.addOnScrollListener(this._syncWithBandHandler);
this._highlight=A;
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.getTimeline=function(){return this._timeline;
};
Timeline._Band.prototype.updateEventTrackInfo=function(A,B){this._eventTrackIncrement=B;
if(A>this._eventTracksNeeded){this._eventTracksNeeded=A;
}};
Timeline._Band.prototype.checkAutoWidth=function(){if(!this._timeline.autoWidth){return ;
}var C=this._eventPainter.getType()=="overview";
var A=C?this._theme.event.overviewTrack.autoWidthMargin:this._theme.event.track.autoWidthMargin;
var B=Math.ceil((this._eventTracksNeeded+A)*this._eventTrackIncrement);
B+=C?this._theme.event.overviewTrack.offset:this._theme.event.track.offset;
var D=this._bandInfo;
if(B!=D.width){D.width=B;
}};
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(A,D){var C=this._keyboardInput.parentNode;
var B=A+Math.floor(D/2);
if(this._timeline.isHorizontal()){this._div.style.top=A+"px";
this._div.style.height=D+"px";
C.style.top=B+"px";
C.style.left="-1em";
}else{this._div.style.left=A+"px";
this._div.style.width=D+"px";
C.style.left=B+"px";
C.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(A){this._viewLength=A;
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.getMinVisibleDateAfterDelta=function(A){return this._ether.pixelOffsetToDate(A);
};
Timeline._Band.prototype.getMaxVisibleDate=function(){return this._ether.pixelOffsetToDate(this._viewLength);
};
Timeline._Band.prototype.getMaxVisibleDateAfterDelta=function(A){return this._ether.pixelOffsetToDate(this._viewLength+A);
};
Timeline._Band.prototype.getCenterVisibleDate=function(){return this._ether.pixelOffsetToDate(this._viewLength/2);
};
Timeline._Band.prototype.setMinVisibleDate=function(A){if(!this._changing){this._moveEther(Math.round(-this._ether.dateToPixelOffset(A)));
}};
Timeline._Band.prototype.setMaxVisibleDate=function(A){if(!this._changing){this._moveEther(Math.round(this._viewLength-this._ether.dateToPixelOffset(A)));
}};
Timeline._Band.prototype.setCenterVisibleDate=function(A){if(!this._changing){this._moveEther(Math.round(this._viewLength/2-this._ether.dateToPixelOffset(A)));
}};
Timeline._Band.prototype.dateToPixelOffset=function(A){return this._ether.dateToPixelOffset(A)-this._viewOffset;
};
Timeline._Band.prototype.pixelOffsetToDate=function(A){return this._ether.pixelOffsetToDate(A+this._viewOffset);
};
Timeline._Band.prototype.createLayerDiv=function(C,A){var D=this._timeline.getDocument().createElement("div");
D.className="timeline-band-layer"+(typeof A=="string"?(" "+A):"");
D.style.zIndex=C;
this._innerDiv.appendChild(D);
var B=this._timeline.getDocument().createElement("div");
B.className="timeline-band-layer-inner";
if(SimileAjax.Platform.browser.isIE){B.style.cursor="move";
}else{B.style.cursor="-moz-grab";
}D.appendChild(B);
return B;
};
Timeline._Band.prototype.removeLayerDiv=function(A){this._innerDiv.removeChild(A.parentNode);
};
Timeline._Band.prototype.scrollToCenter=function(A,C){var B=this._ether.dateToPixelOffset(A);
if(B<-this._viewLength/2){this.setCenterVisibleDate(this.pixelOffsetToDate(B+this._viewLength));
}else{if(B>3*this._viewLength/2){this.setCenterVisibleDate(this.pixelOffsetToDate(B-this._viewLength));
}}this._autoScroll(Math.round(this._viewLength/2-this._ether.dateToPixelOffset(A)),C);
};
Timeline._Band.prototype.showBubbleForEvent=function(C){var A=this.getEventSource().getEvent(C);
if(A){var B=this;
this.scrollToCenter(A.getStart(),function(){B._eventPainter.showBubble(A);
});
}};
Timeline._Band.prototype.zoom=function(C,A,F,E){if(!this._zoomSteps){return ;
}A+=this._viewOffset;
var D=this._ether.pixelOffsetToDate(A);
var B=this._ether.zoom(C);
this._etherPainter.zoom(B);
this._moveEther(Math.round(-this._ether.dateToPixelOffset(D)));
this._moveEther(A);
};
Timeline._Band.prototype._onMouseDown=function(B,A,C){this.closeBubble();
this._dragging=true;
this._dragX=A.clientX;
this._dragY=A.clientY;
};
Timeline._Band.prototype._onMouseMove=function(D,A,E){if(this._dragging){var C=A.clientX-this._dragX;
var B=A.clientY-this._dragY;
this._dragX=A.clientX;
this._dragY=A.clientY;
this._moveEther(this._timeline.isHorizontal()?C:B);
this._positionHighlight();
}};
Timeline._Band.prototype._onMouseUp=function(B,A,C){this._dragging=false;
this._keyboardInput.focus();
};
Timeline._Band.prototype._onMouseOut=function(C,B,D){var A=SimileAjax.DOM.getEventRelativeCoordinates(B,C);
A.x+=this._viewOffset;
if(A.x<0||A.x>C.offsetWidth||A.y<0||A.y>C.offsetHeight){this._dragging=false;
}};
Timeline._Band.prototype._onMouseScroll=function(G,H,B){var A=new Date();
A=A.getTime();
if(!this._lastScrollTime||((A-this._lastScrollTime)>50)){this._lastScrollTime=A;
var I=0;
if(H.wheelDelta){I=H.wheelDelta/120;
}else{if(H.detail){I=-H.detail/3;
}}var F=this._theme.mouseWheel;
if(this._zoomSteps||F==="zoom"){var E=SimileAjax.DOM.getEventRelativeCoordinates(H,G);
if(I!=0){var D;
if(I>0){D=true;
}if(I<0){D=false;
}this._timeline.zoom(D,E.x,E.y,G);
}}else{if(F==="scroll"){var C=50*(I<0?-1:1);
this._moveEther(C);
}}}if(H.stopPropagation){H.stopPropagation();
}H.cancelBubble=true;
if(H.preventDefault){H.preventDefault();
}H.returnValue=false;
};
Timeline._Band.prototype._onDblClick=function(C,B,E){var A=SimileAjax.DOM.getEventRelativeCoordinates(B,C);
var D=A.x-(this._viewLength/2-this._viewOffset);
this._autoScroll(-D);
};
Timeline._Band.prototype._onKeyDown=function(B,A,C){if(!this._dragging){switch(A.keyCode){case 27:break;
case 37:case 38:this._scrollSpeed=Math.min(50,Math.abs(this._scrollSpeed*1.05));
this._moveEther(this._scrollSpeed);
break;
case 39:case 40:this._scrollSpeed=-Math.min(50,Math.abs(this._scrollSpeed*1.05));
this._moveEther(this._scrollSpeed);
break;
default:return true;
}this.closeBubble();
SimileAjax.DOM.cancelEvent(A);
return false;
}return true;
};
Timeline._Band.prototype._onKeyUp=function(B,A,C){if(!this._dragging){this._scrollSpeed=this._originalScrollSpeed;
switch(A.keyCode){case 35:this.setCenterVisibleDate(this._eventSource.getLatestDate());
break;
case 36:this.setCenterVisibleDate(this._eventSource.getEarliestDate());
break;
case 33:this._autoScroll(this._timeline.getPixelLength());
break;
case 34:this._autoScroll(-this._timeline.getPixelLength());
break;
default:return true;
}this.closeBubble();
SimileAjax.DOM.cancelEvent(A);
return false;
}return true;
};
Timeline._Band.prototype._autoScroll=function(D,C){var A=this;
var B=SimileAjax.Graphics.createAnimation(function(E,F){A._moveEther(F);
},0,D,1000,C);
B.run();
};
Timeline._Band.prototype._moveEther=function(A){this.closeBubble();
if(!this._timeline.shiftOK(this._index,A)){return ;
}this._viewOffset+=A;
this._ether.shiftPixels(-A);
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.busy=function(){return(this._changing);
};
Timeline._Band.prototype._fireOnScroll=function(){for(var A=0;
A<this._onScrollListeners.length;
A++){this._onScrollListeners[A](this);
}};
Timeline._Band.prototype._setSyncWithBandDate=function(){if(this._syncWithBand){var A=this._ether.pixelOffsetToDate(this.getViewLength()/2);
this._syncWithBand.setCenterVisibleDate(A);
}};
Timeline._Band.prototype._onHighlightBandScroll=function(){if(this._syncWithBand){var A=this._syncWithBand.getCenterVisibleDate();
var B=this._ether.dateToPixelOffset(A);
this._moveEther(Math.round(this._viewLength/2-B));
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 A=this._syncWithBand.getMinVisibleDate();
var B=this._syncWithBand.getMaxVisibleDate();
if(this._highlight){this._etherPainter.setHighlight(A,B);
}}};
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 A=0;
A<this._decorators.length;
A++){this._decorators[A].paint();
}};
Timeline._Band.prototype._softPaintDecorators=function(){for(var A=0;
A<this._decorators.length;
A++){this._decorators[A].softPaint();
}};
Timeline._Band.prototype.closeBubble=function(){SimileAjax.WindowManager.cancelPopups();
};


/* compact-painter.js */
Timeline.CompactEventPainter=function(A){this._params=A;
this._onSelectListeners=[];
this._filterMatcher=null;
this._highlightMatcher=null;
this._frc=null;
this._eventIdToElmt={};
};
Timeline.CompactEventPainter.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._backLayer=null;
this._eventLayer=null;
this._lineLayer=null;
this._highlightLayer=null;
this._eventIdToElmt=null;
};
Timeline.CompactEventPainter.prototype.addOnSelectListener=function(A){this._onSelectListeners.push(A);
};
Timeline.CompactEventPainter.prototype.removeOnSelectListener=function(B){for(var A=0;
A<this._onSelectListeners.length;
A++){if(this._onSelectListeners[A]==B){this._onSelectListeners.splice(A,1);
break;
}}};
Timeline.CompactEventPainter.prototype.getFilterMatcher=function(){return this._filterMatcher;
};
Timeline.CompactEventPainter.prototype.setFilterMatcher=function(A){this._filterMatcher=A;
};
Timeline.CompactEventPainter.prototype.getHighlightMatcher=function(){return this._highlightMatcher;
};
Timeline.CompactEventPainter.prototype.setHighlightMatcher=function(A){this._highlightMatcher=A;
};
Timeline.CompactEventPainter.prototype.paint=function(){var N=this._band.getEventSource();
if(N==null){return ;
}this._eventIdToElmt={};
this._prepareForPainting();
var O=this._params.theme;
var L=O.event;
var G={trackOffset:"trackOffset" in this._params?this._params.trackOffset:10,trackHeight:"trackHeight" in this._params?this._params.trackHeight:10,tapeHeight:O.event.tape.height,tapeBottomMargin:"tapeBottomMargin" in this._params?this._params.tapeBottomMargin:2,labelBottomMargin:"labelBottomMargin" in this._params?this._params.labelBottomMargin:5,labelRightMargin:"labelRightMargin" in this._params?this._params.labelRightMargin:5,defaultIcon:L.instant.icon,defaultIconWidth:L.instant.iconWidth,defaultIconHeight:L.instant.iconHeight,customIconWidth:"iconWidth" in this._params?this._params.iconWidth:L.instant.iconWidth,customIconHeight:"iconHeight" in this._params?this._params.iconHeight:L.instant.iconHeight,iconLabelGap:"iconLabelGap" in this._params?this._params.iconLabelGap:2,iconBottomMargin:"iconBottomMargin" in this._params?this._params.iconBottomMargin:2};
if("compositeIcon" in this._params){G.compositeIcon=this._params.compositeIcon;
G.compositeIconWidth=this._params.compositeIconWidth||G.customIconWidth;
G.compositeIconHeight=this._params.compositeIconHeight||G.customIconHeight;
}else{G.compositeIcon=G.defaultIcon;
G.compositeIconWidth=G.defaultIconWidth;
G.compositeIconHeight=G.defaultIconHeight;
}G.defaultStackIcon="icon" in this._params.stackConcurrentPreciseInstantEvents?this._params.stackConcurrentPreciseInstantEvents.icon:G.defaultIcon;
G.defaultStackIconWidth="iconWidth" in this._params.stackConcurrentPreciseInstantEvents?this._params.stackConcurrentPreciseInstantEvents.iconWidth:G.defaultIconWidth;
G.defaultStackIconHeight="iconHeight" in this._params.stackConcurrentPreciseInstantEvents?this._params.stackConcurrentPreciseInstantEvents.iconHeight:G.defaultIconHeight;
var B=this._band.getMinDate();
var D=this._band.getMaxDate();
var R=(this._filterMatcher!=null)?this._filterMatcher:function(S){return true;
};
var Q=(this._highlightMatcher!=null)?this._highlightMatcher:function(S){return -1;
};
var F=N.getEventIterator(B,D);
var H="stackConcurrentPreciseInstantEvents" in this._params&&typeof this._params.stackConcurrentPreciseInstantEvents=="object";
var P="collapseConcurrentPreciseInstantEvents" in this._params&&this._params.collapseConcurrentPreciseInstantEvents;
if(P||H){var M=[];
var A=null;
while(F.hasNext()){var E=F.next();
if(R(E)){if(!E.isInstant()||E.isImprecise()){this.paintEvent(E,G,this._params.theme,Q(E));
}else{if(A!=null&&A.getStart().getTime()==E.getStart().getTime()){M[M.length-1].push(E);
}else{M.push([E]);
A=E;
}}}}for(var J=0;
J<M.length;
J++){var K=M[J];
if(K.length==1){this.paintEvent(K[0],G,this._params.theme,Q(E));
}else{var C=-1;
for(var I=0;
C<0&&I<K.length;
I++){C=Q(K[I]);
}if(H){this.paintStackedPreciseInstantEvents(K,G,this._params.theme,C);
}else{this.paintCompositePreciseInstantEvents(K,G,this._params.theme,C);
}}}}else{while(F.hasNext()){var E=F.next();
if(R(E)){this.paintEvent(E,G,this._params.theme,Q(E));
}}}this._highlightLayer.style.display="block";
this._lineLayer.style.display="block";
this._eventLayer.style.display="block";
};
Timeline.CompactEventPainter.prototype.softPaint=function(){};
Timeline.CompactEventPainter.prototype._prepareForPainting=function(){var B=this._band;
if(this._backLayer==null){this._backLayer=this._band.createLayerDiv(0,"timeline-band-events");
this._backLayer.style.visibility="hidden";
var A=document.createElement("span");
A.className="timeline-event-label";
this._backLayer.appendChild(A);
this._frc=SimileAjax.Graphics.getFontRenderingContext(A);
}this._frc.update();
this._tracks=[];
if(this._highlightLayer!=null){B.removeLayerDiv(this._highlightLayer);
}this._highlightLayer=B.createLayerDiv(105,"timeline-band-highlights");
this._highlightLayer.style.display="none";
if(this._lineLayer!=null){B.removeLayerDiv(this._lineLayer);
}this._lineLayer=B.createLayerDiv(110,"timeline-band-lines");
this._lineLayer.style.display="none";
if(this._eventLayer!=null){B.removeLayerDiv(this._eventLayer);
}this._eventLayer=B.createLayerDiv(115,"timeline-band-events");
this._eventLayer.style.display="none";
};
Timeline.CompactEventPainter.prototype.paintEvent=function(B,C,D,A){if(B.isInstant()){this.paintInstantEvent(B,C,D,A);
}else{this.paintDurationEvent(B,C,D,A);
}};
Timeline.CompactEventPainter.prototype.paintInstantEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseInstantEvent(B,C,D,A);
}else{this.paintPreciseInstantEvent(B,C,D,A);
}};
Timeline.CompactEventPainter.prototype.paintDurationEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseDurationEvent(B,C,D,A);
}else{this.paintPreciseDurationEvent(B,C,D,A);
}};
Timeline.CompactEventPainter.prototype.paintPreciseInstantEvent=function(H,F,B,A){var C={tooltip:H.getProperty("tooltip")||H.getText()};
var E={url:H.getIcon()};
if(E.url==null){E.url=F.defaultIcon;
E.width=F.defaultIconWidth;
E.height=F.defaultIconHeight;
E.className="timeline-event-icon-default";
}else{E.width=H.getProperty("iconWidth")||F.customIconWidth;
E.height=H.getProperty("iconHeight")||F.customIconHeight;
}var J={text:H.getText(),color:H.getTextColor()||H.getColor(),className:H.getClassName()};
var G=this.paintTapeIconLabel(H.getStart(),C,null,E,J,F,B,A);
var I=this;
var D=function(L,K,M){return I._onClickInstantEvent(G.iconElmtData.elmt,K,H);
};
SimileAjax.DOM.registerEvent(G.iconElmtData.elmt,"mousedown",D);
SimileAjax.DOM.registerEvent(G.labelElmtData.elmt,"mousedown",D);
this._eventIdToElmt[H.getID()]=G.iconElmtData.elmt;
};
Timeline.CompactEventPainter.prototype.paintCompositePreciseInstantEvents=function(J,H,D,B){var K=J[0];
var A=[];
for(var C=0;
C<J.length;
C++){A.push(J[C].getProperty("tooltip")||J[C].getText());
}var E={tooltip:A.join("; ")};
var G={url:H.compositeIcon,width:H.compositeIconWidth,height:H.compositeIconHeight,className:"timeline-event-icon-composite"};
var M={text:String.substitute(this._params.compositeEventLabelTemplate,[J.length])};
var I=this.paintTapeIconLabel(K.getStart(),E,null,G,M,H,D,B);
var L=this;
var F=function(O,N,P){return L._onClickMultiplePreciseInstantEvent(I.iconElmtData.elmt,N,J);
};
SimileAjax.DOM.registerEvent(I.iconElmtData.elmt,"mousedown",F);
SimileAjax.DOM.registerEvent(I.labelElmtData.elmt,"mousedown",F);
for(var C=0;
C<J.length;
C++){this._eventIdToElmt[J[C].getID()]=I.iconElmtData.elmt;
}};
Timeline.CompactEventPainter.prototype.paintStackedPreciseInstantEvents=function(T,j,c,E){var S="limit" in this._params.stackConcurrentPreciseInstantEvents?this._params.stackConcurrentPreciseInstantEvents.limit:10;
var G="moreMessageTemplate" in this._params.stackConcurrentPreciseInstantEvents?this._params.stackConcurrentPreciseInstantEvents.moreMessageTemplate:"%0 More Events";
var Q=S<=T.length-2;
var B=this._band;
var L=function(i){return Math.round(B.dateToPixelOffset(i));
};
var O=function(i){var r={url:i.getIcon()};
if(r.url==null){r.url=j.defaultStackIcon;
r.width=j.defaultStackIconWidth;
r.height=j.defaultStackIconHeight;
r.className="timeline-event-icon-stack timeline-event-icon-default";
}else{r.width=i.getProperty("iconWidth")||j.customIconWidth;
r.height=i.getProperty("iconHeight")||j.customIconHeight;
r.className="timeline-event-icon-stack";
}return r;
};
var C=O(T[0]);
var V=5;
var D=0;
var g=0;
var p=0;
var U=0;
var l=[];
for(var n=0;
n<T.length&&(!Q||n<S);
n++){var b=T[n];
var a=b.getText();
var X=O(b);
var W=this._frc.computeSize(a);
var K={text:a,iconData:X,labelSize:W,iconLeft:C.width+n*V-X.width};
K.labelLeft=C.width+n*V+j.iconLabelGap;
K.top=p;
l.push(K);
D=Math.min(D,K.iconLeft);
p+=W.height;
g=Math.max(g,K.labelLeft+W.width);
U=Math.max(U,K.top+X.height);
}if(Q){var e=String.substitute(G,[T.length-S]);
var H=this._frc.computeSize(e);
var J=C.width+(S-1)*V+j.iconLabelGap;
var m=p;
p+=H.height;
g=Math.max(g,J+H.width);
}g+=j.labelRightMargin;
p+=j.labelBottomMargin;
U+=j.iconBottomMargin;
var F=L(T[0].getStart());
var Y=[];
var N=Math.ceil(Math.max(U,p)/j.trackHeight);
var M=C.width+(T.length-1)*V;
for(var n=0;
n<N;
n++){Y.push({start:D,end:M});
}var f=Math.ceil(p/j.trackHeight);
for(var n=0;
n<f;
n++){var P=Y[n];
P.end=Math.max(P.end,g);
}var k=this._fitTracks(F,Y);
var Z=k*j.trackHeight+j.trackOffset;
var q=this._timeline.getDocument().createElement("div");
q.className="timeline-event-icon-stack";
q.style.position="absolute";
q.style.overflow="visible";
q.style.left=F+"px";
q.style.top=Z+"px";
q.style.width=M+"px";
q.style.height=U+"px";
q.innerHTML="<div style='position: relative'></div>";
this._eventLayer.appendChild(q);
var I=this;
var R=function(r){try{var w=parseInt(this.getAttribute("index"));
var u=q.firstChild.childNodes;
for(var s=0;
s<u.length;
s++){var v=u[s];
if(s==w){v.style.zIndex=u.length;
}else{v.style.zIndex=u.length-s;
}}}catch(t){}};
var d=function(u){var w=l[u];
var r=T[u];
var i=r.getProperty("tooltip")||r.getText();
var v=I._paintEventLabel({tooltip:i},{text:w.text},F+w.labelLeft,Z+w.top,w.labelSize.width,w.labelSize.height,c);
v.elmt.setAttribute("index",u);
v.elmt.onmouseover=R;
var t=SimileAjax.Graphics.createTranslucentImage(w.iconData.url);
var s=I._timeline.getDocument().createElement("div");
s.className="timeline-event-icon"+("className" in w.iconData?(" "+w.iconData.className):"");
s.style.left=w.iconLeft+"px";
s.style.top=w.top+"px";
s.style.zIndex=(l.length-u);
s.appendChild(t);
s.setAttribute("index",u);
s.onmouseover=R;
q.firstChild.appendChild(s);
var x=function(z,y,AA){return I._onClickInstantEvent(v.elmt,y,r);
};
SimileAjax.DOM.registerEvent(s,"mousedown",x);
SimileAjax.DOM.registerEvent(v.elmt,"mousedown",x);
I._eventIdToElmt[r.getID()]=s;
};
for(var n=0;
n<l.length;
n++){d(n);
}if(Q){var o=T.slice(S);
var A=this._paintEventLabel({tooltip:e},{text:e},F+J,Z+m,H.width,H.height,c);
var h=function(r,i,s){return I._onClickMultiplePreciseInstantEvent(A.elmt,i,o);
};
SimileAjax.DOM.registerEvent(A.elmt,"mousedown",h);
for(var n=0;
n<o.length;
n++){this._eventIdToElmt[o[n].getID()]=A.elmt;
}}};
Timeline.CompactEventPainter.prototype.paintImpreciseInstantEvent=function(I,G,B,A){var C={tooltip:I.getProperty("tooltip")||I.getText()};
var E={start:I.getStart(),end:I.getEnd(),latestStart:I.getLatestStart(),earliestEnd:I.getEarliestEnd(),isInstant:true};
var F={url:I.getIcon()};
if(F.url==null){F=null;
}else{F.width=I.getProperty("iconWidth")||G.customIconWidth;
F.height=I.getProperty("iconHeight")||G.customIconHeight;
}var K={text:I.getText(),color:I.getTextColor()||I.getColor(),className:I.getClassName()};
var H=this.paintTapeIconLabel(I.getStart(),C,E,F,K,G,B,A);
var J=this;
var D=F!=null?function(M,L,N){return J._onClickInstantEvent(H.iconElmtData.elmt,L,I);
}:function(M,L,N){return J._onClickInstantEvent(H.labelElmtData.elmt,L,I);
};
SimileAjax.DOM.registerEvent(H.labelElmtData.elmt,"mousedown",D);
SimileAjax.DOM.registerEvent(H.impreciseTapeElmtData.elmt,"mousedown",D);
if(F!=null){SimileAjax.DOM.registerEvent(H.iconElmtData.elmt,"mousedown",D);
this._eventIdToElmt[I.getID()]=H.iconElmtData.elmt;
}else{this._eventIdToElmt[I.getID()]=H.labelElmtData.elmt;
}};
Timeline.CompactEventPainter.prototype.paintPreciseDurationEvent=function(I,G,B,A){var C={tooltip:I.getProperty("tooltip")||I.getText()};
var E={start:I.getStart(),end:I.getEnd(),isInstant:false};
var F={url:I.getIcon()};
if(F.url==null){F=null;
}else{F.width=I.getProperty("iconWidth")||G.customIconWidth;
F.height=I.getProperty("iconHeight")||G.customIconHeight;
}var K={text:I.getText(),color:I.getTextColor()||I.getColor(),className:I.getClassName()};
var H=this.paintTapeIconLabel(I.getLatestStart(),C,E,F,K,G,B,A);
var J=this;
var D=F!=null?function(M,L,N){return J._onClickInstantEvent(H.iconElmtData.elmt,L,I);
}:function(M,L,N){return J._onClickInstantEvent(H.labelElmtData.elmt,L,I);
};
SimileAjax.DOM.registerEvent(H.labelElmtData.elmt,"mousedown",D);
SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt,"mousedown",D);
if(F!=null){SimileAjax.DOM.registerEvent(H.iconElmtData.elmt,"mousedown",D);
this._eventIdToElmt[I.getID()]=H.iconElmtData.elmt;
}else{this._eventIdToElmt[I.getID()]=H.labelElmtData.elmt;
}};
Timeline.CompactEventPainter.prototype.paintImpreciseDurationEvent=function(I,G,B,A){var C={tooltip:I.getProperty("tooltip")||I.getText()};
var E={start:I.getStart(),end:I.getEnd(),latestStart:I.getLatestStart(),earliestEnd:I.getEarliestEnd(),isInstant:false};
var F={url:I.getIcon()};
if(F.url==null){F=null;
}else{F.width=I.getProperty("iconWidth")||G.customIconWidth;
F.height=I.getProperty("iconHeight")||G.customIconHeight;
}var K={text:I.getText(),color:I.getTextColor()||I.getColor(),className:I.getClassName()};
var H=this.paintTapeIconLabel(I.getLatestStart(),C,E,F,K,G,B,A);
var J=this;
var D=F!=null?function(M,L,N){return J._onClickInstantEvent(H.iconElmtData.elmt,L,I);
}:function(M,L,N){return J._onClickInstantEvent(H.labelElmtData.elmt,L,I);
};
SimileAjax.DOM.registerEvent(H.labelElmtData.elmt,"mousedown",D);
SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt,"mousedown",D);
if(F!=null){SimileAjax.DOM.registerEvent(H.iconElmtData.elmt,"mousedown",D);
this._eventIdToElmt[I.getID()]=H.iconElmtData.elmt;
}else{this._eventIdToElmt[I.getID()]=H.labelElmtData.elmt;
}};
Timeline.CompactEventPainter.prototype.paintTapeIconLabel=function(V,O,S,I,a,X,c,Z){var R=this._band;
var F=function(e){return Math.round(R.dateToPixelOffset(e));
};
var d=F(V);
var W=[];
var b=0;
var B=0;
var C=0;
if(S!=null){b=X.tapeHeight+X.tapeBottomMargin;
B=Math.ceil(X.tapeHeight/X.trackHeight);
var A=F(S.end)-d;
var L=F(S.start)-d;
for(var Q=0;
Q<B;
Q++){W.push({start:L,end:A});
}C=X.trackHeight-(b%X.tapeHeight);
}var N=0;
var U=0;
if(I!=null){if("iconAlign" in I&&I.iconAlign=="center"){N=-Math.floor(I.width/2);
}U=N+I.width+X.iconLabelGap;
if(B>0){W[B-1].end=Math.max(W[B-1].end,U);
}var E=I.height+X.iconBottomMargin+C;
while(E>0){W.push({start:N,end:U});
E-=X.trackHeight;
}}var P=a.text;
var H=this._frc.computeSize(P);
var M=H.height+X.labelBottomMargin+C;
var J=U+H.width+X.labelRightMargin;
if(B>0){W[B-1].end=Math.max(W[B-1].end,J);
}for(var Y=0;
M>0;
Y++){if(B+Y<W.length){var T=W[B+Y];
T.end=J;
}else{W.push({start:0,end:J});
}M-=X.trackHeight;
}var G=this._fitTracks(d,W);
var K=G*X.trackHeight+X.trackOffset;
var D={};
D.labelElmtData=this._paintEventLabel(O,a,d+U,K+b,H.width,H.height,c);
if(S!=null){if("latestStart" in S||"earliestEnd" in S){D.impreciseTapeElmtData=this._paintEventTape(O,S,X.tapeHeight,K,F(S.start),F(S.end),c.event.duration.impreciseColor,c.event.duration.impreciseOpacity,X,c);
}if(!S.isInstant&&"start" in S&&"end" in S){D.tapeElmtData=this._paintEventTape(O,S,X.tapeHeight,K,d,F("earliestEnd" in S?S.earliestEnd:S.end),S.color,100,X,c);
}}if(I!=null){D.iconElmtData=this._paintEventIcon(O,I,K+b,d+N,X,c);
}return D;
};
Timeline.CompactEventPainter.prototype._fitTracks=function(F,C){var H;
for(H=0;
H<this._tracks.length;
H++){var E=true;
for(var B=0;
B<C.length&&(H+B)<this._tracks.length;
B++){var G=this._tracks[H+B];
var A=C[B];
if(F+A.start<G){E=false;
break;
}}if(E){break;
}}for(var D=0;
D<C.length;
D++){this._tracks[H+D]=F+C[D].end;
}return H;
};
Timeline.CompactEventPainter.prototype._paintEventIcon=function(C,D,H,G,E,F){var B=SimileAjax.Graphics.createTranslucentImage(D.url);
var A=this._timeline.getDocument().createElement("div");
A.className="timeline-event-icon"+("className" in D?(" "+D.className):"");
A.style.left=G+"px";
A.style.top=H+"px";
A.appendChild(B);
if("tooltip" in C&&typeof C.tooltip=="string"){A.title=C.tooltip;
}this._eventLayer.appendChild(A);
return{left:G,top:H,width:E.iconWidth,height:E.iconHeight,elmt:A};
};
Timeline.CompactEventPainter.prototype._paintEventLabel=function(E,I,C,F,A,G,D){var H=this._timeline.getDocument();
var B=H.createElement("div");
B.className="timeline-event-label";
B.style.left=C+"px";
B.style.width=(A+1)+"px";
B.style.top=F+"px";
B.innerHTML=I.text;
if("tooltip" in E&&typeof E.tooltip=="string"){B.title=E.tooltip;
}if("color" in I&&typeof I.color=="string"){B.style.color=I.color;
}if("className" in I&&typeof I.className=="string"){B.className+=" "+I.className;
}this._eventLayer.appendChild(B);
return{left:C,top:F,width:A,height:G,elmt:B};
};
Timeline.CompactEventPainter.prototype._paintEventTape=function(G,H,K,J,D,A,E,C,I,F){var B=A-D;
var L=this._timeline.getDocument().createElement("div");
L.className="timeline-event-tape";
L.style.left=D+"px";
L.style.top=J+"px";
L.style.width=B+"px";
L.style.height=K+"px";
if("tooltip" in G&&typeof G.tooltip=="string"){L.title=G.tooltip;
}if(E!=null&&typeof H.color=="string"){L.style.backgroundColor=E;
}if("backgroundImage" in H&&typeof H.backgroundImage=="string"){L.style.backgroundImage="url("+backgroundImage+")";
L.style.backgroundRepeat=("backgroundRepeat" in H&&typeof H.backgroundRepeat=="string")?H.backgroundRepeat:"repeat";
}SimileAjax.Graphics.setOpacity(L,C);
if("className" in H&&typeof H.className=="string"){L.className+=" "+H.className;
}this._eventLayer.appendChild(L);
return{left:D,top:J,width:B,height:K,elmt:L};
};
Timeline.CompactEventPainter.prototype._createHighlightDiv=function(A,C,E){if(A>=0){var D=this._timeline.getDocument();
var G=E.event;
var B=G.highlightColors[Math.min(A,G.highlightColors.length-1)];
var F=D.createElement("div");
F.style.position="absolute";
F.style.overflow="hidden";
F.style.left=(C.left-2)+"px";
F.style.width=(C.width+4)+"px";
F.style.top=(C.top-2)+"px";
F.style.height=(C.height+4)+"px";
this._highlightLayer.appendChild(F);
}};
Timeline.CompactEventPainter.prototype._onClickMultiplePreciseInstantEvent=function(E,A,B){var F=SimileAjax.DOM.getPageCoordinates(E);
this._showBubble(F.left+Math.ceil(E.offsetWidth/2),F.top+Math.ceil(E.offsetHeight/2),B);
var D=[];
for(var C=0;
C<B.length;
C++){D.push(B[C].getID());
}this._fireOnSelect(D);
A.cancelBubble=true;
SimileAjax.DOM.cancelEvent(A);
return false;
};
Timeline.CompactEventPainter.prototype._onClickInstantEvent=function(C,A,B){var D=SimileAjax.DOM.getPageCoordinates(C);
this._showBubble(D.left+Math.ceil(C.offsetWidth/2),D.top+Math.ceil(C.offsetHeight/2),[B]);
this._fireOnSelect([B.getID()]);
A.cancelBubble=true;
SimileAjax.DOM.cancelEvent(A);
return false;
};
Timeline.CompactEventPainter.prototype._onClickDurationEvent=function(F,B,C){if("pageX" in B){var A=B.pageX;
var E=B.pageY;
}else{var D=SimileAjax.DOM.getPageCoordinates(F);
var A=B.offsetX+D.left;
var E=B.offsetY+D.top;
}this._showBubble(A,E,[C]);
this._fireOnSelect([C.getID()]);
B.cancelBubble=true;
SimileAjax.DOM.cancelEvent(B);
return false;
};
Timeline.CompactEventPainter.prototype.showBubble=function(A){var B=this._eventIdToElmt[A.getID()];
if(B){var C=SimileAjax.DOM.getPageCoordinates(B);
this._showBubble(C.left+B.offsetWidth/2,C.top+B.offsetHeight/2,[A]);
}};
Timeline.CompactEventPainter.prototype._showBubble=function(A,F,B){var E=document.createElement("div");
B=("fillInfoBubble" in B)?[B]:B;
for(var D=0;
D<B.length;
D++){var C=document.createElement("div");
E.appendChild(C);
B[D].fillInfoBubble(C,this._params.theme,this._band.getLabeller());
}SimileAjax.WindowManager.cancelPopups();
SimileAjax.Graphics.createBubbleForContentAndPoint(E,A,F,this._params.theme.event.bubble.width);
};
Timeline.CompactEventPainter.prototype._fireOnSelect=function(B){for(var A=0;
A<this._onSelectListeners.length;
A++){this._onSelectListeners[A](B);
}};


/* decorators.js */
Timeline.SpanHighlightDecorator=function(A){this._unit=A.unit!=null?A.unit:SimileAjax.NativeDateUnit;
this._startDate=(typeof A.startDate=="string")?this._unit.parseFromObject(A.startDate):A.startDate;
this._endDate=(typeof A.endDate=="string")?this._unit.parseFromObject(A.endDate):A.endDate;
this._startLabel=A.startLabel!=null?A.startLabel:"";
this._endLabel=A.endLabel!=null?A.endLabel:"";
this._color=A.color;
this._cssClass=A.cssClass!=null?A.cssClass:null;
this._opacity=A.opacity!=null?A.opacity:100;
this._zIndex=(A.inFront!=null&&A.inFront)?113:10;
};
Timeline.SpanHighlightDecorator.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._layerDiv=null;
};
Timeline.SpanHighlightDecorator.prototype.paint=function(){if(this._layerDiv!=null){this._band.removeLayerDiv(this._layerDiv);
}this._layerDiv=this._band.createLayerDiv(this._zIndex);
this._layerDiv.setAttribute("name","span-highlight-decorator");
this._layerDiv.style.display="none";
var E=this._band.getMinDate();
var A=this._band.getMaxDate();
if(this._unit.compare(this._startDate,A)<0&&this._unit.compare(this._endDate,E)>0){E=this._unit.later(E,this._startDate);
A=this._unit.earlier(A,this._endDate);
var F=this._band.dateToPixelOffset(E);
var I=this._band.dateToPixelOffset(A);
var H=this._timeline.getDocument();
var K=function(){var L=H.createElement("table");
L.insertRow(0).insertCell(0);
return L;
};
var B=H.createElement("div");
B.className="timeline-highlight-decorator";
if(this._cssClass){B.className+=" "+this._cssClass;
}if(this._color!=null){B.style.backgroundColor=this._color;
}if(this._opacity<100){SimileAjax.Graphics.setOpacity(B,this._opacity);
}this._layerDiv.appendChild(B);
var J=K();
J.className="timeline-highlight-label timeline-highlight-label-start";
var C=J.rows[0].cells[0];
C.innerHTML=this._startLabel;
if(this._cssClass){C.className="label_"+this._cssClass;
}this._layerDiv.appendChild(J);
var G=K();
G.className="timeline-highlight-label timeline-highlight-label-end";
var D=G.rows[0].cells[0];
D.innerHTML=this._endLabel;
if(this._cssClass){D.className="label_"+this._cssClass;
}this._layerDiv.appendChild(G);
if(this._timeline.isHorizontal()){B.style.left=F+"px";
B.style.width=(I-F)+"px";
J.style.right=(this._band.getTotalViewLength()-F)+"px";
J.style.width=(this._startLabel.length)+"em";
G.style.left=I+"px";
G.style.width=(this._endLabel.length)+"em";
}else{B.style.top=F+"px";
B.style.height=(I-F)+"px";
J.style.bottom=F+"px";
J.style.height="1.5px";
G.style.top=I+"px";
G.style.height="1.5px";
}}this._layerDiv.style.display="block";
};
Timeline.SpanHighlightDecorator.prototype.softPaint=function(){};
Timeline.PointHighlightDecorator=function(A){this._unit=A.unit!=null?A.unit:SimileAjax.NativeDateUnit;
this._date=(typeof A.date=="string")?this._unit.parseFromObject(A.date):A.date;
this._width=A.width!=null?A.width:10;
this._color=A.color;
this._cssClass=A.cssClass!=null?A.cssClass:"";
this._opacity=A.opacity!=null?A.opacity:100;
};
Timeline.PointHighlightDecorator.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._layerDiv=null;
};
Timeline.PointHighlightDecorator.prototype.paint=function(){if(this._layerDiv!=null){this._band.removeLayerDiv(this._layerDiv);
}this._layerDiv=this._band.createLayerDiv(10);
this._layerDiv.setAttribute("name","span-highlight-decorator");
this._layerDiv.style.display="none";
var C=this._band.getMinDate();
var E=this._band.getMaxDate();
if(this._unit.compare(this._date,E)<0&&this._unit.compare(this._date,C)>0){var A=this._band.dateToPixelOffset(this._date);
var B=A-Math.round(this._width/2);
var D=this._timeline.getDocument();
var F=D.createElement("div");
F.className="timeline-highlight-point-decorator";
F.className+=" "+this._cssClass;
if(this._color!=null){F.style.backgroundColor=this._color;
}if(this._opacity<100){SimileAjax.Graphics.setOpacity(F,this._opacity);
}this._layerDiv.appendChild(F);
if(this._timeline.isHorizontal()){F.style.left=B+"px";
F.style.width=this._width;
}else{F.style.top=B+"px";
F.style.height=this._width;
}}this._layerDiv.style.display="block";
};
Timeline.PointHighlightDecorator.prototype.softPaint=function(){};


/* detailed-painter.js */
Timeline.DetailedEventPainter=function(A){this._params=A;
this._onSelectListeners=[];
this._filterMatcher=null;
this._highlightMatcher=null;
this._frc=null;
this._eventIdToElmt={};
};
Timeline.DetailedEventPainter.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._backLayer=null;
this._eventLayer=null;
this._lineLayer=null;
this._highlightLayer=null;
this._eventIdToElmt=null;
};
Timeline.DetailedEventPainter.prototype.getType=function(){return"detailed";
};
Timeline.DetailedEventPainter.prototype.addOnSelectListener=function(A){this._onSelectListeners.push(A);
};
Timeline.DetailedEventPainter.prototype.removeOnSelectListener=function(B){for(var A=0;
A<this._onSelectListeners.length;
A++){if(this._onSelectListeners[A]==B){this._onSelectListeners.splice(A,1);
break;
}}};
Timeline.DetailedEventPainter.prototype.getFilterMatcher=function(){return this._filterMatcher;
};
Timeline.DetailedEventPainter.prototype.setFilterMatcher=function(A){this._filterMatcher=A;
};
Timeline.DetailedEventPainter.prototype.getHighlightMatcher=function(){return this._highlightMatcher;
};
Timeline.DetailedEventPainter.prototype.setHighlightMatcher=function(A){this._highlightMatcher=A;
};
Timeline.DetailedEventPainter.prototype.paint=function(){var C=this._band.getEventSource();
if(C==null){return ;
}this._eventIdToElmt={};
this._prepareForPainting();
var I=this._params.theme.event;
var G=Math.max(I.track.height,this._frc.getLineHeight());
var F={trackOffset:Math.round(this._band.getViewWidth()/2-G/2),trackHeight:G,trackGap:I.track.gap,trackIncrement:G+I.track.gap,icon:I.instant.icon,iconWidth:I.instant.iconWidth,iconHeight:I.instant.iconHeight,labelWidth:I.label.width};
var D=this._band.getMinDate();
var B=this._band.getMaxDate();
var J=(this._filterMatcher!=null)?this._filterMatcher:function(K){return true;
};
var A=(this._highlightMatcher!=null)?this._highlightMatcher:function(K){return -1;
};
var E=C.getEventReverseIterator(D,B);
while(E.hasNext()){var H=E.next();
if(J(H)){this.paintEvent(H,F,this._params.theme,A(H));
}}this._highlightLayer.style.display="block";
this._lineLayer.style.display="block";
this._eventLayer.style.display="block";
this._band.updateEventTrackInfo(this._lowerTracks.length+this._upperTracks.length,F.trackIncrement);
};
Timeline.DetailedEventPainter.prototype.softPaint=function(){};
Timeline.DetailedEventPainter.prototype._prepareForPainting=function(){var B=this._band;
if(this._backLayer==null){this._backLayer=this._band.createLayerDiv(0,"timeline-band-events");
this._backLayer.style.visibility="hidden";
var A=document.createElement("span");
A.className="timeline-event-label";
this._backLayer.appendChild(A);
this._frc=SimileAjax.Graphics.getFontRenderingContext(A);
}this._frc.update();
this._lowerTracks=[];
this._upperTracks=[];
if(this._highlightLayer!=null){B.removeLayerDiv(this._highlightLayer);
}this._highlightLayer=B.createLayerDiv(105,"timeline-band-highlights");
this._highlightLayer.style.display="none";
if(this._lineLayer!=null){B.removeLayerDiv(this._lineLayer);
}this._lineLayer=B.createLayerDiv(110,"timeline-band-lines");
this._lineLayer.style.display="none";
if(this._eventLayer!=null){B.removeLayerDiv(this._eventLayer);
}this._eventLayer=B.createLayerDiv(110,"timeline-band-events");
this._eventLayer.style.display="none";
};
Timeline.DetailedEventPainter.prototype.paintEvent=function(B,C,D,A){if(B.isInstant()){this.paintInstantEvent(B,C,D,A);
}else{this.paintDurationEvent(B,C,D,A);
}};
Timeline.DetailedEventPainter.prototype.paintInstantEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseInstantEvent(B,C,D,A);
}else{this.paintPreciseInstantEvent(B,C,D,A);
}};
Timeline.DetailedEventPainter.prototype.paintDurationEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseDurationEvent(B,C,D,A);
}else{this.paintPreciseDurationEvent(B,C,D,A);
}};
Timeline.DetailedEventPainter.prototype.paintPreciseInstantEvent=function(L,P,S,Q){var T=this._timeline.getDocument();
var J=L.getText();
var G=L.getStart();
var H=Math.round(this._band.dateToPixelOffset(G));
var A=Math.round(H+P.iconWidth/2);
var C=Math.round(H-P.iconWidth/2);
var E=this._frc.computeSize(J);
var F=this._findFreeTrackForSolid(A,H);
var B=this._paintEventIcon(L,F,C,P,S);
var K=A+S.event.label.offsetFromLine;
var O=F;
var D=this._getTrackData(F);
if(Math.min(D.solid,D.text)>=K+E.width){D.solid=C;
D.text=K;
}else{D.solid=C;
K=H+S.event.label.offsetFromLine;
O=this._findFreeTrackForText(F,K+E.width,function(U){U.line=H-2;
});
this._getTrackData(O).text=C;
this._paintEventLine(L,H,F,O,P,S);
}var N=Math.round(P.trackOffset+O*P.trackIncrement+P.trackHeight/2-E.height/2);
var R=this._paintEventLabel(L,J,K,N,E.width,E.height,S);
var M=this;
var I=function(V,U,W){return M._onClickInstantEvent(B.elmt,U,L);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",I);
SimileAjax.DOM.registerEvent(R.elmt,"mousedown",I);
this._createHighlightDiv(Q,B,S);
this._eventIdToElmt[L.getID()]=B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseInstantEvent=function(O,S,W,T){var X=this._timeline.getDocument();
var M=O.getText();
var I=O.getStart();
var U=O.getEnd();
var K=Math.round(this._band.dateToPixelOffset(I));
var B=Math.round(this._band.dateToPixelOffset(U));
var A=Math.round(K+S.iconWidth/2);
var D=Math.round(K-S.iconWidth/2);
var G=this._frc.computeSize(M);
var H=this._findFreeTrackForSolid(B,K);
var E=this._paintEventTape(O,H,K,B,W.event.instant.impreciseColor,W.event.instant.impreciseOpacity,S,W);
var C=this._paintEventIcon(O,H,D,S,W);
var F=this._getTrackData(H);
F.solid=D;
var N=A+W.event.label.offsetFromLine;
var J=N+G.width;
var R;
if(J<B){R=H;
}else{N=K+W.event.label.offsetFromLine;
J=N+G.width;
R=this._findFreeTrackForText(H,J,function(Y){Y.line=K-2;
});
this._getTrackData(R).text=D;
this._paintEventLine(O,K,H,R,S,W);
}var Q=Math.round(S.trackOffset+R*S.trackIncrement+S.trackHeight/2-G.height/2);
var V=this._paintEventLabel(O,M,N,Q,G.width,G.height,W);
var P=this;
var L=function(Z,Y,a){return P._onClickInstantEvent(C.elmt,Y,O);
};
SimileAjax.DOM.registerEvent(C.elmt,"mousedown",L);
SimileAjax.DOM.registerEvent(E.elmt,"mousedown",L);
SimileAjax.DOM.registerEvent(V.elmt,"mousedown",L);
this._createHighlightDiv(T,C,W);
this._eventIdToElmt[O.getID()]=C.elmt;
};
Timeline.DetailedEventPainter.prototype.paintPreciseDurationEvent=function(K,O,T,Q){var U=this._timeline.getDocument();
var I=K.getText();
var E=K.getStart();
var R=K.getEnd();
var F=Math.round(this._band.dateToPixelOffset(E));
var A=Math.round(this._band.dateToPixelOffset(R));
var C=this._frc.computeSize(I);
var D=this._findFreeTrackForSolid(A);
var P=K.getColor();
P=P!=null?P:T.event.duration.color;
var B=this._paintEventTape(K,D,F,A,P,100,O,T);
var H=this._getTrackData(D);
H.solid=F;
var J=F+T.event.label.offsetFromLine;
var N=this._findFreeTrackForText(D,J+C.width,function(V){V.line=F-2;
});
this._getTrackData(N).text=F-2;
this._paintEventLine(K,F,D,N,O,T);
var M=Math.round(O.trackOffset+N*O.trackIncrement+O.trackHeight/2-C.height/2);
var S=this._paintEventLabel(K,I,J,M,C.width,C.height,T);
var L=this;
var G=function(W,V,X){return L._onClickDurationEvent(B.elmt,V,K);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",G);
SimileAjax.DOM.registerEvent(S.elmt,"mousedown",G);
this._createHighlightDiv(Q,B,T);
this._eventIdToElmt[K.getID()]=B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseDurationEvent=function(M,T,Y,V){var Z=this._timeline.getDocument();
var K=M.getText();
var G=M.getStart();
var S=M.getLatestStart();
var W=M.getEnd();
var O=M.getEarliestEnd();
var H=Math.round(this._band.dateToPixelOffset(G));
var E=Math.round(this._band.dateToPixelOffset(S));
var A=Math.round(this._band.dateToPixelOffset(W));
var F=Math.round(this._band.dateToPixelOffset(O));
var C=this._frc.computeSize(K);
var D=this._findFreeTrackForSolid(A);
var U=M.getColor();
U=U!=null?U:Y.event.duration.color;
var R=this._paintEventTape(M,D,H,A,Y.event.duration.impreciseColor,Y.event.duration.impreciseOpacity,T,Y);
var B=this._paintEventTape(M,D,E,F,U,100,T,Y);
var J=this._getTrackData(D);
J.solid=H;
var L=E+Y.event.label.offsetFromLine;
var Q=this._findFreeTrackForText(D,L+C.width,function(a){a.line=E-2;
});
this._getTrackData(Q).text=E-2;
this._paintEventLine(M,E,D,Q,T,Y);
var P=Math.round(T.trackOffset+Q*T.trackIncrement+T.trackHeight/2-C.height/2);
var X=this._paintEventLabel(M,K,L,P,C.width,C.height,Y);
var N=this;
var I=function(b,a,c){return N._onClickDurationEvent(B.elmt,a,M);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",I);
SimileAjax.DOM.registerEvent(X.elmt,"mousedown",I);
this._createHighlightDiv(V,B,Y);
this._eventIdToElmt[M.getID()]=B.elmt;
};
Timeline.DetailedEventPainter.prototype._findFreeTrackForSolid=function(D,A){for(var C=0;
true;
C++){if(C<this._lowerTracks.length){var B=this._lowerTracks[C];
if(Math.min(B.solid,B.text)>D&&(!(A)||B.line>A)){return C;
}}else{this._lowerTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
return C;
}if(C<this._upperTracks.length){var B=this._upperTracks[C];
if(Math.min(B.solid,B.text)>D&&(!(A)||B.line>A)){return -1-C;
}}else{this._upperTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
return -1-C;
}}};
Timeline.DetailedEventPainter.prototype._findFreeTrackForText=function(C,A,I){var B;
var E;
var F;
var H;
if(C<0){B=true;
F=-C;
E=this._findFreeUpperTrackForText(F,A);
H=-1-E;
}else{if(C>0){B=false;
F=C+1;
E=this._findFreeLowerTrackForText(F,A);
H=E;
}else{var G=this._findFreeUpperTrackForText(0,A);
var J=this._findFreeLowerTrackForText(1,A);
if(J-1<=G){B=false;
F=1;
E=J;
H=E;
}else{B=true;
F=0;
E=G;
H=-1-E;
}}}if(B){if(E==this._upperTracks.length){this._upperTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
}for(var D=F;
D<E;
D++){I(this._upperTracks[D]);
}}else{if(E==this._lowerTracks.length){this._lowerTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
}for(var D=F;
D<E;
D++){I(this._lowerTracks[D]);
}}return H;
};
Timeline.DetailedEventPainter.prototype._findFreeLowerTrackForText=function(A,C){for(;
A<this._lowerTracks.length;
A++){var B=this._lowerTracks[A];
if(Math.min(B.solid,B.text)>=C){break;
}}return A;
};
Timeline.DetailedEventPainter.prototype._findFreeUpperTrackForText=function(A,C){for(;
A<this._upperTracks.length;
A++){var B=this._upperTracks[A];
if(Math.min(B.solid,B.text)>=C){break;
}}return A;
};
Timeline.DetailedEventPainter.prototype._getTrackData=function(A){return(A<0)?this._upperTracks[-A-1]:this._lowerTracks[A];
};
Timeline.DetailedEventPainter.prototype._paintEventLine=function(J,E,D,A,G,F){var H=Math.round(G.trackOffset+D*G.trackIncrement+G.trackHeight/2);
var I=Math.round(Math.abs(A-D)*G.trackIncrement);
var C="1px solid "+F.event.label.lineColor;
var B=this._timeline.getDocument().createElement("div");
B.style.position="absolute";
B.style.left=E+"px";
B.style.width=F.event.label.offsetFromLine+"px";
B.style.height=I+"px";
if(D>A){B.style.top=(H-I)+"px";
B.style.borderTop=C;
}else{B.style.top=H+"px";
B.style.borderBottom=C;
}B.style.borderLeft=C;
this._lineLayer.appendChild(B);
};
Timeline.DetailedEventPainter.prototype._paintEventIcon=function(J,B,C,F,E){var H=J.getIcon();
H=H!=null?H:F.icon;
var G=F.trackOffset+B*F.trackIncrement+F.trackHeight/2;
var I=Math.round(G-F.iconHeight/2);
var D=SimileAjax.Graphics.createTranslucentImage(H);
var A=this._timeline.getDocument().createElement("div");
A.style.position="absolute";
A.style.left=C+"px";
A.style.top=I+"px";
A.appendChild(D);
A.style.cursor="pointer";
if(J._title!=null){A.title=J._title;
}this._eventLayer.appendChild(A);
return{left:C,top:I,width:F.iconWidth,height:F.iconHeight,elmt:A};
};
Timeline.DetailedEventPainter.prototype._paintEventLabel=function(I,J,C,F,A,G,E){var H=this._timeline.getDocument();
var K=H.createElement("div");
K.style.position="absolute";
K.style.left=C+"px";
K.style.width=A+"px";
K.style.top=F+"px";
K.style.height=G+"px";
K.style.backgroundColor=E.event.label.backgroundColor;
SimileAjax.Graphics.setOpacity(K,E.event.label.backgroundOpacity);
this._eventLayer.appendChild(K);
var B=H.createElement("div");
B.style.position="absolute";
B.style.left=C+"px";
B.style.width=A+"px";
B.style.top=F+"px";
B.innerHTML=J;
B.style.cursor="pointer";
if(I._title!=null){B.title=I._title;
}var D=I.getTextColor();
if(D==null){D=I.getColor();
}if(D!=null){B.style.color=D;
}this._eventLayer.appendChild(B);
return{left:C,top:F,width:A,height:G,elmt:B};
};
Timeline.DetailedEventPainter.prototype._paintEventTape=function(L,B,D,A,G,C,I,H){var F=A-D;
var E=H.event.tape.height;
var K=I.trackOffset+B*I.trackIncrement+I.trackHeight/2;
var J=Math.round(K-E/2);
var M=this._timeline.getDocument().createElement("div");
M.style.position="absolute";
M.style.left=D+"px";
M.style.width=F+"px";
M.style.top=J+"px";
M.style.height=E+"px";
M.style.backgroundColor=G;
M.style.overflow="hidden";
M.style.cursor="pointer";
if(L._title!=null){M.title=L._title;
}SimileAjax.Graphics.setOpacity(M,C);
this._eventLayer.appendChild(M);
return{left:D,top:J,width:F,height:E,elmt:M};
};
Timeline.DetailedEventPainter.prototype._createHighlightDiv=function(A,C,E){if(A>=0){var D=this._timeline.getDocument();
var G=E.event;
var B=G.highlightColors[Math.min(A,G.highlightColors.length-1)];
var F=D.createElement("div");
F.style.position="absolute";
F.style.overflow="hidden";
F.style.left=(C.left-2)+"px";
F.style.width=(C.width+4)+"px";
F.style.top=(C.top-2)+"px";
F.style.height=(C.height+4)+"px";
F.style.background=B;
this._highlightLayer.appendChild(F);
}};
Timeline.DetailedEventPainter.prototype._onClickInstantEvent=function(C,A,B){var D=SimileAjax.DOM.getPageCoordinates(C);
this._showBubble(D.left+Math.ceil(C.offsetWidth/2),D.top+Math.ceil(C.offsetHeight/2),B);
this._fireOnSelect(B.getID());
A.cancelBubble=true;
SimileAjax.DOM.cancelEvent(A);
return false;
};
Timeline.DetailedEventPainter.prototype._onClickDurationEvent=function(F,B,C){if("pageX" in B){var A=B.pageX;
var E=B.pageY;
}else{var D=SimileAjax.DOM.getPageCoordinates(F);
var A=B.offsetX+D.left;
var E=B.offsetY+D.top;
}this._showBubble(A,E,C);
this._fireOnSelect(C.getID());
B.cancelBubble=true;
SimileAjax.DOM.cancelEvent(B);
return false;
};
Timeline.DetailedEventPainter.prototype.showBubble=function(A){var B=this._eventIdToElmt[A.getID()];
if(B){var C=SimileAjax.DOM.getPageCoordinates(B);
this._showBubble(C.left+B.offsetWidth/2,C.top+B.offsetHeight/2,A);
}};
Timeline.DetailedEventPainter.prototype._showBubble=function(B,E,C){var D=document.createElement("div");
var A=this._params.theme.event.bubble;
C.fillInfoBubble(D,this._params.theme,this._band.getLabeller());
SimileAjax.WindowManager.cancelPopups();
SimileAjax.Graphics.createBubbleForContentAndPoint(D,B,E,A.width,null,A.maxHeight);
};
Timeline.DetailedEventPainter.prototype._fireOnSelect=function(A){for(var B=0;
B<this._onSelectListeners.length;
B++){this._onSelectListeners[B](A);
}};


/* ether-painters.js */
Timeline.GregorianEtherPainter=function(A){this._params=A;
this._theme=A.theme;
this._unit=A.unit;
this._multiple=("multiple" in A)?A.multiple:1;
};
Timeline.GregorianEtherPainter.prototype.initialize=function(C,B){this._band=C;
this._timeline=B;
this._backgroundLayer=C.createLayerDiv(0);
this._backgroundLayer.setAttribute("name","ether-background");
this._backgroundLayer.className="timeline-ether-bg";
this._markerLayer=null;
this._lineLayer=null;
var D=("align" in this._params&&this._params.align!=undefined)?this._params.align:this._theme.ether.interval.marker[B.isHorizontal()?"hAlign":"vAlign"];
var A=("showLine" in this._params)?this._params.showLine:this._theme.ether.interval.line.show;
this._intervalMarkerLayout=new Timeline.EtherIntervalMarkerLayout(this._timeline,this._band,this._theme,D,A);
this._highlight=new Timeline.EtherHighlight(this._timeline,this._band,this._theme,this._backgroundLayer);
};
Timeline.GregorianEtherPainter.prototype.setHighlight=function(A,B){this._highlight.position(A,B);
};
Timeline.GregorianEtherPainter.prototype.paint=function(){if(this._markerLayer){this._band.removeLayerDiv(this._markerLayer);
}this._markerLayer=this._band.createLayerDiv(100);
this._markerLayer.setAttribute("name","ether-markers");
this._markerLayer.style.display="none";
if(this._lineLayer){this._band.removeLayerDiv(this._lineLayer);
}this._lineLayer=this._band.createLayerDiv(1);
this._lineLayer.setAttribute("name","ether-lines");
this._lineLayer.style.display="none";
var C=this._band.getMinDate();
var F=this._band.getMaxDate();
var A=this._band.getTimeZone();
var E=this._band.getLabeller();
SimileAjax.DateTime.roundDownToInterval(C,this._unit,A,this._multiple,this._theme.firstDayOfWeek);
var D=this;
var B=function(G){for(var H=0;
H<D._multiple;
H++){SimileAjax.DateTime.incrementByInterval(G,D._unit);
}};
while(C.getTime()<F.getTime()){this._intervalMarkerLayout.createIntervalMarker(C,E,this._unit,this._markerLayer,this._lineLayer);
B(C);
}this._markerLayer.style.display="block";
this._lineLayer.style.display="block";
};
Timeline.GregorianEtherPainter.prototype.softPaint=function(){};
Timeline.GregorianEtherPainter.prototype.zoom=function(A){if(A!=0){this._unit+=A;
}};
Timeline.HotZoneGregorianEtherPainter=function(G){this._params=G;
this._theme=G.theme;
this._zones=[{startTime:Number.NEGATIVE_INFINITY,endTime:Number.POSITIVE_INFINITY,unit:G.unit,multiple:1}];
for(var F=0;
F<G.zones.length;
F++){var C=G.zones[F];
var E=SimileAjax.DateTime.parseGregorianDateTime(C.start).getTime();
var B=SimileAjax.DateTime.parseGregorianDateTime(C.end).getTime();
for(var D=0;
D<this._zones.length&&B>E;
D++){var A=this._zones[D];
if(E<A.endTime){if(E>A.startTime){this._zones.splice(D,0,{startTime:A.startTime,endTime:E,unit:A.unit,multiple:A.multiple});
D++;
A.startTime=E;
}if(B<A.endTime){this._zones.splice(D,0,{startTime:E,endTime:B,unit:C.unit,multiple:(C.multiple)?C.multiple:1});
D++;
A.startTime=B;
E=B;
}else{A.multiple=C.multiple;
A.unit=C.unit;
E=A.endTime;
}}}}};
Timeline.HotZoneGregorianEtherPainter.prototype.initialize=function(C,B){this._band=C;
this._timeline=B;
this._backgroundLayer=C.createLayerDiv(0);
this._backgroundLayer.setAttribute("name","ether-background");
this._backgroundLayer.className="timeline-ether-bg";
this._markerLayer=null;
this._lineLayer=null;
var D=("align" in this._params&&this._params.align!=undefined)?this._params.align:this._theme.ether.interval.marker[B.isHorizontal()?"hAlign":"vAlign"];
var A=("showLine" in this._params)?this._params.showLine:this._theme.ether.interval.line.show;
this._intervalMarkerLayout=new Timeline.EtherIntervalMarkerLayout(this._timeline,this._band,this._theme,D,A);
this._highlight=new Timeline.EtherHighlight(this._timeline,this._band,this._theme,this._backgroundLayer);
};
Timeline.HotZoneGregorianEtherPainter.prototype.setHighlight=function(A,B){this._highlight.position(A,B);
};
Timeline.HotZoneGregorianEtherPainter.prototype.paint=function(){if(this._markerLayer){this._band.removeLayerDiv(this._markerLayer);
}this._markerLayer=this._band.createLayerDiv(100);
this._markerLayer.setAttribute("name","ether-markers");
this._markerLayer.style.display="none";
if(this._lineLayer){this._band.removeLayerDiv(this._lineLayer);
}this._lineLayer=this._band.createLayerDiv(1);
this._lineLayer.setAttribute("name","ether-lines");
this._lineLayer.style.display="none";
var C=this._band.getMinDate();
var A=this._band.getMaxDate();
var I=this._band.getTimeZone();
var L=this._band.getLabeller();
var B=this;
var J=function(N,M){for(var O=0;
O<M.multiple;
O++){SimileAjax.DateTime.incrementByInterval(N,M.unit);
}};
var D=0;
while(D<this._zones.length){if(C.getTime()<this._zones[D].endTime){break;
}D++;
}var E=this._zones.length-1;
while(E>=0){if(A.getTime()>this._zones[E].startTime){break;
}E--;
}for(var H=D;
H<=E;
H++){var G=this._zones[H];
var K=new Date(Math.max(C.getTime(),G.startTime));
var F=new Date(Math.min(A.getTime(),G.endTime));
SimileAjax.DateTime.roundDownToInterval(K,G.unit,I,G.multiple,this._theme.firstDayOfWeek);
SimileAjax.DateTime.roundUpToInterval(F,G.unit,I,G.multiple,this._theme.firstDayOfWeek);
while(K.getTime()<F.getTime()){this._intervalMarkerLayout.createIntervalMarker(K,L,G.unit,this._markerLayer,this._lineLayer);
J(K,G);
}}this._markerLayer.style.display="block";
this._lineLayer.style.display="block";
};
Timeline.HotZoneGregorianEtherPainter.prototype.softPaint=function(){};
Timeline.HotZoneGregorianEtherPainter.prototype.zoom=function(A){if(A!=0){for(var B=0;
B<this._zones.length;
++B){if(this._zones[B]){this._zones[B].unit+=A;
}}}};
Timeline.YearCountEtherPainter=function(A){this._params=A;
this._theme=A.theme;
this._startDate=SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
this._multiple=("multiple" in A)?A.multiple:1;
};
Timeline.YearCountEtherPainter.prototype.initialize=function(C,B){this._band=C;
this._timeline=B;
this._backgroundLayer=C.createLayerDiv(0);
this._backgroundLayer.setAttribute("name","ether-background");
this._backgroundLayer.className="timeline-ether-bg";
this._markerLayer=null;
this._lineLayer=null;
var D=("align" in this._params)?this._params.align:this._theme.ether.interval.marker[B.isHorizontal()?"hAlign":"vAlign"];
var A=("showLine" in this._params)?this._params.showLine:this._theme.ether.interval.line.show;
this._intervalMarkerLayout=new Timeline.EtherIntervalMarkerLayout(this._timeline,this._band,this._theme,D,A);
this._highlight=new Timeline.EtherHighlight(this._timeline,this._band,this._theme,this._backgroundLayer);
};
Timeline.YearCountEtherPainter.prototype.setHighlight=function(A,B){this._highlight.position(A,B);
};
Timeline.YearCountEtherPainter.prototype.paint=function(){if(this._markerLayer){this._band.removeLayerDiv(this._markerLayer);
}this._markerLayer=this._band.createLayerDiv(100);
this._markerLayer.setAttribute("name","ether-markers");
this._markerLayer.style.display="none";
if(this._lineLayer){this._band.removeLayerDiv(this._lineLayer);
}this._lineLayer=this._band.createLayerDiv(1);
this._lineLayer.setAttribute("name","ether-lines");
this._lineLayer.style.display="none";
var B=new Date(this._startDate.getTime());
var F=this._band.getMaxDate();
var E=this._band.getMinDate().getUTCFullYear()-this._startDate.getUTCFullYear();
B.setUTCFullYear(this._band.getMinDate().getUTCFullYear()-E%this._multiple);
var C=this;
var A=function(G){for(var H=0;
H<C._multiple;
H++){SimileAjax.DateTime.incrementByInterval(G,SimileAjax.DateTime.YEAR);
}};
var D={labelInterval:function(G,I){var H=G.getUTCFullYear()-C._startDate.getUTCFullYear();
return{text:H,emphasized:H==0};
}};
while(B.getTime()<F.getTime()){this._intervalMarkerLayout.createIntervalMarker(B,D,SimileAjax.DateTime.YEAR,this._markerLayer,this._lineLayer);
A(B);
}this._markerLayer.style.display="block";
this._lineLayer.style.display="block";
};
Timeline.YearCountEtherPainter.prototype.softPaint=function(){};
Timeline.QuarterlyEtherPainter=function(A){this._params=A;
this._theme=A.theme;
this._startDate=SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
};
Timeline.QuarterlyEtherPainter.prototype.initialize=function(C,B){this._band=C;
this._timeline=B;
this._backgroundLayer=C.createLayerDiv(0);
this._backgroundLayer.setAttribute("name","ether-background");
this._backgroundLayer.className="timeline-ether-bg";
this._markerLayer=null;
this._lineLayer=null;
var D=("align" in this._params)?this._params.align:this._theme.ether.interval.marker[B.isHorizontal()?"hAlign":"vAlign"];
var A=("showLine" in this._params)?this._params.showLine:this._theme.ether.interval.line.show;
this._intervalMarkerLayout=new Timeline.EtherIntervalMarkerLayout(this._timeline,this._band,this._theme,D,A);
this._highlight=new Timeline.EtherHighlight(this._timeline,this._band,this._theme,this._backgroundLayer);
};
Timeline.QuarterlyEtherPainter.prototype.setHighlight=function(A,B){this._highlight.position(A,B);
};
Timeline.QuarterlyEtherPainter.prototype.paint=function(){if(this._markerLayer){this._band.removeLayerDiv(this._markerLayer);
}this._markerLayer=this._band.createLayerDiv(100);
this._markerLayer.setAttribute("name","ether-markers");
this._markerLayer.style.display="none";
if(this._lineLayer){this._band.removeLayerDiv(this._lineLayer);
}this._lineLayer=this._band.createLayerDiv(1);
this._lineLayer.setAttribute("name","ether-lines");
this._lineLayer.style.display="none";
var B=new Date(0);
var E=this._band.getMaxDate();
B.setUTCFullYear(Math.max(this._startDate.getUTCFullYear(),this._band.getMinDate().getUTCFullYear()));
B.setUTCMonth(this._startDate.getUTCMonth());
var C=this;
var A=function(F){F.setUTCMonth(F.getUTCMonth()+3);
};
var D={labelInterval:function(G,H){var F=(4+(G.getUTCMonth()-C._startDate.getUTCMonth())/3)%4;
if(F!=0){return{text:"Q"+(F+1),emphasized:false};
}else{return{text:"Y"+(G.getUTCFullYear()-C._startDate.getUTCFullYear()+1),emphasized:true};
}}};
while(B.getTime()<E.getTime()){this._intervalMarkerLayout.createIntervalMarker(B,D,SimileAjax.DateTime.YEAR,this._markerLayer,this._lineLayer);
A(B);
}this._markerLayer.style.display="block";
this._lineLayer.style.display="block";
};
Timeline.QuarterlyEtherPainter.prototype.softPaint=function(){};
Timeline.EtherIntervalMarkerLayout=function(I,L,C,E,M){var A=I.isHorizontal();
if(A){if(E=="Top"){this.positionDiv=function(O,N){O.style.left=N+"px";
O.style.top="0px";
};
}else{this.positionDiv=function(O,N){O.style.left=N+"px";
O.style.bottom="0px";
};
}}else{if(E=="Left"){this.positionDiv=function(O,N){O.style.top=N+"px";
O.style.left="0px";
};
}else{this.positionDiv=function(O,N){O.style.top=N+"px";
O.style.right="0px";
};
}}var D=C.ether.interval.marker;
var K=C.ether.interval.line;
var B=C.ether.interval.weekend;
var H=(A?"h":"v")+E;
var G=D[H+"Styler"];
var J=D[H+"EmphasizedStyler"];
var F=SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.DAY];
this.createIntervalMarker=function(T,c,a,Y,P){var U=Math.round(L.dateToPixelOffset(T));
if(M&&a!=SimileAjax.DateTime.WEEK){var V=I.getDocument().createElement("div");
V.className="timeline-ether-lines";
if(K.opacity<100){SimileAjax.Graphics.setOpacity(V,K.opacity);
}if(A){V.style.left=U+"px";
}else{V.style.top=U+"px";
}P.appendChild(V);
}if(a==SimileAjax.DateTime.WEEK){var N=C.firstDayOfWeek;
var R=new Date(T.getTime()+(6-N-7)*F);
var b=new Date(R.getTime()+2*F);
var Q=Math.round(L.dateToPixelOffset(R));
var S=Math.round(L.dateToPixelOffset(b));
var W=Math.max(1,S-Q);
var X=I.getDocument().createElement("div");
X.className="timeline-ether-weekends";
if(B.opacity<100){SimileAjax.Graphics.setOpacity(X,B.opacity);
}if(A){X.style.left=Q+"px";
X.style.width=W+"px";
}else{X.style.top=Q+"px";
X.style.height=W+"px";
}P.appendChild(X);
}var Z=c.labelInterval(T,a);
var O=I.getDocument().createElement("div");
O.innerHTML=Z.text;
O.className="timeline-date-label";
if(Z.emphasized){O.className+=" timeline-date-label-em";
}this.positionDiv(O,U);
Y.appendChild(O);
return O;
};
};
Timeline.EtherHighlight=function(B,E,D,C){var A=B.isHorizontal();
this._highlightDiv=null;
this._createHighlightDiv=function(){if(this._highlightDiv==null){this._highlightDiv=B.getDocument().createElement("div");
this._highlightDiv.setAttribute("name","ether-highlight");
this._highlightDiv.className="timeline-ether-highlight";
var F=D.ether.highlightOpacity;
if(F<100){SimileAjax.Graphics.setOpacity(this._highlightDiv,F);
}C.appendChild(this._highlightDiv);
}};
this.position=function(H,J){this._createHighlightDiv();
var I=Math.round(E.dateToPixelOffset(H));
var G=Math.round(E.dateToPixelOffset(J));
var F=Math.max(G-I,3);
if(A){this._highlightDiv.style.left=I+"px";
this._highlightDiv.style.width=F+"px";
this._highlightDiv.style.height=(E.getViewWidth()-4)+"px";
}else{this._highlightDiv.style.top=I+"px";
this._highlightDiv.style.height=F+"px";
this._highlightDiv.style.width=(E.getViewWidth()-4)+"px";
}};
};


/* ethers.js */
Timeline.LinearEther=function(A){this._params=A;
this._interval=A.interval;
this._pixelsPerInterval=A.pixelsPerInterval;
};
Timeline.LinearEther.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._unit=A.getUnit();
if("startsOn" in this._params){this._start=this._unit.parseFromObject(this._params.startsOn);
}else{if("endsOn" in this._params){this._start=this._unit.parseFromObject(this._params.endsOn);
this.shiftPixels(-this._timeline.getPixelLength());
}else{if("centersOn" in this._params){this._start=this._unit.parseFromObject(this._params.centersOn);
this.shiftPixels(-this._timeline.getPixelLength()/2);
}else{this._start=this._unit.makeDefaultValue();
this.shiftPixels(-this._timeline.getPixelLength()/2);
}}}};
Timeline.LinearEther.prototype.setDate=function(A){this._start=this._unit.cloneValue(A);
};
Timeline.LinearEther.prototype.shiftPixels=function(B){var A=this._interval*B/this._pixelsPerInterval;
this._start=this._unit.change(this._start,A);
};
Timeline.LinearEther.prototype.dateToPixelOffset=function(B){var A=this._unit.compare(B,this._start);
return this._pixelsPerInterval*A/this._interval;
};
Timeline.LinearEther.prototype.pixelOffsetToDate=function(B){var A=B*this._interval/this._pixelsPerInterval;
return this._unit.change(this._start,A);
};
Timeline.LinearEther.prototype.zoom=function(D){var A=0;
var B=this._band._zoomIndex;
var C=B;
if(D&&(B>0)){C=B-1;
}if(!D&&(B<(this._band._zoomSteps.length-1))){C=B+1;
}this._band._zoomIndex=C;
this._interval=SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
this._pixelsPerInterval=this._band._zoomSteps[C].pixelsPerInterval;
A=this._band._zoomSteps[C].unit-this._band._zoomSteps[B].unit;
return A;
};
Timeline.HotZoneEther=function(A){this._params=A;
this._interval=A.interval;
this._pixelsPerInterval=A.pixelsPerInterval;
this._theme=A.theme;
};
Timeline.HotZoneEther.prototype.initialize=function(I,H){this._band=I;
this._timeline=H;
this._unit=H.getUnit();
this._zones=[{startTime:Number.NEGATIVE_INFINITY,endTime:Number.POSITIVE_INFINITY,magnify:1}];
var D=this._params;
for(var E=0;
E<D.zones.length;
E++){var G=D.zones[E];
var F=this._unit.parseFromObject(G.start);
var B=this._unit.parseFromObject(G.end);
for(var C=0;
C<this._zones.length&&this._unit.compare(B,F)>0;
C++){var A=this._zones[C];
if(this._unit.compare(F,A.endTime)<0){if(this._unit.compare(F,A.startTime)>0){this._zones.splice(C,0,{startTime:A.startTime,endTime:F,magnify:A.magnify});
C++;
A.startTime=F;
}if(this._unit.compare(B,A.endTime)<0){this._zones.splice(C,0,{startTime:F,endTime:B,magnify:G.magnify*A.magnify});
C++;
A.startTime=B;
F=B;
}else{A.magnify*=G.magnify;
F=A.endTime;
}}}}if("startsOn" in this._params){this._start=this._unit.parseFromObject(this._params.startsOn);
}else{if("endsOn" in this._params){this._start=this._unit.parseFromObject(this._params.endsOn);
this.shiftPixels(-this._timeline.getPixelLength());
}else{if("centersOn" in this._params){this._start=this._unit.parseFromObject(this._params.centersOn);
this.shiftPixels(-this._timeline.getPixelLength()/2);
}else{this._start=this._unit.makeDefaultValue();
this.shiftPixels(-this._timeline.getPixelLength()/2);
}}}};
Timeline.HotZoneEther.prototype.setDate=function(A){this._start=this._unit.cloneValue(A);
};
Timeline.HotZoneEther.prototype.shiftPixels=function(A){this._start=this.pixelOffsetToDate(A);
};
Timeline.HotZoneEther.prototype.dateToPixelOffset=function(A){return this._dateDiffToPixelOffset(this._start,A);
};
Timeline.HotZoneEther.prototype.pixelOffsetToDate=function(A){return this._pixelOffsetToDate(A,this._start);
};
Timeline.HotZoneEther.prototype.zoom=function(D){var A=0;
var B=this._band._zoomIndex;
var C=B;
if(D&&(B>0)){C=B-1;
}if(!D&&(B<(this._band._zoomSteps.length-1))){C=B+1;
}this._band._zoomIndex=C;
this._interval=SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
this._pixelsPerInterval=this._band._zoomSteps[C].pixelsPerInterval;
A=this._band._zoomSteps[C].unit-this._band._zoomSteps[B].unit;
return A;
};
Timeline.HotZoneEther.prototype._dateDiffToPixelOffset=function(H,C){var D=this._getScale();
var I=H;
var B=C;
var E=0;
if(this._unit.compare(I,B)<0){var G=0;
while(G<this._zones.length){if(this._unit.compare(I,this._zones[G].endTime)<0){break;
}G++;
}while(this._unit.compare(I,B)<0){var F=this._zones[G];
var A=this._unit.earlier(B,F.endTime);
E+=(this._unit.compare(A,I)/(D/F.magnify));
I=A;
G++;
}}else{var G=this._zones.length-1;
while(G>=0){if(this._unit.compare(I,this._zones[G].startTime)>0){break;
}G--;
}while(this._unit.compare(I,B)>0){var F=this._zones[G];
var A=this._unit.later(B,F.startTime);
E+=(this._unit.compare(A,I)/(D/F.magnify));
I=A;
G--;
}}return E;
};
Timeline.HotZoneEther.prototype._pixelOffsetToDate=function(E,B){var G=this._getScale();
var D=B;
if(E>0){var F=0;
while(F<this._zones.length){if(this._unit.compare(D,this._zones[F].endTime)<0){break;
}F++;
}while(E>0){var A=this._zones[F];
var H=G/A.magnify;
if(A.endTime==Number.POSITIVE_INFINITY){D=this._unit.change(D,E*H);
E=0;
}else{var C=this._unit.compare(A.endTime,D)/H;
if(C>E){D=this._unit.change(D,E*H);
E=0;
}else{D=A.endTime;
E-=C;
}}F++;
}}else{var F=this._zones.length-1;
while(F>=0){if(this._unit.compare(D,this._zones[F].startTime)>0){break;
}F--;
}E=-E;
while(E>0){var A=this._zones[F];
var H=G/A.magnify;
if(A.startTime==Number.NEGATIVE_INFINITY){D=this._unit.change(D,-E*H);
E=0;
}else{var C=this._unit.compare(D,A.startTime)/H;
if(C>E){D=this._unit.change(D,-E*H);
E=0;
}else{D=A.startTime;
E-=C;
}}F--;
}}return D;
};
Timeline.HotZoneEther.prototype._getScale=function(){return this._interval/this._pixelsPerInterval;
};


/* event-utils.js */
Timeline.EventUtils={};
Timeline.EventUtils.getNewEventID=function(){if(this._lastEventID==null){this._lastEventID=0;
}this._lastEventID+=1;
return"e"+this._lastEventID;
};
Timeline.EventUtils.decodeEventElID=function(C){var D=C.split("-");
if(D[1]!="tl"){alert("Internal Timeline problem 101, please consult support");
return{band:null,evt:null};
}var B=Timeline.getTimelineFromID(D[2]);
var E=B.getBand(D[3]);
var A=E.getEventSource.getEvent(D[4]);
return{band:E,evt:A};
};
Timeline.EventUtils.encodeEventElID=function(B,D,C,A){return C+"-tl-"+B.timelineID+"-"+D.getIndex()+"-"+A.getID();
};


/* labellers.js */
Timeline.GregorianDateLabeller=function(B,A){this._locale=B;
this._timeZone=A;
};
Timeline.GregorianDateLabeller.monthNames=[];
Timeline.GregorianDateLabeller.dayNames=[];
Timeline.GregorianDateLabeller.labelIntervalFunctions=[];
Timeline.GregorianDateLabeller.getMonthName=function(B,A){return Timeline.GregorianDateLabeller.monthNames[A][B];
};
Timeline.GregorianDateLabeller.prototype.labelInterval=function(A,C){var B=Timeline.GregorianDateLabeller.labelIntervalFunctions[this._locale];
if(B==null){B=Timeline.GregorianDateLabeller.prototype.defaultLabelInterval;
}return B.call(this,A,C);
};
Timeline.GregorianDateLabeller.prototype.labelPrecise=function(A){return SimileAjax.DateTime.removeTimeZoneOffset(A,this._timeZone).toUTCString();
};
Timeline.GregorianDateLabeller.prototype.defaultLabelInterval=function(B,C){var D;
var F=false;
B=SimileAjax.DateTime.removeTimeZoneOffset(B,this._timeZone);
switch(C){case SimileAjax.DateTime.MILLISECOND:D=B.getUTCMilliseconds();
break;
case SimileAjax.DateTime.SECOND:D=B.getUTCSeconds();
break;
case SimileAjax.DateTime.MINUTE:var A=B.getUTCMinutes();
if(A==0){D=B.getUTCHours()+":00";
F=true;
}else{D=A;
}break;
case SimileAjax.DateTime.HOUR:D=B.getUTCHours()+"hr";
break;
case SimileAjax.DateTime.DAY:D=Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(),this._locale)+" "+B.getUTCDate();
break;
case SimileAjax.DateTime.WEEK:D=Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(),this._locale)+" "+B.getUTCDate();
break;
case SimileAjax.DateTime.MONTH:var A=B.getUTCMonth();
if(A!=0){D=Timeline.GregorianDateLabeller.getMonthName(A,this._locale);
break;
}case SimileAjax.DateTime.YEAR:case SimileAjax.DateTime.DECADE:case SimileAjax.DateTime.CENTURY:case SimileAjax.DateTime.MILLENNIUM:var E=B.getUTCFullYear();
if(E>0){D=B.getUTCFullYear();
}else{D=(1-E)+"BC";
}F=(C==SimileAjax.DateTime.MONTH)||(C==SimileAjax.DateTime.DECADE&&E%100==0)||(C==SimileAjax.DateTime.CENTURY&&E%1000==0);
break;
default:D=B.toUTCString();
}return{text:D,emphasized:F};
};


/* original-painter.js */
Timeline.OriginalEventPainter=function(A){this._params=A;
this._onSelectListeners=[];
this._eventPaintListeners=[];
this._filterMatcher=null;
this._highlightMatcher=null;
this._frc=null;
this._eventIdToElmt={};
};
Timeline.OriginalEventPainter.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._backLayer=null;
this._eventLayer=null;
this._lineLayer=null;
this._highlightLayer=null;
this._eventIdToElmt=null;
};
Timeline.OriginalEventPainter.prototype.getType=function(){return"original";
};
Timeline.OriginalEventPainter.prototype.addOnSelectListener=function(A){this._onSelectListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeOnSelectListener=function(B){for(var A=0;
A<this._onSelectListeners.length;
A++){if(this._onSelectListeners[A]==B){this._onSelectListeners.splice(A,1);
break;
}}};
Timeline.OriginalEventPainter.prototype.addEventPaintListener=function(A){this._eventPaintListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeEventPaintListener=function(B){for(var A=0;
A<this._eventPaintListeners.length;
A++){if(this._eventPaintListeners[A]==B){this._eventPaintListeners.splice(A,1);
break;
}}};
Timeline.OriginalEventPainter.prototype.getFilterMatcher=function(){return this._filterMatcher;
};
Timeline.OriginalEventPainter.prototype.setFilterMatcher=function(A){this._filterMatcher=A;
};
Timeline.OriginalEventPainter.prototype.getHighlightMatcher=function(){return this._highlightMatcher;
};
Timeline.OriginalEventPainter.prototype.setHighlightMatcher=function(A){this._highlightMatcher=A;
};
Timeline.OriginalEventPainter.prototype.paint=function(){var C=this._band.getEventSource();
if(C==null){return ;
}this._eventIdToElmt={};
this._fireEventPaintListeners("paintStarting",null,null);
this._prepareForPainting();
var I=this._params.theme.event;
var G=Math.max(I.track.height,I.tape.height+this._frc.getLineHeight());
var F={trackOffset:I.track.offset,trackHeight:G,trackGap:I.track.gap,trackIncrement:G+I.track.gap,icon:I.instant.icon,iconWidth:I.instant.iconWidth,iconHeight:I.instant.iconHeight,labelWidth:I.label.width,maxLabelChar:I.label.maxLabelChar,impreciseIconMargin:I.instant.impreciseIconMargin};
var D=this._band.getMinDate();
var B=this._band.getMaxDate();
var J=(this._filterMatcher!=null)?this._filterMatcher:function(K){return true;
};
var A=(this._highlightMatcher!=null)?this._highlightMatcher:function(K){return -1;
};
var E=C.getEventReverseIterator(D,B);
while(E.hasNext()){var H=E.next();
if(J(H)){this.paintEvent(H,F,this._params.theme,A(H));
}}this._highlightLayer.style.display="block";
this._lineLayer.style.display="block";
this._eventLayer.style.display="block";
this._band.updateEventTrackInfo(this._tracks.length,F.trackIncrement);
this._fireEventPaintListeners("paintEnded",null,null);
};
Timeline.OriginalEventPainter.prototype.softPaint=function(){};
Timeline.OriginalEventPainter.prototype._prepareForPainting=function(){var B=this._band;
if(this._backLayer==null){this._backLayer=this._band.createLayerDiv(0,"timeline-band-events");
this._backLayer.style.visibility="hidden";
var A=document.createElement("span");
A.className="timeline-event-label";
this._backLayer.appendChild(A);
this._frc=SimileAjax.Graphics.getFontRenderingContext(A);
}this._frc.update();
this._tracks=[];
if(this._highlightLayer!=null){B.removeLayerDiv(this._highlightLayer);
}this._highlightLayer=B.createLayerDiv(105,"timeline-band-highlights");
this._highlightLayer.style.display="none";
if(this._lineLayer!=null){B.removeLayerDiv(this._lineLayer);
}this._lineLayer=B.createLayerDiv(110,"timeline-band-lines");
this._lineLayer.style.display="none";
if(this._eventLayer!=null){B.removeLayerDiv(this._eventLayer);
}this._eventLayer=B.createLayerDiv(115,"timeline-band-events");
this._eventLayer.style.display="none";
};
Timeline.OriginalEventPainter.prototype.paintEvent=function(B,C,D,A){if(B.isInstant()){this.paintInstantEvent(B,C,D,A);
}else{this.paintDurationEvent(B,C,D,A);
}};
Timeline.OriginalEventPainter.prototype.paintInstantEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseInstantEvent(B,C,D,A);
}else{this.paintPreciseInstantEvent(B,C,D,A);
}};
Timeline.OriginalEventPainter.prototype.paintDurationEvent=function(B,C,D,A){if(B.isImprecise()){this.paintImpreciseDurationEvent(B,C,D,A);
}else{this.paintPreciseDurationEvent(B,C,D,A);
}};
Timeline.OriginalEventPainter.prototype.paintPreciseInstantEvent=function(N,S,V,T){var W=this._timeline.getDocument();
var L=N.getText();
var H=N.getStart();
var I=Math.round(this._band.dateToPixelOffset(H));
var A=Math.round(I+S.iconWidth/2);
var C=Math.round(I-S.iconWidth/2);
var F=this._getLabelDivClassName(N);
var D=this._frc.computeSize(L,F);
var M=A+V.event.label.offsetFromLine;
var J=M+D.width;
var Q=J;
var P=this._findFreeTrack(N,Q);
var R=Math.round(S.trackOffset+P*S.trackIncrement+S.trackHeight/2-D.height/2);
var B=this._paintEventIcon(N,P,C,S,V,0);
var U=this._paintEventLabel(N,L,M,R,D.width,D.height,V,F,T);
var E=[B.elmt,U.elmt];
var O=this;
var K=function(Y,X,Z){return O._onClickInstantEvent(B.elmt,X,N);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",K);
SimileAjax.DOM.registerEvent(U.elmt,"mousedown",K);
var G=this._createHighlightDiv(T,B,V,N);
if(G!=null){E.push(G);
}this._fireEventPaintListeners("paintedEvent",N,E);
this._eventIdToElmt[N.getID()]=B.elmt;
this._tracks[P]=C;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseInstantEvent=function(P,U,Z,W){var b=this._timeline.getDocument();
var N=P.getText();
var J=P.getStart();
var X=P.getEnd();
var K=Math.round(this._band.dateToPixelOffset(J));
var B=Math.round(this._band.dateToPixelOffset(X));
var A=Math.round(K+U.iconWidth/2);
var D=Math.round(K-U.iconWidth/2);
var H=this._getLabelDivClassName(P);
var F=this._frc.computeSize(N,H);
var O=A+Z.event.label.offsetFromLine;
var L=O+F.width;
var S=Math.max(L,B);
var R=this._findFreeTrack(P,S);
var a=Z.event.tape.height;
var T=Math.round(U.trackOffset+R*U.trackIncrement+a);
var C=this._paintEventIcon(P,R,D,U,Z,a);
var Y=this._paintEventLabel(P,N,O,T,F.width,F.height,Z,H,W);
var V=P.getColor();
V=V!=null?V:Z.event.instant.impreciseColor;
var E=this._paintEventTape(P,R,K,B,V,Z.event.instant.impreciseOpacity,U,Z,0);
var G=[C.elmt,Y.elmt,E.elmt];
var Q=this;
var M=function(d,c,e){return Q._onClickInstantEvent(C.elmt,c,P);
};
SimileAjax.DOM.registerEvent(C.elmt,"mousedown",M);
SimileAjax.DOM.registerEvent(E.elmt,"mousedown",M);
SimileAjax.DOM.registerEvent(Y.elmt,"mousedown",M);
var I=this._createHighlightDiv(W,C,Z,P);
if(I!=null){G.push(I);
}this._fireEventPaintListeners("paintedEvent",P,G);
this._eventIdToElmt[P.getID()]=C.elmt;
this._tracks[R]=D;
};
Timeline.OriginalEventPainter.prototype.paintPreciseDurationEvent=function(M,R,W,T){var X=this._timeline.getDocument();
var K=M.getText();
var G=M.getStart();
var U=M.getEnd();
var H=Math.round(this._band.dateToPixelOffset(G));
var A=Math.round(this._band.dateToPixelOffset(U));
var E=this._getLabelDivClassName(M);
var C=this._frc.computeSize(K,E);
var L=H;
var I=L+C.width;
var P=Math.max(I,A);
var O=this._findFreeTrack(M,P);
var Q=Math.round(R.trackOffset+O*R.trackIncrement+W.event.tape.height);
var S=M.getColor();
S=S!=null?S:W.event.duration.color;
var B=this._paintEventTape(M,O,H,A,S,100,R,W,0);
var V=this._paintEventLabel(M,K,L,Q,C.width,C.height,W,E,T);
var D=[B.elmt,V.elmt];
var N=this;
var J=function(Z,Y,a){return N._onClickDurationEvent(B.elmt,Y,M);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",J);
SimileAjax.DOM.registerEvent(V.elmt,"mousedown",J);
var F=this._createHighlightDiv(T,B,W,M);
if(F!=null){D.push(F);
}this._fireEventPaintListeners("paintedEvent",M,D);
this._eventIdToElmt[M.getID()]=B.elmt;
this._tracks[O]=H;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseDurationEvent=function(O,W,b,Y){var c=this._timeline.getDocument();
var M=O.getText();
var I=O.getStart();
var V=O.getLatestStart();
var Z=O.getEnd();
var Q=O.getEarliestEnd();
var K=Math.round(this._band.dateToPixelOffset(I));
var F=Math.round(this._band.dateToPixelOffset(V));
var A=Math.round(this._band.dateToPixelOffset(Z));
var G=Math.round(this._band.dateToPixelOffset(Q));
var E=this._getLabelDivClassName(O);
var C=this._frc.computeSize(M,E);
var N=F;
var J=N+C.width;
var S=Math.max(J,A);
var R=this._findFreeTrack(O,S);
var T=Math.round(W.trackOffset+R*W.trackIncrement+b.event.tape.height);
var X=O.getColor();
X=X!=null?X:b.event.duration.color;
var U=this._paintEventTape(O,R,K,A,b.event.duration.impreciseColor,b.event.duration.impreciseOpacity,W,b,0);
var B=this._paintEventTape(O,R,F,G,X,100,W,b,1);
var a=this._paintEventLabel(O,M,N,T,C.width,C.height,b,E,Y);
var D=[U.elmt,B.elmt,a.elmt];
var P=this;
var L=function(e,d,f){return P._onClickDurationEvent(B.elmt,d,O);
};
SimileAjax.DOM.registerEvent(B.elmt,"mousedown",L);
SimileAjax.DOM.registerEvent(a.elmt,"mousedown",L);
var H=this._createHighlightDiv(Y,B,b,O);
if(H!=null){D.push(H);
}this._fireEventPaintListeners("paintedEvent",O,D);
this._eventIdToElmt[O.getID()]=B.elmt;
this._tracks[R]=K;
};
Timeline.OriginalEventPainter.prototype._encodeEventElID=function(B,A){return Timeline.EventUtils.encodeEventElID(this._timeline,this._band,B,A);
};
Timeline.OriginalEventPainter.prototype._findFreeTrack=function(E,D){var A=E.getTrackNum();
if(A!=null){return A;
}for(var C=0;
C<this._tracks.length;
C++){var B=this._tracks[C];
if(B>D){break;
}}return C;
};
Timeline.OriginalEventPainter.prototype._paintEventIcon=function(K,B,C,G,F,D){var I=K.getIcon();
I=I!=null?I:G.icon;
var J;
if(D>0){J=G.trackOffset+B*G.trackIncrement+D+G.impreciseIconMargin;
}else{var H=G.trackOffset+B*G.trackIncrement+G.trackHeight/2;
J=Math.round(H-G.iconHeight/2);
}var E=SimileAjax.Graphics.createTranslucentImage(I);
var A=this._timeline.getDocument().createElement("div");
A.className=this._getElClassName("timeline-event-icon",K,"icon");
A.id=this._encodeEventElID("icon",K);
A.style.left=C+"px";
A.style.top=J+"px";
A.appendChild(E);
if(K._title!=null){A.title=K._title;
}this._eventLayer.appendChild(A);
return{left:C,top:J,width:G.iconWidth,height:G.iconHeight,elmt:A};
};
Timeline.OriginalEventPainter.prototype._paintEventLabel=function(K,L,D,H,A,J,G,E,C){var I=this._timeline.getDocument();
var B=I.createElement("div");
B.className=E;
B.id=this._encodeEventElID("label",K);
B.style.left=D+"px";
B.style.width=A+"px";
B.style.top=H+"px";
B.innerHTML=L;
if(K._title!=null){B.title=K._title;
}var F=K.getTextColor();
if(F==null){F=K.getColor();
}if(F!=null){B.style.color=F;
}if(G.event.highlightLabelBackground&&C>=0){B.style.background=this._getHighlightColor(C,G);
}this._eventLayer.appendChild(B);
return{left:D,top:H,width:A,height:J,elmt:B};
};
Timeline.OriginalEventPainter.prototype._paintEventTape=function(N,B,D,A,G,C,J,I,M){var F=A-D;
var E=I.event.tape.height;
var K=J.trackOffset+B*J.trackIncrement;
var O=this._timeline.getDocument().createElement("div");
O.className=this._getElClassName("timeline-event-tape",N,"tape");
O.id=this._encodeEventElID("tape"+M,N);
O.style.left=D+"px";
O.style.width=F+"px";
O.style.height=E+"px";
O.style.top=K+"px";
if(N._title!=null){O.title=N._title;
}if(G!=null){O.style.backgroundColor=G;
}var L=N.getTapeImage();
var H=N.getTapeRepeat();
H=H!=null?H:"repeat";
if(L!=null){O.style.backgroundImage="url("+L+")";
O.style.backgroundRepeat=H;
}SimileAjax.Graphics.setOpacity(O,C);
this._eventLayer.appendChild(O);
return{left:D,top:K,width:F,height:E,elmt:O};
};
Timeline.OriginalEventPainter.prototype._getLabelDivClassName=function(A){return this._getElClassName("timeline-event-label",A,"label");
};
Timeline.OriginalEventPainter.prototype._getElClassName=function(D,C,A){var E=C.getClassName(),B=[];
if(E){if(A){B.push(A+"-"+E+" ");
}B.push(E+" ");
}B.push(D);
return(B.join(""));
};
Timeline.OriginalEventPainter.prototype._getHighlightColor=function(A,B){var C=B.event.highlightColors;
return C[Math.min(A,C.length-1)];
};
Timeline.OriginalEventPainter.prototype._createHighlightDiv=function(A,D,F,B){var G=null;
if(A>=0){var E=this._timeline.getDocument();
var C=this._getHighlightColor(A,F);
G=E.createElement("div");
G.className=this._getElClassName("timeline-event-highlight",B,"highlight");
G.id=this._encodeEventElID("highlight0",B);
G.style.position="absolute";
G.style.overflow="hidden";
G.style.left=(D.left-2)+"px";
G.style.width=(D.width+4)+"px";
G.style.top=(D.top-2)+"px";
G.style.height=(D.height+4)+"px";
G.style.background=C;
this._highlightLayer.appendChild(G);
}return G;
};
Timeline.OriginalEventPainter.prototype._onClickInstantEvent=function(C,A,B){var D=SimileAjax.DOM.getPageCoordinates(C);
this._showBubble(D.left+Math.ceil(C.offsetWidth/2),D.top+Math.ceil(C.offsetHeight/2),B);
this._fireOnSelect(B.getID());
A.cancelBubble=true;
SimileAjax.DOM.cancelEvent(A);
return false;
};
Timeline.OriginalEventPainter.prototype._onClickDurationEvent=function(F,B,C){if("pageX" in B){var A=B.pageX;
var E=B.pageY;
}else{var D=SimileAjax.DOM.getPageCoordinates(F);
var A=B.offsetX+D.left;
var E=B.offsetY+D.top;
}this._showBubble(A,E,C);
this._fireOnSelect(C.getID());
B.cancelBubble=true;
SimileAjax.DOM.cancelEvent(B);
return false;
};
Timeline.OriginalEventPainter.prototype.showBubble=function(A){var B=this._eventIdToElmt[A.getID()];
if(B){var C=SimileAjax.DOM.getPageCoordinates(B);
this._showBubble(C.left+B.offsetWidth/2,C.top+B.offsetHeight/2,A);
}};
Timeline.OriginalEventPainter.prototype._showBubble=function(B,E,C){var D=document.createElement("div");
var A=this._params.theme.event.bubble;
C.fillInfoBubble(D,this._params.theme,this._band.getLabeller());
SimileAjax.WindowManager.cancelPopups();
SimileAjax.Graphics.createBubbleForContentAndPoint(D,B,E,A.width,null,A.maxHeight);
};
Timeline.OriginalEventPainter.prototype._fireOnSelect=function(A){for(var B=0;
B<this._onSelectListeners.length;
B++){this._onSelectListeners[B](A);
}};
Timeline.OriginalEventPainter.prototype._fireEventPaintListeners=function(D,A,C){for(var B=0;
B<this._eventPaintListeners.length;
B++){this._eventPaintListeners[B](this._band,D,A,C);
}};


/* overview-painter.js */
Timeline.OverviewEventPainter=function(A){this._params=A;
this._onSelectListeners=[];
this._filterMatcher=null;
this._highlightMatcher=null;
};
Timeline.OverviewEventPainter.prototype.initialize=function(B,A){this._band=B;
this._timeline=A;
this._eventLayer=null;
this._highlightLayer=null;
};
Timeline.OverviewEventPainter.prototype.getType=function(){return"overview";
};
Timeline.OverviewEventPainter.prototype.addOnSelectListener=function(A){this._onSelectListeners.push(A);
};
Timeline.OverviewEventPainter.prototype.removeOnSelectListener=function(B){for(var A=0;
A<this._onSelectListeners.length;
A++){if(this._onSelectListeners[A]==B){this._onSelectListeners.splice(A,1);
break;
}}};
Timeline.OverviewEventPainter.prototype.getFilterMatcher=function(){return this._filterMatcher;
};
Timeline.OverviewEventPainter.prototype.setFilterMatcher=function(A){this._filterMatcher=A;
};
Timeline.OverviewEventPainter.prototype.getHighlightMatcher=function(){return this._highlightMatcher;
};
Timeline.OverviewEventPainter.prototype.setHighlightMatcher=function(A){this._highlightMatcher=A;
};
Timeline.OverviewEventPainter.prototype.paint=function(){var C=this._band.getEventSource();
if(C==null){return ;
}this._prepareForPainting();
var H=this._params.theme.event;
var F={trackOffset:H.overviewTrack.offset,trackHeight:H.overviewTrack.height,trackGap:H.overviewTrack.gap,trackIncrement:H.overviewTrack.height+H.overviewTrack.gap};
var D=this._band.getMinDate();
var B=this._band.getMaxDate();
var I=(this._filterMatcher!=null)?this._filterMatcher:function(J){return true;
};
var A=(this._highlightMatcher!=null)?this._highlightMatcher:function(J){return -1;
};
var E=C.getEventReverseIterator(D,B);
while(E.hasNext()){var G=E.next();
if(I(G)){this.paintEvent(G,F,this._params.theme,A(G));
}}this._highlightLayer.style.display="block";
this._eventLayer.style.display="block";
this._band.updateEventTrackInfo(this._tracks.length,F.trackIncrement);
};
Timeline.OverviewEventPainter.prototype.softPaint=function(){};
Timeline.OverviewEventPainter.prototype._prepareForPainting=function(){var A=this._band;
this._tracks=[];
if(this._highlightLayer!=null){A.removeLayerDiv(this._highlightLayer);
}this._highlightLayer=A.createLayerDiv(105,"timeline-band-highlights");
this._highlightLayer.style.display="none";
if(this._eventLayer!=null){A.removeLayerDiv(this._eventLayer);
}this._eventLayer=A.createLayerDiv(110,"timeline-band-events");
this._eventLayer.style.display="none";
};
Timeline.OverviewEventPainter.prototype.paintEvent=function(B,C,D,A){if(B.isInstant()){this.paintInstantEvent(B,C,D,A);
}else{this.paintDurationEvent(B,C,D,A);
}};
Timeline.OverviewEventPainter.prototype.paintInstantEvent=function(I,H,E,A){var F=I.getStart();
var B=Math.round(this._band.dateToPixelOffset(F));
var C=I.getColor(),D=I.getClassName();
if(D){C=null;
}else{C=C!=null?C:E.event.duration.color;
}var G=this._paintEventTick(I,B,C,100,H,E);
this._createHighlightDiv(A,G,E);
};
Timeline.OverviewEventPainter.prototype.paintDurationEvent=function(L,K,H,B){var A=L.getLatestStart();
var I=L.getEarliestEnd();
var J=Math.round(this._band.dateToPixelOffset(A));
var C=Math.round(this._band.dateToPixelOffset(I));
var F=0;
for(;
F<this._tracks.length;
F++){if(C<this._tracks[F]){break;
}}this._tracks[F]=C;
var E=L.getColor(),G=L.getClassName();
if(G){E=null;
}else{E=E!=null?E:H.event.duration.color;
}var D=this._paintEventTape(L,F,J,C,E,100,K,H,G);
this._createHighlightDiv(B,D,H);
};
Timeline.OverviewEventPainter.prototype._paintEventTape=function(K,B,D,L,E,C,H,G,F){var I=H.trackOffset+B*H.trackIncrement;
var A=L-D;
var J=H.trackHeight;
var M=this._timeline.getDocument().createElement("div");
M.className="timeline-small-event-tape";
if(F){M.className+=" small-"+F;
}M.style.left=D+"px";
M.style.width=A+"px";
M.style.top=I+"px";
M.style.height=J+"px";
if(E){M.style.backgroundColor=E;
}if(C<100){SimileAjax.Graphics.setOpacity(M,C);
}this._eventLayer.appendChild(M);
return{left:D,top:I,width:A,height:J,elmt:M};
};
Timeline.OverviewEventPainter.prototype._paintEventTick=function(J,C,D,B,G,F){var I=F.event.overviewTrack.tickHeight;
var H=G.trackOffset-I;
var A=1;
var K=this._timeline.getDocument().createElement("div");
K.className="timeline-small-event-icon";
K.style.left=C+"px";
K.style.top=H+"px";
var E=J.getClassName();
if(E){K.className+=" small-"+E;
}if(B<100){SimileAjax.Graphics.setOpacity(K,B);
}this._eventLayer.appendChild(K);
return{left:C,top:H,width:A,height:I,elmt:K};
};
Timeline.OverviewEventPainter.prototype._createHighlightDiv=function(A,C,E){if(A>=0){var D=this._timeline.getDocument();
var G=E.event;
var B=G.highlightColors[Math.min(A,G.highlightColors.length-1)];
var F=D.createElement("div");
F.style.position="absolute";
F.style.overflow="hidden";
F.style.left=(C.left-1)+"px";
F.style.width=(C.width+2)+"px";
F.style.top=(C.top-1)+"px";
F.style.height=(C.height+2)+"px";
F.style.background=B;
this._highlightLayer.appendChild(F);
}};
Timeline.OverviewEventPainter.prototype.showBubble=function(A){};


/* sources.js */
Timeline.DefaultEventSource=function(A){this._events=(A instanceof Object)?A:new SimileAjax.EventIndex();
this._listeners=[];
};
Timeline.DefaultEventSource.prototype.addListener=function(A){this._listeners.push(A);
};
Timeline.DefaultEventSource.prototype.removeListener=function(B){for(var A=0;
A<this._listeners.length;
A++){if(this._listeners[A]==B){this._listeners.splice(A,1);
break;
}}};
Timeline.DefaultEventSource.prototype.loadXML=function(G,A){var C=this._getBaseURL(A);
var H=G.documentElement.getAttribute("wiki-url");
var J=G.documentElement.getAttribute("wiki-section");
var F=G.documentElement.getAttribute("date-time-format");
var E=this._events.getUnit().getParser(F);
var D=G.documentElement.firstChild;
var I=false;
while(D!=null){if(D.nodeType==1){var L="";
if(D.firstChild!=null&&D.firstChild.nodeType==3){L=D.firstChild.nodeValue;
}var B=(D.getAttribute("isDuration")===null&&D.getAttribute("durationEvent")===null)||D.getAttribute("isDuration")=="false"||D.getAttribute("durationEvent")=="false";
var K=new Timeline.DefaultEventSource.Event({id:D.getAttribute("id"),start:E(D.getAttribute("start")),end:E(D.getAttribute("end")),latestStart:E(D.getAttribute("latestStart")),earliestEnd:E(D.getAttribute("earliestEnd")),instant:B,text:D.getAttribute("title"),description:L,image:this._resolveRelativeURL(D.getAttribute("image"),C),link:this._resolveRelativeURL(D.getAttribute("link"),C),icon:this._resolveRelativeURL(D.getAttribute("icon"),C),color:D.getAttribute("color"),textColor:D.getAttribute("textColor"),hoverText:D.getAttribute("hoverText"),classname:D.getAttribute("classname"),tapeImage:D.getAttribute("tapeImage"),tapeRepeat:D.getAttribute("tapeRepeat"),caption:D.getAttribute("caption"),eventID:D.getAttribute("eventID"),trackNum:D.getAttribute("trackNum")});
K._node=D;
K.getProperty=function(M){return this._node.getAttribute(M);
};
K.setWikiInfo(H,J);
this._events.add(K);
I=true;
}D=D.nextSibling;
}if(I){this._fire("onAddMany",[]);
}};
Timeline.DefaultEventSource.prototype.loadJSON=function(H,B){var D=this._getBaseURL(B);
var J=false;
if(H&&H.events){var I=("wikiURL" in H)?H.wikiURL:null;
var K=("wikiSection" in H)?H.wikiSection:null;
var F=("dateTimeFormat" in H)?H.dateTimeFormat:null;
var E=this._events.getUnit().getParser(F);
for(var G=0;
G<H.events.length;
G++){var A=H.events[G];
var C=A.isDuration||(A.durationEvent!=null&&!A.durationEvent);
var L=new Timeline.DefaultEventSource.Event({id:("id" in A)?A.id:undefined,start:E(A.start),end:E(A.end),latestStart:E(A.latestStart),earliestEnd:E(A.earliestEnd),instant:C,text:A.title,description:A.description,image:this._resolveRelativeURL(A.image,D),link:this._resolveRelativeURL(A.link,D),icon:this._resolveRelativeURL(A.icon,D),color:A.color,textColor:A.textColor,hoverText:A.hoverText,classname:A.classname,tapeImage:A.tapeImage,tapeRepeat:A.tapeRepeat,caption:A.caption,eventID:A.eventID,trackNum:A.trackNum});
L._obj=A;
L.getProperty=function(M){return this._obj[M];
};
L.setWikiInfo(I,K);
this._events.add(L);
J=true;
}}if(J){this._fire("onAddMany",[]);
}};
Timeline.DefaultEventSource.prototype.loadSPARQL=function(I,B){var E=this._getBaseURL(B);
var H="iso8601";
var G=this._events.getUnit().getParser(H);
if(I==null){return ;
}var F=I.documentElement.firstChild;
while(F!=null&&(F.nodeType!=1||F.nodeName!="results")){F=F.nextSibling;
}var J=null;
var L=null;
if(F!=null){J=F.getAttribute("wiki-url");
L=F.getAttribute("wiki-section");
F=F.firstChild;
}var K=false;
while(F!=null){if(F.nodeType==1){var D={};
var A=F.firstChild;
while(A!=null){if(A.nodeType==1&&A.firstChild!=null&&A.firstChild.nodeType==1&&A.firstChild.firstChild!=null&&A.firstChild.firstChild.nodeType==3){D[A.getAttribute("name")]=A.firstChild.firstChild.nodeValue;
}A=A.nextSibling;
}if(D["start"]==null&&D["date"]!=null){D["start"]=D["date"];
}var C=(D["isDuration"]===null&&D["durationEvent"]===null)||D["isDuration"]=="false"||D["durationEvent"]=="false";
var M=new Timeline.DefaultEventSource.Event({id:D["id"],start:G(D["start"]),end:G(D["end"]),latestStart:G(D["latestStart"]),earliestEnd:G(D["earliestEnd"]),instant:C,text:D["title"],description:D["description"],image:this._resolveRelativeURL(D["image"],E),link:this._resolveRelativeURL(D["link"],E),icon:this._resolveRelativeURL(D["icon"],E),color:D["color"],textColor:D["textColor"],hoverText:D["hoverText"],caption:D["caption"],classname:D["classname"],tapeImage:D["tapeImage"],tapeRepeat:D["tapeRepeat"],eventID:D["eventID"],trackNum:D["trackNum"]});
M._bindings=D;
M.getProperty=function(N){return this._bindings[N];
};
M.setWikiInfo(J,L);
this._events.add(M);
K=true;
}F=F.nextSibling;
}if(K){this._fire("onAddMany",[]);
}};
Timeline.DefaultEventSource.prototype.add=function(A){this._events.add(A);
this._fire("onAddOne",[A]);
};
Timeline.DefaultEventSource.prototype.addMany=function(A){for(var B=0;
B<A.length;
B++){this._events.add(A[B]);
}this._fire("onAddMany",[]);
};
Timeline.DefaultEventSource.prototype.clear=function(){this._events.removeAll();
this._fire("onClear",[]);
};
Timeline.DefaultEventSource.prototype.getEvent=function(A){return this._events.getEvent(A);
};
Timeline.DefaultEventSource.prototype.getEventIterator=function(A,B){return this._events.getIterator(A,B);
};
Timeline.DefaultEventSource.prototype.getEventReverseIterator=function(A,B){return this._events.getReverseIterator(A,B);
};
Timeline.DefaultEventSource.prototype.getAllEventIterator=function(){return this._events.getAllIterator();
};
Timeline.DefaultEventSource.prototype.getCount=function(){return this._events.getCount();
};
Timeline.DefaultEventSource.prototype.getEarliestDate=function(){return this._events.getEarliestDate();
};
Timeline.DefaultEventSource.prototype.getLatestDate=function(){return this._events.getLatestDate();
};
Timeline.DefaultEventSource.prototype._fire=function(B,A){for(var C=0;
C<this._listeners.length;
C++){var D=this._listeners[C];
if(B in D){try{D[B].apply(D,A);
}catch(E){SimileAjax.Debug.exception(E);
}}}};
Timeline.DefaultEventSource.prototype._getBaseURL=function(A){if(A.indexOf("://")<0){var C=this._getBaseURL(document.location.href);
if(A.substr(0,1)=="/"){A=C.substr(0,C.indexOf("/",C.indexOf("://")+3))+A;
}else{A=C+A;
}}var B=A.lastIndexOf("/");
if(B<0){return"";
}else{return A.substr(0,B+1);
}};
Timeline.DefaultEventSource.prototype._resolveRelativeURL=function(A,B){if(A==null||A==""){return A;
}else{if(A.indexOf("://")>0){return A;
}else{if(A.substr(0,1)=="/"){return B.substr(0,B.indexOf("/",B.indexOf("://")+3))+A;
}else{return B+A;
}}}};
Timeline.DefaultEventSource.Event=function(A){function D(E){return(A[E]!=null&&A[E]!="")?A[E]:null;
}var C=A.id?A.id.trim():"";
this._id=C.length>0?C:Timeline.EventUtils.getNewEventID();
this._instant=A.instant||(A.end==null);
this._start=A.start;
this._end=(A.end!=null)?A.end:A.start;
this._latestStart=(A.latestStart!=null)?A.latestStart:(A.instant?this._end:this._start);
this._earliestEnd=(A.earliestEnd!=null)?A.earliestEnd:this._end;
var B=[];
if(this._start>this._latestStart){this._latestStart=this._start;
B.push("start is > latestStart");
}if(this._start>this._earliestEnd){this._earliestEnd=this._latestStart;
B.push("start is > earliestEnd");
}if(this._start>this._end){this._end=this._earliestEnd;
B.push("start is > end");
}if(this._latestStart>this._earliestEnd){this._earliestEnd=this._latestStart;
B.push("latestStart is > earliestEnd");
}if(this._latestStart>this._end){this._end=this._earliestEnd;
B.push("latestStart is > end");
}if(this._earliestEnd>this._end){this._end=this._earliestEnd;
B.push("earliestEnd is > end");
}this._eventID=D("eventID");
this._text=(A.text!=null)?SimileAjax.HTML.deEntify(A.text):"";
if(B.length>0){this._text+=" PROBLEM: "+B.join(", ");
}this._description=SimileAjax.HTML.deEntify(A.description);
this._image=D("image");
this._link=D("link");
this._title=D("hoverText");
this._title=D("caption");
this._icon=D("icon");
this._color=D("color");
this._textColor=D("textColor");
this._classname=D("classname");
this._tapeImage=D("tapeImage");
this._tapeRepeat=D("tapeRepeat");
this._trackNum=D("trackNum");
if(this._trackNum!=null){this._trackNum=parseInt(this._trackNum);
}this._wikiURL=null;
this._wikiSection=null;
};
Timeline.DefaultEventSource.Event.prototype={getID:function(){return this._id;
},isInstant:function(){return this._instant;
},isImprecise:function(){return this._start!=this._latestStart||this._end!=this._earliestEnd;
},getStart:function(){return this._start;
},getEnd:function(){return this._end;
},getLatestStart:function(){return this._latestStart;
},getEarliestEnd:function(){return this._earliestEnd;
},getEventID:function(){return this._eventID;
},getText:function(){return this._text;
},getDescription:function(){return this._description;
},getImage:function(){return this._image;
},getLink:function(){return this._link;
},getIcon:function(){return this._icon;
},getColor:function(){return this._color;
},getTextColor:function(){return this._textColor;
},getClassName:function(){return this._classname;
},getTapeImage:function(){return this._tapeImage;
},getTapeRepeat:function(){return this._tapeRepeat;
},getTrackNum:function(){return this._trackNum;
},getProperty:function(A){return null;
},getWikiURL:function(){return this._wikiURL;
},getWikiSection:function(){return this._wikiSection;
},setWikiInfo:function(B,A){this._wikiURL=B;
this._wikiSection=A;
},fillDescription:function(A){A.innerHTML=this._description;
},fillWikiInfo:function(D){D.style.display="none";
if(this._wikiURL==null||this._wikiSection==null){return ;
}var C=this.getProperty("wikiID");
if(C==null||C.length==0){C=this.getText();
}if(C==null||C.length==0){return ;
}D.style.display="inline";
C=C.replace(/\s/g,"_");
var B=this._wikiURL+this._wikiSection.replace(/\s/g,"_")+"/"+C;
var A=document.createElement("a");
A.href=B;
A.target="new";
A.innerHTML=Timeline.strings[Timeline.clientLocale].wikiLinkLabel;
D.appendChild(document.createTextNode("["));
D.appendChild(A);
D.appendChild(document.createTextNode("]"));
},fillTime:function(A,B){if(this._instant){if(this.isImprecise()){A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
A.appendChild(A.ownerDocument.createElement("br"));
A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._end)));
}else{A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
}}else{if(this.isImprecise()){A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)+" ~ "+B.labelPrecise(this._latestStart)));
A.appendChild(A.ownerDocument.createElement("br"));
A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._earliestEnd)+" ~ "+B.labelPrecise(this._end)));
}else{A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
A.appendChild(A.ownerDocument.createElement("br"));
A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._end)));
}}},fillInfoBubble:function(A,E,M){var K=A.ownerDocument;
var J=this.getText();
var H=this.getLink();
var B=this.getImage();
if(B!=null){var D=K.createElement("img");
D.src=B;
E.event.bubble.imageStyler(D);
A.appendChild(D);
}var L=K.createElement("div");
var C=K.createTextNode(J);
if(H!=null){var I=K.createElement("a");
I.href=H;
I.appendChild(C);
L.appendChild(I);
}else{L.appendChild(C);
}E.event.bubble.titleStyler(L);
A.appendChild(L);
var N=K.createElement("div");
this.fillDescription(N);
E.event.bubble.bodyStyler(N);
A.appendChild(N);
var G=K.createElement("div");
this.fillTime(G,M);
E.event.bubble.timeStyler(G);
A.appendChild(G);
var F=K.createElement("div");
this.fillWikiInfo(F);
E.event.bubble.wikiStyler(F);
A.appendChild(F);
}};


/* themes.js */
Timeline.ClassicTheme=new Object();
Timeline.ClassicTheme.implementations=[];
Timeline.ClassicTheme.create=function(B){if(B==null){B=Timeline.getDefaultLocale();
}var A=Timeline.ClassicTheme.implementations[B];
if(A==null){A=Timeline.ClassicTheme._Impl;
}return new A();
};
Timeline.ClassicTheme._Impl=function(){this.firstDayOfWeek=0;
this.autoWidth=false;
this.autoWidthAnimationTime=500;
this.timeline_start=null;
this.timeline_stop=null;
this.ether={backgroundColors:[],highlightOpacity:50,interval:{line:{show:true,opacity:25},weekend:{opacity:30},marker:{hAlign:"Bottom",vAlign:"Right"}}};
this.event={track:{height:10,gap:2,offset:2,autoWidthMargin:1.5},overviewTrack:{offset:20,tickHeight:6,height:2,gap:1,autoWidthMargin:5},tape:{height:4},instant:{icon:Timeline.urlPrefix+"images/dull-blue-circle.png",iconWidth:10,iconHeight:10,impreciseOpacity:20,impreciseIconMargin:3},duration:{impreciseOpacity:20},label:{backgroundOpacity:50,offsetFromLine:3},highlightColors:["#FFFF00","#FFC000","#FF0000","#0000FF"],highlightLabelBackground:false,bubble:{width:250,maxHeight:0,titleStyler:function(A){A.className="timeline-event-bubble-title";
},bodyStyler:function(A){A.className="timeline-event-bubble-body";
},imageStyler:function(A){A.className="timeline-event-bubble-image";
},wikiStyler:function(A){A.className="timeline-event-bubble-wiki";
},timeStyler:function(A){A.className="timeline-event-bubble-time";
}}};
this.mouseWheel="scroll";
};


/* timeline.js */
Timeline.version="2.3.0";
Timeline.ajax_lib_version=SimileAjax.version;
Timeline.display_version=Timeline.version+" (with Ajax lib "+Timeline.ajax_lib_version+")";
Timeline.strings={};
Timeline.HORIZONTAL=0;
Timeline.VERTICAL=1;
Timeline._defaultTheme=null;
Timeline.getDefaultLocale=function(){return Timeline.clientLocale;
};
Timeline.create=function(D,C,E,F){if(Timeline.timelines==null){Timeline.timelines=[];
}var B=Timeline.timelines.length;
Timeline.timelines[B]=null;
var A=new Timeline._Impl(D,C,E,F,B);
Timeline.timelines[B]=A;
return A;
};
Timeline.createBandInfo=function(F){var G=("theme" in F)?F.theme:Timeline.getDefaultTheme();
var D=("eventSource" in F)?F.eventSource:null;
var H=new Timeline.LinearEther({centersOn:("date" in F)?F.date:new Date(),interval:SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],pixelsPerInterval:F.intervalPixels,theme:G});
var C=new Timeline.GregorianEtherPainter({unit:F.intervalUnit,multiple:("multiple" in F)?F.multiple:1,theme:G,align:("align" in F)?F.align:undefined});
var I={showText:("showEventText" in F)?F.showEventText:true,theme:G};
if("eventPainterParams" in F){for(var A in F.eventPainterParams){I[A]=F.eventPainterParams[A];
}}if("trackHeight" in F){I.trackHeight=F.trackHeight;
}if("trackGap" in F){I.trackGap=F.trackGap;
}var B=("overview" in F&&F.overview)?"overview":("layout" in F?F.layout:"original");
var E;
if("eventPainter" in F){E=new F.eventPainter(I);
}else{switch(B){case"overview":E=new Timeline.OverviewEventPainter(I);
break;
case"detailed":E=new Timeline.DetailedEventPainter(I);
break;
default:E=new Timeline.OriginalEventPainter(I);
}}return{width:F.width,eventSource:D,timeZone:("timeZone" in F)?F.timeZone:0,ether:H,etherPainter:C,eventPainter:E,theme:G,zoomIndex:("zoomIndex" in F)?F.zoomIndex:0,zoomSteps:("zoomSteps" in F)?F.zoomSteps:null};
};
Timeline.createHotZoneBandInfo=function(F){var G=("theme" in F)?F.theme:Timeline.getDefaultTheme();
var D=("eventSource" in F)?F.eventSource:null;
var H=new Timeline.HotZoneEther({centersOn:("date" in F)?F.date:new Date(),interval:SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],pixelsPerInterval:F.intervalPixels,zones:F.zones,theme:G});
var C=new Timeline.HotZoneGregorianEtherPainter({unit:F.intervalUnit,zones:F.zones,theme:G,align:("align" in F)?F.align:undefined});
var I={showText:("showEventText" in F)?F.showEventText:true,theme:G};
if("eventPainterParams" in F){for(var A in F.eventPainterParams){I[A]=F.eventPainterParams[A];
}}if("trackHeight" in F){I.trackHeight=F.trackHeight;
}if("trackGap" in F){I.trackGap=F.trackGap;
}var B=("overview" in F&&F.overview)?"overview":("layout" in F?F.layout:"original");
var E;
if("eventPainter" in F){E=new F.eventPainter(I);
}else{switch(B){case"overview":E=new Timeline.OverviewEventPainter(I);
break;
case"detailed":E=new Timeline.DetailedEventPainter(I);
break;
default:E=new Timeline.OriginalEventPainter(I);
}}return{width:F.width,eventSource:D,timeZone:("timeZone" in F)?F.timeZone:0,ether:H,etherPainter:C,eventPainter:E,theme:G,zoomIndex:("zoomIndex" in F)?F.zoomIndex:0,zoomSteps:("zoomSteps" in F)?F.zoomSteps:null};
};
Timeline.getDefaultTheme=function(){if(Timeline._defaultTheme==null){Timeline._defaultTheme=Timeline.ClassicTheme.create(Timeline.getDefaultLocale());
}return Timeline._defaultTheme;
};
Timeline.setDefaultTheme=function(A){Timeline._defaultTheme=A;
};
Timeline.loadXML=function(A,C){var D=function(G,F,E){alert("Failed to load data xml from "+A+"\n"+G);
};
var B=function(F){var E=F.responseXML;
if(!E.documentElement&&F.responseStream){E.load(F.responseStream);
}C(E,A);
};
SimileAjax.XmlHttp.get(A,D,B);
};
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);
};
SimileAjax.XmlHttp.get(url,fError,fDone);
};
Timeline.getTimelineFromID=function(A){return Timeline.timelines[A];
};
Timeline.writeVersion=function(A){document.getElementById(A).innerHTML=this.display_version;
};
Timeline._Impl=function(C,B,D,E,A){SimileAjax.WindowManager.initialize();
this._containerDiv=C;
this._bandInfos=B;
this._orientation=D==null?Timeline.HORIZONTAL:D;
this._unit=(E!=null)?E:SimileAjax.NativeDateUnit;
this._starting=true;
this._autoResizing=false;
this.autoWidth=B&&B[0]&&B[0].theme&&B[0].theme.autoWidth;
this.autoWidthAnimationTime=B&&B[0]&&B[0].theme&&B[0].theme.autoWidthAnimationTime;
this.timelineID=A;
this.timeline_start=B&&B[0]&&B[0].theme&&B[0].theme.timeline_start;
this.timeline_stop=B&&B[0]&&B[0].theme&&B[0].theme.timeline_stop;
this.timeline_at_start=false;
this.timeline_at_stop=false;
this._initialize();
};
Timeline._Impl.prototype.dispose=function(){for(var A=0;
A<this._bands.length;
A++){this._bands[A].dispose();
}this._bands=null;
this._bandInfos=null;
this._containerDiv.innerHTML="";
Timeline.timelines[this.timelineID]=null;
};
Timeline._Impl.prototype.getBandCount=function(){return this._bands.length;
};
Timeline._Impl.prototype.getBand=function(A){return this._bands[A];
};
Timeline._Impl.prototype.finishedEventLoading=function(){this._autoWidthCheck(true);
this._starting=false;
};
Timeline._Impl.prototype.layout=function(){this._autoWidthCheck(true);
this._distributeWidths();
};
Timeline._Impl.prototype.paint=function(){for(var A=0;
A<this._bands.length;
A++){this._bands[A].paint();
}};
Timeline._Impl.prototype.getDocument=function(){return this._containerDiv.ownerDocument;
};
Timeline._Impl.prototype.addDiv=function(A){this._containerDiv.appendChild(A);
};
Timeline._Impl.prototype.removeDiv=function(A){this._containerDiv.removeChild(A);
};
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.getWidthStyle=function(){return this._orientation==Timeline.HORIZONTAL?"height":"width";
};
Timeline._Impl.prototype.loadXML=function(B,D){var A=this;
var E=function(H,G,F){alert("Failed to load data xml from "+B+"\n"+H);
A.hideLoadingMessage();
};
var C=function(G){try{var F=G.responseXML;
if(!F.documentElement&&G.responseStream){F.load(G.responseStream);
}D(F,B);
}finally{A.hideLoadingMessage();
}};
this.showLoadingMessage();
window.setTimeout(function(){SimileAjax.XmlHttp.get(B,E,C);
},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(){SimileAjax.XmlHttp.get(url,fError,fDone);
},0);
};
Timeline._Impl.prototype._autoWidthScrollListener=function(A){A.getTimeline()._autoWidthCheck(false);
};
Timeline._Impl.prototype._autoWidthCheck=function(C){var A=this;
var B=A._starting;
var D=0;
function E(){var G=A.getWidthStyle();
if(B){A._containerDiv.style[G]=D+"px";
}else{A._autoResizing=true;
var H={};
H[G]=D+"px";
SimileAjax.jQuery(A._containerDiv).animate(H,A.autoWidthAnimationTime,"linear",function(){A._autoResizing=false;
});
}}function F(){var H=0;
var G=A.getPixelWidth();
if(A._autoResizing){return ;
}for(var I=0;
I<A._bands.length;
I++){A._bands[I].checkAutoWidth();
H+=A._bandInfos[I].width;
}if(H>G||C){D=H;
E();
A._distributeWidths();
}}if(!A.autoWidth){return ;
}F();
};
Timeline._Impl.prototype._initialize=function(){var H=this._containerDiv;
var E=H.ownerDocument;
H.className=H.className.split(" ").concat("timeline-container").join(" ");
var C=(this.isHorizontal())?"horizontal":"vertical";
H.className+=" timeline-"+C;
while(H.firstChild){H.removeChild(H.firstChild);
}var A=SimileAjax.Graphics.createTranslucentImage(Timeline.urlPrefix+(this.isHorizontal()?"images/copyright-vertical.png":"images/copyright.png"));
A.className="timeline-copyright";
A.title="Timeline copyright SIMILE - www.code.google.com/p/simile-widgets/";
SimileAjax.DOM.registerEvent(A,"click",function(){window.location="http://code.google.com/p/simile-widgets/";
});
H.appendChild(A);
this._bands=[];
for(var B=0;
B<this._bandInfos.length;
B++){var G=new Timeline._Band(this,this._bandInfos[B],B);
this._bands.push(G);
}this._distributeWidths();
for(var B=0;
B<this._bandInfos.length;
B++){var F=this._bandInfos[B];
if("syncWith" in F){this._bands[B].setSyncWithBand(this._bands[F.syncWith],("highlight" in F)?F.highlight:false);
}}if(this.autoWidth){for(var B=0;
B<this._bands.length;
B++){this._bands[B].addOnScrollListener(this._autoWidthScrollListener);
}}var D=SimileAjax.Graphics.createMessageBubble(E);
D.containerDiv.className="timeline-message-container";
H.appendChild(D.containerDiv);
D.contentDiv.className="timeline-message";
D.contentDiv.innerHTML="<img src='"+Timeline.urlPrefix+"images/progress-running.gif' /> Loading...";
this.showLoadingMessage=function(){D.containerDiv.style.display="block";
};
this.hideLoadingMessage=function(){D.containerDiv.style.display="none";
};
};
Timeline._Impl.prototype._distributeWidths=function(){var G=this.getPixelLength();
var B=this.getPixelWidth();
var C=0;
for(var F=0;
F<this._bands.length;
F++){var J=this._bands[F];
var I=this._bandInfos[F];
var E=I.width;
var D;
if(typeof E=="string"){var H=E.indexOf("%");
if(H>0){var A=parseInt(E.substr(0,H));
D=Math.round(A*B/100);
}else{D=parseInt(E);
}}else{D=E;
}J.setBandShiftAndWidth(C,D);
J.setViewLength(G);
C+=D;
}};
Timeline._Impl.prototype.shiftOK=function(C,B){var F=B>0,A=B<0;
if((F&&this.timeline_start==null)||(A&&this.timeline_stop==null)||(B==0)){return(true);
}var H=false;
for(var E=0;
E<this._bands.length&&!H;
E++){H=this._bands[E].busy();
}if(H){return(true);
}if((F&&this.timeline_at_start)||(A&&this.timeline_at_stop)){return(false);
}var D=false;
for(var E=0;
E<this._bands.length&&!D;
E++){var G=this._bands[E];
if(F){D=(E==C?G.getMinVisibleDateAfterDelta(B):G.getMinVisibleDate())>=this.timeline_start;
}else{D=(E==C?G.getMaxVisibleDateAfterDelta(B):G.getMaxVisibleDate())<=this.timeline_stop;
}}if(F){this.timeline_at_start=!D;
this.timeline_at_stop=false;
}else{this.timeline_at_stop=!D;
this.timeline_at_start=false;
}return(D);
};
Timeline._Impl.prototype.zoom=function(D,A,G,F){var C=new RegExp("^timeline-band-([0-9]+)$");
var E=null;
var B=C.exec(F.id);
if(B){E=parseInt(B[1]);
}if(E!=null){this._bands[E].zoom(D,A,G,F);
}this.paint();
};


/* units.js */
Timeline.NativeDateUnit=new Object();
Timeline.NativeDateUnit.createLabeller=function(B,A){return new Timeline.GregorianDateLabeller(B,A);
};
Timeline.NativeDateUnit.makeDefaultValue=function(){return new Date();
};
Timeline.NativeDateUnit.cloneValue=function(A){return new Date(A.getTime());
};
Timeline.NativeDateUnit.getParser=function(A){if(typeof A=="string"){A=A.toLowerCase();
}return(A=="iso8601"||A=="iso 8601")?Timeline.DateTime.parseIso8601DateTime:Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject=function(A){return Timeline.DateTime.parseGregorianDateTime(A);
};
Timeline.NativeDateUnit.toNumber=function(A){return A.getTime();
};
Timeline.NativeDateUnit.fromNumber=function(A){return new Date(A);
};
Timeline.NativeDateUnit.compare=function(D,C){var B,A;
if(typeof D=="object"){B=D.getTime();
}else{B=Number(D);
}if(typeof C=="object"){A=C.getTime();
}else{A=Number(C);
}return B-A;
};
Timeline.NativeDateUnit.earlier=function(B,A){return Timeline.NativeDateUnit.compare(B,A)<0?B:A;
};
Timeline.NativeDateUnit.later=function(B,A){return Timeline.NativeDateUnit.compare(B,A)>0?B:A;
};
Timeline.NativeDateUnit.change=function(A,B){return new Date(A.getTime()+B);
};
