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