actually draw the graph
[dygraphs.git] / dygraph-combined.js
1 Date.ext={};Date.ext.util={};Date.ext.util.xPad=function(x,pad,r){if(typeof (r)=="undefined"){r=10}for(;parseInt(x,10)<r&&r>1;r/=10){x=pad.toString()+x}return x.toString()};Date.prototype.locale="en-GB";if(document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang){Date.prototype.locale=document.getElementsByTagName("html")[0].lang}Date.ext.locales={};Date.ext.locales.en={a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],B:["January","February","March","April","May","June","July","August","September","October","November","December"],c:"%a %d %b %Y %T %Z",p:["AM","PM"],P:["am","pm"],x:"%d/%m/%y",X:"%T"};Date.ext.locales["en-US"]=Date.ext.locales.en;Date.ext.locales["en-US"].c="%a %d %b %Y %r %Z";Date.ext.locales["en-US"].x="%D";Date.ext.locales["en-US"].X="%r";Date.ext.locales["en-GB"]=Date.ext.locales.en;Date.ext.locales["en-AU"]=Date.ext.locales["en-GB"];Date.ext.formats={a:function(d){return Date.ext.locales[d.locale].a[d.getDay()]},A:function(d){return Date.ext.locales[d.locale].A[d.getDay()]},b:function(d){return Date.ext.locales[d.locale].b[d.getMonth()]},B:function(d){return Date.ext.locales[d.locale].B[d.getMonth()]},c:"toLocaleString",C:function(d){return Date.ext.util.xPad(parseInt(d.getFullYear()/100,10),0)},d:["getDate","0"],e:["getDate"," "],g:function(d){return Date.ext.util.xPad(parseInt(Date.ext.util.G(d)/100,10),0)},G:function(d){var y=d.getFullYear();var V=parseInt(Date.ext.formats.V(d),10);var W=parseInt(Date.ext.formats.W(d),10);if(W>V){y++}else{if(W===0&&V>=52){y--}}return y},H:["getHours","0"],I:function(d){var I=d.getHours()%12;return Date.ext.util.xPad(I===0?12:I,0)},j:function(d){var ms=d-new Date(""+d.getFullYear()+"/1/1 GMT");ms+=d.getTimezoneOffset()*60000;var doy=parseInt(ms/60000/60/24,10)+1;return Date.ext.util.xPad(doy,0,100)},m:function(d){return Date.ext.util.xPad(d.getMonth()+1,0)},M:["getMinutes","0"],p:function(d){return Date.ext.locales[d.locale].p[d.getHours()>=12?1:0]},P:function(d){return Date.ext.locales[d.locale].P[d.getHours()>=12?1:0]},S:["getSeconds","0"],u:function(d){var dow=d.getDay();return dow===0?7:dow},U:function(d){var doy=parseInt(Date.ext.formats.j(d),10);var rdow=6-d.getDay();var woy=parseInt((doy+rdow)/7,10);return Date.ext.util.xPad(woy,0)},V:function(d){var woy=parseInt(Date.ext.formats.W(d),10);var dow1_1=(new Date(""+d.getFullYear()+"/1/1")).getDay();var idow=woy+(dow1_1>4||dow1_1<=1?0:1);if(idow==53&&(new Date(""+d.getFullYear()+"/12/31")).getDay()<4){idow=1}else{if(idow===0){idow=Date.ext.formats.V(new Date(""+(d.getFullYear()-1)+"/12/31"))}}return Date.ext.util.xPad(idow,0)},w:"getDay",W:function(d){var doy=parseInt(Date.ext.formats.j(d),10);var rdow=7-Date.ext.formats.u(d);var woy=parseInt((doy+rdow)/7,10);return Date.ext.util.xPad(woy,0,10)},y:function(d){return Date.ext.util.xPad(d.getFullYear()%100,0)},Y:"getFullYear",z:function(d){var o=d.getTimezoneOffset();var H=Date.ext.util.xPad(parseInt(Math.abs(o/60),10),0);var M=Date.ext.util.xPad(o%60,0);return(o>0?"-":"+")+H+M},Z:function(d){return d.toString().replace(/^.*\(([^)]+)\)$/,"$1")},"%":function(d){return"%"}};Date.ext.aggregates={c:"locale",D:"%m/%d/%y",h:"%b",n:"\n",r:"%I:%M:%S %p",R:"%H:%M",t:"\t",T:"%H:%M:%S",x:"locale",X:"locale"};Date.ext.aggregates.z=Date.ext.formats.z(new Date());Date.ext.aggregates.Z=Date.ext.formats.Z(new Date());Date.ext.unsupported={};Date.prototype.strftime=function(fmt){if(!(this.locale in Date.ext.locales)){if(this.locale.replace(/-[a-zA-Z]+$/,"") in Date.ext.locales){this.locale=this.locale.replace(/-[a-zA-Z]+$/,"")}else{this.locale="en-GB"}}var d=this;while(fmt.match(/%[cDhnrRtTxXzZ]/)){fmt=fmt.replace(/%([cDhnrRtTxXzZ])/g,function(m0,m1){var f=Date.ext.aggregates[m1];return(f=="locale"?Date.ext.locales[d.locale][m1]:f)})}var str=fmt.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g,function(m0,m1){var f=Date.ext.formats[m1];if(typeof (f)=="string"){return d[f]()}else{if(typeof (f)=="function"){return f.call(d,d)}else{if(typeof (f)=="object"&&typeof (f[0])=="string"){return Date.ext.util.xPad(d[f[0]](),f[1])}else{return m1}}}});d=null;return str};
2 DygraphLayout=function(_1,_2){
3 this.dygraph_=_1;
4 this.options={};
5 Dygraph.update(this.options,_2?_2:{});
6 this.datasets=new Array();
7 };
8 DygraphLayout.prototype.attr_=function(_3){
9 return this.dygraph_.attr_(_3);
10 };
11 DygraphLayout.prototype.addDataset=function(_4,_5){
12 this.datasets[_4]=_5;
13 };
14 DygraphLayout.prototype.evaluate=function(){
15 this._evaluateLimits();
16 this._evaluateLineCharts();
17 this._evaluateLineTicks();
18 };
19 DygraphLayout.prototype._evaluateLimits=function(){
20 this.minxval=this.maxxval=null;
21 for(var _6 in this.datasets){
22 if(!this.datasets.hasOwnProperty(_6)){
23 continue;
24 }
25 var _7=this.datasets[_6];
26 var x1=_7[0][0];
27 if(!this.minxval||x1<this.minxval){
28 this.minxval=x1;
29 }
30 var x2=_7[_7.length-1][0];
31 if(!this.maxxval||x2>this.maxxval){
32 this.maxxval=x2;
33 }
34 }
35 this.xrange=this.maxxval-this.minxval;
36 this.xscale=(this.xrange!=0?1/this.xrange:1);
37 this.minyval=this.options.yAxis[0];
38 this.maxyval=this.options.yAxis[1];
39 this.yrange=this.maxyval-this.minyval;
40 this.yscale=(this.yrange!=0?1/this.yrange:1);
41 };
42 DygraphLayout.prototype._evaluateLineCharts=function(){
43 this.points=new Array();
44 for(var _10 in this.datasets){
45 if(!this.datasets.hasOwnProperty(_10)){
46 continue;
47 }
48 var _11=this.datasets[_10];
49 for(var j=0;j<_11.length;j++){
50 var _13=_11[j];
51 var _14={x:((parseFloat(_13[0])-this.minxval)*this.xscale),y:1-((parseFloat(_13[1])-this.minyval)*this.yscale),xval:parseFloat(_13[0]),yval:parseFloat(_13[1]),name:_10};
52 if(_14.y<=0){
53 _14.y=0;
54 }
55 if(_14.y>=1){
56 _14.y=1;
57 }
58 if((_14.x>=0)&&(_14.x<=1)){
59 this.points.push(_14);
60 }
61 }
62 }
63 };
64 DygraphLayout.prototype._evaluateLineTicks=function(){
65 this.xticks=new Array();
66 for(var i=0;i<this.options.xTicks.length;i++){
67 var _16=this.options.xTicks[i];
68 var _17=_16.label;
69 var pos=this.xscale*(_16.v-this.minxval);
70 if((pos>=0)&&(pos<=1)){
71 this.xticks.push([pos,_17]);
72 }
73 }
74 this.yticks=new Array();
75 for(var i=0;i<this.options.yTicks.length;i++){
76 var _16=this.options.yTicks[i];
77 var _17=_16.label;
78 var pos=1-(this.yscale*(_16.v-this.minyval));
79 if((pos>=0)&&(pos<=1)){
80 this.yticks.push([pos,_17]);
81 }
82 }
83 };
84 DygraphLayout.prototype.evaluateWithError=function(){
85 this.evaluate();
86 if(!this.options.errorBars){
87 return;
88 }
89 var i=0;
90 for(var _19 in this.datasets){
91 if(!this.datasets.hasOwnProperty(_19)){
92 continue;
93 }
94 var j=0;
95 var _20=this.datasets[_19];
96 for(var j=0;j<_20.length;j++,i++){
97 var _21=_20[j];
98 var xv=parseFloat(_21[0]);
99 var yv=parseFloat(_21[1]);
100 if(xv==this.points[i].xval&&yv==this.points[i].yval){
101 this.points[i].errorMinus=parseFloat(_21[2]);
102 this.points[i].errorPlus=parseFloat(_21[3]);
103 }
104 }
105 }
106 };
107 DygraphLayout.prototype.removeAllDatasets=function(){
108 delete this.datasets;
109 this.datasets=new Array();
110 };
111 DygraphLayout.prototype.updateOptions=function(_24){
112 Dygraph.update(this.options,_24?_24:{});
113 };
114 DygraphCanvasRenderer=function(_25,_26,_27,_28){
115 this.dygraph_=_25;
116 this.options={"strokeWidth":0.5,"drawXAxis":true,"drawYAxis":true,"axisLineColor":"black","axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":"black","axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"drawYGrid":true,"drawXGrid":true,"gridLineColor":"rgb(128,128,128)"};
117 Dygraph.update(this.options,_28);
118 this.layout=_27;
119 this.element=_26;
120 this.container=this.element.parentNode;
121 this.height=this.element.height;
122 this.width=this.element.width;
123 if(!this.isIE&&!(DygraphCanvasRenderer.isSupported(this.element))){
124 throw "Canvas is not supported.";
125 }
126 this.xlabels=new Array();
127 this.ylabels=new Array();
128 this.area={x:this.options.yAxisLabelWidth+2*this.options.axisTickSize,y:0};
129 this.area.w=this.width-this.area.x-this.options.rightGap;
130 this.area.h=this.height-this.options.axisLabelFontSize-2*this.options.axisTickSize;
131 this.container.style.position="relative";
132 this.container.style.width=this.width+"px";
133 };
134 DygraphCanvasRenderer.prototype.clear=function(){
135 if(this.isIE){
136 try{
137 if(this.clearDelay){
138 this.clearDelay.cancel();
139 this.clearDelay=null;
140 }
141 var _29=this.element.getContext("2d");
142 }
143 catch(e){
144 this.clearDelay=MochiKit.Async.wait(this.IEDelay);
145 this.clearDelay.addCallback(bind(this.clear,this));
146 return;
147 }
148 }
149 var _29=this.element.getContext("2d");
150 _29.clearRect(0,0,this.width,this.height);
151 for(var i=0;i<this.xlabels.length;i++){
152 var el=this.xlabels[i];
153 el.parentNode.removeChild(el);
154 }
155 for(var i=0;i<this.ylabels.length;i++){
156 var el=this.ylabels[i];
157 el.parentNode.removeChild(el);
158 }
159 this.xlabels=new Array();
160 this.ylabels=new Array();
161 };
162 DygraphCanvasRenderer.isSupported=function(_31){
163 var _32=null;
164 try{
165 if(typeof (_31)=="undefined"||_31==null){
166 _32=document.createElement("canvas");
167 }else{
168 _32=_31;
169 }
170 var _33=_32.getContext("2d");
171 }
172 catch(e){
173 var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);
174 var _35=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
175 if((!ie)||(ie[1]<6)||(_35)){
176 return false;
177 }
178 return true;
179 }
180 return true;
181 };
182 DygraphCanvasRenderer.prototype.render=function(){
183 var ctx=this.element.getContext("2d");
184 if(this.options.drawYGrid){
185 var _37=this.layout.yticks;
186 ctx.save();
187 ctx.strokeStyle=this.options.gridLineColor;
188 ctx.lineWidth=this.options.axisLineWidth;
189 for(var i=0;i<_37.length;i++){
190 var x=this.area.x;
191 var y=this.area.y+_37[i][0]*this.area.h;
192 ctx.beginPath();
193 ctx.moveTo(x,y);
194 ctx.lineTo(x+this.area.w,y);
195 ctx.closePath();
196 ctx.stroke();
197 }
198 }
199 if(this.options.drawXGrid){
200 var _37=this.layout.xticks;
201 ctx.save();
202 ctx.strokeStyle=this.options.gridLineColor;
203 ctx.lineWidth=this.options.axisLineWidth;
204 for(var i=0;i<_37.length;i++){
205 var x=this.area.x+_37[i][0]*this.area.w;
206 var y=this.area.y+this.area.h;
207 ctx.beginPath();
208 ctx.moveTo(x,y);
209 ctx.lineTo(x,this.area.y);
210 ctx.closePath();
211 ctx.stroke();
212 }
213 }
214 this._renderLineChart();
215 this._renderAxis();
216 };
217 DygraphCanvasRenderer.prototype._renderAxis=function(){
218 if(!this.options.drawXAxis&&!this.options.drawYAxis){
219 return;
220 }
221 var _40=this.element.getContext("2d");
222 var _41={"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor,"width":this.options.axisLabelWidth+"px","overflow":"hidden"};
223 var _42=function(txt){
224 var div=document.createElement("div");
225 for(var _45 in _41){
226 if(_41.hasOwnProperty(_45)){
227 div.style[_45]=_41[_45];
228 }
229 }
230 div.appendChild(document.createTextNode(txt));
231 return div;
232 };
233 _40.save();
234 _40.strokeStyle=this.options.axisLineColor;
235 _40.lineWidth=this.options.axisLineWidth;
236 if(this.options.drawYAxis){
237 if(this.layout.yticks&&this.layout.yticks.length>0){
238 for(var i=0;i<this.layout.yticks.length;i++){
239 var _46=this.layout.yticks[i];
240 if(typeof (_46)=="function"){
241 return;
242 }
243 var x=this.area.x;
244 var y=this.area.y+_46[0]*this.area.h;
245 _40.beginPath();
246 _40.moveTo(x,y);
247 _40.lineTo(x-this.options.axisTickSize,y);
248 _40.closePath();
249 _40.stroke();
250 var _47=_42(_46[1]);
251 var top=(y-this.options.axisLabelFontSize/2);
252 if(top<0){
253 top=0;
254 }
255 if(top+this.options.axisLabelFontSize+3>this.height){
256 _47.style.bottom="0px";
257 }else{
258 _47.style.top=top+"px";
259 }
260 _47.style.left="0px";
261 _47.style.textAlign="right";
262 _47.style.width=this.options.yAxisLabelWidth+"px";
263 this.container.appendChild(_47);
264 this.ylabels.push(_47);
265 }
266 var _49=this.ylabels[0];
267 var _50=this.options.axisLabelFontSize;
268 var _51=parseInt(_49.style.top)+_50;
269 if(_51>this.height-_50){
270 _49.style.top=(parseInt(_49.style.top)-_50/2)+"px";
271 }
272 }
273 _40.beginPath();
274 _40.moveTo(this.area.x,this.area.y);
275 _40.lineTo(this.area.x,this.area.y+this.area.h);
276 _40.closePath();
277 _40.stroke();
278 }
279 if(this.options.drawXAxis){
280 if(this.layout.xticks){
281 for(var i=0;i<this.layout.xticks.length;i++){
282 var _46=this.layout.xticks[i];
283 if(typeof (dataset)=="function"){
284 return;
285 }
286 var x=this.area.x+_46[0]*this.area.w;
287 var y=this.area.y+this.area.h;
288 _40.beginPath();
289 _40.moveTo(x,y);
290 _40.lineTo(x,y+this.options.axisTickSize);
291 _40.closePath();
292 _40.stroke();
293 var _47=_42(_46[1]);
294 _47.style.textAlign="center";
295 _47.style.bottom="0px";
296 var _52=(x-this.options.axisLabelWidth/2);
297 if(_52+this.options.axisLabelWidth>this.width){
298 _52=this.width-this.options.xAxisLabelWidth;
299 _47.style.textAlign="right";
300 }
301 if(_52<0){
302 _52=0;
303 _47.style.textAlign="left";
304 }
305 _47.style.left=_52+"px";
306 _47.style.width=this.options.xAxisLabelWidth+"px";
307 this.container.appendChild(_47);
308 this.xlabels.push(_47);
309 }
310 }
311 _40.beginPath();
312 _40.moveTo(this.area.x,this.area.y+this.area.h);
313 _40.lineTo(this.area.x+this.area.w,this.area.y+this.area.h);
314 _40.closePath();
315 _40.stroke();
316 }
317 _40.restore();
318 };
319 DygraphCanvasRenderer.prototype._renderLineChart=function(){
320 var _53=this.element.getContext("2d");
321 var _54=this.options.colorScheme.length;
322 var _55=this.options.colorScheme;
323 var _56=this.layout.options.errorBars;
324 var _57=[];
325 for(var _58 in this.layout.datasets){
326 if(this.layout.datasets.hasOwnProperty(_58)){
327 _57.push(_58);
328 }
329 }
330 var _59=_57.length;
331 for(var i=0;i<this.layout.points.length;i++){
332 var _60=this.layout.points[i];
333 _60.canvasx=this.area.w*_60.x+this.area.x;
334 _60.canvasy=this.area.h*_60.y+this.area.y;
335 }
336 var _61=function(x){
337 return x&&!isNaN(x);
338 };
339 var ctx=_53;
340 if(_56){
341 for(var i=0;i<_59;i++){
342 var _62=_57[i];
343 var _63=_55[i%_54];
344 ctx.save();
345 ctx.strokeStyle=_63;
346 ctx.lineWidth=this.options.strokeWidth;
347 var _64=-1;
348 var _65=[-1,-1];
349 var _66=0;
350 var _67=this.layout.yscale;
351 var rgb=new RGBColor(_63);
352 var _69="rgba("+rgb.r+","+rgb.g+","+rgb.b+",0.15)";
353 ctx.fillStyle=_69;
354 ctx.beginPath();
355 for(var j=0;j<this.layout.points.length;j++){
356 var _60=this.layout.points[j];
357 _66++;
358 if(_60.name==_62){
359 if(!_60.y||isNaN(_60.y)){
360 _64=-1;
361 continue;
362 }
363 var _70=[_60.y-_60.errorPlus*_67,_60.y+_60.errorMinus*_67];
364 _70[0]=this.area.h*_70[0]+this.area.y;
365 _70[1]=this.area.h*_70[1]+this.area.y;
366 if(_64>=0){
367 ctx.moveTo(_64,_65[0]);
368 ctx.lineTo(_60.canvasx,_70[0]);
369 ctx.lineTo(_60.canvasx,_70[1]);
370 ctx.lineTo(_64,_65[1]);
371 ctx.closePath();
372 }
373 _65[0]=_70[0];
374 _65[1]=_70[1];
375 _64=_60.canvasx;
376 }
377 }
378 ctx.fill();
379 }
380 }
381 for(var i=0;i<_59;i++){
382 var _62=_57[i];
383 var _63=_55[i%_54];
384 _53.save();
385 var _60=this.layout.points[0];
386 var _71=this.dygraph_.attr_("pointSize");
387 var _64=null,prevY=null;
388 var _72=this.dygraph_.attr_("drawPoints");
389 var _73=this.layout.points;
390 for(var j=0;j<_73.length;j++){
391 var _60=_73[j];
392 if(_60.name==_62){
393 if(!_61(_60.canvasy)){
394 _64=prevY=null;
395 }else{
396 var _74=(!_64&&(j==_73.length-1||!_61(_73[j+1].canvasy)));
397 if(!_64){
398 _64=_60.canvasx;
399 prevY=_60.canvasy;
400 }else{
401 ctx.beginPath();
402 ctx.strokeStyle=_63;
403 ctx.lineWidth=this.options.strokeWidth;
404 ctx.moveTo(_64,prevY);
405 _64=_60.canvasx;
406 prevY=_60.canvasy;
407 ctx.lineTo(_64,prevY);
408 ctx.stroke();
409 }
410 if(_72||_74){
411 ctx.beginPath();
412 ctx.fillStyle=_63;
413 ctx.arc(_60.canvasx,_60.canvasy,_71,0,2*Math.PI,false);
414 ctx.fill();
415 }
416 }
417 }
418 }
419 }
420 _53.restore();
421 };
422 Dygraph=function(div,_75,_76){
423 if(arguments.length>0){
424 if(arguments.length==4){
425 this.warn("Using deprecated four-argument dygraph constructor");
426 this.__old_init__(div,_75,arguments[2],arguments[3]);
427 }else{
428 this.__init__(div,_75,_76);
429 }
430 }
431 };
432 Dygraph.NAME="Dygraph";
433 Dygraph.VERSION="1.2";
434 Dygraph.__repr__=function(){
435 return "["+this.NAME+" "+this.VERSION+"]";
436 };
437 Dygraph.toString=function(){
438 return this.__repr__();
439 };
440 Dygraph.DEFAULT_ROLL_PERIOD=1;
441 Dygraph.DEFAULT_WIDTH=480;
442 Dygraph.DEFAULT_HEIGHT=320;
443 Dygraph.AXIS_LINE_WIDTH=0.3;
444 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};
445 Dygraph.DEBUG=1;
446 Dygraph.INFO=2;
447 Dygraph.WARNING=3;
448 Dygraph.ERROR=3;
449 Dygraph.prototype.__old_init__=function(div,_77,_78,_79){
450 if(_78!=null){
451 var _80=["Date"];
452 for(var i=0;i<_78.length;i++){
453 _80.push(_78[i]);
454 }
455 Dygraph.update(_79,{"labels":_80});
456 }
457 this.__init__(div,_77,_79);
458 };
459 Dygraph.prototype.__init__=function(div,_81,_82){
460 if(_82==null){
461 _82={};
462 }
463 this.maindiv_=div;
464 this.file_=_81;
465 this.rollPeriod_=_82.rollPeriod||Dygraph.DEFAULT_ROLL_PERIOD;
466 this.previousVerticalX_=-1;
467 this.fractions_=_82.fractions||false;
468 this.dateWindow_=_82.dateWindow||null;
469 this.valueRange_=_82.valueRange||null;
470 this.wilsonInterval_=_82.wilsonInterval||true;
471 div.innerHTML="";
472 if(div.style.width==""){
473 div.style.width=Dygraph.DEFAULT_WIDTH+"px";
474 }
475 if(div.style.height==""){
476 div.style.height=Dygraph.DEFAULT_HEIGHT+"px";
477 }
478 this.width_=parseInt(div.style.width,10);
479 this.height_=parseInt(div.style.height,10);
480 this.user_attrs_={};
481 Dygraph.update(this.user_attrs_,_82);
482 this.attrs_={};
483 Dygraph.update(this.attrs_,Dygraph.DEFAULT_ATTRS);
484 this.labelsFromCSV_=(this.attr_("labels")==null);
485 this.createInterface_();
486 this.layoutOptions_={"xOriginIsZero":false};
487 Dygraph.update(this.layoutOptions_,this.attrs_);
488 Dygraph.update(this.layoutOptions_,this.user_attrs_);
489 Dygraph.update(this.layoutOptions_,{"errorBars":(this.attr_("errorBars")||this.attr_("customBars"))});
490 this.layout_=new DygraphLayout(this,this.layoutOptions_);
491 this.renderOptions_={colorScheme:this.colors_,strokeColor:null,axisLineWidth:Dygraph.AXIS_LINE_WIDTH};
492 Dygraph.update(this.renderOptions_,this.attrs_);
493 Dygraph.update(this.renderOptions_,this.user_attrs_);
494 this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.layout_,this.renderOptions_);
495 this.createStatusMessage_();
496 this.createRollInterface_();
497 this.createDragInterface_();
498 this.start_();
499 };
500 Dygraph.prototype.attr_=function(_83){
501 if(typeof (this.user_attrs_[_83])!="undefined"){
502 return this.user_attrs_[_83];
503 }else{
504 if(typeof (this.attrs_[_83])!="undefined"){
505 return this.attrs_[_83];
506 }else{
507 return null;
508 }
509 }
510 };
511 Dygraph.prototype.log=function(_84,_85){
512 if(typeof (console)!="undefined"){
513 switch(_84){
514 case Dygraph.DEBUG:
515 console.debug("dygraphs: "+_85);
516 break;
517 case Dygraph.INFO:
518 console.info("dygraphs: "+_85);
519 break;
520 case Dygraph.WARNING:
521 console.warn("dygraphs: "+_85);
522 break;
523 case Dygraph.ERROR:
524 console.error("dygraphs: "+_85);
525 break;
526 }
527 }
528 };
529 Dygraph.prototype.info=function(_86){
530 this.log(Dygraph.INFO,_86);
531 };
532 Dygraph.prototype.warn=function(_87){
533 this.log(Dygraph.WARNING,_87);
534 };
535 Dygraph.prototype.error=function(_88){
536 this.log(Dygraph.ERROR,_88);
537 };
538 Dygraph.prototype.rollPeriod=function(){
539 return this.rollPeriod_;
540 };
541 Dygraph.addEvent=function(el,evt,fn){
542 var _91=function(e){
543 if(!e){
544 var e=window.event;
545 }
546 fn(e);
547 };
548 if(window.addEventListener){
549 el.addEventListener(evt,_91,false);
550 }else{
551 el.attachEvent("on"+evt,_91);
552 }
553 };
554 Dygraph.prototype.createInterface_=function(){
555 var _93=this.maindiv_;
556 this.graphDiv=document.createElement("div");
557 this.graphDiv.style.width=this.width_+"px";
558 this.graphDiv.style.height=this.height_+"px";
559 _93.appendChild(this.graphDiv);
560 this.canvas_=Dygraph.createCanvas();
561 this.canvas_.style.position="absolute";
562 this.canvas_.width=this.width_;
563 this.canvas_.height=this.height_;
564 this.canvas_.style.width=this.width_+"px";
565 this.canvas_.style.height=this.height_+"px";
566 this.graphDiv.appendChild(this.canvas_);
567 this.hidden_=this.createPlotKitCanvas_(this.canvas_);
568 var _94=this;
569 Dygraph.addEvent(this.hidden_,"mousemove",function(e){
570 _94.mouseMove_(e);
571 });
572 Dygraph.addEvent(this.hidden_,"mouseout",function(e){
573 _94.mouseOut_(e);
574 });
575 };
576 Dygraph.prototype.createPlotKitCanvas_=function(_95){
577 var h=Dygraph.createCanvas();
578 h.style.position="absolute";
579 h.style.top=_95.style.top;
580 h.style.left=_95.style.left;
581 h.width=this.width_;
582 h.height=this.height_;
583 h.style.width=this.width_+"px";
584 h.style.height=this.height_+"px";
585 this.graphDiv.appendChild(h);
586 return h;
587 };
588 Dygraph.hsvToRGB=function(hue,_98,_99){
589 var red;
590 var _101;
591 var blue;
592 if(_98===0){
593 red=_99;
594 _101=_99;
595 blue=_99;
596 }else{
597 var i=Math.floor(hue*6);
598 var f=(hue*6)-i;
599 var p=_99*(1-_98);
600 var q=_99*(1-(_98*f));
601 var t=_99*(1-(_98*(1-f)));
602 switch(i){
603 case 1:
604 red=q;
605 _101=_99;
606 blue=p;
607 break;
608 case 2:
609 red=p;
610 _101=_99;
611 blue=t;
612 break;
613 case 3:
614 red=p;
615 _101=q;
616 blue=_99;
617 break;
618 case 4:
619 red=t;
620 _101=p;
621 blue=_99;
622 break;
623 case 5:
624 red=_99;
625 _101=p;
626 blue=q;
627 break;
628 case 6:
629 case 0:
630 red=_99;
631 _101=t;
632 blue=p;
633 break;
634 }
635 }
636 red=Math.floor(255*red+0.5);
637 _101=Math.floor(255*_101+0.5);
638 blue=Math.floor(255*blue+0.5);
639 return "rgb("+red+","+_101+","+blue+")";
640 };
641 Dygraph.prototype.setColors_=function(){
642 var num=this.attr_("labels").length-1;
643 this.colors_=[];
644 var _108=this.attr_("colors");
645 if(!_108){
646 var sat=this.attr_("colorSaturation")||1;
647 var val=this.attr_("colorValue")||0.5;
648 for(var i=1;i<=num;i++){
649 var hue=(1*i/(1+num));
650 this.colors_.push(Dygraph.hsvToRGB(hue,sat,val));
651 }
652 }else{
653 for(var i=0;i<num;i++){
654 var _111=_108[i%_108.length];
655 this.colors_.push(_111);
656 }
657 }
658 this.renderOptions_.colorScheme=this.colors_;
659 Dygraph.update(this.plotter_.options,this.renderOptions_);
660 Dygraph.update(this.layoutOptions_,this.user_attrs_);
661 Dygraph.update(this.layoutOptions_,this.attrs_);
662 };
663 Dygraph.findPosX=function(obj){
664 var _113=0;
665 if(obj.offsetParent){
666 while(obj.offsetParent){
667 _113+=obj.offsetLeft;
668 obj=obj.offsetParent;
669 }
670 }else{
671 if(obj.x){
672 _113+=obj.x;
673 }
674 }
675 return _113;
676 };
677 Dygraph.findPosY=function(obj){
678 var _114=0;
679 if(obj.offsetParent){
680 while(obj.offsetParent){
681 _114+=obj.offsetTop;
682 obj=obj.offsetParent;
683 }
684 }else{
685 if(obj.y){
686 _114+=obj.y;
687 }
688 }
689 return _114;
690 };
691 Dygraph.prototype.createStatusMessage_=function(){
692 if(!this.attr_("labelsDiv")){
693 var _115=this.attr_("labelsDivWidth");
694 var _116={"position":"absolute","fontSize":"14px","zIndex":10,"width":_115+"px","top":"0px","left":(this.width_-_115-2)+"px","background":"white","textAlign":"left","overflow":"hidden"};
695 Dygraph.update(_116,this.attr_("labelsDivStyles"));
696 var div=document.createElement("div");
697 for(var name in _116){
698 if(_116.hasOwnProperty(name)){
699 div.style[name]=_116[name];
700 }
701 }
702 this.graphDiv.appendChild(div);
703 this.attrs_.labelsDiv=div;
704 }
705 };
706 Dygraph.prototype.createRollInterface_=function(){
707 var _118=this.attr_("showRoller")?"block":"none";
708 var _119={"position":"absolute","zIndex":10,"top":(this.plotter_.area.h-25)+"px","left":(this.plotter_.area.x+1)+"px","display":_118};
709 var _120=document.createElement("input");
710 _120.type="text";
711 _120.size="2";
712 _120.value=this.rollPeriod_;
713 for(var name in _119){
714 if(_119.hasOwnProperty(name)){
715 _120.style[name]=_119[name];
716 }
717 }
718 var pa=this.graphDiv;
719 pa.appendChild(_120);
720 var _122=this;
721 _120.onchange=function(){
722 _122.adjustRoll(_120.value);
723 };
724 return _120;
725 };
726 Dygraph.pageX=function(e){
727 if(e.pageX){
728 return (!e.pageX||e.pageX<0)?0:e.pageX;
729 }else{
730 var de=document;
731 var b=document.body;
732 return e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
733 }
734 };
735 Dygraph.pageY=function(e){
736 if(e.pageY){
737 return (!e.pageY||e.pageY<0)?0:e.pageY;
738 }else{
739 var de=document;
740 var b=document.body;
741 return e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
742 }
743 };
744 Dygraph.prototype.createDragInterface_=function(){
745 var self=this;
746 var _126=false;
747 var _127=null;
748 var _128=null;
749 var _129=null;
750 var _130=null;
751 var _131=null;
752 var px=0;
753 var py=0;
754 var getX=function(e){
755 return Dygraph.pageX(e)-px;
756 };
757 var getY=function(e){
758 return Dygraph.pageX(e)-py;
759 };
760 Dygraph.addEvent(this.hidden_,"mousemove",function(_136){
761 if(_126){
762 _129=getX(_136);
763 _130=getY(_136);
764 self.drawZoomRect_(_127,_129,_131);
765 _131=_129;
766 }
767 });
768 Dygraph.addEvent(this.hidden_,"mousedown",function(_137){
769 _126=true;
770 px=Dygraph.findPosX(self.canvas_);
771 py=Dygraph.findPosY(self.canvas_);
772 _127=getX(_137);
773 _128=getY(_137);
774 });
775 Dygraph.addEvent(document,"mouseup",function(_138){
776 if(_126){
777 _126=false;
778 _127=null;
779 _128=null;
780 }
781 });
782 Dygraph.addEvent(this.hidden_,"mouseout",function(_139){
783 if(_126){
784 _129=null;
785 _130=null;
786 }
787 });
788 Dygraph.addEvent(this.hidden_,"mouseup",function(_140){
789 if(_126){
790 _126=false;
791 _129=getX(_140);
792 _130=getY(_140);
793 var _141=Math.abs(_129-_127);
794 var _142=Math.abs(_130-_128);
795 if(_141<2&&_142<2&&self.attr_("clickCallback")!=null&&self.lastx_!=undefined){
796 self.attr_("clickCallback")(_140,self.lastx_,self.selPoints_);
797 }
798 if(_141>=10){
799 self.doZoom_(Math.min(_127,_129),Math.max(_127,_129));
800 }else{
801 self.canvas_.getContext("2d").clearRect(0,0,self.canvas_.width,self.canvas_.height);
802 }
803 _127=null;
804 _128=null;
805 }
806 });
807 Dygraph.addEvent(this.hidden_,"dblclick",function(_143){
808 if(self.dateWindow_==null){
809 return;
810 }
811 self.dateWindow_=null;
812 self.drawGraph_(self.rawData_);
813 var _144=self.rawData_[0][0];
814 var _145=self.rawData_[self.rawData_.length-1][0];
815 if(self.attr_("zoomCallback")){
816 self.attr_("zoomCallback")(_144,_145);
817 }
818 });
819 };
820 Dygraph.prototype.drawZoomRect_=function(_146,endX,_148){
821 var ctx=this.canvas_.getContext("2d");
822 if(_148){
823 ctx.clearRect(Math.min(_146,_148),0,Math.abs(_146-_148),this.height_);
824 }
825 if(endX&&_146){
826 ctx.fillStyle="rgba(128,128,128,0.33)";
827 ctx.fillRect(Math.min(_146,endX),0,Math.abs(endX-_146),this.height_);
828 }
829 };
830 Dygraph.prototype.doZoom_=function(lowX,_150){
831 var _151=this.layout_.points;
832 var _152=null;
833 var _153=null;
834 for(var i=0;i<_151.length;i++){
835 var cx=_151[i].canvasx;
836 var x=_151[i].xval;
837 if(cx<lowX&&(_152==null||x>_152)){
838 _152=x;
839 }
840 if(cx>_150&&(_153==null||x<_153)){
841 _153=x;
842 }
843 }
844 if(_152==null){
845 _152=_151[0].xval;
846 }
847 if(_153==null){
848 _153=_151[_151.length-1].xval;
849 }
850 this.dateWindow_=[_152,_153];
851 this.drawGraph_(this.rawData_);
852 if(this.attr_("zoomCallback")){
853 this.attr_("zoomCallback")(_152,_153);
854 }
855 };
856 Dygraph.prototype.mouseMove_=function(_155){
857 var _156=Dygraph.pageX(_155)-Dygraph.findPosX(this.hidden_);
858 var _157=this.layout_.points;
859 var _158=-1;
860 var _159=-1;
861 var _160=1e+100;
862 var idx=-1;
863 for(var i=0;i<_157.length;i++){
864 var dist=Math.abs(_157[i].canvasx-_156);
865 if(dist>_160){
866 break;
867 }
868 _160=dist;
869 idx=i;
870 }
871 if(idx>=0){
872 _158=_157[idx].xval;
873 }
874 if(_156>_157[_157.length-1].canvasx){
875 _158=_157[_157.length-1].xval;
876 }
877 this.selPoints_=[];
878 for(var i=0;i<_157.length;i++){
879 if(_157[i].xval==_158){
880 this.selPoints_.push(_157[i]);
881 }
882 }
883 if(this.attr_("highlightCallback")){
884 this.attr_("highlightCallback")(_155,_158,this.selPoints_);
885 }
886 var _163=this.attr_("highlightCircleSize");
887 var ctx=this.canvas_.getContext("2d");
888 if(this.previousVerticalX_>=0){
889 var px=this.previousVerticalX_;
890 ctx.clearRect(px-_163-1,0,2*_163+2,this.height_);
891 }
892 var isOK=function(x){
893 return x&&!isNaN(x);
894 };
895 if(this.selPoints_.length>0){
896 var _156=this.selPoints_[0].canvasx;
897 var _165=this.attr_("xValueFormatter")(_158,this)+":";
898 var clen=this.colors_.length;
899 for(var i=0;i<this.selPoints_.length;i++){
900 if(!isOK(this.selPoints_[i].canvasy)){
901 continue;
902 }
903 if(this.attr_("labelsSeparateLines")){
904 _165+="<br/>";
905 }
906 var _167=this.selPoints_[i];
907 var c=new RGBColor(this.colors_[i%clen]);
908 _165+=" <b><font color='"+c.toHex()+"'>"+_167.name+"</font></b>:"+this.round_(_167.yval,2);
909 }
910 this.attr_("labelsDiv").innerHTML=_165;
911 this.lastx_=_158;
912 ctx.save();
913 for(var i=0;i<this.selPoints_.length;i++){
914 if(!isOK(this.selPoints_[i%clen].canvasy)){
915 continue;
916 }
917 ctx.beginPath();
918 ctx.fillStyle=this.colors_[i%clen];
919 ctx.arc(_156,this.selPoints_[i%clen].canvasy,_163,0,2*Math.PI,false);
920 ctx.fill();
921 }
922 ctx.restore();
923 this.previousVerticalX_=_156;
924 }
925 };
926 Dygraph.prototype.mouseOut_=function(_169){
927 var ctx=this.canvas_.getContext("2d");
928 ctx.clearRect(0,0,this.width_,this.height_);
929 this.attr_("labelsDiv").innerHTML="";
930 };
931 Dygraph.zeropad=function(x){
932 if(x<10){
933 return "0"+x;
934 }else{
935 return ""+x;
936 }
937 };
938 Dygraph.prototype.hmsString_=function(date){
939 var _171=Dygraph.zeropad;
940 var d=new Date(date);
941 if(d.getSeconds()){
942 return _171(d.getHours())+":"+_171(d.getMinutes())+":"+_171(d.getSeconds());
943 }else{
944 if(d.getMinutes()){
945 return _171(d.getHours())+":"+_171(d.getMinutes());
946 }else{
947 return _171(d.getHours());
948 }
949 }
950 };
951 Dygraph.dateString_=function(date,self){
952 var _173=Dygraph.zeropad;
953 var d=new Date(date);
954 var year=""+d.getFullYear();
955 var _175=_173(d.getMonth()+1);
956 var day=_173(d.getDate());
957 var ret="";
958 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
959 if(frac){
960 ret=" "+self.hmsString_(date);
961 }
962 return year+"/"+_175+"/"+day+ret;
963 };
964 Dygraph.prototype.round_=function(num,_179){
965 var _180=Math.pow(10,_179);
966 return Math.round(num*_180)/_180;
967 };
968 Dygraph.prototype.loadedEvent_=function(data){
969 this.rawData_=this.parseCSV_(data);
970 this.drawGraph_(this.rawData_);
971 };
972 Dygraph.prototype.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
973 Dygraph.prototype.quarters=["Jan","Apr","Jul","Oct"];
974 Dygraph.prototype.addXTicks_=function(){
975 var _182,endDate;
976 if(this.dateWindow_){
977 _182=this.dateWindow_[0];
978 endDate=this.dateWindow_[1];
979 }else{
980 _182=this.rawData_[0][0];
981 endDate=this.rawData_[this.rawData_.length-1][0];
982 }
983 var _183=this.attr_("xTicker")(_182,endDate,this);
984 this.layout_.updateOptions({xTicks:_183});
985 };
986 Dygraph.SECONDLY=0;
987 Dygraph.TEN_SECONDLY=1;
988 Dygraph.THIRTY_SECONDLY=2;
989 Dygraph.MINUTELY=3;
990 Dygraph.TEN_MINUTELY=4;
991 Dygraph.THIRTY_MINUTELY=5;
992 Dygraph.HOURLY=6;
993 Dygraph.SIX_HOURLY=7;
994 Dygraph.DAILY=8;
995 Dygraph.WEEKLY=9;
996 Dygraph.MONTHLY=10;
997 Dygraph.QUARTERLY=11;
998 Dygraph.BIANNUAL=12;
999 Dygraph.ANNUAL=13;
1000 Dygraph.DECADAL=14;
1001 Dygraph.NUM_GRANULARITIES=15;
1002 Dygraph.SHORT_SPACINGS=[];
1003 Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1000*1;
1004 Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1000*10;
1005 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=1000*30;
1006 Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=1000*60;
1007 Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=1000*60*10;
1008 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=1000*60*30;
1009 Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600;
1010 Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600*6;
1011 Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=1000*86400;
1012 Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=1000*604800;
1013 Dygraph.prototype.NumXTicks=function(_184,_185,_186){
1014 if(_186<Dygraph.MONTHLY){
1015 var _187=Dygraph.SHORT_SPACINGS[_186];
1016 return Math.floor(0.5+1*(_185-_184)/_187);
1017 }else{
1018 var _188=1;
1019 var _189=12;
1020 if(_186==Dygraph.QUARTERLY){
1021 _189=3;
1022 }
1023 if(_186==Dygraph.BIANNUAL){
1024 _189=2;
1025 }
1026 if(_186==Dygraph.ANNUAL){
1027 _189=1;
1028 }
1029 if(_186==Dygraph.DECADAL){
1030 _189=1;
1031 _188=10;
1032 }
1033 var _190=365.2524*24*3600*1000;
1034 var _191=1*(_185-_184)/_190;
1035 return Math.floor(0.5+1*_191*_189/_188);
1036 }
1037 };
1038 Dygraph.prototype.GetXAxis=function(_192,_193,_194){
1039 var _195=[];
1040 if(_194<Dygraph.MONTHLY){
1041 var _196=Dygraph.SHORT_SPACINGS[_194];
1042 var _197="%d%b";
1043 if(_194<Dygraph.HOURLY){
1044 _192=_196*Math.floor(0.5+_192/_196);
1045 }
1046 for(var t=_192;t<=_193;t+=_196){
1047 var d=new Date(t);
1048 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
1049 if(frac==0||_194>=Dygraph.DAILY){
1050 _195.push({v:t,label:new Date(t+3600*1000).strftime(_197)});
1051 }else{
1052 _195.push({v:t,label:this.hmsString_(t)});
1053 }
1054 }
1055 }else{
1056 var _198;
1057 var _199=1;
1058 if(_194==Dygraph.MONTHLY){
1059 _198=[0,1,2,3,4,5,6,7,8,9,10,11,12];
1060 }else{
1061 if(_194==Dygraph.QUARTERLY){
1062 _198=[0,3,6,9];
1063 }else{
1064 if(_194==Dygraph.BIANNUAL){
1065 _198=[0,6];
1066 }else{
1067 if(_194==Dygraph.ANNUAL){
1068 _198=[0];
1069 }else{
1070 if(_194==Dygraph.DECADAL){
1071 _198=[0];
1072 _199=10;
1073 }
1074 }
1075 }
1076 }
1077 }
1078 var _200=new Date(_192).getFullYear();
1079 var _201=new Date(_193).getFullYear();
1080 var _202=Dygraph.zeropad;
1081 for(var i=_200;i<=_201;i++){
1082 if(i%_199!=0){
1083 continue;
1084 }
1085 for(var j=0;j<_198.length;j++){
1086 var _203=i+"/"+_202(1+_198[j])+"/01";
1087 var t=Date.parse(_203);
1088 if(t<_192||t>_193){
1089 continue;
1090 }
1091 _195.push({v:t,label:new Date(t).strftime("%b %y")});
1092 }
1093 }
1094 }
1095 return _195;
1096 };
1097 Dygraph.dateTicker=function(_204,_205,self){
1098 var _206=-1;
1099 for(var i=0;i<Dygraph.NUM_GRANULARITIES;i++){
1100 var _207=self.NumXTicks(_204,_205,i);
1101 if(self.width_/_207>=self.attr_("pixelsPerXLabel")){
1102 _206=i;
1103 break;
1104 }
1105 }
1106 if(_206>=0){
1107 return self.GetXAxis(_204,_205,_206);
1108 }else{
1109 }
1110 };
1111 Dygraph.numericTicks=function(minV,maxV,self){
1112 var _210=[1,2,5];
1113 var _211,low_val,high_val,nTicks;
1114 var _212=self.attr_("pixelsPerYLabel");
1115 for(var i=-10;i<50;i++){
1116 var _213=Math.pow(10,i);
1117 for(var j=0;j<_210.length;j++){
1118 _211=_213*_210[j];
1119 low_val=Math.floor(minV/_211)*_211;
1120 high_val=Math.ceil(maxV/_211)*_211;
1121 nTicks=(high_val-low_val)/_211;
1122 var _214=self.height_/nTicks;
1123 if(_214>_212){
1124 break;
1125 }
1126 }
1127 if(_214>_212){
1128 break;
1129 }
1130 }
1131 var _215=[];
1132 var k;
1133 var _217=[];
1134 if(self.attr_("labelsKMB")){
1135 k=1000;
1136 _217=["K","M","B","T"];
1137 }
1138 if(self.attr_("labelsKMG2")){
1139 if(k){
1140 self.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
1141 }
1142 k=1024;
1143 _217=["k","M","G","T"];
1144 }
1145 for(var i=0;i<nTicks;i++){
1146 var _218=low_val+i*_211;
1147 var _219=Math.abs(_218);
1148 var _220=self.round_(_218,2);
1149 if(_217.length){
1150 var n=k*k*k*k;
1151 for(var j=3;j>=0;j--,n/=k){
1152 if(_219>=n){
1153 _220=self.round_(_218/n,1)+_217[j];
1154 break;
1155 }
1156 }
1157 }
1158 _215.push({label:_220,v:_218});
1159 }
1160 return _215;
1161 };
1162 Dygraph.prototype.addYTicks_=function(minY,maxY){
1163 var _224=Dygraph.numericTicks(minY,maxY,this);
1164 this.layout_.updateOptions({yAxis:[minY,maxY],yTicks:_224});
1165 };
1166 Dygraph.prototype.extremeValues_=function(_225){
1167 var minY=null,maxY=null;
1168 var bars=this.attr_("errorBars")||this.attr_("customBars");
1169 if(bars){
1170 for(var j=0;j<_225.length;j++){
1171 var y=_225[j][1][0];
1172 if(!y){
1173 continue;
1174 }
1175 var low=y-_225[j][1][1];
1176 var high=y+_225[j][1][2];
1177 if(low>y){
1178 low=y;
1179 }
1180 if(high<y){
1181 high=y;
1182 }
1183 if(maxY==null||high>maxY){
1184 maxY=high;
1185 }
1186 if(minY==null||low<minY){
1187 minY=low;
1188 }
1189 }
1190 }else{
1191 for(var j=0;j<_225.length;j++){
1192 var y=_225[j][1];
1193 if(!y){
1194 continue;
1195 }
1196 if(maxY==null||y>maxY){
1197 maxY=y;
1198 }
1199 if(minY==null||y<minY){
1200 minY=y;
1201 }
1202 }
1203 }
1204 return [minY,maxY];
1205 };
1206 Dygraph.prototype.drawGraph_=function(data){
1207 var minY=null,maxY=null;
1208 this.layout_.removeAllDatasets();
1209 this.setColors_();
1210 this.attrs_["pointSize"]=0.5*this.attr_("highlightCircleSize");
1211 for(var i=1;i<data[0].length;i++){
1212 var _229=[];
1213 for(var j=0;j<data.length;j++){
1214 var date=data[j][0];
1215 _229[j]=[date,data[j][i]];
1216 }
1217 _229=this.rollingAverage(_229,this.rollPeriod_);
1218 var bars=this.attr_("errorBars")||this.attr_("customBars");
1219 if(this.dateWindow_){
1220 var low=this.dateWindow_[0];
1221 var high=this.dateWindow_[1];
1222 var _230=[];
1223 for(var k=0;k<_229.length;k++){
1224 if(_229[k][0]>=low&&_229[k][0]<=high){
1225 _230.push(_229[k]);
1226 }
1227 }
1228 _229=_230;
1229 }
1230 var _231=this.extremeValues_(_229);
1231 var _232=_231[0];
1232 var _233=_231[1];
1233 if(!minY||_232<minY){
1234 minY=_232;
1235 }
1236 if(!maxY||_233>maxY){
1237 maxY=_233;
1238 }
1239 if(bars){
1240 var vals=[];
1241 for(var j=0;j<_229.length;j++){
1242 vals[j]=[_229[j][0],_229[j][1][0],_229[j][1][1],_229[j][1][2]];
1243 }
1244 this.layout_.addDataset(this.attr_("labels")[i],vals);
1245 }else{
1246 this.layout_.addDataset(this.attr_("labels")[i],_229);
1247 }
1248 }
1249 if(this.valueRange_!=null){
1250 this.addYTicks_(this.valueRange_[0],this.valueRange_[1]);
1251 }else{
1252 var span=maxY-minY;
1253 var _236=maxY+0.1*span;
1254 var _237=minY-0.1*span;
1255 if(_237<0&&minY>=0){
1256 _237=0;
1257 }
1258 if(_236>0&&maxY<=0){
1259 _236=0;
1260 }
1261 if(this.attr_("includeZero")){
1262 if(maxY<0){
1263 _236=0;
1264 }
1265 if(minY>0){
1266 _237=0;
1267 }
1268 }
1269 this.addYTicks_(_237,_236);
1270 }
1271 this.addXTicks_();
1272 this.layout_.evaluateWithError();
1273 this.plotter_.clear();
1274 this.plotter_.render();
1275 this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height);
1276 };
1277 Dygraph.prototype.rollingAverage=function(_238,_239){
1278 if(_238.length<2){
1279 return _238;
1280 }
1281 var _239=Math.min(_239,_238.length-1);
1282 var _240=[];
1283 var _241=this.attr_("sigma");
1284 if(this.fractions_){
1285 var num=0;
1286 var den=0;
1287 var mult=100;
1288 for(var i=0;i<_238.length;i++){
1289 num+=_238[i][1][0];
1290 den+=_238[i][1][1];
1291 if(i-_239>=0){
1292 num-=_238[i-_239][1][0];
1293 den-=_238[i-_239][1][1];
1294 }
1295 var date=_238[i][0];
1296 var _244=den?num/den:0;
1297 if(this.attr_("errorBars")){
1298 if(this.wilsonInterval_){
1299 if(den){
1300 var p=_244<0?0:_244,n=den;
1301 var pm=_241*Math.sqrt(p*(1-p)/n+_241*_241/(4*n*n));
1302 var _246=1+_241*_241/den;
1303 var low=(p+_241*_241/(2*den)-pm)/_246;
1304 var high=(p+_241*_241/(2*den)+pm)/_246;
1305 _240[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
1306 }else{
1307 _240[i]=[date,[0,0,0]];
1308 }
1309 }else{
1310 var _247=den?_241*Math.sqrt(_244*(1-_244)/den):1;
1311 _240[i]=[date,[mult*_244,mult*_247,mult*_247]];
1312 }
1313 }else{
1314 _240[i]=[date,mult*_244];
1315 }
1316 }
1317 }else{
1318 if(this.attr_("customBars")){
1319 var low=0;
1320 var mid=0;
1321 var high=0;
1322 var _249=0;
1323 for(var i=0;i<_238.length;i++){
1324 var data=_238[i][1];
1325 var y=data[1];
1326 _240[i]=[_238[i][0],[y,y-data[0],data[2]-y]];
1327 if(y!=null&&!isNaN(y)){
1328 low+=data[0];
1329 mid+=y;
1330 high+=data[2];
1331 _249+=1;
1332 }
1333 if(i-_239>=0){
1334 var prev=_238[i-_239];
1335 if(prev[1][1]!=null&&!isNaN(prev[1][1])){
1336 low-=prev[1][0];
1337 mid-=prev[1][1];
1338 high-=prev[1][2];
1339 _249-=1;
1340 }
1341 }
1342 _240[i]=[_238[i][0],[1*mid/_249,1*(mid-low)/_249,1*(high-mid)/_249]];
1343 }
1344 }else{
1345 var _251=Math.min(_239-1,_238.length-2);
1346 if(!this.attr_("errorBars")){
1347 if(_239==1){
1348 return _238;
1349 }
1350 for(var i=0;i<_238.length;i++){
1351 var sum=0;
1352 var _253=0;
1353 for(var j=Math.max(0,i-_239+1);j<i+1;j++){
1354 var y=_238[j][1];
1355 if(y==null||isNaN(y)){
1356 continue;
1357 }
1358 _253++;
1359 sum+=_238[j][1];
1360 }
1361 if(_253){
1362 _240[i]=[_238[i][0],sum/_253];
1363 }else{
1364 _240[i]=[_238[i][0],null];
1365 }
1366 }
1367 }else{
1368 for(var i=0;i<_238.length;i++){
1369 var sum=0;
1370 var _254=0;
1371 var _253=0;
1372 for(var j=Math.max(0,i-_239+1);j<i+1;j++){
1373 var y=_238[j][1][0];
1374 if(y==null||isNaN(y)){
1375 continue;
1376 }
1377 _253++;
1378 sum+=_238[j][1][0];
1379 _254+=Math.pow(_238[j][1][1],2);
1380 }
1381 if(_253){
1382 var _247=Math.sqrt(_254)/_253;
1383 _240[i]=[_238[i][0],[sum/_253,_241*_247,_241*_247]];
1384 }else{
1385 _240[i]=[_238[i][0],[null,null,null]];
1386 }
1387 }
1388 }
1389 }
1390 }
1391 return _240;
1392 };
1393 Dygraph.dateParser=function(_255,self){
1394 var _256;
1395 var d;
1396 if(_255.length==10&&_255.search("-")!=-1){
1397 _256=_255.replace("-","/","g");
1398 while(_256.search("-")!=-1){
1399 _256=_256.replace("-","/");
1400 }
1401 d=Date.parse(_256);
1402 }else{
1403 if(_255.length==8){
1404 _256=_255.substr(0,4)+"/"+_255.substr(4,2)+"/"+_255.substr(6,2);
1405 d=Date.parse(_256);
1406 }else{
1407 d=Date.parse(_255);
1408 }
1409 }
1410 if(!d||isNaN(d)){
1411 self.error("Couldn't parse "+_255+" as a date");
1412 }
1413 return d;
1414 };
1415 Dygraph.prototype.detectTypeFromString_=function(str){
1416 var _258=false;
1417 if(str.indexOf("-")>=0||str.indexOf("/")>=0||isNaN(parseFloat(str))){
1418 _258=true;
1419 }else{
1420 if(str.length==8&&str>"19700101"&&str<"20371231"){
1421 _258=true;
1422 }
1423 }
1424 if(_258){
1425 this.attrs_.xValueFormatter=Dygraph.dateString_;
1426 this.attrs_.xValueParser=Dygraph.dateParser;
1427 this.attrs_.xTicker=Dygraph.dateTicker;
1428 }else{
1429 this.attrs_.xValueFormatter=function(x){
1430 return x;
1431 };
1432 this.attrs_.xValueParser=function(x){
1433 return parseFloat(x);
1434 };
1435 this.attrs_.xTicker=Dygraph.numericTicks;
1436 }
1437 };
1438 Dygraph.prototype.parseCSV_=function(data){
1439 var ret=[];
1440 var _259=data.split("\n");
1441 var _260=this.attr_("delimiter");
1442 if(_259[0].indexOf(_260)==-1&&_259[0].indexOf("\t")>=0){
1443 _260="\t";
1444 }
1445 var _261=0;
1446 if(this.labelsFromCSV_){
1447 _261=1;
1448 this.attrs_.labels=_259[0].split(_260);
1449 }
1450 var _262;
1451 var _263=false;
1452 var _264=this.attr_("labels").length;
1453 for(var i=_261;i<_259.length;i++){
1454 var line=_259[i];
1455 if(line.length==0){
1456 continue;
1457 }
1458 if(line[0]=="#"){
1459 continue;
1460 }
1461 var _266=line.split(_260);
1462 if(_266.length<2){
1463 continue;
1464 }
1465 var _267=[];
1466 if(!_263){
1467 this.detectTypeFromString_(_266[0]);
1468 _262=this.attr_("xValueParser");
1469 _263=true;
1470 }
1471 _267[0]=_262(_266[0],this);
1472 if(this.fractions_){
1473 for(var j=1;j<_266.length;j++){
1474 var vals=_266[j].split("/");
1475 _267[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
1476 }
1477 }else{
1478 if(this.attr_("errorBars")){
1479 for(var j=1;j<_266.length;j+=2){
1480 _267[(j+1)/2]=[parseFloat(_266[j]),parseFloat(_266[j+1])];
1481 }
1482 }else{
1483 if(this.attr_("customBars")){
1484 for(var j=1;j<_266.length;j++){
1485 var vals=_266[j].split(";");
1486 _267[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
1487 }
1488 }else{
1489 for(var j=1;j<_266.length;j++){
1490 _267[j]=parseFloat(_266[j]);
1491 }
1492 }
1493 }
1494 }
1495 ret.push(_267);
1496 if(_267.length!=_264){
1497 this.error("Number of columns in line "+i+" ("+_267.length+") does not agree with number of labels ("+_264+") "+line);
1498 }
1499 }
1500 return ret;
1501 };
1502 Dygraph.prototype.parseArray_=function(data){
1503 if(data.length==0){
1504 this.error("Can't plot empty data set");
1505 return null;
1506 }
1507 if(data[0].length==0){
1508 this.error("Data set cannot contain an empty row");
1509 return null;
1510 }
1511 if(this.attr_("labels")==null){
1512 this.warn("Using default labels. Set labels explicitly via 'labels' "+"in the options parameter");
1513 this.attrs_.labels=["X"];
1514 for(var i=1;i<data[0].length;i++){
1515 this.attrs_.labels.push("Y"+i);
1516 }
1517 }
1518 if(Dygraph.isDateLike(data[0][0])){
1519 this.attrs_.xValueFormatter=Dygraph.dateString_;
1520 this.attrs_.xTicker=Dygraph.dateTicker;
1521 var _268=Dygraph.clone(data);
1522 for(var i=0;i<data.length;i++){
1523 if(_268[i].length==0){
1524 this.error("Row "<<(1+i)<<" of data is empty");
1525 return null;
1526 }
1527 if(_268[i][0]==null||typeof (_268[i][0].getTime)!="function"){
1528 this.error("x value in row "<<(1+i)<<" is not a Date");
1529 return null;
1530 }
1531 _268[i][0]=_268[i][0].getTime();
1532 }
1533 return _268;
1534 }else{
1535 this.attrs_.xValueFormatter=function(x){
1536 return x;
1537 };
1538 this.attrs_.xTicker=Dygraph.numericTicks;
1539 return data;
1540 }
1541 };
1542 Dygraph.prototype.parseDataTable_=function(data){
1543 var cols=data.getNumberOfColumns();
1544 var rows=data.getNumberOfRows();
1545 var _271=[];
1546 for(var i=0;i<cols;i++){
1547 _271.push(data.getColumnLabel(i));
1548 if(i!=0&&this.attr_("errorBars")){
1549 i+=1;
1550 }
1551 }
1552 this.attrs_.labels=_271;
1553 cols=_271.length;
1554 var _272=data.getColumnType(0);
1555 if(_272=="date"){
1556 this.attrs_.xValueFormatter=Dygraph.dateString_;
1557 this.attrs_.xValueParser=Dygraph.dateParser;
1558 this.attrs_.xTicker=Dygraph.dateTicker;
1559 }else{
1560 if(_272=="number"){
1561 this.attrs_.xValueFormatter=function(x){
1562 return x;
1563 };
1564 this.attrs_.xValueParser=function(x){
1565 return parseFloat(x);
1566 };
1567 this.attrs_.xTicker=Dygraph.numericTicks;
1568 }else{
1569 this.error("only 'date' and 'number' types are supported for column 1 "+"of DataTable input (Got '"+_272+"')");
1570 return null;
1571 }
1572 }
1573 var ret=[];
1574 for(var i=0;i<rows;i++){
1575 var row=[];
1576 if(!data.getValue(i,0)){
1577 continue;
1578 }
1579 if(_272=="date"){
1580 row.push(data.getValue(i,0).getTime());
1581 }else{
1582 row.push(data.getValue(i,0));
1583 }
1584 if(!this.attr_("errorBars")){
1585 for(var j=1;j<cols;j++){
1586 row.push(data.getValue(i,j));
1587 }
1588 }else{
1589 for(var j=0;j<cols-1;j++){
1590 row.push([data.getValue(i,1+2*j),data.getValue(i,2+2*j)]);
1591 }
1592 }
1593 ret.push(row);
1594 }
1595 return ret;
1596 };
1597 Dygraph.update=function(self,o){
1598 if(typeof (o)!="undefined"&&o!==null){
1599 for(var k in o){
1600 if(o.hasOwnProperty(k)){
1601 self[k]=o[k];
1602 }
1603 }
1604 }
1605 return self;
1606 };
1607 Dygraph.isArrayLike=function(o){
1608 var typ=typeof (o);
1609 if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
1610 return false;
1611 }
1612 return true;
1613 };
1614 Dygraph.isDateLike=function(o){
1615 if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
1616 return false;
1617 }
1618 return true;
1619 };
1620 Dygraph.clone=function(o){
1621 var r=[];
1622 for(var i=0;i<o.length;i++){
1623 if(Dygraph.isArrayLike(o[i])){
1624 r.push(Dygraph.clone(o[i]));
1625 }else{
1626 r.push(o[i]);
1627 }
1628 }
1629 return r;
1630 };
1631 Dygraph.prototype.start_=function(){
1632 if(typeof this.file_=="function"){
1633 this.loadedEvent_(this.file_());
1634 }else{
1635 if(Dygraph.isArrayLike(this.file_)){
1636 this.rawData_=this.parseArray_(this.file_);
1637 this.drawGraph_(this.rawData_);
1638 }else{
1639 if(typeof this.file_=="object"&&typeof this.file_.getColumnRange=="function"){
1640 this.rawData_=this.parseDataTable_(this.file_);
1641 this.drawGraph_(this.rawData_);
1642 }else{
1643 if(typeof this.file_=="string"){
1644 if(this.file_.indexOf("\n")>=0){
1645 this.loadedEvent_(this.file_);
1646 }else{
1647 var req=new XMLHttpRequest();
1648 var _278=this;
1649 req.onreadystatechange=function(){
1650 if(req.readyState==4){
1651 if(req.status==200){
1652 _278.loadedEvent_(req.responseText);
1653 }
1654 }
1655 };
1656 req.open("GET",this.file_,true);
1657 req.send(null);
1658 }
1659 }else{
1660 this.error("Unknown data format: "+(typeof this.file_));
1661 }
1662 }
1663 }
1664 }
1665 };
1666 Dygraph.prototype.updateOptions=function(_279){
1667 if(_279.rollPeriod){
1668 this.rollPeriod_=_279.rollPeriod;
1669 }
1670 if(_279.dateWindow){
1671 this.dateWindow_=_279.dateWindow;
1672 }
1673 if(_279.valueRange){
1674 this.valueRange_=_279.valueRange;
1675 }
1676 Dygraph.update(this.user_attrs_,_279);
1677 this.labelsFromCSV_=(this.attr_("labels")==null);
1678 this.layout_.updateOptions({"errorBars":this.attr_("errorBars")});
1679 if(_279["file"]&&_279["file"]!=this.file_){
1680 this.file_=_279["file"];
1681 this.start_();
1682 }else{
1683 this.drawGraph_(this.rawData_);
1684 }
1685 };
1686 Dygraph.prototype.adjustRoll=function(_280){
1687 this.rollPeriod_=_280;
1688 this.drawGraph_(this.rawData_);
1689 };
1690 Dygraph.createCanvas=function(){
1691 var _281=document.createElement("canvas");
1692 isIE=(/MSIE/.test(navigator.userAgent)&&!window.opera);
1693 if(isIE){
1694 _281=G_vmlCanvasManager.initElement(_281);
1695 }
1696 return _281;
1697 };
1698 Dygraph.GVizChart=function(_282){
1699 this.container=_282;
1700 };
1701 Dygraph.GVizChart.prototype.draw=function(data,_283){
1702 this.container.innerHTML="";
1703 this.date_graph=new Dygraph(this.container,data,_283);
1704 };
1705 DateGraph=Dygraph;
1706 function RGBColor(_284){
1707 this.ok=false;
1708 if(_284.charAt(0)=="#"){
1709 _284=_284.substr(1,6);
1710 }
1711 _284=_284.replace(/ /g,"");
1712 _284=_284.toLowerCase();
1713 var _285={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"};
1714 for(var key in _285){
1715 if(_284==key){
1716 _284=_285[key];
1717 }
1718 }
1719 var _287=[{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){
1720 return [parseInt(bits[1]),parseInt(bits[2]),parseInt(bits[3])];
1721 }},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(bits){
1722 return [parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16)];
1723 }},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(bits){
1724 return [parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16)];
1725 }}];
1726 for(var i=0;i<_287.length;i++){
1727 var re=_287[i].re;
1728 var _290=_287[i].process;
1729 var bits=re.exec(_284);
1730 if(bits){
1731 channels=_290(bits);
1732 this.r=channels[0];
1733 this.g=channels[1];
1734 this.b=channels[2];
1735 this.ok=true;
1736 }
1737 }
1738 this.r=(this.r<0||isNaN(this.r))?0:((this.r>255)?255:this.r);
1739 this.g=(this.g<0||isNaN(this.g))?0:((this.g>255)?255:this.g);
1740 this.b=(this.b<0||isNaN(this.b))?0:((this.b>255)?255:this.b);
1741 this.toRGB=function(){
1742 return "rgb("+this.r+", "+this.g+", "+this.b+")";
1743 };
1744 this.toHex=function(){
1745 var r=this.r.toString(16);
1746 var g=this.g.toString(16);
1747 var b=this.b.toString(16);
1748 if(r.length==1){
1749 r="0"+r;
1750 }
1751 if(g.length==1){
1752 g="0"+g;
1753 }
1754 if(b.length==1){
1755 b="0"+b;
1756 }
1757 return "#"+r+g+b;
1758 };
1759 }
1760