some gadget options
[dygraphs.git] / dygraph-combined.js
index 38705bf..0768e24 100644 (file)
@@ -4304,7 +4304,7 @@ this.__init__(_69,_70,_71);
 PlotKit.CanvasRenderer.prototype.__init__=function(_72,_73,_74){
 var _75=MochiKit.Base.isUndefinedOrNull;
 var _76=MochiKit.Color.Color;
-this.options={"drawBackground":true,"backgroundColor":_76.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"strokeColor":_76.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":_76.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":_76.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"pieRadius":0.4,"enableEvents":true};
+this.options={"drawBackground":true,"backgroundColor":_76.whiteColor(),"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"strokeColor":_76.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":_76.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":_76.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"pieRadius":0.4,"enableEvents":true};
 MochiKit.Base.update(this.options,_74?_74:{});
 this.layout=_73;
 this.element=MochiKit.DOM.getElement(_72);
@@ -4331,7 +4331,9 @@ throw "CanvasRenderer() - <canvas> needs to be enclosed in <div>";
 this.xlabels=new Array();
 this.ylabels=new Array();
 this.isFirstRender=true;
-this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom};
+this.area={x:this.options.yAxisLabelWidth+2*this.options.axisTickSize,y:0};
+this.area.w=this.width-this.area.x-this.options.rightGap;
+this.area.h=this.height-this.options.axisLabelFontSize-2*this.options.axisTickSize;
 MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}});
 };
 PlotKit.CanvasRenderer.prototype.render=function(){
@@ -4432,14 +4434,28 @@ _93.lineTo(x-this.options.axisTickSize,y);
 _93.closePath();
 _93.stroke();
 var _98=DIV(_94,_96[1]);
-_98.style.top=(y-this.options.axisLabelFontSize)+"px";
-_98.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px";
+var top=(y-this.options.axisLabelFontSize/2);
+if(top<0){
+top=0;
+}
+if(top+this.options.axisLabelFontSize+3>this.height){
+_98.style.bottom="0px";
+}else{
+_98.style.top=top+"px";
+}
+_98.style.left="0px";
 _98.style.textAlign="right";
-_98.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px";
+_98.style.width=this.options.yAxisLabelWidth+"px";
 MochiKit.DOM.appendChildNodes(this.container,_98);
 this.ylabels.push(_98);
 };
 MochiKit.Iter.forEach(this.layout.yticks,bind(_95,this));
+var _100=this.ylabels[0];
+var _101=this.options.axisLabelFontSize;
+var _102=parseInt(_100.style.top)+_101;
+if(_102>this.height-_101){
+_100.style.top=(parseInt(_100.style.top)-_101/2)+"px";
+}
 }
 _93.beginPath();
 _93.moveTo(this.area.x,this.area.y);
@@ -4449,24 +4465,33 @@ _93.stroke();
 }
 if(this.options.drawXAxis){
 if(this.layout.xticks){
-var _95=function(_99){
+var _95=function(tick){
 if(typeof (dataset)=="function"){
 return;
 }
-var x=this.area.x+_99[0]*this.area.w;
+var x=this.area.x+tick[0]*this.area.w;
 var y=this.area.y+this.area.h;
 _93.beginPath();
 _93.moveTo(x,y);
 _93.lineTo(x,y+this.options.axisTickSize);
 _93.closePath();
 _93.stroke();
-var _100=DIV(_94,_99[1]);
-_100.style.top=(y+this.options.axisTickSize)+"px";
-_100.style.left=(x-this.options.axisLabelWidth/2)+"px";
-_100.style.textAlign="center";
-_100.style.width=this.options.axisLabelWidth+"px";
-MochiKit.DOM.appendChildNodes(this.container,_100);
-this.xlabels.push(_100);
+var _104=DIV(_94,tick[1]);
+_104.style.textAlign="center";
+_104.style.bottom="0px";
+var left=(x-this.options.axisLabelWidth/2);
+if(left+this.options.axisLabelWidth>this.width){
+left=this.width-this.options.xAxisLabelWidth;
+_104.style.textAlign="right";
+}
+if(left<0){
+left=0;
+_104.style.textAlign="left";
+}
+_104.style.left=left+"px";
+_104.style.width=this.options.xAxisLabelWidth+"px";
+MochiKit.DOM.appendChildNodes(this.container,_104);
+this.xlabels.push(_104);
 };
 MochiKit.Iter.forEach(this.layout.xticks,bind(_95,this));
 }
@@ -4479,11 +4504,11 @@ _93.stroke();
 _93.restore();
 };
 PlotKit.CanvasRenderer.prototype._renderBackground=function(){
-var _101=this.element.getContext("2d");
-_101.save();
-_101.fillStyle=this.options.backgroundColor.toRGBString();
-_101.fillRect(0,0,this.width,this.height);
-_101.restore();
+var _106=this.element.getContext("2d");
+_106.save();
+_106.fillStyle=this.options.backgroundColor.toRGBString();
+_106.fillRect(0,0,this.width,this.height);
+_106.restore();
 };
 PlotKit.CanvasRenderer.prototype.clear=function(){
 if(this.isIE){
@@ -4492,7 +4517,7 @@ if(this.clearDelay){
 this.clearDelay.cancel();
 this.clearDelay=null;
 }
-var _102=this.element.getContext("2d");
+var _107=this.element.getContext("2d");
 }
 catch(e){
 this.isFirstRender=false;
@@ -4501,88 +4526,88 @@ this.clearDelay.addCallback(bind(this.clear,this));
 return;
 }
 }
-var _102=this.element.getContext("2d");
-_102.clearRect(0,0,this.width,this.height);
+var _107=this.element.getContext("2d");
+_107.clearRect(0,0,this.width,this.height);
 MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement);
 MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement);
 this.xlabels=new Array();
 this.ylabels=new Array();
 };
 PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){
-var _103=MochiKit.Signal.connect;
+var _108=MochiKit.Signal.connect;
 var bind=MochiKit.Base.bind;
-_103(this.element,"onclick",bind(this.onclick,this));
+_108(this.element,"onclick",bind(this.onclick,this));
 };
 PlotKit.CanvasRenderer.prototype._resolveObject=function(e){
 var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w;
 var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h;
-var _106=this.layout.hitTest(x,y);
-if(_106){
-return _106;
+var _111=this.layout.hitTest(x,y);
+if(_111){
+return _111;
 }
 return null;
 };
-PlotKit.CanvasRenderer.prototype._createEventObject=function(_107,e){
-if(_107==null){
+PlotKit.CanvasRenderer.prototype._createEventObject=function(_112,e){
+if(_112==null){
 return null;
 }
-e.chart=_107;
+e.chart=_112;
 return e;
 };
 PlotKit.CanvasRenderer.prototype.onclick=function(e){
-var _108=this._resolveObject(e);
-var _109=this._createEventObject(_108,e);
-if(_109!=null){
-MochiKit.Signal.signal(this,"onclick",_109);
+var _113=this._resolveObject(e);
+var _114=this._createEventObject(_113,e);
+if(_114!=null){
+MochiKit.Signal.signal(this,"onclick",_114);
 }
 };
 PlotKit.CanvasRenderer.prototype.onmouseover=function(e){
-var _110=this._resolveObject(e);
-var _111=this._createEventObject(_110,e);
-if(_111!=null){
-signal(this,"onmouseover",_111);
+var _115=this._resolveObject(e);
+var _116=this._createEventObject(_115,e);
+if(_116!=null){
+signal(this,"onmouseover",_116);
 }
 };
 PlotKit.CanvasRenderer.prototype.onmouseout=function(e){
-var _112=this._resolveObject(e);
-var _113=this._createEventObject(_112,e);
-if(_113==null){
+var _117=this._resolveObject(e);
+var _118=this._createEventObject(_117,e);
+if(_118==null){
 signal(this,"onmouseout",e);
 }else{
-signal(this,"onmouseout",_113);
+signal(this,"onmouseout",_118);
 }
 };
 PlotKit.CanvasRenderer.prototype.onmousemove=function(e){
-var _114=this._resolveObject(e);
-var _115=this._createEventObject(_114,e);
-if((_114==null)&&(this.event_isinside==null)){
+var _119=this._resolveObject(e);
+var _120=this._createEventObject(_119,e);
+if((_119==null)&&(this.event_isinside==null)){
 return;
 }
-if((_114!=null)&&(this.event_isinside==null)){
-signal(this,"onmouseover",_115);
+if((_119!=null)&&(this.event_isinside==null)){
+signal(this,"onmouseover",_120);
 }
-if((_114==null)&&(this.event_isinside!=null)){
-signal(this,"onmouseout",_115);
+if((_119==null)&&(this.event_isinside!=null)){
+signal(this,"onmouseout",_120);
 }
-if((_114!=null)&&(this.event_isinside!=null)){
-signal(this,"onmousemove",_115);
+if((_119!=null)&&(this.event_isinside!=null)){
+signal(this,"onmousemove",_120);
 }
-this.event_isinside=_114;
+this.event_isinside=_119;
 };
-PlotKit.CanvasRenderer.isSupported=function(_116){
-var _117=null;
+PlotKit.CanvasRenderer.isSupported=function(_121){
+var _122=null;
 try{
-if(MochiKit.Base.isUndefinedOrNull(_116)){
-_117=MochiKit.DOM.CANVAS({});
+if(MochiKit.Base.isUndefinedOrNull(_121)){
+_122=MochiKit.DOM.CANVAS({});
 }else{
-_117=MochiKit.DOM.getElement(_116);
+_122=MochiKit.DOM.getElement(_121);
 }
-var _118=_117.getContext("2d");
+var _123=_122.getContext("2d");
 }
 catch(e){
 var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);
-var _120=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
-if((!ie)||(ie[1]<6)||(_120)){
+var _125=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
+if((!ie)||(ie[1]<6)||(_125)){
 return false;
 }
 return true;
@@ -4710,12 +4735,16 @@ var _31=this.layout.points[0];
 var _32=true;
 var _33=function(_34,_31){
 if(_31.name==_28){
+if(!_31.canvasy||isNaN(_31.canvasy)){
+_32=true;
+}else{
 if(_32){
 _34.moveTo(_31.canvasx,_31.canvasy);
+_32=false;
 }else{
 _34.lineTo(_31.canvasx,_31.canvasy);
 }
-_32=false;
+}
 }
 };
 MochiKit.Iter.forEach(this.layout.points,_24(_33,ctx),this);
@@ -4737,6 +4766,10 @@ var _42=this.layout.yscale;
 var _43=function(_44,_45){
 _41++;
 if(_45.name==_36){
+if(!_45.y||isNaN(_45.y)){
+_39=-1;
+return;
+}
 var _46=[_45.y-_45.errorPlus*_42,_45.y+_45.errorMinus*_42];
 _46[0]=this.area.h*_46[0]+this.area.y;
 _46[1]=this.area.h*_46[1]+this.area.y;
@@ -4787,7 +4820,7 @@ Dygraph.DEFAULT_ROLL_PERIOD=1;
 Dygraph.DEFAULT_WIDTH=480;
 Dygraph.DEFAULT_HEIGHT=320;
 Dygraph.AXIS_LINE_WIDTH=0.3;
-Dygraph.DEFAULT_ATTRS={highlightCircleSize:3,pixelsPerXLabel:60,pixelsPerYLabel:30,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:false,labelsKMB:false,strokeWidth:1,showRoller:false,xValueFormatter:Dygraph.dateString_,xValueParser:Dygraph.dateParser,xTicker:Dygraph.dateTicker,sigma:2,errorBars:false,fractions:false,wilsonInterval:true,customBars:false};
+Dygraph.DEFAULT_ATTRS={highlightCircleSize:3,pixelsPerXLabel:60,pixelsPerYLabel:30,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:false,labelsKMB:false,strokeWidth:1,axisTickSize:3,axisLabelFontSize:14,xAxisLabelWidth:50,yAxisLabelWidth:50,rightGap:5,showRoller:false,xValueFormatter:Dygraph.dateString_,xValueParser:Dygraph.dateParser,xTicker:Dygraph.dateTicker,sigma:2,errorBars:false,fractions:false,wilsonInterval:true,customBars:false};
 Dygraph.DEBUG=1;
 Dygraph.INFO=2;
 Dygraph.WARNING=3;
@@ -4815,6 +4848,7 @@ this.dateWindow_=_56.dateWindow||null;
 this.valueRange_=_56.valueRange||null;
 this.wilsonInterval_=_56.wilsonInterval||true;
 this.customBars_=_56.customBars||false;
+div.innerHTML="";
 if(div.style.width==""){
 div.style.width=Dygraph.DEFAULT_WIDTH+"px";
 }
@@ -4833,7 +4867,7 @@ this.layoutOptions_={"errorBars":(this.attr_("errorBars")||this.customBars_),"xO
 MochiKit.Base.update(this.layoutOptions_,this.attrs_);
 MochiKit.Base.update(this.layoutOptions_,this.user_attrs_);
 this.layout_=new DygraphLayout(this.layoutOptions_);
-this.renderOptions_={colorScheme:this.colors_,strokeColor:null,strokeWidth:this.attr_("strokeWidth"),axisLabelFontSize:14,axisLineWidth:Dygraph.AXIS_LINE_WIDTH};
+this.renderOptions_={colorScheme:this.colors_,strokeColor:null,axisLineWidth:Dygraph.AXIS_LINE_WIDTH};
 MochiKit.Base.update(this.renderOptions_,this.attrs_);
 MochiKit.Base.update(this.renderOptions_,this.user_attrs_);
 this.plotter_=new DygraphCanvasRenderer(this.hidden_,this.layout_,this.renderOptions_);
@@ -4933,7 +4967,7 @@ MochiKit.Base.update(this.layoutOptions_,this.attrs_);
 Dygraph.prototype.createStatusMessage_=function(){
 if(!this.attr_("labelsDiv")){
 var _74=this.attr_("labelsDivWidth");
-var _75={"style":{"position":"absolute","fontSize":"14px","zIndex":10,"width":_74+"px","top":"0px","left":this.width_-_74+"px","background":"white","textAlign":"left","overflow":"hidden"}};
+var _75={"style":{"position":"absolute","fontSize":"14px","zIndex":10,"width":_74+"px","top":"0px","left":(this.width_-_74-2)+"px","background":"white","textAlign":"left","overflow":"hidden"}};
 MochiKit.Base.update(_75["style"],this.attr_("labelsDivStyles"));
 var div=MochiKit.DOM.DIV(_75);
 MochiKit.DOM.appendChildNodes(this.graphDiv,div);
@@ -4941,181 +4975,189 @@ this.attrs_.labelsDiv=div;
 }
 };
 Dygraph.prototype.createRollInterface_=function(){
-var _76=this.plotter_.options.padding;
-var _77=this.attr_("showRoller")?"block":"none";
-var _78={"type":"text","size":"2","value":this.rollPeriod_,"style":{"position":"absolute","zIndex":10,"top":(this.height_-25-_76.bottom)+"px","left":(_76.left+1)+"px","display":_77}};
-var _79=MochiKit.DOM.INPUT(_78);
+var _76=this.attr_("showRoller")?"block":"none";
+var _77={"type":"text","size":"2","value":this.rollPeriod_,"style":{"position":"absolute","zIndex":10,"top":(this.plotter_.area.h-25)+"px","left":(this.plotter_.area.x+1)+"px","display":_76}};
+var _78=MochiKit.DOM.INPUT(_77);
 var pa=this.graphDiv;
-MochiKit.DOM.appendChildNodes(pa,_79);
-connect(_79,"onchange",this,function(){
-this.adjustRoll(_79.value);
+MochiKit.DOM.appendChildNodes(pa,_78);
+connect(_78,"onchange",this,function(){
+this.adjustRoll(_78.value);
 });
-return _79;
+return _78;
 };
 Dygraph.prototype.createDragInterface_=function(){
-var _81=this;
-var _82=false;
+var _80=this;
+var _81=false;
+var _82=null;
 var _83=null;
 var _84=null;
 var _85=null;
 var _86=null;
-var _87=null;
 var px=0;
 var py=0;
-var _90=function(e){
+var _89=function(e){
 return e.mouse().page.x-px;
 };
-var _91=function(e){
+var _90=function(e){
 return e.mouse().page.y-py;
 };
-connect(this.hidden_,"onmousemove",function(_92){
-if(_82){
-_85=_90(_92);
-_86=_91(_92);
-_81.drawZoomRect_(_83,_85,_87);
-_87=_85;
+connect(this.hidden_,"onmousemove",function(_91){
+if(_81){
+_84=_89(_91);
+_85=_90(_91);
+_80.drawZoomRect_(_82,_84,_86);
+_86=_84;
 }
 });
-connect(this.hidden_,"onmousedown",function(_93){
-_82=true;
-px=PlotKit.Base.findPosX(_81.canvas_);
-py=PlotKit.Base.findPosY(_81.canvas_);
-_83=_90(_93);
-_84=_91(_93);
+connect(this.hidden_,"onmousedown",function(_92){
+_81=true;
+px=PlotKit.Base.findPosX(_80.canvas_);
+py=PlotKit.Base.findPosY(_80.canvas_);
+_82=_89(_92);
+_83=_90(_92);
 });
-connect(document,"onmouseup",this,function(_94){
-if(_82){
-_82=false;
+connect(document,"onmouseup",this,function(_93){
+if(_81){
+_81=false;
+_82=null;
 _83=null;
-_84=null;
 }
 });
-connect(this.hidden_,"onmouseout",this,function(_95){
-if(_82){
+connect(this.hidden_,"onmouseout",this,function(_94){
+if(_81){
+_84=null;
 _85=null;
-_86=null;
 }
 });
-connect(this.hidden_,"onmouseup",this,function(_96){
-if(_82){
-_82=false;
-_85=_90(_96);
-_86=_91(_96);
+connect(this.hidden_,"onmouseup",this,function(_95){
+if(_81){
+_81=false;
+_84=_89(_95);
+_85=_90(_95);
+var _96=Math.abs(_84-_82);
 var _97=Math.abs(_85-_83);
-var _98=Math.abs(_86-_84);
-if(_97<2&&_98<2&&_81.attr_("clickCallback")!=null&&_81.lastx_!=undefined){
-_81.attr_("clickCallback")(_96,new Date(_81.lastx_));
+if(_96<2&&_97<2&&_80.attr_("clickCallback")!=null&&_80.lastx_!=undefined){
+_80.attr_("clickCallback")(_95,new Date(_80.lastx_));
 }
-if(_97>=10){
-_81.doZoom_(Math.min(_83,_85),Math.max(_83,_85));
+if(_96>=10){
+_80.doZoom_(Math.min(_82,_84),Math.max(_82,_84));
 }else{
-_81.canvas_.getContext("2d").clearRect(0,0,_81.canvas_.width,_81.canvas_.height);
+_80.canvas_.getContext("2d").clearRect(0,0,_80.canvas_.width,_80.canvas_.height);
 }
+_82=null;
 _83=null;
-_84=null;
 }
 });
-connect(this.hidden_,"ondblclick",this,function(_99){
-_81.dateWindow_=null;
-_81.drawGraph_(_81.rawData_);
-var _100=_81.rawData_[0][0];
-var _101=_81.rawData_[_81.rawData_.length-1][0];
-if(_81.attr_("zoomCallback")){
-_81.attr_("zoomCallback")(_100,_101);
+connect(this.hidden_,"ondblclick",this,function(_98){
+_80.dateWindow_=null;
+_80.drawGraph_(_80.rawData_);
+var _99=_80.rawData_[0][0];
+var _100=_80.rawData_[_80.rawData_.length-1][0];
+if(_80.attr_("zoomCallback")){
+_80.attr_("zoomCallback")(_99,_100);
 }
 });
 };
-Dygraph.prototype.drawZoomRect_=function(_102,endX,_104){
+Dygraph.prototype.drawZoomRect_=function(_101,endX,_103){
 var ctx=this.canvas_.getContext("2d");
-if(_104){
-ctx.clearRect(Math.min(_102,_104),0,Math.abs(_102-_104),this.height_);
+if(_103){
+ctx.clearRect(Math.min(_101,_103),0,Math.abs(_101-_103),this.height_);
 }
-if(endX&&_102){
+if(endX&&_101){
 ctx.fillStyle="rgba(128,128,128,0.33)";
-ctx.fillRect(Math.min(_102,endX),0,Math.abs(endX-_102),this.height_);
+ctx.fillRect(Math.min(_101,endX),0,Math.abs(endX-_101),this.height_);
 }
 };
-Dygraph.prototype.doZoom_=function(lowX,_106){
-var _107=this.layout_.points;
+Dygraph.prototype.doZoom_=function(lowX,_105){
+var _106=this.layout_.points;
+var _107=null;
 var _108=null;
-var _109=null;
-for(var i=0;i<_107.length;i++){
-var cx=_107[i].canvasx;
-var x=_107[i].xval;
-if(cx<lowX&&(_108==null||x>_108)){
+for(var i=0;i<_106.length;i++){
+var cx=_106[i].canvasx;
+var x=_106[i].xval;
+if(cx<lowX&&(_107==null||x>_107)){
+_107=x;
+}
+if(cx>_105&&(_108==null||x<_108)){
 _108=x;
 }
-if(cx>_106&&(_109==null||x<_109)){
-_109=x;
 }
+if(_107==null){
+_107=_106[0].xval;
 }
 if(_108==null){
-_108=_107[0].xval;
+_108=_106[_106.length-1].xval;
 }
-if(_109==null){
-_109=_107[_107.length-1].xval;
-}
-this.dateWindow_=[_108,_109];
+this.dateWindow_=[_107,_108];
 this.drawGraph_(this.rawData_);
 if(this.attr_("zoomCallback")){
-this.attr_("zoomCallback")(_108,_109);
+this.attr_("zoomCallback")(_107,_108);
 }
 };
-Dygraph.prototype.mouseMove_=function(_111){
-var _112=_111.mouse().page.x-PlotKit.Base.findPosX(this.hidden_);
-var _113=this.layout_.points;
+Dygraph.prototype.mouseMove_=function(_110){
+var _111=_110.mouse().page.x-PlotKit.Base.findPosX(this.hidden_);
+var _112=this.layout_.points;
+var _113=-1;
 var _114=-1;
-var _115=-1;
-var _116=1e+100;
+var _115=1e+100;
 var idx=-1;
-for(var i=0;i<_113.length;i++){
-var dist=Math.abs(_113[i].canvasx-_112);
-if(dist>_116){
+for(var i=0;i<_112.length;i++){
+var dist=Math.abs(_112[i].canvasx-_111);
+if(dist>_115){
 break;
 }
-_116=dist;
+_115=dist;
 idx=i;
 }
 if(idx>=0){
-_114=_113[idx].xval;
+_113=_112[idx].xval;
 }
-if(_112>_113[_113.length-1].canvasx){
-_114=_113[_113.length-1].xval;
+if(_111>_112[_112.length-1].canvasx){
+_113=_112[_112.length-1].xval;
 }
-var _119=[];
-for(var i=0;i<_113.length;i++){
-if(_113[i].xval==_114){
-_119.push(_113[i]);
+var _118=[];
+for(var i=0;i<_112.length;i++){
+if(_112[i].xval==_113){
+_118.push(_112[i]);
 }
 }
-var _120=this.attr_("highlightCircleSize");
+var _119=this.attr_("highlightCircleSize");
 var ctx=this.canvas_.getContext("2d");
 if(this.previousVerticalX_>=0){
 var px=this.previousVerticalX_;
-ctx.clearRect(px-_120-1,0,2*_120+2,this.height_);
+ctx.clearRect(px-_119-1,0,2*_119+2,this.height_);
 }
-if(_119.length>0){
-var _112=_119[0].canvasx;
-var _121=this.attr_("xValueFormatter")(_114,this)+":";
+var isOK=function(x){
+return x&&!isNaN(x);
+};
+if(_118.length>0){
+var _111=_118[0].canvasx;
+var _121=this.attr_("xValueFormatter")(_113,this)+":";
 var clen=this.colors_.length;
-for(var i=0;i<_119.length;i++){
+for(var i=0;i<_118.length;i++){
+if(!isOK(_118[i].canvasy)){
+continue;
+}
 if(this.attr_("labelsSeparateLines")){
 _121+="<br/>";
 }
-var _123=_119[i];
+var _123=_118[i];
 _121+=" <b><font color='"+this.colors_[i%clen].toHexString()+"'>"+_123.name+"</font></b>:"+this.round_(_123.yval,2);
 }
 this.attr_("labelsDiv").innerHTML=_121;
-this.lastx_=_114;
+this.lastx_=_113;
 ctx.save();
-for(var i=0;i<_119.length;i++){
+for(var i=0;i<_118.length;i++){
+if(!isOK(_118[i%clen].canvasy)){
+continue;
+}
 ctx.beginPath();
 ctx.fillStyle=this.colors_[i%clen].toRGBString();
-ctx.arc(_112,_119[i%clen].canvasy,_120,0,360,false);
+ctx.arc(_111,_118[i%clen].canvasy,_119,0,360,false);
 ctx.fill();
 }
 ctx.restore();
-this.previousVerticalX_=_112;
+this.previousVerticalX_=_111;
 }
 };
 Dygraph.prototype.mouseOut_=function(_124){
@@ -5349,71 +5391,109 @@ Dygraph.prototype.addYTicks_=function(minY,maxY){
 var _178=Dygraph.numericTicks(minY,maxY,this);
 this.layout_.updateOptions({yAxis:[minY,maxY],yTicks:_178});
 };
+Dygraph.prototype.extremeValues_=function(_179){
+var minY=null,maxY=null;
+var bars=this.attr_("errorBars")||this.customBars_;
+if(bars){
+for(var j=0;j<_179.length;j++){
+var y=_179[j][1][0];
+if(!y){
+continue;
+}
+var low=y-_179[j][1][1];
+var high=y+_179[j][1][2];
+if(low>y){
+low=y;
+}
+if(high<y){
+high=y;
+}
+if(maxY==null||high>maxY){
+maxY=high;
+}
+if(minY==null||low<minY){
+minY=low;
+}
+}
+}else{
+for(var j=0;j<_179.length;j++){
+var y=_179[j][1];
+if(!y){
+continue;
+}
+if(maxY==null||y>maxY){
+maxY=y;
+}
+if(minY==null||y<minY){
+minY=y;
+}
+}
+}
+return [minY,maxY];
+};
 Dygraph.prototype.drawGraph_=function(data){
-var maxY=null;
+var minY=null,maxY=null;
 this.layout_.removeAllDatasets();
 this.setColors_();
 for(var i=1;i<data[0].length;i++){
-var _179=[];
+var _183=[];
 for(var j=0;j<data.length;j++){
 var date=data[j][0];
-_179[j]=[date,data[j][i]];
+_183[j]=[date,data[j][i]];
 }
-_179=this.rollingAverage(_179,this.rollPeriod_);
+_183=this.rollingAverage(_183,this.rollPeriod_);
 var bars=this.attr_("errorBars")||this.customBars_;
 if(this.dateWindow_){
 var low=this.dateWindow_[0];
 var high=this.dateWindow_[1];
-var _183=[];
-for(var k=0;k<_179.length;k++){
-if(_179[k][0]>=low&&_179[k][0]<=high){
-_183.push(_179[k]);
-var y=bars?_179[k][1][0]:_179[k][1];
-if(maxY==null||y>maxY){
-maxY=y;
+var _184=[];
+for(var k=0;k<_183.length;k++){
+if(_183[k][0]>=low&&_183[k][0]<=high){
+_184.push(_183[k]);
 }
 }
+_183=_184;
 }
-_179=_183;
-}else{
-if(!this.customBars_){
-for(var j=0;j<_179.length;j++){
-var y=bars?_179[j][1][0]:_179[j][1];
-if(maxY==null||y>maxY){
-maxY=bars?y+_179[j][1][1]:y;
-}
-}
-}else{
-for(var j=0;j<_179.length;j++){
-var y=_179[j][1][0];
-var high=_179[j][1][2];
-if(high>y){
-y=high;
-}
-if(maxY==null||y>maxY){
-maxY=y;
-}
-}
+var _185=this.extremeValues_(_183);
+var _186=_185[0];
+var _187=_185[1];
+if(!minY||_186<minY){
+minY=_186;
 }
+if(!maxY||_187>maxY){
+maxY=_187;
 }
 if(bars){
 var vals=[];
-for(var j=0;j<_179.length;j++){
-vals[j]=[_179[j][0],_179[j][1][0],_179[j][1][1],_179[j][1][2]];
+for(var j=0;j<_183.length;j++){
+vals[j]=[_183[j][0],_183[j][1][0],_183[j][1][1],_183[j][1][2]];
 }
 this.layout_.addDataset(this.attr_("labels")[i],vals);
 }else{
-this.layout_.addDataset(this.attr_("labels")[i],_179);
+this.layout_.addDataset(this.attr_("labels")[i],_183);
 }
 }
 if(this.valueRange_!=null){
 this.addYTicks_(this.valueRange_[0],this.valueRange_[1]);
 }else{
-maxY*=1.1;
-if(maxY<=0){
-maxY=1;
+var span=maxY-minY;
+var _190=maxY+0.1*span;
+var _191=minY-0.1*span;
+if(_191<0&&minY>=0){
+_191=0;
+}
+if(_190>0&&maxY<=0){
+_190=0;
 }
-this.addYTicks_(0,maxY);
+if(this.attr_("includeZero")){
+if(maxY<0){
+_190=0;
+}
+if(minY>0){
+_191=0;
+}
+}
+this.addYTicks_(_191,_190);
 }
 this.addXTicks_();
 this.layout_.evaluateWithError();
@@ -5421,44 +5501,44 @@ this.plotter_.clear();
 this.plotter_.render();
 this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height);
 };
-Dygraph.prototype.rollingAverage=function(_185,_186){
-if(_185.length<2){
-return _185;
+Dygraph.prototype.rollingAverage=function(_192,_193){
+if(_192.length<2){
+return _192;
 }
-var _186=Math.min(_186,_185.length-1);
-var _187=[];
-var _188=this.attr_("sigma");
+var _193=Math.min(_193,_192.length-1);
+var _194=[];
+var _195=this.attr_("sigma");
 if(this.fractions_){
 var num=0;
 var den=0;
 var mult=100;
-for(var i=0;i<_185.length;i++){
-num+=_185[i][1][0];
-den+=_185[i][1][1];
-if(i-_186>=0){
-num-=_185[i-_186][1][0];
-den-=_185[i-_186][1][1];
-}
-var date=_185[i][0];
-var _191=den?num/den:0;
+for(var i=0;i<_192.length;i++){
+num+=_192[i][1][0];
+den+=_192[i][1][1];
+if(i-_193>=0){
+num-=_192[i-_193][1][0];
+den-=_192[i-_193][1][1];
+}
+var date=_192[i][0];
+var _198=den?num/den:0;
 if(this.attr_("errorBars")){
 if(this.wilsonInterval_){
 if(den){
-var p=_191<0?0:_191,n=den;
-var pm=_188*Math.sqrt(p*(1-p)/n+_188*_188/(4*n*n));
-var _194=1+_188*_188/den;
-var low=(p+_188*_188/(2*den)-pm)/_194;
-var high=(p+_188*_188/(2*den)+pm)/_194;
-_187[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
+var p=_198<0?0:_198,n=den;
+var pm=_195*Math.sqrt(p*(1-p)/n+_195*_195/(4*n*n));
+var _201=1+_195*_195/den;
+var low=(p+_195*_195/(2*den)-pm)/_201;
+var high=(p+_195*_195/(2*den)+pm)/_201;
+_194[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
 }else{
-_187[i]=[date,[0,0,0]];
+_194[i]=[date,[0,0,0]];
 }
 }else{
-var _195=den?_188*Math.sqrt(_191*(1-_191)/den):1;
-_187[i]=[date,[mult*_191,mult*_195,mult*_195]];
+var _202=den?_195*Math.sqrt(_198*(1-_198)/den):1;
+_194[i]=[date,[mult*_198,mult*_202,mult*_202]];
 }
 }else{
-_187[i]=[date,mult*_191];
+_194[i]=[date,mult*_198];
 }
 }
 }else{
@@ -5466,99 +5546,122 @@ if(this.customBars_){
 var low=0;
 var mid=0;
 var high=0;
-var _197=0;
-for(var i=0;i<_185.length;i++){
-var data=_185[i][1];
+var _204=0;
+for(var i=0;i<_192.length;i++){
+var data=_192[i][1];
 var y=data[1];
-_187[i]=[_185[i][0],[y,y-data[0],data[2]-y]];
+_194[i]=[_192[i][0],[y,y-data[0],data[2]-y]];
 low+=data[0];
 mid+=y;
 high+=data[2];
-_197+=1;
-if(i-_186>=0){
-var prev=_185[i-_186];
+_204+=1;
+if(i-_193>=0){
+var prev=_192[i-_193];
 low-=prev[1][0];
 mid-=prev[1][1];
 high-=prev[1][2];
-_197-=1;
+_204-=1;
 }
-_187[i]=[_185[i][0],[1*mid/_197,1*(mid-low)/_197,1*(high-mid)/_197]];
+_194[i]=[_192[i][0],[1*mid/_204,1*(mid-low)/_204,1*(high-mid)/_204]];
 }
 }else{
-var _199=Math.min(_186-1,_185.length-2);
+var _206=Math.min(_193-1,_192.length-2);
 if(!this.attr_("errorBars")){
-for(var i=0;i<_199;i++){
+if(_193==1){
+return _192;
+}
+for(var i=0;i<_206;i++){
 var sum=0;
 for(var j=0;j<i+1;j++){
-sum+=_185[j][1];
+sum+=_192[j][1];
 }
-_187[i]=[_185[i][0],sum/(i+1)];
+_194[i]=[_192[i][0],sum/(i+1)];
 }
-for(var i=Math.min(_186-1,_185.length-2);i<_185.length;i++){
+for(var i=Math.min(_193-1,_192.length-2);i<_192.length;i++){
 var sum=0;
-for(var j=i-_186+1;j<i+1;j++){
-sum+=_185[j][1];
+for(var j=i-_193+1;j<i+1;j++){
+sum+=_192[j][1];
 }
-_187[i]=[_185[i][0],sum/_186];
+_194[i]=[_192[i][0],sum/_193];
 }
 }else{
-for(var i=0;i<_199;i++){
+for(var i=0;i<_206;i++){
 var sum=0;
-var _201=0;
+var _208=0;
+var _209=0;
 for(var j=0;j<i+1;j++){
-sum+=_185[j][1][0];
-_201+=Math.pow(_185[j][1][1],2);
+var y=_192[j][1][0];
+if(!y||isNaN(y)){
+continue;
 }
-var _195=Math.sqrt(_201)/(i+1);
-_187[i]=[_185[i][0],[sum/(i+1),_188*_195,_188*_195]];
+_209++;
+sum+=y;
+_208+=Math.pow(_192[j][1][1],2);
 }
-for(var i=Math.min(_186-1,_185.length-2);i<_185.length;i++){
+if(_209){
+var _202=Math.sqrt(_208)/_209;
+_194[i]=[_192[i][0],[sum/_209,_195*_202,_195*_202]];
+}else{
+_194[i]=[_192[i][0],[null,null,null]];
+}
+}
+for(var i=Math.min(_193-1,_192.length-2);i<_192.length;i++){
 var sum=0;
-var _201=0;
-for(var j=i-_186+1;j<i+1;j++){
-sum+=_185[j][1][0];
-_201+=Math.pow(_185[j][1][1],2);
+var _208=0;
+var _209=0;
+for(var j=i-_193+1;j<i+1;j++){
+var y=_192[j][1][0];
+if(!y||isNaN(y)){
+continue;
 }
-var _195=Math.sqrt(_201)/_186;
-_187[i]=[_185[i][0],[sum/_186,_188*_195,_188*_195]];
+_209++;
+sum+=_192[j][1][0];
+_208+=Math.pow(_192[j][1][1],2);
 }
+if(_209){
+var _202=Math.sqrt(_208)/_209;
+_194[i]=[_192[i][0],[sum/_209,_195*_202,_195*_202]];
+}else{
+_194[i]=[_192[i][0],[null,null,null]];
 }
 }
 }
-return _187;
+}
+}
+return _194;
 };
-Dygraph.dateParser=function(_202,self){
-var _203;
+Dygraph.dateParser=function(_210,self){
+var _211;
 var d;
-if(_202.length==10&&_202.search("-")!=-1){
-_203=_202.replace("-","/","g");
-while(_203.search("-")!=-1){
-_203=_203.replace("-","/");
+if(_210.length==10&&_210.search("-")!=-1){
+_211=_210.replace("-","/","g");
+while(_211.search("-")!=-1){
+_211=_211.replace("-","/");
 }
-d=Date.parse(_203);
+d=Date.parse(_211);
 }else{
-if(_202.length==8){
-_203=_202.substr(0,4)+"/"+_202.substr(4,2)+"/"+_202.substr(6,2);
-d=Date.parse(_203);
+if(_210.length==8){
+_211=_210.substr(0,4)+"/"+_210.substr(4,2)+"/"+_210.substr(6,2);
+d=Date.parse(_211);
 }else{
-d=Date.parse(_202);
+d=Date.parse(_210);
 }
 }
 if(!d||isNaN(d)){
-self.error("Couldn't parse "+_202+" as a date");
+self.error("Couldn't parse "+_210+" as a date");
 }
 return d;
 };
 Dygraph.prototype.detectTypeFromString_=function(str){
-var _205=false;
+var _213=false;
 if(str.indexOf("-")>=0||str.indexOf("/")>=0||isNaN(parseFloat(str))){
-_205=true;
+_213=true;
 }else{
 if(str.length==8&&str>"19700101"&&str<"20371231"){
-_205=true;
+_213=true;
 }
 }
-if(_205){
+if(_213){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xValueParser=Dygraph.dateParser;
 this.attrs_.xTicker=Dygraph.dateTicker;
@@ -5574,57 +5677,57 @@ this.attrs_.xTicker=Dygraph.numericTicks;
 };
 Dygraph.prototype.parseCSV_=function(data){
 var ret=[];
-var _206=data.split("\n");
-var _207=0;
+var _214=data.split("\n");
+var _215=0;
 if(this.labelsFromCSV_){
-_207=1;
-this.attrs_.labels=_206[0].split(",");
-}
-var _208;
-var _209=false;
-var _210=this.attr_("labels").length;
-for(var i=_207;i<_206.length;i++){
-var line=_206[i];
+_215=1;
+this.attrs_.labels=_214[0].split(",");
+}
+var _216;
+var _217=false;
+var _218=this.attr_("labels").length;
+for(var i=_215;i<_214.length;i++){
+var line=_214[i];
 if(line.length==0){
 continue;
 }
-var _212=line.split(",");
-if(_212.length<2){
+var _220=line.split(",");
+if(_220.length<2){
 continue;
 }
-var _213=[];
-if(!_209){
-this.detectTypeFromString_(_212[0]);
-_208=this.attr_("xValueParser");
-_209=true;
+var _221=[];
+if(!_217){
+this.detectTypeFromString_(_220[0]);
+_216=this.attr_("xValueParser");
+_217=true;
 }
-_213[0]=_208(_212[0],this);
+_221[0]=_216(_220[0],this);
 if(this.fractions_){
-for(var j=1;j<_212.length;j++){
-var vals=_212[j].split("/");
-_213[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
+for(var j=1;j<_220.length;j++){
+var vals=_220[j].split("/");
+_221[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
 }
 }else{
 if(this.attr_("errorBars")){
-for(var j=1;j<_212.length;j+=2){
-_213[(j+1)/2]=[parseFloat(_212[j]),parseFloat(_212[j+1])];
+for(var j=1;j<_220.length;j+=2){
+_221[(j+1)/2]=[parseFloat(_220[j]),parseFloat(_220[j+1])];
 }
 }else{
 if(this.customBars_){
-for(var j=1;j<_212.length;j++){
-var vals=_212[j].split(";");
-_213[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
+for(var j=1;j<_220.length;j++){
+var vals=_220[j].split(";");
+_221[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
 }
 }else{
-for(var j=1;j<_212.length;j++){
-_213[j]=parseFloat(_212[j]);
+for(var j=1;j<_220.length;j++){
+_221[j]=parseFloat(_220[j]);
 }
 }
 }
 }
-ret.push(_213);
-if(_213.length!=_210){
-this.error("Number of columns in line "+i+" ("+_213.length+") does not agree with number of labels ("+_210+") "+line);
+ret.push(_221);
+if(_221.length!=_218){
+this.error("Number of columns in line "+i+" ("+_221.length+") does not agree with number of labels ("+_218+") "+line);
 }
 }
 return ret;
@@ -5648,19 +5751,19 @@ this.attrs_.labels.push("Y"+i);
 if(MochiKit.Base.isDateLike(data[0][0])){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xTicker=Dygraph.dateTicker;
-var _214=MochiKit.Base.clone(data);
+var _222=MochiKit.Base.clone(data);
 for(var i=0;i<data.length;i++){
-if(_214[i].length==0){
+if(_222[i].length==0){
 this.error("Row "<<(1+i)<<" of data is empty");
 return null;
 }
-if(_214[i][0]==null||typeof (_214[i][0].getTime)!="function"){
+if(_222[i][0]==null||typeof (_222[i][0].getTime)!="function"){
 this.error("x value in row "<<(1+i)<<" is not a Date");
 return null;
 }
-_214[i][0]=_214[i][0].getTime();
+_222[i][0]=_222[i][0].getTime();
 }
-return _214;
+return _222;
 }else{
 this.attrs_.xValueFormatter=function(x){
 return x;
@@ -5672,18 +5775,18 @@ return data;
 Dygraph.prototype.parseDataTable_=function(data){
 var cols=data.getNumberOfColumns();
 var rows=data.getNumberOfRows();
-var _217=[];
+var _225=[];
 for(var i=0;i<cols;i++){
-_217.push(data.getColumnLabel(i));
+_225.push(data.getColumnLabel(i));
 }
-this.attrs_.labels=_217;
-var _218=data.getColumnType(0);
-if(_218=="date"){
+this.attrs_.labels=_225;
+var _226=data.getColumnType(0);
+if(_226=="date"){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xValueParser=Dygraph.dateParser;
 this.attrs_.xTicker=Dygraph.dateTicker;
 }else{
-if(_218!="number"){
+if(_226=="number"){
 this.attrs_.xValueFormatter=function(x){
 return x;
 };
@@ -5692,14 +5795,17 @@ return parseFloat(x);
 };
 this.attrs_.xTicker=Dygraph.numericTicks;
 }else{
-this.error("only 'date' and 'number' types are supported for column 1"+"of DataTable input (Got '"+_218+"')");
+this.error("only 'date' and 'number' types are supported for column 1 "+"of DataTable input (Got '"+_226+"')");
 return null;
 }
 }
 var ret=[];
 for(var i=0;i<rows;i++){
 var row=[];
-if(_218=="date"){
+if(!data.getValue(i,0)){
+continue;
+}
+if(_226=="date"){
 row.push(data.getValue(i,0).getTime());
 }else{
 row.push(data.getValue(i,0));
@@ -5728,11 +5834,11 @@ if(this.file_.indexOf("\n")>=0){
 this.loadedEvent_(this.file_);
 }else{
 var req=new XMLHttpRequest();
-var _221=this;
+var _229=this;
 req.onreadystatechange=function(){
 if(req.readyState==4){
 if(req.status==200){
-_221.loadedEvent_(req.responseText);
+_229.loadedEvent_(req.responseText);
 }
 }
 };
@@ -5746,39 +5852,39 @@ this.error("Unknown data format: "+(typeof this.file_));
 }
 }
 };
-Dygraph.prototype.updateOptions=function(_222){
-if(_222.customBars){
-this.customBars_=_222.customBars;
+Dygraph.prototype.updateOptions=function(_230){
+if(_230.customBars){
+this.customBars_=_230.customBars;
 }
-if(_222.rollPeriod){
-this.rollPeriod_=_222.rollPeriod;
+if(_230.rollPeriod){
+this.rollPeriod_=_230.rollPeriod;
 }
-if(_222.dateWindow){
-this.dateWindow_=_222.dateWindow;
+if(_230.dateWindow){
+this.dateWindow_=_230.dateWindow;
 }
-if(_222.valueRange){
-this.valueRange_=_222.valueRange;
+if(_230.valueRange){
+this.valueRange_=_230.valueRange;
 }
-MochiKit.Base.update(this.user_attrs_,_222);
+MochiKit.Base.update(this.user_attrs_,_230);
 this.labelsFromCSV_=(this.attr_("labels")==null);
 this.layout_.updateOptions({"errorBars":this.attr_("errorBars")});
-if(_222["file"]&&_222["file"]!=this.file_){
-this.file_=_222["file"];
+if(_230["file"]&&_230["file"]!=this.file_){
+this.file_=_230["file"];
 this.start_();
 }else{
 this.drawGraph_(this.rawData_);
 }
 };
-Dygraph.prototype.adjustRoll=function(_223){
-this.rollPeriod_=_223;
+Dygraph.prototype.adjustRoll=function(_231){
+this.rollPeriod_=_231;
 this.drawGraph_(this.rawData_);
 };
-Dygraph.GVizChart=function(_224){
-this.container=_224;
+Dygraph.GVizChart=function(_232){
+this.container=_232;
 };
-Dygraph.GVizChart.prototype.draw=function(data,_225){
+Dygraph.GVizChart.prototype.draw=function(data,_233){
 this.container.innerHTML="";
-this.date_graph=new Dygraph(this.container,data,_225);
+this.date_graph=new Dygraph(this.container,data,_233);
 };
 DateGraph=Dygraph;