update combined
[dygraphs.git] / dygraph-combined.js
index 42928fc..df6491e 100644 (file)
@@ -18,7 +18,14 @@ this._evaluateLineTicks();
 };
 DygraphLayout.prototype._evaluateLimits=function(){
 this.minxval=this.maxxval=null;
+if(this.options.dateWindow){
+this.minxval=this.options.dateWindow[0];
+this.maxxval=this.options.dateWindow[1];
+}else{
 for(var _6 in this.datasets){
+if(!this.datasets.hasOwnProperty(_6)){
+continue;
+}
 var _7=this.datasets[_6];
 var x1=_7[0][0];
 if(!this.minxval||x1<this.minxval){
@@ -29,6 +36,7 @@ if(!this.maxxval||x2>this.maxxval){
 this.maxxval=x2;
 }
 }
+}
 this.xrange=this.maxxval-this.minxval;
 this.xscale=(this.xrange!=0?1/this.xrange:1);
 this.minyval=this.options.yAxis[0];
@@ -39,6 +47,9 @@ this.yscale=(this.yrange!=0?1/this.yrange:1);
 DygraphLayout.prototype._evaluateLineCharts=function(){
 this.points=new Array();
 for(var _10 in this.datasets){
+if(!this.datasets.hasOwnProperty(_10)){
+continue;
+}
 var _11=this.datasets[_10];
 for(var j=0;j<_11.length;j++){
 var _13=_11[j];
@@ -82,6 +93,9 @@ return;
 }
 var i=0;
 for(var _19 in this.datasets){
+if(!this.datasets.hasOwnProperty(_19)){
+continue;
+}
 var j=0;
 var _20=this.datasets[_19];
 for(var j=0;j<_20.length;j++,i++){
@@ -214,8 +228,10 @@ var _41={"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","z
 var _42=function(txt){
 var div=document.createElement("div");
 for(var _45 in _41){
+if(_41.hasOwnProperty(_45)){
 div.style[_45]=_41[_45];
 }
+}
 div.appendChild(document.createTextNode(txt));
 return div;
 };
@@ -223,7 +239,7 @@ _40.save();
 _40.strokeStyle=this.options.axisLineColor;
 _40.lineWidth=this.options.axisLineWidth;
 if(this.options.drawYAxis){
-if(this.layout.yticks){
+if(this.layout.yticks&&this.layout.yticks.length>0){
 for(var i=0;i<this.layout.yticks.length;i++){
 var _46=this.layout.yticks[i];
 if(typeof (_46)=="function"){
@@ -312,8 +328,10 @@ var _55=this.options.colorScheme;
 var _56=this.layout.options.errorBars;
 var _57=[];
 for(var _58 in this.layout.datasets){
+if(this.layout.datasets.hasOwnProperty(_58)){
 _57.push(_58);
 }
+}
 var _59=_57.length;
 for(var i=0;i<this.layout.points.length;i++){
 var _60=this.layout.points[i];
@@ -428,7 +446,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,axisTickSize:3,axisLabelFontSize:14,xAxisLabelWidth:50,yAxisLabelWidth:50,rightGap:5,showRoller:false,xValueFormatter:Dygraph.dateString_,xValueParser:Dygraph.dateParser,xTicker:Dygraph.dateTicker,delimiter:",",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,labelsKMG2:false,strokeWidth:1,axisTickSize:3,axisLabelFontSize:14,xAxisLabelWidth:50,yAxisLabelWidth:50,rightGap:5,showRoller:false,xValueFormatter:Dygraph.dateString_,xValueParser:Dygraph.dateParser,xTicker:Dygraph.dateTicker,delimiter:",",sigma:2,errorBars:false,fractions:false,wilsonInterval:true,customBars:false};
 Dygraph.DEBUG=1;
 Dygraph.INFO=2;
 Dygraph.WARNING=3;
@@ -470,18 +488,6 @@ this.attrs_={};
 Dygraph.update(this.attrs_,Dygraph.DEFAULT_ATTRS);
 this.labelsFromCSV_=(this.attr_("labels")==null);
 this.createInterface_();
-this.layoutOptions_={"xOriginIsZero":false};
-Dygraph.update(this.layoutOptions_,this.attrs_);
-Dygraph.update(this.layoutOptions_,this.user_attrs_);
-Dygraph.update(this.layoutOptions_,{"errorBars":(this.attr_("errorBars")||this.attr_("customBars"))});
-this.layout_=new DygraphLayout(this,this.layoutOptions_);
-this.renderOptions_={colorScheme:this.colors_,strokeColor:null,axisLineWidth:Dygraph.AXIS_LINE_WIDTH};
-Dygraph.update(this.renderOptions_,this.attrs_);
-Dygraph.update(this.renderOptions_,this.user_attrs_);
-this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.layout_,this.renderOptions_);
-this.createStatusMessage_();
-this.createRollInterface_();
-this.createDragInterface_();
 this.start_();
 };
 Dygraph.prototype.attr_=function(_83){
@@ -559,6 +565,18 @@ _94.mouseMove_(e);
 Dygraph.addEvent(this.hidden_,"mouseout",function(e){
 _94.mouseOut_(e);
 });
+this.layoutOptions_={"xOriginIsZero":false};
+Dygraph.update(this.layoutOptions_,this.attrs_);
+Dygraph.update(this.layoutOptions_,this.user_attrs_);
+Dygraph.update(this.layoutOptions_,{"errorBars":(this.attr_("errorBars")||this.attr_("customBars"))});
+this.layout_=new DygraphLayout(this,this.layoutOptions_);
+this.renderOptions_={colorScheme:this.colors_,strokeColor:null,axisLineWidth:Dygraph.AXIS_LINE_WIDTH};
+Dygraph.update(this.renderOptions_,this.attrs_);
+Dygraph.update(this.renderOptions_,this.user_attrs_);
+this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.layout_,this.renderOptions_);
+this.createStatusMessage_();
+this.createRollInterface_();
+this.createDragInterface_();
 };
 Dygraph.prototype.createPlotKitCanvas_=function(_95){
 var h=Dygraph.createCanvas();
@@ -682,8 +700,10 @@ var _116={"position":"absolute","fontSize":"14px","zIndex":10,"width":_115+"px",
 Dygraph.update(_116,this.attr_("labelsDivStyles"));
 var div=document.createElement("div");
 for(var name in _116){
+if(_116.hasOwnProperty(name)){
 div.style[name]=_116[name];
 }
+}
 this.graphDiv.appendChild(div);
 this.attrs_.labelsDiv=div;
 }
@@ -696,8 +716,10 @@ _120.type="text";
 _120.size="2";
 _120.value=this.rollPeriod_;
 for(var name in _119){
+if(_119.hasOwnProperty(name)){
 _120.style[name]=_119[name];
 }
+}
 var pa=this.graphDiv;
 pa.appendChild(_120);
 var _122=this;
@@ -727,11 +749,14 @@ return e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
 Dygraph.prototype.createDragInterface_=function(){
 var self=this;
 var _126=false;
-var _127=null;
+var _127=false;
 var _128=null;
 var _129=null;
 var _130=null;
 var _131=null;
+var _132=null;
+var _133=null;
+var _134=null;
 var px=0;
 var py=0;
 var getX=function(e){
@@ -740,158 +765,185 @@ return Dygraph.pageX(e)-px;
 var getY=function(e){
 return Dygraph.pageX(e)-py;
 };
-Dygraph.addEvent(this.hidden_,"mousemove",function(_136){
+Dygraph.addEvent(this.hidden_,"mousemove",function(_139){
 if(_126){
-_129=getX(_136);
-_130=getY(_136);
-self.drawZoomRect_(_127,_129,_131);
-_131=_129;
+_130=getX(_139);
+_131=getY(_139);
+self.drawZoomRect_(_128,_130,_132);
+_132=_130;
+}else{
+if(_127){
+_130=getX(_139);
+_131=getY(_139);
+self.dateWindow_[0]=_133-(_130/self.width_)*_134;
+self.dateWindow_[1]=self.dateWindow_[0]+_134;
+self.drawGraph_(self.rawData_);
+}
 }
 });
-Dygraph.addEvent(this.hidden_,"mousedown",function(_137){
-_126=true;
+Dygraph.addEvent(this.hidden_,"mousedown",function(_140){
 px=Dygraph.findPosX(self.canvas_);
 py=Dygraph.findPosY(self.canvas_);
-_127=getX(_137);
-_128=getY(_137);
+_128=getX(_140);
+_129=getY(_140);
+if(_140.altKey||_140.shiftKey){
+if(!self.dateWindow_){
+return;
+}
+_127=true;
+_134=self.dateWindow_[1]-self.dateWindow_[0];
+_133=(_128/self.width_)*_134+self.dateWindow_[0];
+}else{
+_126=true;
+}
 });
-Dygraph.addEvent(document,"mouseup",function(_138){
-if(_126){
+Dygraph.addEvent(document,"mouseup",function(_141){
+if(_126||_127){
 _126=false;
-_127=null;
 _128=null;
+_129=null;
+}
+if(_127){
+_127=false;
+_133=null;
+_134=null;
 }
 });
-Dygraph.addEvent(this.hidden_,"mouseout",function(_139){
+Dygraph.addEvent(this.hidden_,"mouseout",function(_142){
 if(_126){
-_129=null;
 _130=null;
+_131=null;
 }
 });
-Dygraph.addEvent(this.hidden_,"mouseup",function(_140){
+Dygraph.addEvent(this.hidden_,"mouseup",function(_143){
 if(_126){
 _126=false;
-_129=getX(_140);
-_130=getY(_140);
-var _141=Math.abs(_129-_127);
-var _142=Math.abs(_130-_128);
-if(_141<2&&_142<2&&self.attr_("clickCallback")!=null&&self.lastx_!=undefined){
-self.attr_("clickCallback")(_140,self.lastx_,self.selPoints_);
-}
-if(_141>=10){
-self.doZoom_(Math.min(_127,_129),Math.max(_127,_129));
+_130=getX(_143);
+_131=getY(_143);
+var _144=Math.abs(_130-_128);
+var _145=Math.abs(_131-_129);
+if(_144<2&&_145<2&&self.attr_("clickCallback")!=null&&self.lastx_!=undefined){
+self.attr_("clickCallback")(_143,self.lastx_,self.selPoints_);
+}
+if(_144>=10){
+self.doZoom_(Math.min(_128,_130),Math.max(_128,_130));
 }else{
 self.canvas_.getContext("2d").clearRect(0,0,self.canvas_.width,self.canvas_.height);
 }
-_127=null;
 _128=null;
+_129=null;
+}
+if(_127){
+_127=false;
+_133=null;
+_134=null;
 }
 });
-Dygraph.addEvent(this.hidden_,"dblclick",function(_143){
+Dygraph.addEvent(this.hidden_,"dblclick",function(_146){
 if(self.dateWindow_==null){
 return;
 }
 self.dateWindow_=null;
 self.drawGraph_(self.rawData_);
-var _144=self.rawData_[0][0];
-var _145=self.rawData_[self.rawData_.length-1][0];
+var _147=self.rawData_[0][0];
+var _148=self.rawData_[self.rawData_.length-1][0];
 if(self.attr_("zoomCallback")){
-self.attr_("zoomCallback")(_144,_145);
+self.attr_("zoomCallback")(_147,_148);
 }
 });
 };
-Dygraph.prototype.drawZoomRect_=function(_146,endX,_148){
+Dygraph.prototype.drawZoomRect_=function(_149,endX,_151){
 var ctx=this.canvas_.getContext("2d");
-if(_148){
-ctx.clearRect(Math.min(_146,_148),0,Math.abs(_146-_148),this.height_);
+if(_151){
+ctx.clearRect(Math.min(_149,_151),0,Math.abs(_149-_151),this.height_);
 }
-if(endX&&_146){
+if(endX&&_149){
 ctx.fillStyle="rgba(128,128,128,0.33)";
-ctx.fillRect(Math.min(_146,endX),0,Math.abs(endX-_146),this.height_);
+ctx.fillRect(Math.min(_149,endX),0,Math.abs(endX-_149),this.height_);
 }
 };
-Dygraph.prototype.doZoom_=function(lowX,_150){
-var _151=this.layout_.points;
-var _152=null;
-var _153=null;
-for(var i=0;i<_151.length;i++){
-var cx=_151[i].canvasx;
-var x=_151[i].xval;
-if(cx<lowX&&(_152==null||x>_152)){
-_152=x;
+Dygraph.prototype.doZoom_=function(lowX,_153){
+var _154=this.layout_.points;
+var _155=null;
+var _156=null;
+for(var i=0;i<_154.length;i++){
+var cx=_154[i].canvasx;
+var x=_154[i].xval;
+if(cx<lowX&&(_155==null||x>_155)){
+_155=x;
 }
-if(cx>_150&&(_153==null||x<_153)){
-_153=x;
+if(cx>_153&&(_156==null||x<_156)){
+_156=x;
 }
 }
-if(_152==null){
-_152=_151[0].xval;
+if(_155==null){
+_155=_154[0].xval;
 }
-if(_153==null){
-_153=_151[_151.length-1].xval;
+if(_156==null){
+_156=_154[_154.length-1].xval;
 }
-this.dateWindow_=[_152,_153];
+this.dateWindow_=[_155,_156];
 this.drawGraph_(this.rawData_);
 if(this.attr_("zoomCallback")){
-this.attr_("zoomCallback")(_152,_153);
+this.attr_("zoomCallback")(_155,_156);
 }
 };
-Dygraph.prototype.mouseMove_=function(_155){
-var _156=Dygraph.pageX(_155)-Dygraph.findPosX(this.hidden_);
-var _157=this.layout_.points;
-var _158=-1;
-var _159=-1;
-var _160=1e+100;
+Dygraph.prototype.mouseMove_=function(_158){
+var _159=Dygraph.pageX(_158)-Dygraph.findPosX(this.hidden_);
+var _160=this.layout_.points;
+var _161=-1;
+var _162=-1;
+var _163=1e+100;
 var idx=-1;
-for(var i=0;i<_157.length;i++){
-var dist=Math.abs(_157[i].canvasx-_156);
-if(dist>_160){
+for(var i=0;i<_160.length;i++){
+var dist=Math.abs(_160[i].canvasx-_159);
+if(dist>_163){
 break;
 }
-_160=dist;
+_163=dist;
 idx=i;
 }
 if(idx>=0){
-_158=_157[idx].xval;
+_161=_160[idx].xval;
 }
-if(_156>_157[_157.length-1].canvasx){
-_158=_157[_157.length-1].xval;
+if(_159>_160[_160.length-1].canvasx){
+_161=_160[_160.length-1].xval;
 }
 this.selPoints_=[];
-for(var i=0;i<_157.length;i++){
-if(_157[i].xval==_158){
-this.selPoints_.push(_157[i]);
+for(var i=0;i<_160.length;i++){
+if(_160[i].xval==_161){
+this.selPoints_.push(_160[i]);
 }
 }
 if(this.attr_("highlightCallback")){
-this.attr_("highlightCallback")(_155,_158,this.selPoints_);
+this.attr_("highlightCallback")(_158,_161,this.selPoints_);
 }
-var _163=this.attr_("highlightCircleSize");
+var _166=this.attr_("highlightCircleSize");
 var ctx=this.canvas_.getContext("2d");
 if(this.previousVerticalX_>=0){
 var px=this.previousVerticalX_;
-ctx.clearRect(px-_163-1,0,2*_163+2,this.height_);
+ctx.clearRect(px-_166-1,0,2*_166+2,this.height_);
 }
 var isOK=function(x){
 return x&&!isNaN(x);
 };
 if(this.selPoints_.length>0){
-var _156=this.selPoints_[0].canvasx;
-var _165=this.attr_("xValueFormatter")(_158,this)+":";
+var _159=this.selPoints_[0].canvasx;
+var _168=this.attr_("xValueFormatter")(_161,this)+":";
 var clen=this.colors_.length;
 for(var i=0;i<this.selPoints_.length;i++){
 if(!isOK(this.selPoints_[i].canvasy)){
 continue;
 }
 if(this.attr_("labelsSeparateLines")){
-_165+="<br/>";
+_168+="<br/>";
 }
-var _167=this.selPoints_[i];
+var _170=this.selPoints_[i];
 var c=new RGBColor(this.colors_[i%clen]);
-_165+=" <b><font color='"+c.toHex()+"'>"+_167.name+"</font></b>:"+this.round_(_167.yval,2);
+_168+=" <b><font color='"+c.toHex()+"'>"+_170.name+"</font></b>:"+this.round_(_170.yval,2);
 }
-this.attr_("labelsDiv").innerHTML=_165;
-this.lastx_=_158;
+this.attr_("labelsDiv").innerHTML=_168;
+this.lastx_=_161;
 ctx.save();
 for(var i=0;i<this.selPoints_.length;i++){
 if(!isOK(this.selPoints_[i%clen].canvasy)){
@@ -899,14 +951,14 @@ continue;
 }
 ctx.beginPath();
 ctx.fillStyle=this.colors_[i%clen];
-ctx.arc(_156,this.selPoints_[i%clen].canvasy,_163,0,2*Math.PI,false);
+ctx.arc(_159,this.selPoints_[i%clen].canvasy,_166,0,2*Math.PI,false);
 ctx.fill();
 }
 ctx.restore();
-this.previousVerticalX_=_156;
+this.previousVerticalX_=_159;
 }
 };
-Dygraph.prototype.mouseOut_=function(_169){
+Dygraph.prototype.mouseOut_=function(_172){
 var ctx=this.canvas_.getContext("2d");
 ctx.clearRect(0,0,this.width_,this.height_);
 this.attr_("labelsDiv").innerHTML="";
@@ -919,34 +971,34 @@ return ""+x;
 }
 };
 Dygraph.prototype.hmsString_=function(date){
-var _171=Dygraph.zeropad;
+var _174=Dygraph.zeropad;
 var d=new Date(date);
 if(d.getSeconds()){
-return _171(d.getHours())+":"+_171(d.getMinutes())+":"+_171(d.getSeconds());
+return _174(d.getHours())+":"+_174(d.getMinutes())+":"+_174(d.getSeconds());
 }else{
 if(d.getMinutes()){
-return _171(d.getHours())+":"+_171(d.getMinutes());
+return _174(d.getHours())+":"+_174(d.getMinutes());
 }else{
-return _171(d.getHours());
+return _174(d.getHours());
 }
 }
 };
 Dygraph.dateString_=function(date,self){
-var _173=Dygraph.zeropad;
+var _176=Dygraph.zeropad;
 var d=new Date(date);
 var year=""+d.getFullYear();
-var _175=_173(d.getMonth()+1);
-var day=_173(d.getDate());
+var _178=_176(d.getMonth()+1);
+var day=_176(d.getDate());
 var ret="";
 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
 if(frac){
 ret=" "+self.hmsString_(date);
 }
-return year+"/"+_175+"/"+day+ret;
+return year+"/"+_178+"/"+day+ret;
 };
-Dygraph.prototype.round_=function(num,_179){
-var _180=Math.pow(10,_179);
-return Math.round(num*_180)/_180;
+Dygraph.prototype.round_=function(num,_182){
+var _183=Math.pow(10,_182);
+return Math.round(num*_183)/_183;
 };
 Dygraph.prototype.loadedEvent_=function(data){
 this.rawData_=this.parseCSV_(data);
@@ -955,199 +1007,251 @@ this.drawGraph_(this.rawData_);
 Dygraph.prototype.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
 Dygraph.prototype.quarters=["Jan","Apr","Jul","Oct"];
 Dygraph.prototype.addXTicks_=function(){
-var _182,endDate;
+var _185,endDate;
 if(this.dateWindow_){
-_182=this.dateWindow_[0];
+_185=this.dateWindow_[0];
 endDate=this.dateWindow_[1];
 }else{
-_182=this.rawData_[0][0];
+_185=this.rawData_[0][0];
 endDate=this.rawData_[this.rawData_.length-1][0];
 }
-var _183=this.attr_("xTicker")(_182,endDate,this);
-this.layout_.updateOptions({xTicks:_183});
+var _186=this.attr_("xTicker")(_185,endDate,this);
+this.layout_.updateOptions({xTicks:_186});
 };
 Dygraph.SECONDLY=0;
-Dygraph.TEN_SECONDLY=1;
-Dygraph.THIRTY_SECONDLY=2;
-Dygraph.MINUTELY=3;
-Dygraph.TEN_MINUTELY=4;
-Dygraph.THIRTY_MINUTELY=5;
-Dygraph.HOURLY=6;
-Dygraph.SIX_HOURLY=7;
-Dygraph.DAILY=8;
-Dygraph.WEEKLY=9;
-Dygraph.MONTHLY=10;
-Dygraph.QUARTERLY=11;
-Dygraph.BIANNUAL=12;
-Dygraph.ANNUAL=13;
-Dygraph.DECADAL=14;
-Dygraph.NUM_GRANULARITIES=15;
+Dygraph.TWO_SECONDLY=1;
+Dygraph.FIVE_SECONDLY=2;
+Dygraph.TEN_SECONDLY=3;
+Dygraph.THIRTY_SECONDLY=4;
+Dygraph.MINUTELY=5;
+Dygraph.TWO_MINUTELY=6;
+Dygraph.FIVE_MINUTELY=7;
+Dygraph.TEN_MINUTELY=8;
+Dygraph.THIRTY_MINUTELY=9;
+Dygraph.HOURLY=10;
+Dygraph.TWO_HOURLY=11;
+Dygraph.SIX_HOURLY=12;
+Dygraph.DAILY=13;
+Dygraph.WEEKLY=14;
+Dygraph.MONTHLY=15;
+Dygraph.QUARTERLY=16;
+Dygraph.BIANNUAL=17;
+Dygraph.ANNUAL=18;
+Dygraph.DECADAL=19;
+Dygraph.NUM_GRANULARITIES=20;
 Dygraph.SHORT_SPACINGS=[];
 Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1000*1;
+Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY]=1000*2;
+Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY]=1000*5;
 Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1000*10;
 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=1000*30;
 Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=1000*60;
+Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY]=1000*60*2;
+Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY]=1000*60*5;
 Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=1000*60*10;
 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=1000*60*30;
 Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600;
-Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600*6;
+Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]=1000*3600*2;
+Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]=1000*3600*6;
 Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=1000*86400;
 Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=1000*604800;
-Dygraph.prototype.NumXTicks=function(_184,_185,_186){
-if(_186<Dygraph.MONTHLY){
-var _187=Dygraph.SHORT_SPACINGS[_186];
-return Math.floor(0.5+1*(_185-_184)/_187);
+Dygraph.prototype.NumXTicks=function(_187,_188,_189){
+if(_189<Dygraph.MONTHLY){
+var _190=Dygraph.SHORT_SPACINGS[_189];
+return Math.floor(0.5+1*(_188-_187)/_190);
 }else{
-var _188=1;
-var _189=12;
-if(_186==Dygraph.QUARTERLY){
-_189=3;
-}
-if(_186==Dygraph.BIANNUAL){
-_189=2;
-}
-if(_186==Dygraph.ANNUAL){
-_189=1;
+var _191=1;
+var _192=12;
+if(_189==Dygraph.QUARTERLY){
+_192=3;
+}
+if(_189==Dygraph.BIANNUAL){
+_192=2;
+}
+if(_189==Dygraph.ANNUAL){
+_192=1;
+}
+if(_189==Dygraph.DECADAL){
+_192=1;
+_191=10;
+}
+var _193=365.2524*24*3600*1000;
+var _194=1*(_188-_187)/_193;
+return Math.floor(0.5+1*_194*_192/_191);
+}
+};
+Dygraph.prototype.GetXAxis=function(_195,_196,_197){
+var _198=[];
+if(_197<Dygraph.MONTHLY){
+var _199=Dygraph.SHORT_SPACINGS[_197];
+var _200="%d%b";
+var g=_199/1000;
+this.info(g);
+var d=new Date(_195);
+if(g<=60){
+var x=d.getSeconds();
+d.setSeconds(x-x%g);
+}else{
+d.setSeconds(0);
+g/=60;
+if(g<=60){
+var x=d.getMinutes();
+d.setMinutes(x-x%g);
+}else{
+d.setMinutes(0);
+g/=60;
+if(g<=24){
+var x=d.getHours();
+d.setHours(x-x%g);
+}else{
+d.setHours(0);
+g/=24;
+if(g==7){
+d.setDate(d.getDate()-d.getDay());
 }
-if(_186==Dygraph.DECADAL){
-_189=1;
-_188=10;
 }
-var _190=365.2524*24*3600*1000;
-var _191=1*(_185-_184)/_190;
-return Math.floor(0.5+1*_191*_189/_188);
 }
-};
-Dygraph.prototype.GetXAxis=function(_192,_193,_194){
-var _195=[];
-if(_194<Dygraph.MONTHLY){
-var _196=Dygraph.SHORT_SPACINGS[_194];
-var _197="%d%b";
-if(_194<Dygraph.HOURLY){
-_192=_196*Math.floor(0.5+_192/_196);
 }
-for(var t=_192;t<=_193;t+=_196){
+_195=d.getTime();
+for(var t=_195;t<=_196;t+=_199){
 var d=new Date(t);
 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
-if(frac==0||_194>=Dygraph.DAILY){
-_195.push({v:t,label:new Date(t+3600*1000).strftime(_197)});
+if(frac==0||_197>=Dygraph.DAILY){
+_198.push({v:t,label:new Date(t+3600*1000).strftime(_200)});
 }else{
-_195.push({v:t,label:this.hmsString_(t)});
+_198.push({v:t,label:this.hmsString_(t)});
 }
 }
 }else{
-var _198;
-var _199=1;
-if(_194==Dygraph.MONTHLY){
-_198=[0,1,2,3,4,5,6,7,8,9,10,11,12];
+var _202;
+var _203=1;
+if(_197==Dygraph.MONTHLY){
+_202=[0,1,2,3,4,5,6,7,8,9,10,11,12];
 }else{
-if(_194==Dygraph.QUARTERLY){
-_198=[0,3,6,9];
+if(_197==Dygraph.QUARTERLY){
+_202=[0,3,6,9];
 }else{
-if(_194==Dygraph.BIANNUAL){
-_198=[0,6];
+if(_197==Dygraph.BIANNUAL){
+_202=[0,6];
 }else{
-if(_194==Dygraph.ANNUAL){
-_198=[0];
+if(_197==Dygraph.ANNUAL){
+_202=[0];
 }else{
-if(_194==Dygraph.DECADAL){
-_198=[0];
-_199=10;
+if(_197==Dygraph.DECADAL){
+_202=[0];
+_203=10;
 }
 }
 }
 }
 }
-var _200=new Date(_192).getFullYear();
-var _201=new Date(_193).getFullYear();
-var _202=Dygraph.zeropad;
-for(var i=_200;i<=_201;i++){
-if(i%_199!=0){
+var _204=new Date(_195).getFullYear();
+var _205=new Date(_196).getFullYear();
+var _206=Dygraph.zeropad;
+for(var i=_204;i<=_205;i++){
+if(i%_203!=0){
 continue;
 }
-for(var j=0;j<_198.length;j++){
-var _203=i+"/"+_202(1+_198[j])+"/01";
-var t=Date.parse(_203);
-if(t<_192||t>_193){
+for(var j=0;j<_202.length;j++){
+var _207=i+"/"+_206(1+_202[j])+"/01";
+var t=Date.parse(_207);
+if(t<_195||t>_196){
 continue;
 }
-_195.push({v:t,label:new Date(t).strftime("%b %y")});
+_198.push({v:t,label:new Date(t).strftime("%b %y")});
 }
 }
 }
-return _195;
+return _198;
 };
-Dygraph.dateTicker=function(_204,_205,self){
-var _206=-1;
+Dygraph.dateTicker=function(_208,_209,self){
+var _210=-1;
 for(var i=0;i<Dygraph.NUM_GRANULARITIES;i++){
-var _207=self.NumXTicks(_204,_205,i);
-if(self.width_/_207>=self.attr_("pixelsPerXLabel")){
-_206=i;
+var _211=self.NumXTicks(_208,_209,i);
+if(self.width_/_211>=self.attr_("pixelsPerXLabel")){
+_210=i;
 break;
 }
 }
-if(_206>=0){
-return self.GetXAxis(_204,_205,_206);
+if(_210>=0){
+return self.GetXAxis(_208,_209,_210);
 }else{
 }
 };
 Dygraph.numericTicks=function(minV,maxV,self){
-var _210=[1,2,5];
-var _211,low_val,high_val,nTicks;
-var _212=self.attr_("pixelsPerYLabel");
+if(self.attr_("labelsKMG2")){
+var _214=[1,2,4,8];
+}else{
+var _214=[1,2,5];
+}
+var _215,low_val,high_val,nTicks;
+var _216=self.attr_("pixelsPerYLabel");
 for(var i=-10;i<50;i++){
-var _213=Math.pow(10,i);
-for(var j=0;j<_210.length;j++){
-_211=_213*_210[j];
-low_val=Math.floor(minV/_211)*_211;
-high_val=Math.ceil(maxV/_211)*_211;
-nTicks=(high_val-low_val)/_211;
-var _214=self.height_/nTicks;
-if(_214>_212){
+if(self.attr_("labelsKMG2")){
+var _217=Math.pow(16,i);
+}else{
+var _217=Math.pow(10,i);
+}
+for(var j=0;j<_214.length;j++){
+_215=_217*_214[j];
+low_val=Math.floor(minV/_215)*_215;
+high_val=Math.ceil(maxV/_215)*_215;
+nTicks=(high_val-low_val)/_215;
+var _218=self.height_/nTicks;
+if(_218>_216){
 break;
 }
 }
-if(_214>_212){
+if(_218>_216){
 break;
 }
 }
-var _215=[];
-for(var i=0;i<nTicks;i++){
-var _216=low_val+i*_211;
-var _217=self.round_(_216,2);
+var _219=[];
+var k;
+var _221=[];
 if(self.attr_("labelsKMB")){
-var k=1000;
-if(_216>=k*k*k){
-_217=self.round_(_216/(k*k*k),1)+"B";
-}else{
-if(_216>=k*k){
-_217=self.round_(_216/(k*k),1)+"M";
-}else{
-if(_216>=k){
-_217=self.round_(_216/k,1)+"K";
+k=1000;
+_221=["K","M","B","T"];
 }
+if(self.attr_("labelsKMG2")){
+if(k){
+self.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
 }
+k=1024;
+_221=["k","M","G","T"];
+}
+for(var i=0;i<nTicks;i++){
+var _222=low_val+i*_215;
+var _223=Math.abs(_222);
+var _224=self.round_(_222,2);
+if(_221.length){
+var n=k*k*k*k;
+for(var j=3;j>=0;j--,n/=k){
+if(_223>=n){
+_224=self.round_(_222/n,1)+_221[j];
+break;
 }
 }
-_215.push({label:_217,v:_216});
 }
-return _215;
+_219.push({label:_224,v:_222});
+}
+return _219;
 };
 Dygraph.prototype.addYTicks_=function(minY,maxY){
-var _221=Dygraph.numericTicks(minY,maxY,this);
-this.layout_.updateOptions({yAxis:[minY,maxY],yTicks:_221});
+var _228=Dygraph.numericTicks(minY,maxY,this);
+this.layout_.updateOptions({yAxis:[minY,maxY],yTicks:_228});
 };
-Dygraph.prototype.extremeValues_=function(_222){
+Dygraph.prototype.extremeValues_=function(_229){
 var minY=null,maxY=null;
 var bars=this.attr_("errorBars")||this.attr_("customBars");
 if(bars){
-for(var j=0;j<_222.length;j++){
-var y=_222[j][1][0];
+for(var j=0;j<_229.length;j++){
+var y=_229[j][1][0];
 if(!y){
 continue;
 }
-var low=y-_222[j][1][1];
-var high=y+_222[j][1][2];
+var low=y-_229[j][1][1];
+var high=y+_229[j][1][2];
 if(low>y){
 low=y;
 }
@@ -1162,9 +1266,9 @@ minY=low;
 }
 }
 }else{
-for(var j=0;j<_222.length;j++){
-var y=_222[j][1];
-if(!y){
+for(var j=0;j<_229.length;j++){
+var y=_229[j][1];
+if(y===null||isNaN(y)){
 continue;
 }
 if(maxY==null||y>maxY){
@@ -1183,109 +1287,110 @@ this.layout_.removeAllDatasets();
 this.setColors_();
 this.attrs_["pointSize"]=0.5*this.attr_("highlightCircleSize");
 for(var i=1;i<data[0].length;i++){
-var _226=[];
+var _233=[];
 for(var j=0;j<data.length;j++){
 var date=data[j][0];
-_226[j]=[date,data[j][i]];
+_233[j]=[date,data[j][i]];
 }
-_226=this.rollingAverage(_226,this.rollPeriod_);
+_233=this.rollingAverage(_233,this.rollPeriod_);
 var bars=this.attr_("errorBars")||this.attr_("customBars");
 if(this.dateWindow_){
 var low=this.dateWindow_[0];
 var high=this.dateWindow_[1];
-var _227=[];
-for(var k=0;k<_226.length;k++){
-if(_226[k][0]>=low&&_226[k][0]<=high){
-_227.push(_226[k]);
+var _234=[];
+for(var k=0;k<_233.length;k++){
+if(_233[k][0]>=low&&_233[k][0]<=high){
+_234.push(_233[k]);
 }
 }
-_226=_227;
+_233=_234;
 }
-var _228=this.extremeValues_(_226);
-var _229=_228[0];
-var _230=_228[1];
-if(!minY||_229<minY){
-minY=_229;
+var _235=this.extremeValues_(_233);
+var _236=_235[0];
+var _237=_235[1];
+if(!minY||_236<minY){
+minY=_236;
 }
-if(!maxY||_230>maxY){
-maxY=_230;
+if(!maxY||_237>maxY){
+maxY=_237;
 }
 if(bars){
 var vals=[];
-for(var j=0;j<_226.length;j++){
-vals[j]=[_226[j][0],_226[j][1][0],_226[j][1][1],_226[j][1][2]];
+for(var j=0;j<_233.length;j++){
+vals[j]=[_233[j][0],_233[j][1][0],_233[j][1][1],_233[j][1][2]];
 }
 this.layout_.addDataset(this.attr_("labels")[i],vals);
 }else{
-this.layout_.addDataset(this.attr_("labels")[i],_226);
+this.layout_.addDataset(this.attr_("labels")[i],_233);
 }
 }
 if(this.valueRange_!=null){
 this.addYTicks_(this.valueRange_[0],this.valueRange_[1]);
 }else{
 var span=maxY-minY;
-var _233=maxY+0.1*span;
-var _234=minY-0.1*span;
-if(_234<0&&minY>=0){
-_234=0;
+var _240=maxY+0.1*span;
+var _241=minY-0.1*span;
+if(_241<0&&minY>=0){
+_241=0;
 }
-if(_233>0&&maxY<=0){
-_233=0;
+if(_240>0&&maxY<=0){
+_240=0;
 }
 if(this.attr_("includeZero")){
 if(maxY<0){
-_233=0;
+_240=0;
 }
 if(minY>0){
-_234=0;
+_241=0;
 }
 }
-this.addYTicks_(_234,_233);
+this.addYTicks_(_241,_240);
 }
 this.addXTicks_();
+this.layout_.updateOptions({dateWindow:this.dateWindow_});
 this.layout_.evaluateWithError();
 this.plotter_.clear();
 this.plotter_.render();
 this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height);
 };
-Dygraph.prototype.rollingAverage=function(_235,_236){
-if(_235.length<2){
-return _235;
+Dygraph.prototype.rollingAverage=function(_242,_243){
+if(_242.length<2){
+return _242;
 }
-var _236=Math.min(_236,_235.length-1);
-var _237=[];
-var _238=this.attr_("sigma");
+var _243=Math.min(_243,_242.length-1);
+var _244=[];
+var _245=this.attr_("sigma");
 if(this.fractions_){
 var num=0;
 var den=0;
 var mult=100;
-for(var i=0;i<_235.length;i++){
-num+=_235[i][1][0];
-den+=_235[i][1][1];
-if(i-_236>=0){
-num-=_235[i-_236][1][0];
-den-=_235[i-_236][1][1];
-}
-var date=_235[i][0];
-var _241=den?num/den:0;
+for(var i=0;i<_242.length;i++){
+num+=_242[i][1][0];
+den+=_242[i][1][1];
+if(i-_243>=0){
+num-=_242[i-_243][1][0];
+den-=_242[i-_243][1][1];
+}
+var date=_242[i][0];
+var _248=den?num/den:0;
 if(this.attr_("errorBars")){
 if(this.wilsonInterval_){
 if(den){
-var p=_241<0?0:_241,n=den;
-var pm=_238*Math.sqrt(p*(1-p)/n+_238*_238/(4*n*n));
-var _243=1+_238*_238/den;
-var low=(p+_238*_238/(2*den)-pm)/_243;
-var high=(p+_238*_238/(2*den)+pm)/_243;
-_237[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
+var p=_248<0?0:_248,n=den;
+var pm=_245*Math.sqrt(p*(1-p)/n+_245*_245/(4*n*n));
+var _250=1+_245*_245/den;
+var low=(p+_245*_245/(2*den)-pm)/_250;
+var high=(p+_245*_245/(2*den)+pm)/_250;
+_244[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
 }else{
-_237[i]=[date,[0,0,0]];
+_244[i]=[date,[0,0,0]];
 }
 }else{
-var _244=den?_238*Math.sqrt(_241*(1-_241)/den):1;
-_237[i]=[date,[mult*_241,mult*_244,mult*_244]];
+var _251=den?_245*Math.sqrt(_248*(1-_248)/den):1;
+_244[i]=[date,[mult*_248,mult*_251,mult*_251]];
 }
 }else{
-_237[i]=[date,mult*_241];
+_244[i]=[date,mult*_248];
 }
 }
 }else{
@@ -1293,109 +1398,109 @@ if(this.attr_("customBars")){
 var low=0;
 var mid=0;
 var high=0;
-var _246=0;
-for(var i=0;i<_235.length;i++){
-var data=_235[i][1];
+var _253=0;
+for(var i=0;i<_242.length;i++){
+var data=_242[i][1];
 var y=data[1];
-_237[i]=[_235[i][0],[y,y-data[0],data[2]-y]];
+_244[i]=[_242[i][0],[y,y-data[0],data[2]-y]];
 if(y!=null&&!isNaN(y)){
 low+=data[0];
 mid+=y;
 high+=data[2];
-_246+=1;
+_253+=1;
 }
-if(i-_236>=0){
-var prev=_235[i-_236];
+if(i-_243>=0){
+var prev=_242[i-_243];
 if(prev[1][1]!=null&&!isNaN(prev[1][1])){
 low-=prev[1][0];
 mid-=prev[1][1];
 high-=prev[1][2];
-_246-=1;
+_253-=1;
 }
 }
-_237[i]=[_235[i][0],[1*mid/_246,1*(mid-low)/_246,1*(high-mid)/_246]];
+_244[i]=[_242[i][0],[1*mid/_253,1*(mid-low)/_253,1*(high-mid)/_253]];
 }
 }else{
-var _248=Math.min(_236-1,_235.length-2);
+var _255=Math.min(_243-1,_242.length-2);
 if(!this.attr_("errorBars")){
-if(_236==1){
-return _235;
+if(_243==1){
+return _242;
 }
-for(var i=0;i<_235.length;i++){
+for(var i=0;i<_242.length;i++){
 var sum=0;
-var _250=0;
-for(var j=Math.max(0,i-_236+1);j<i+1;j++){
-var y=_235[j][1];
+var _257=0;
+for(var j=Math.max(0,i-_243+1);j<i+1;j++){
+var y=_242[j][1];
 if(y==null||isNaN(y)){
 continue;
 }
-_250++;
-sum+=_235[j][1];
+_257++;
+sum+=_242[j][1];
 }
-if(_250){
-_237[i]=[_235[i][0],sum/_250];
+if(_257){
+_244[i]=[_242[i][0],sum/_257];
 }else{
-_237[i]=[_235[i][0],null];
+_244[i]=[_242[i][0],null];
 }
 }
 }else{
-for(var i=0;i<_235.length;i++){
+for(var i=0;i<_242.length;i++){
 var sum=0;
-var _251=0;
-var _250=0;
-for(var j=Math.max(0,i-_236+1);j<i+1;j++){
-var y=_235[j][1][0];
+var _258=0;
+var _257=0;
+for(var j=Math.max(0,i-_243+1);j<i+1;j++){
+var y=_242[j][1][0];
 if(y==null||isNaN(y)){
 continue;
 }
-_250++;
-sum+=_235[j][1][0];
-_251+=Math.pow(_235[j][1][1],2);
+_257++;
+sum+=_242[j][1][0];
+_258+=Math.pow(_242[j][1][1],2);
 }
-if(_250){
-var _244=Math.sqrt(_251)/_250;
-_237[i]=[_235[i][0],[sum/_250,_238*_244,_238*_244]];
+if(_257){
+var _251=Math.sqrt(_258)/_257;
+_244[i]=[_242[i][0],[sum/_257,_245*_251,_245*_251]];
 }else{
-_237[i]=[_235[i][0],[null,null,null]];
+_244[i]=[_242[i][0],[null,null,null]];
 }
 }
 }
 }
 }
-return _237;
+return _244;
 };
-Dygraph.dateParser=function(_252,self){
-var _253;
+Dygraph.dateParser=function(_259,self){
+var _260;
 var d;
-if(_252.length==10&&_252.search("-")!=-1){
-_253=_252.replace("-","/","g");
-while(_253.search("-")!=-1){
-_253=_253.replace("-","/");
+if(_259.length==10&&_259.search("-")!=-1){
+_260=_259.replace("-","/","g");
+while(_260.search("-")!=-1){
+_260=_260.replace("-","/");
 }
-d=Date.parse(_253);
+d=Date.parse(_260);
 }else{
-if(_252.length==8){
-_253=_252.substr(0,4)+"/"+_252.substr(4,2)+"/"+_252.substr(6,2);
-d=Date.parse(_253);
+if(_259.length==8){
+_260=_259.substr(0,4)+"/"+_259.substr(4,2)+"/"+_259.substr(6,2);
+d=Date.parse(_260);
 }else{
-d=Date.parse(_252);
+d=Date.parse(_259);
 }
 }
 if(!d||isNaN(d)){
-self.error("Couldn't parse "+_252+" as a date");
+self.error("Couldn't parse "+_259+" as a date");
 }
 return d;
 };
 Dygraph.prototype.detectTypeFromString_=function(str){
-var _255=false;
+var _262=false;
 if(str.indexOf("-")>=0||str.indexOf("/")>=0||isNaN(parseFloat(str))){
-_255=true;
+_262=true;
 }else{
 if(str.length==8&&str>"19700101"&&str<"20371231"){
-_255=true;
+_262=true;
 }
 }
-if(_255){
+if(_262){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xValueParser=Dygraph.dateParser;
 this.attrs_.xTicker=Dygraph.dateTicker;
@@ -1411,64 +1516,64 @@ this.attrs_.xTicker=Dygraph.numericTicks;
 };
 Dygraph.prototype.parseCSV_=function(data){
 var ret=[];
-var _256=data.split("\n");
-var _257=this.attr_("delimiter");
-if(_256[0].indexOf(_257)==-1&&_256[0].indexOf("\t")>=0){
-_257="\t";
+var _263=data.split("\n");
+var _264=this.attr_("delimiter");
+if(_263[0].indexOf(_264)==-1&&_263[0].indexOf("\t")>=0){
+_264="\t";
 }
-var _258=0;
+var _265=0;
 if(this.labelsFromCSV_){
-_258=1;
-this.attrs_.labels=_256[0].split(_257);
-}
-var _259;
-var _260=false;
-var _261=this.attr_("labels").length;
-for(var i=_258;i<_256.length;i++){
-var line=_256[i];
+_265=1;
+this.attrs_.labels=_263[0].split(_264);
+}
+var _266;
+var _267=false;
+var _268=this.attr_("labels").length;
+for(var i=_265;i<_263.length;i++){
+var line=_263[i];
 if(line.length==0){
 continue;
 }
 if(line[0]=="#"){
 continue;
 }
-var _263=line.split(_257);
-if(_263.length<2){
+var _270=line.split(_264);
+if(_270.length<2){
 continue;
 }
-var _264=[];
-if(!_260){
-this.detectTypeFromString_(_263[0]);
-_259=this.attr_("xValueParser");
-_260=true;
+var _271=[];
+if(!_267){
+this.detectTypeFromString_(_270[0]);
+_266=this.attr_("xValueParser");
+_267=true;
 }
-_264[0]=_259(_263[0],this);
+_271[0]=_266(_270[0],this);
 if(this.fractions_){
-for(var j=1;j<_263.length;j++){
-var vals=_263[j].split("/");
-_264[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
+for(var j=1;j<_270.length;j++){
+var vals=_270[j].split("/");
+_271[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
 }
 }else{
 if(this.attr_("errorBars")){
-for(var j=1;j<_263.length;j+=2){
-_264[(j+1)/2]=[parseFloat(_263[j]),parseFloat(_263[j+1])];
+for(var j=1;j<_270.length;j+=2){
+_271[(j+1)/2]=[parseFloat(_270[j]),parseFloat(_270[j+1])];
 }
 }else{
 if(this.attr_("customBars")){
-for(var j=1;j<_263.length;j++){
-var vals=_263[j].split(";");
-_264[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
+for(var j=1;j<_270.length;j++){
+var vals=_270[j].split(";");
+_271[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
 }
 }else{
-for(var j=1;j<_263.length;j++){
-_264[j]=parseFloat(_263[j]);
+for(var j=1;j<_270.length;j++){
+_271[j]=parseFloat(_270[j]);
 }
 }
 }
 }
-ret.push(_264);
-if(_264.length!=_261){
-this.error("Number of columns in line "+i+" ("+_264.length+") does not agree with number of labels ("+_261+") "+line);
+ret.push(_271);
+if(_271.length!=_268){
+this.error("Number of columns in line "+i+" ("+_271.length+") does not agree with number of labels ("+_268+") "+line);
 }
 }
 return ret;
@@ -1492,19 +1597,19 @@ this.attrs_.labels.push("Y"+i);
 if(Dygraph.isDateLike(data[0][0])){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xTicker=Dygraph.dateTicker;
-var _265=Dygraph.clone(data);
+var _272=Dygraph.clone(data);
 for(var i=0;i<data.length;i++){
-if(_265[i].length==0){
+if(_272[i].length==0){
 this.error("Row "<<(1+i)<<" of data is empty");
 return null;
 }
-if(_265[i][0]==null||typeof (_265[i][0].getTime)!="function"){
+if(_272[i][0]==null||typeof (_272[i][0].getTime)!="function"){
 this.error("x value in row "<<(1+i)<<" is not a Date");
 return null;
 }
-_265[i][0]=_265[i][0].getTime();
+_272[i][0]=_272[i][0].getTime();
 }
-return _265;
+return _272;
 }else{
 this.attrs_.xValueFormatter=function(x){
 return x;
@@ -1516,22 +1621,22 @@ return data;
 Dygraph.prototype.parseDataTable_=function(data){
 var cols=data.getNumberOfColumns();
 var rows=data.getNumberOfRows();
-var _268=[];
+var _275=[];
 for(var i=0;i<cols;i++){
-_268.push(data.getColumnLabel(i));
+_275.push(data.getColumnLabel(i));
 if(i!=0&&this.attr_("errorBars")){
 i+=1;
 }
 }
-this.attrs_.labels=_268;
-cols=_268.length;
-var _269=data.getColumnType(0);
-if(_269=="date"){
+this.attrs_.labels=_275;
+cols=_275.length;
+var _276=data.getColumnType(0);
+if(_276=="date"){
 this.attrs_.xValueFormatter=Dygraph.dateString_;
 this.attrs_.xValueParser=Dygraph.dateParser;
 this.attrs_.xTicker=Dygraph.dateTicker;
 }else{
-if(_269=="number"){
+if(_276=="number"){
 this.attrs_.xValueFormatter=function(x){
 return x;
 };
@@ -1540,17 +1645,18 @@ 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 '"+_269+"')");
+this.error("only 'date' and 'number' types are supported for column 1 "+"of DataTable input (Got '"+_276+"')");
 return null;
 }
 }
 var ret=[];
 for(var i=0;i<rows;i++){
 var row=[];
-if(!data.getValue(i,0)){
+if(typeof (data.getValue(i,0))==="undefined"||data.getValue(i,0)===null){
+this.warning("Ignoring row "+i+" of DataTable because of undefined or null first column.");
 continue;
 }
-if(_269=="date"){
+if(_276=="date"){
 row.push(data.getValue(i,0).getTime());
 }else{
 row.push(data.getValue(i,0));
@@ -1571,9 +1677,11 @@ return ret;
 Dygraph.update=function(self,o){
 if(typeof (o)!="undefined"&&o!==null){
 for(var k in o){
+if(o.hasOwnProperty(k)){
 self[k]=o[k];
 }
 }
+}
 return self;
 };
 Dygraph.isArrayLike=function(o){
@@ -1617,11 +1725,11 @@ if(this.file_.indexOf("\n")>=0){
 this.loadedEvent_(this.file_);
 }else{
 var req=new XMLHttpRequest();
-var _275=this;
+var _282=this;
 req.onreadystatechange=function(){
 if(req.readyState==4){
 if(req.status==200){
-_275.loadedEvent_(req.responseText);
+_282.loadedEvent_(req.responseText);
 }
 }
 };
@@ -1635,72 +1743,91 @@ this.error("Unknown data format: "+(typeof this.file_));
 }
 }
 };
-Dygraph.prototype.updateOptions=function(_276){
-if(_276.rollPeriod){
-this.rollPeriod_=_276.rollPeriod;
+Dygraph.prototype.updateOptions=function(_283){
+if(_283.rollPeriod){
+this.rollPeriod_=_283.rollPeriod;
 }
-if(_276.dateWindow){
-this.dateWindow_=_276.dateWindow;
+if(_283.dateWindow){
+this.dateWindow_=_283.dateWindow;
 }
-if(_276.valueRange){
-this.valueRange_=_276.valueRange;
+if(_283.valueRange){
+this.valueRange_=_283.valueRange;
 }
-Dygraph.update(this.user_attrs_,_276);
+Dygraph.update(this.user_attrs_,_283);
 this.labelsFromCSV_=(this.attr_("labels")==null);
 this.layout_.updateOptions({"errorBars":this.attr_("errorBars")});
-if(_276["file"]&&_276["file"]!=this.file_){
-this.file_=_276["file"];
+if(_283["file"]&&_283["file"]!=this.file_){
+this.file_=_283["file"];
 this.start_();
 }else{
 this.drawGraph_(this.rawData_);
 }
 };
-Dygraph.prototype.adjustRoll=function(_277){
-this.rollPeriod_=_277;
+Dygraph.prototype.resize=function(_284,_285){
+if((_284===null)!=(_285===null)){
+this.warn("Dygraph.resize() should be called with zero parameters or "+"two non-NULL parameters. Pretending it was zero.");
+_284=_285=null;
+}
+this.maindiv_.innerHTML="";
+this.attrs_.labelsDiv=null;
+if(_284){
+this.maindiv_.style.width=_284+"px";
+this.maindiv_.style.height=_285+"px";
+this.width_=_284;
+this.height_=_285;
+}else{
+this.width_=this.maindiv_.offsetWidth;
+this.height_=this.maindiv_.offsetHeight;
+}
+this.createInterface_();
+this.drawGraph_(this.rawData_);
+};
+Dygraph.prototype.adjustRoll=function(_286){
+this.rollPeriod_=_286;
 this.drawGraph_(this.rawData_);
 };
 Dygraph.createCanvas=function(){
-var _278=document.createElement("canvas");
+var _287=document.createElement("canvas");
 isIE=(/MSIE/.test(navigator.userAgent)&&!window.opera);
 if(isIE){
-_278=G_vmlCanvasManager.initElement(_278);
+_287=G_vmlCanvasManager.initElement(_287);
 }
-return _278;
+return _287;
 };
-Dygraph.GVizChart=function(_279){
-this.container=_279;
+Dygraph.GVizChart=function(_288){
+this.container=_288;
 };
-Dygraph.GVizChart.prototype.draw=function(data,_280){
+Dygraph.GVizChart.prototype.draw=function(data,_289){
 this.container.innerHTML="";
-this.date_graph=new Dygraph(this.container,data,_280);
+this.date_graph=new Dygraph(this.container,data,_289);
 };
 DateGraph=Dygraph;
-function RGBColor(_281){
+function RGBColor(_290){
 this.ok=false;
-if(_281.charAt(0)=="#"){
-_281=_281.substr(1,6);
+if(_290.charAt(0)=="#"){
+_290=_290.substr(1,6);
 }
-_281=_281.replace(/ /g,"");
-_281=_281.toLowerCase();
-var _282={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};
-for(var key in _282){
-if(_281==key){
-_281=_282[key];
+_290=_290.replace(/ /g,"");
+_290=_290.toLowerCase();
+var _291={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"};
+for(var key in _291){
+if(_290==key){
+_290=_291[key];
 }
 }
-var _284=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(bits){
+var _293=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(bits){
 return [parseInt(bits[1]),parseInt(bits[2]),parseInt(bits[3])];
 }},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(bits){
 return [parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16)];
 }},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(bits){
 return [parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16)];
 }}];
-for(var i=0;i<_284.length;i++){
-var re=_284[i].re;
-var _287=_284[i].process;
-var bits=re.exec(_281);
+for(var i=0;i<_293.length;i++){
+var re=_293[i].re;
+var _296=_293[i].process;
+var bits=re.exec(_290);
 if(bits){
-channels=_287(bits);
+channels=_296(bits);
 this.r=channels[0];
 this.g=channels[1];
 this.b=channels[2];