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=null;
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 px=0;
760 var py=0;
761 var getX=function(e){
762 return Dygraph.pageX(e)-px;
763 };
764 var getY=function(e){
765 return Dygraph.pageX(e)-py;
766 };
767 Dygraph.addEvent(this.hidden_,"mousemove",function(_138){
768 if(_126){
769 _129=getX(_138);
770 _130=getY(_138);
771 self.drawZoomRect_(_127,_129,_131);
772 _131=_129;
773 }else{
774 if(isPanning){
775 _129=getX(_138);
776 _130=getY(_138);
777 self.dateWindow_[0]=_132-(_129/self.width_)*_133;
778 self.dateWindow_[1]=self.dateWindow_[0]+_133;
779 self.drawGraph_(self.rawData_);
780 }
781 }
782 });
783 Dygraph.addEvent(this.hidden_,"mousedown",function(_139){
784 px=Dygraph.findPosX(self.canvas_);
785 py=Dygraph.findPosY(self.canvas_);
786 _127=getX(_139);
787 _128=getY(_139);
788 if(_139.altKey){
789 if(!self.dateWindow_){
790 return;
791 }
792 isPanning=true;
793 _133=self.dateWindow_[1]-self.dateWindow_[0];
794 _132=(_127/self.width_)*_133+self.dateWindow_[0];
795 }else{
796 _126=true;
797 }
798 });
799 Dygraph.addEvent(document,"mouseup",function(_140){
800 if(_126||isPanning){
801 _126=false;
802 _127=null;
803 _128=null;
804 }
805 if(isPanning){
806 isPanning=false;
807 _132=null;
808 _133=null;
809 }
810 });
811 Dygraph.addEvent(this.hidden_,"mouseout",function(_141){
812 if(_126){
813 _129=null;
814 _130=null;
815 }
816 });
817 Dygraph.addEvent(this.hidden_,"mouseup",function(_142){
818 if(_126){
819 _126=false;
820 _129=getX(_142);
821 _130=getY(_142);
822 var _143=Math.abs(_129-_127);
823 var _144=Math.abs(_130-_128);
824 if(_143<2&&_144<2&&self.attr_("clickCallback")!=null&&self.lastx_!=undefined){
825 self.attr_("clickCallback")(_142,self.lastx_,self.selPoints_);
826 }
827 if(_143>=10){
828 self.doZoom_(Math.min(_127,_129),Math.max(_127,_129));
829 }else{
830 self.canvas_.getContext("2d").clearRect(0,0,self.canvas_.width,self.canvas_.height);
831 }
832 _127=null;
833 _128=null;
834 }
835 if(isPanning){
836 isPanning=false;
837 _132=null;
838 _133=null;
839 }
840 });
841 Dygraph.addEvent(this.hidden_,"dblclick",function(_145){
842 if(self.dateWindow_==null){
843 return;
844 }
845 self.dateWindow_=null;
846 self.drawGraph_(self.rawData_);
847 var _146=self.rawData_[0][0];
848 var _147=self.rawData_[self.rawData_.length-1][0];
849 if(self.attr_("zoomCallback")){
850 self.attr_("zoomCallback")(_146,_147);
851 }
852 });
853 };
854 Dygraph.prototype.drawZoomRect_=function(_148,endX,_150){
855 var ctx=this.canvas_.getContext("2d");
856 if(_150){
857 ctx.clearRect(Math.min(_148,_150),0,Math.abs(_148-_150),this.height_);
858 }
859 if(endX&&_148){
860 ctx.fillStyle="rgba(128,128,128,0.33)";
861 ctx.fillRect(Math.min(_148,endX),0,Math.abs(endX-_148),this.height_);
862 }
863 };
864 Dygraph.prototype.doZoom_=function(lowX,_152){
865 var _153=this.layout_.points;
866 var _154=null;
867 var _155=null;
868 for(var i=0;i<_153.length;i++){
869 var cx=_153[i].canvasx;
870 var x=_153[i].xval;
871 if(cx<lowX&&(_154==null||x>_154)){
872 _154=x;
873 }
874 if(cx>_152&&(_155==null||x<_155)){
875 _155=x;
876 }
877 }
878 if(_154==null){
879 _154=_153[0].xval;
880 }
881 if(_155==null){
882 _155=_153[_153.length-1].xval;
883 }
884 this.dateWindow_=[_154,_155];
885 this.drawGraph_(this.rawData_);
886 if(this.attr_("zoomCallback")){
887 this.attr_("zoomCallback")(_154,_155);
888 }
889 };
890 Dygraph.prototype.mouseMove_=function(_157){
891 var _158=Dygraph.pageX(_157)-Dygraph.findPosX(this.hidden_);
892 var _159=this.layout_.points;
893 var _160=-1;
894 var _161=-1;
895 var _162=1e+100;
896 var idx=-1;
897 for(var i=0;i<_159.length;i++){
898 var dist=Math.abs(_159[i].canvasx-_158);
899 if(dist>_162){
900 break;
901 }
902 _162=dist;
903 idx=i;
904 }
905 if(idx>=0){
906 _160=_159[idx].xval;
907 }
908 if(_158>_159[_159.length-1].canvasx){
909 _160=_159[_159.length-1].xval;
910 }
911 this.selPoints_=[];
912 for(var i=0;i<_159.length;i++){
913 if(_159[i].xval==_160){
914 this.selPoints_.push(_159[i]);
915 }
916 }
917 if(this.attr_("highlightCallback")){
918 this.attr_("highlightCallback")(_157,_160,this.selPoints_);
919 }
920 var _165=this.attr_("highlightCircleSize");
921 var ctx=this.canvas_.getContext("2d");
922 if(this.previousVerticalX_>=0){
923 var px=this.previousVerticalX_;
924 ctx.clearRect(px-_165-1,0,2*_165+2,this.height_);
925 }
926 var isOK=function(x){
927 return x&&!isNaN(x);
928 };
929 if(this.selPoints_.length>0){
930 var _158=this.selPoints_[0].canvasx;
931 var _167=this.attr_("xValueFormatter")(_160,this)+":";
932 var clen=this.colors_.length;
933 for(var i=0;i<this.selPoints_.length;i++){
934 if(!isOK(this.selPoints_[i].canvasy)){
935 continue;
936 }
937 if(this.attr_("labelsSeparateLines")){
938 _167+="<br/>";
939 }
940 var _169=this.selPoints_[i];
941 var c=new RGBColor(this.colors_[i%clen]);
942 _167+=" <b><font color='"+c.toHex()+"'>"+_169.name+"</font></b>:"+this.round_(_169.yval,2);
943 }
944 this.attr_("labelsDiv").innerHTML=_167;
945 this.lastx_=_160;
946 ctx.save();
947 for(var i=0;i<this.selPoints_.length;i++){
948 if(!isOK(this.selPoints_[i%clen].canvasy)){
949 continue;
950 }
951 ctx.beginPath();
952 ctx.fillStyle=this.colors_[i%clen];
953 ctx.arc(_158,this.selPoints_[i%clen].canvasy,_165,0,2*Math.PI,false);
954 ctx.fill();
955 }
956 ctx.restore();
957 this.previousVerticalX_=_158;
958 }
959 };
960 Dygraph.prototype.mouseOut_=function(_171){
961 var ctx=this.canvas_.getContext("2d");
962 ctx.clearRect(0,0,this.width_,this.height_);
963 this.attr_("labelsDiv").innerHTML="";
964 };
965 Dygraph.zeropad=function(x){
966 if(x<10){
967 return "0"+x;
968 }else{
969 return ""+x;
970 }
971 };
972 Dygraph.prototype.hmsString_=function(date){
973 var _173=Dygraph.zeropad;
974 var d=new Date(date);
975 if(d.getSeconds()){
976 return _173(d.getHours())+":"+_173(d.getMinutes())+":"+_173(d.getSeconds());
977 }else{
978 if(d.getMinutes()){
979 return _173(d.getHours())+":"+_173(d.getMinutes());
980 }else{
981 return _173(d.getHours());
982 }
983 }
984 };
985 Dygraph.dateString_=function(date,self){
986 var _175=Dygraph.zeropad;
987 var d=new Date(date);
988 var year=""+d.getFullYear();
989 var _177=_175(d.getMonth()+1);
990 var day=_175(d.getDate());
991 var ret="";
992 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
993 if(frac){
994 ret=" "+self.hmsString_(date);
995 }
996 return year+"/"+_177+"/"+day+ret;
997 };
998 Dygraph.prototype.round_=function(num,_181){
999 var _182=Math.pow(10,_181);
1000 return Math.round(num*_182)/_182;
1001 };
1002 Dygraph.prototype.loadedEvent_=function(data){
1003 this.rawData_=this.parseCSV_(data);
1004 this.drawGraph_(this.rawData_);
1005 };
1006 Dygraph.prototype.months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
1007 Dygraph.prototype.quarters=["Jan","Apr","Jul","Oct"];
1008 Dygraph.prototype.addXTicks_=function(){
1009 var _184,endDate;
1010 if(this.dateWindow_){
1011 _184=this.dateWindow_[0];
1012 endDate=this.dateWindow_[1];
1013 }else{
1014 _184=this.rawData_[0][0];
1015 endDate=this.rawData_[this.rawData_.length-1][0];
1016 }
1017 var _185=this.attr_("xTicker")(_184,endDate,this);
1018 this.layout_.updateOptions({xTicks:_185});
1019 };
1020 Dygraph.SECONDLY=0;
1021 Dygraph.TEN_SECONDLY=1;
1022 Dygraph.THIRTY_SECONDLY=2;
1023 Dygraph.MINUTELY=3;
1024 Dygraph.TEN_MINUTELY=4;
1025 Dygraph.THIRTY_MINUTELY=5;
1026 Dygraph.HOURLY=6;
1027 Dygraph.SIX_HOURLY=7;
1028 Dygraph.DAILY=8;
1029 Dygraph.WEEKLY=9;
1030 Dygraph.MONTHLY=10;
1031 Dygraph.QUARTERLY=11;
1032 Dygraph.BIANNUAL=12;
1033 Dygraph.ANNUAL=13;
1034 Dygraph.DECADAL=14;
1035 Dygraph.NUM_GRANULARITIES=15;
1036 Dygraph.SHORT_SPACINGS=[];
1037 Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1000*1;
1038 Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1000*10;
1039 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=1000*30;
1040 Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=1000*60;
1041 Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=1000*60*10;
1042 Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=1000*60*30;
1043 Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600;
1044 Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]=1000*3600*6;
1045 Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=1000*86400;
1046 Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=1000*604800;
1047 Dygraph.prototype.NumXTicks=function(_186,_187,_188){
1048 if(_188<Dygraph.MONTHLY){
1049 var _189=Dygraph.SHORT_SPACINGS[_188];
1050 return Math.floor(0.5+1*(_187-_186)/_189);
1051 }else{
1052 var _190=1;
1053 var _191=12;
1054 if(_188==Dygraph.QUARTERLY){
1055 _191=3;
1056 }
1057 if(_188==Dygraph.BIANNUAL){
1058 _191=2;
1059 }
1060 if(_188==Dygraph.ANNUAL){
1061 _191=1;
1062 }
1063 if(_188==Dygraph.DECADAL){
1064 _191=1;
1065 _190=10;
1066 }
1067 var _192=365.2524*24*3600*1000;
1068 var _193=1*(_187-_186)/_192;
1069 return Math.floor(0.5+1*_193*_191/_190);
1070 }
1071 };
1072 Dygraph.prototype.GetXAxis=function(_194,_195,_196){
1073 var _197=[];
1074 if(_196<Dygraph.MONTHLY){
1075 var _198=Dygraph.SHORT_SPACINGS[_196];
1076 var _199="%d%b";
1077 if(_196<Dygraph.HOURLY){
1078 _194=_198*Math.floor(0.5+_194/_198);
1079 }
1080 for(var t=_194;t<=_195;t+=_198){
1081 var d=new Date(t);
1082 var frac=d.getHours()*3600+d.getMinutes()*60+d.getSeconds();
1083 if(frac==0||_196>=Dygraph.DAILY){
1084 _197.push({v:t,label:new Date(t+3600*1000).strftime(_199)});
1085 }else{
1086 _197.push({v:t,label:this.hmsString_(t)});
1087 }
1088 }
1089 }else{
1090 var _200;
1091 var _201=1;
1092 if(_196==Dygraph.MONTHLY){
1093 _200=[0,1,2,3,4,5,6,7,8,9,10,11,12];
1094 }else{
1095 if(_196==Dygraph.QUARTERLY){
1096 _200=[0,3,6,9];
1097 }else{
1098 if(_196==Dygraph.BIANNUAL){
1099 _200=[0,6];
1100 }else{
1101 if(_196==Dygraph.ANNUAL){
1102 _200=[0];
1103 }else{
1104 if(_196==Dygraph.DECADAL){
1105 _200=[0];
1106 _201=10;
1107 }
1108 }
1109 }
1110 }
1111 }
1112 var _202=new Date(_194).getFullYear();
1113 var _203=new Date(_195).getFullYear();
1114 var _204=Dygraph.zeropad;
1115 for(var i=_202;i<=_203;i++){
1116 if(i%_201!=0){
1117 continue;
1118 }
1119 for(var j=0;j<_200.length;j++){
1120 var _205=i+"/"+_204(1+_200[j])+"/01";
1121 var t=Date.parse(_205);
1122 if(t<_194||t>_195){
1123 continue;
1124 }
1125 _197.push({v:t,label:new Date(t).strftime("%b %y")});
1126 }
1127 }
1128 }
1129 return _197;
1130 };
1131 Dygraph.dateTicker=function(_206,_207,self){
1132 var _208=-1;
1133 for(var i=0;i<Dygraph.NUM_GRANULARITIES;i++){
1134 var _209=self.NumXTicks(_206,_207,i);
1135 if(self.width_/_209>=self.attr_("pixelsPerXLabel")){
1136 _208=i;
1137 break;
1138 }
1139 }
1140 if(_208>=0){
1141 return self.GetXAxis(_206,_207,_208);
1142 }else{
1143 }
1144 };
1145 Dygraph.numericTicks=function(minV,maxV,self){
1146 var _212=[1,2,5];
1147 var _213,low_val,high_val,nTicks;
1148 var _214=self.attr_("pixelsPerYLabel");
1149 for(var i=-10;i<50;i++){
1150 var _215=Math.pow(10,i);
1151 for(var j=0;j<_212.length;j++){
1152 _213=_215*_212[j];
1153 low_val=Math.floor(minV/_213)*_213;
1154 high_val=Math.ceil(maxV/_213)*_213;
1155 nTicks=(high_val-low_val)/_213;
1156 var _216=self.height_/nTicks;
1157 if(_216>_214){
1158 break;
1159 }
1160 }
1161 if(_216>_214){
1162 break;
1163 }
1164 }
1165 var _217=[];
1166 var k;
1167 var _219=[];
1168 if(self.attr_("labelsKMB")){
1169 k=1000;
1170 _219=["K","M","B","T"];
1171 }
1172 if(self.attr_("labelsKMG2")){
1173 if(k){
1174 self.warn("Setting both labelsKMB and labelsKMG2. Pick one!");
1175 }
1176 k=1024;
1177 _219=["k","M","G","T"];
1178 }
1179 for(var i=0;i<nTicks;i++){
1180 var _220=low_val+i*_213;
1181 var _221=Math.abs(_220);
1182 var _222=self.round_(_220,2);
1183 if(_219.length){
1184 var n=k*k*k*k;
1185 for(var j=3;j>=0;j--,n/=k){
1186 if(_221>=n){
1187 _222=self.round_(_220/n,1)+_219[j];
1188 break;
1189 }
1190 }
1191 }
1192 _217.push({label:_222,v:_220});
1193 }
1194 return _217;
1195 };
1196 Dygraph.prototype.addYTicks_=function(minY,maxY){
1197 var _226=Dygraph.numericTicks(minY,maxY,this);
1198 this.layout_.updateOptions({yAxis:[minY,maxY],yTicks:_226});
1199 };
1200 Dygraph.prototype.extremeValues_=function(_227){
1201 var minY=null,maxY=null;
1202 var bars=this.attr_("errorBars")||this.attr_("customBars");
1203 if(bars){
1204 for(var j=0;j<_227.length;j++){
1205 var y=_227[j][1][0];
1206 if(!y){
1207 continue;
1208 }
1209 var low=y-_227[j][1][1];
1210 var high=y+_227[j][1][2];
1211 if(low>y){
1212 low=y;
1213 }
1214 if(high<y){
1215 high=y;
1216 }
1217 if(maxY==null||high>maxY){
1218 maxY=high;
1219 }
1220 if(minY==null||low<minY){
1221 minY=low;
1222 }
1223 }
1224 }else{
1225 for(var j=0;j<_227.length;j++){
1226 var y=_227[j][1];
1227 if(y===null||isNaN(y)){
1228 continue;
1229 }
1230 if(maxY==null||y>maxY){
1231 maxY=y;
1232 }
1233 if(minY==null||y<minY){
1234 minY=y;
1235 }
1236 }
1237 }
1238 return [minY,maxY];
1239 };
1240 Dygraph.prototype.drawGraph_=function(data){
1241 var minY=null,maxY=null;
1242 this.layout_.removeAllDatasets();
1243 this.setColors_();
1244 this.attrs_["pointSize"]=0.5*this.attr_("highlightCircleSize");
1245 for(var i=1;i<data[0].length;i++){
1246 var _231=[];
1247 for(var j=0;j<data.length;j++){
1248 var date=data[j][0];
1249 _231[j]=[date,data[j][i]];
1250 }
1251 _231=this.rollingAverage(_231,this.rollPeriod_);
1252 var bars=this.attr_("errorBars")||this.attr_("customBars");
1253 if(this.dateWindow_){
1254 var low=this.dateWindow_[0];
1255 var high=this.dateWindow_[1];
1256 var _232=[];
1257 for(var k=0;k<_231.length;k++){
1258 if(_231[k][0]>=low&&_231[k][0]<=high){
1259 _232.push(_231[k]);
1260 }
1261 }
1262 _231=_232;
1263 }
1264 var _233=this.extremeValues_(_231);
1265 var _234=_233[0];
1266 var _235=_233[1];
1267 if(!minY||_234<minY){
1268 minY=_234;
1269 }
1270 if(!maxY||_235>maxY){
1271 maxY=_235;
1272 }
1273 if(bars){
1274 var vals=[];
1275 for(var j=0;j<_231.length;j++){
1276 vals[j]=[_231[j][0],_231[j][1][0],_231[j][1][1],_231[j][1][2]];
1277 }
1278 this.layout_.addDataset(this.attr_("labels")[i],vals);
1279 }else{
1280 this.layout_.addDataset(this.attr_("labels")[i],_231);
1281 }
1282 }
1283 if(this.valueRange_!=null){
1284 this.addYTicks_(this.valueRange_[0],this.valueRange_[1]);
1285 }else{
1286 var span=maxY-minY;
1287 var _238=maxY+0.1*span;
1288 var _239=minY-0.1*span;
1289 if(_239<0&&minY>=0){
1290 _239=0;
1291 }
1292 if(_238>0&&maxY<=0){
1293 _238=0;
1294 }
1295 if(this.attr_("includeZero")){
1296 if(maxY<0){
1297 _238=0;
1298 }
1299 if(minY>0){
1300 _239=0;
1301 }
1302 }
1303 this.addYTicks_(_239,_238);
1304 }
1305 this.addXTicks_();
1306 this.layout_.updateOptions({dateWindow:this.dateWindow_});
1307 this.layout_.evaluateWithError();
1308 this.plotter_.clear();
1309 this.plotter_.render();
1310 this.canvas_.getContext("2d").clearRect(0,0,this.canvas_.width,this.canvas_.height);
1311 };
1312 Dygraph.prototype.rollingAverage=function(_240,_241){
1313 if(_240.length<2){
1314 return _240;
1315 }
1316 var _241=Math.min(_241,_240.length-1);
1317 var _242=[];
1318 var _243=this.attr_("sigma");
1319 if(this.fractions_){
1320 var num=0;
1321 var den=0;
1322 var mult=100;
1323 for(var i=0;i<_240.length;i++){
1324 num+=_240[i][1][0];
1325 den+=_240[i][1][1];
1326 if(i-_241>=0){
1327 num-=_240[i-_241][1][0];
1328 den-=_240[i-_241][1][1];
1329 }
1330 var date=_240[i][0];
1331 var _246=den?num/den:0;
1332 if(this.attr_("errorBars")){
1333 if(this.wilsonInterval_){
1334 if(den){
1335 var p=_246<0?0:_246,n=den;
1336 var pm=_243*Math.sqrt(p*(1-p)/n+_243*_243/(4*n*n));
1337 var _248=1+_243*_243/den;
1338 var low=(p+_243*_243/(2*den)-pm)/_248;
1339 var high=(p+_243*_243/(2*den)+pm)/_248;
1340 _242[i]=[date,[p*mult,(p-low)*mult,(high-p)*mult]];
1341 }else{
1342 _242[i]=[date,[0,0,0]];
1343 }
1344 }else{
1345 var _249=den?_243*Math.sqrt(_246*(1-_246)/den):1;
1346 _242[i]=[date,[mult*_246,mult*_249,mult*_249]];
1347 }
1348 }else{
1349 _242[i]=[date,mult*_246];
1350 }
1351 }
1352 }else{
1353 if(this.attr_("customBars")){
1354 var low=0;
1355 var mid=0;
1356 var high=0;
1357 var _251=0;
1358 for(var i=0;i<_240.length;i++){
1359 var data=_240[i][1];
1360 var y=data[1];
1361 _242[i]=[_240[i][0],[y,y-data[0],data[2]-y]];
1362 if(y!=null&&!isNaN(y)){
1363 low+=data[0];
1364 mid+=y;
1365 high+=data[2];
1366 _251+=1;
1367 }
1368 if(i-_241>=0){
1369 var prev=_240[i-_241];
1370 if(prev[1][1]!=null&&!isNaN(prev[1][1])){
1371 low-=prev[1][0];
1372 mid-=prev[1][1];
1373 high-=prev[1][2];
1374 _251-=1;
1375 }
1376 }
1377 _242[i]=[_240[i][0],[1*mid/_251,1*(mid-low)/_251,1*(high-mid)/_251]];
1378 }
1379 }else{
1380 var _253=Math.min(_241-1,_240.length-2);
1381 if(!this.attr_("errorBars")){
1382 if(_241==1){
1383 return _240;
1384 }
1385 for(var i=0;i<_240.length;i++){
1386 var sum=0;
1387 var _255=0;
1388 for(var j=Math.max(0,i-_241+1);j<i+1;j++){
1389 var y=_240[j][1];
1390 if(y==null||isNaN(y)){
1391 continue;
1392 }
1393 _255++;
1394 sum+=_240[j][1];
1395 }
1396 if(_255){
1397 _242[i]=[_240[i][0],sum/_255];
1398 }else{
1399 _242[i]=[_240[i][0],null];
1400 }
1401 }
1402 }else{
1403 for(var i=0;i<_240.length;i++){
1404 var sum=0;
1405 var _256=0;
1406 var _255=0;
1407 for(var j=Math.max(0,i-_241+1);j<i+1;j++){
1408 var y=_240[j][1][0];
1409 if(y==null||isNaN(y)){
1410 continue;
1411 }
1412 _255++;
1413 sum+=_240[j][1][0];
1414 _256+=Math.pow(_240[j][1][1],2);
1415 }
1416 if(_255){
1417 var _249=Math.sqrt(_256)/_255;
1418 _242[i]=[_240[i][0],[sum/_255,_243*_249,_243*_249]];
1419 }else{
1420 _242[i]=[_240[i][0],[null,null,null]];
1421 }
1422 }
1423 }
1424 }
1425 }
1426 return _242;
1427 };
1428 Dygraph.dateParser=function(_257,self){
1429 var _258;
1430 var d;
1431 if(_257.length==10&&_257.search("-")!=-1){
1432 _258=_257.replace("-","/","g");
1433 while(_258.search("-")!=-1){
1434 _258=_258.replace("-","/");
1435 }
1436 d=Date.parse(_258);
1437 }else{
1438 if(_257.length==8){
1439 _258=_257.substr(0,4)+"/"+_257.substr(4,2)+"/"+_257.substr(6,2);
1440 d=Date.parse(_258);
1441 }else{
1442 d=Date.parse(_257);
1443 }
1444 }
1445 if(!d||isNaN(d)){
1446 self.error("Couldn't parse "+_257+" as a date");
1447 }
1448 return d;
1449 };
1450 Dygraph.prototype.detectTypeFromString_=function(str){
1451 var _260=false;
1452 if(str.indexOf("-")>=0||str.indexOf("/")>=0||isNaN(parseFloat(str))){
1453 _260=true;
1454 }else{
1455 if(str.length==8&&str>"19700101"&&str<"20371231"){
1456 _260=true;
1457 }
1458 }
1459 if(_260){
1460 this.attrs_.xValueFormatter=Dygraph.dateString_;
1461 this.attrs_.xValueParser=Dygraph.dateParser;
1462 this.attrs_.xTicker=Dygraph.dateTicker;
1463 }else{
1464 this.attrs_.xValueFormatter=function(x){
1465 return x;
1466 };
1467 this.attrs_.xValueParser=function(x){
1468 return parseFloat(x);
1469 };
1470 this.attrs_.xTicker=Dygraph.numericTicks;
1471 }
1472 };
1473 Dygraph.prototype.parseCSV_=function(data){
1474 var ret=[];
1475 var _261=data.split("\n");
1476 var _262=this.attr_("delimiter");
1477 if(_261[0].indexOf(_262)==-1&&_261[0].indexOf("\t")>=0){
1478 _262="\t";
1479 }
1480 var _263=0;
1481 if(this.labelsFromCSV_){
1482 _263=1;
1483 this.attrs_.labels=_261[0].split(_262);
1484 }
1485 var _264;
1486 var _265=false;
1487 var _266=this.attr_("labels").length;
1488 for(var i=_263;i<_261.length;i++){
1489 var line=_261[i];
1490 if(line.length==0){
1491 continue;
1492 }
1493 if(line[0]=="#"){
1494 continue;
1495 }
1496 var _268=line.split(_262);
1497 if(_268.length<2){
1498 continue;
1499 }
1500 var _269=[];
1501 if(!_265){
1502 this.detectTypeFromString_(_268[0]);
1503 _264=this.attr_("xValueParser");
1504 _265=true;
1505 }
1506 _269[0]=_264(_268[0],this);
1507 if(this.fractions_){
1508 for(var j=1;j<_268.length;j++){
1509 var vals=_268[j].split("/");
1510 _269[j]=[parseFloat(vals[0]),parseFloat(vals[1])];
1511 }
1512 }else{
1513 if(this.attr_("errorBars")){
1514 for(var j=1;j<_268.length;j+=2){
1515 _269[(j+1)/2]=[parseFloat(_268[j]),parseFloat(_268[j+1])];
1516 }
1517 }else{
1518 if(this.attr_("customBars")){
1519 for(var j=1;j<_268.length;j++){
1520 var vals=_268[j].split(";");
1521 _269[j]=[parseFloat(vals[0]),parseFloat(vals[1]),parseFloat(vals[2])];
1522 }
1523 }else{
1524 for(var j=1;j<_268.length;j++){
1525 _269[j]=parseFloat(_268[j]);
1526 }
1527 }
1528 }
1529 }
1530 ret.push(_269);
1531 if(_269.length!=_266){
1532 this.error("Number of columns in line "+i+" ("+_269.length+") does not agree with number of labels ("+_266+") "+line);
1533 }
1534 }
1535 return ret;
1536 };
1537 Dygraph.prototype.parseArray_=function(data){
1538 if(data.length==0){
1539 this.error("Can't plot empty data set");
1540 return null;
1541 }
1542 if(data[0].length==0){
1543 this.error("Data set cannot contain an empty row");
1544 return null;
1545 }
1546 if(this.attr_("labels")==null){
1547 this.warn("Using default labels. Set labels explicitly via 'labels' "+"in the options parameter");
1548 this.attrs_.labels=["X"];
1549 for(var i=1;i<data[0].length;i++){
1550 this.attrs_.labels.push("Y"+i);
1551 }
1552 }
1553 if(Dygraph.isDateLike(data[0][0])){
1554 this.attrs_.xValueFormatter=Dygraph.dateString_;
1555 this.attrs_.xTicker=Dygraph.dateTicker;
1556 var _270=Dygraph.clone(data);
1557 for(var i=0;i<data.length;i++){
1558 if(_270[i].length==0){
1559 this.error("Row "<<(1+i)<<" of data is empty");
1560 return null;
1561 }
1562 if(_270[i][0]==null||typeof (_270[i][0].getTime)!="function"){
1563 this.error("x value in row "<<(1+i)<<" is not a Date");
1564 return null;
1565 }
1566 _270[i][0]=_270[i][0].getTime();
1567 }
1568 return _270;
1569 }else{
1570 this.attrs_.xValueFormatter=function(x){
1571 return x;
1572 };
1573 this.attrs_.xTicker=Dygraph.numericTicks;
1574 return data;
1575 }
1576 };
1577 Dygraph.prototype.parseDataTable_=function(data){
1578 var cols=data.getNumberOfColumns();
1579 var rows=data.getNumberOfRows();
1580 var _273=[];
1581 for(var i=0;i<cols;i++){
1582 _273.push(data.getColumnLabel(i));
1583 if(i!=0&&this.attr_("errorBars")){
1584 i+=1;
1585 }
1586 }
1587 this.attrs_.labels=_273;
1588 cols=_273.length;
1589 var _274=data.getColumnType(0);
1590 if(_274=="date"){
1591 this.attrs_.xValueFormatter=Dygraph.dateString_;
1592 this.attrs_.xValueParser=Dygraph.dateParser;
1593 this.attrs_.xTicker=Dygraph.dateTicker;
1594 }else{
1595 if(_274=="number"){
1596 this.attrs_.xValueFormatter=function(x){
1597 return x;
1598 };
1599 this.attrs_.xValueParser=function(x){
1600 return parseFloat(x);
1601 };
1602 this.attrs_.xTicker=Dygraph.numericTicks;
1603 }else{
1604 this.error("only 'date' and 'number' types are supported for column 1 "+"of DataTable input (Got '"+_274+"')");
1605 return null;
1606 }
1607 }
1608 var ret=[];
1609 for(var i=0;i<rows;i++){
1610 var row=[];
1611 if(!data.getValue(i,0)){
1612 continue;
1613 }
1614 if(_274=="date"){
1615 row.push(data.getValue(i,0).getTime());
1616 }else{
1617 row.push(data.getValue(i,0));
1618 }
1619 if(!this.attr_("errorBars")){
1620 for(var j=1;j<cols;j++){
1621 row.push(data.getValue(i,j));
1622 }
1623 }else{
1624 for(var j=0;j<cols-1;j++){
1625 row.push([data.getValue(i,1+2*j),data.getValue(i,2+2*j)]);
1626 }
1627 }
1628 ret.push(row);
1629 }
1630 return ret;
1631 };
1632 Dygraph.update=function(self,o){
1633 if(typeof (o)!="undefined"&&o!==null){
1634 for(var k in o){
1635 if(o.hasOwnProperty(k)){
1636 self[k]=o[k];
1637 }
1638 }
1639 }
1640 return self;
1641 };
1642 Dygraph.isArrayLike=function(o){
1643 var typ=typeof (o);
1644 if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
1645 return false;
1646 }
1647 return true;
1648 };
1649 Dygraph.isDateLike=function(o){
1650 if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
1651 return false;
1652 }
1653 return true;
1654 };
1655 Dygraph.clone=function(o){
1656 var r=[];
1657 for(var i=0;i<o.length;i++){
1658 if(Dygraph.isArrayLike(o[i])){
1659 r.push(Dygraph.clone(o[i]));
1660 }else{
1661 r.push(o[i]);
1662 }
1663 }
1664 return r;
1665 };
1666 Dygraph.prototype.start_=function(){
1667 if(typeof this.file_=="function"){
1668 this.loadedEvent_(this.file_());
1669 }else{
1670 if(Dygraph.isArrayLike(this.file_)){
1671 this.rawData_=this.parseArray_(this.file_);
1672 this.drawGraph_(this.rawData_);
1673 }else{
1674 if(typeof this.file_=="object"&&typeof this.file_.getColumnRange=="function"){
1675 this.rawData_=this.parseDataTable_(this.file_);
1676 this.drawGraph_(this.rawData_);
1677 }else{
1678 if(typeof this.file_=="string"){
1679 if(this.file_.indexOf("\n")>=0){
1680 this.loadedEvent_(this.file_);
1681 }else{
1682 var req=new XMLHttpRequest();
1683 var _280=this;
1684 req.onreadystatechange=function(){
1685 if(req.readyState==4){
1686 if(req.status==200){
1687 _280.loadedEvent_(req.responseText);
1688 }
1689 }
1690 };
1691 req.open("GET",this.file_,true);
1692 req.send(null);
1693 }
1694 }else{
1695 this.error("Unknown data format: "+(typeof this.file_));
1696 }
1697 }
1698 }
1699 }
1700 };
1701 Dygraph.prototype.updateOptions=function(_281){
1702 if(_281.rollPeriod){
1703 this.rollPeriod_=_281.rollPeriod;
1704 }
1705 if(_281.dateWindow){
1706 this.dateWindow_=_281.dateWindow;
1707 }
1708 if(_281.valueRange){
1709 this.valueRange_=_281.valueRange;
1710 }
1711 Dygraph.update(this.user_attrs_,_281);
1712 this.labelsFromCSV_=(this.attr_("labels")==null);
1713 this.layout_.updateOptions({"errorBars":this.attr_("errorBars")});
1714 if(_281["file"]&&_281["file"]!=this.file_){
1715 this.file_=_281["file"];
1716 this.start_();
1717 }else{
1718 this.drawGraph_(this.rawData_);
1719 }
1720 };
1721 Dygraph.prototype.resize=function(_282,_283){
1722 if((_282===null)!=(_283===null)){
1723 this.warn("Dygraph.resize() should be called with zero parameters or "+"two non-NULL parameters. Pretending it was zero.");
1724 _282=_283=null;
1725 }
1726 this.maindiv_.innerHTML="";
1727 this.attrs_.labelsDiv=null;
1728 if(_282){
1729 this.maindiv_.style.width=_282+"px";
1730 this.maindiv_.style.height=_283+"px";
1731 this.width_=_282;
1732 this.height_=_283;
1733 }else{
1734 this.width_=this.maindiv_.offsetWidth;
1735 this.height_=this.maindiv_.offsetHeight;
1736 }
1737 this.createInterface_();
1738 this.drawGraph_(this.rawData_);
1739 };
1740 Dygraph.prototype.adjustRoll=function(_284){
1741 this.rollPeriod_=_284;
1742 this.drawGraph_(this.rawData_);
1743 };
1744 Dygraph.createCanvas=function(){
1745 var _285=document.createElement("canvas");
1746 isIE=(/MSIE/.test(navigator.userAgent)&&!window.opera);
1747 if(isIE){
1748 _285=G_vmlCanvasManager.initElement(_285);
1749 }
1750 return _285;
1751 };
1752 Dygraph.GVizChart=function(_286){
1753 this.container=_286;
1754 };
1755 Dygraph.GVizChart.prototype.draw=function(data,_287){
1756 this.container.innerHTML="";
1757 this.date_graph=new Dygraph(this.container,data,_287);
1758 };
1759 DateGraph=Dygraph;
1760 function RGBColor(_288){
1761 this.ok=false;
1762 if(_288.charAt(0)=="#"){
1763 _288=_288.substr(1,6);
1764 }
1765 _288=_288.replace(/ /g,"");
1766 _288=_288.toLowerCase();
1767 var _289={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"};
1768 for(var key in _289){
1769 if(_288==key){
1770 _288=_289[key];
1771 }
1772 }
1773 var _291=[{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){
1774 return [parseInt(bits[1]),parseInt(bits[2]),parseInt(bits[3])];
1775 }},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(bits){
1776 return [parseInt(bits[1],16),parseInt(bits[2],16),parseInt(bits[3],16)];
1777 }},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(bits){
1778 return [parseInt(bits[1]+bits[1],16),parseInt(bits[2]+bits[2],16),parseInt(bits[3]+bits[3],16)];
1779 }}];
1780 for(var i=0;i<_291.length;i++){
1781 var re=_291[i].re;
1782 var _294=_291[i].process;
1783 var bits=re.exec(_288);
1784 if(bits){
1785 channels=_294(bits);
1786 this.r=channels[0];
1787 this.g=channels[1];
1788 this.b=channels[2];
1789 this.ok=true;
1790 }
1791 }
1792 this.r=(this.r<0||isNaN(this.r))?0:((this.r>255)?255:this.r);
1793 this.g=(this.g<0||isNaN(this.g))?0:((this.g>255)?255:this.g);
1794 this.b=(this.b<0||isNaN(this.b))?0:((this.b>255)?255:this.b);
1795 this.toRGB=function(){
1796 return "rgb("+this.r+", "+this.g+", "+this.b+")";
1797 };
1798 this.toHex=function(){
1799 var r=this.r.toString(16);
1800 var g=this.g.toString(16);
1801 var b=this.b.toString(16);
1802 if(r.length==1){
1803 r="0"+r;
1804 }
1805 if(g.length==1){
1806 g="0"+g;
1807 }
1808 if(b.length==1){
1809 b="0"+b;
1810 }
1811 return "#"+r+g+b;
1812 };
1813 }
1814