Only pack a subset of MochiKit. This saves another 90k.
[dygraphs.git] / docs / dygraph-combined.js
CommitLineData
078d1d29
DV
1/***
2
3 MochiKit.MochiKit 1.4 : PACKED VERSION
4
5 THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please
6 diff against the source tree, not this file.
7
8 See <http://mochikit.com/> for documentation, downloads, license, etc.
9
10 (c) 2005 Bob Ippolito. All rights Reserved.
11
12***/
13
14if(typeof (dojo)!="undefined"){
15dojo.provide("MochiKit.Base");
16}
17if(typeof (MochiKit)=="undefined"){
18MochiKit={};
19}
20if(typeof (MochiKit.Base)=="undefined"){
21MochiKit.Base={};
22}
23if(typeof (MochiKit.__export__)=="undefined"){
24MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
25}
26MochiKit.Base.VERSION="1.4";
27MochiKit.Base.NAME="MochiKit.Base";
28MochiKit.Base.update=function(_1,_2){
29if(_1===null){
30_1={};
31}
32for(var i=1;i<arguments.length;i++){
33var o=arguments[i];
34if(typeof (o)!="undefined"&&o!==null){
35for(var k in o){
36_1[k]=o[k];
37}
38}
39}
40return _1;
41};
42MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
43return "["+this.NAME+" "+this.VERSION+"]";
44},toString:function(){
45return this.__repr__();
46},camelize:function(_6){
47var _7=_6.split("-");
48var cc=_7[0];
49for(var i=1;i<_7.length;i++){
50cc+=_7[i].charAt(0).toUpperCase()+_7[i].substring(1);
51}
52return cc;
53},counter:function(n){
54if(arguments.length===0){
55n=1;
56}
57return function(){
58return n++;
59};
60},clone:function(_b){
61var me=arguments.callee;
62if(arguments.length==1){
63me.prototype=_b;
64return new me();
65}
66},_flattenArray:function(_d,_e){
67for(var i=0;i<_e.length;i++){
68var o=_e[i];
69if(o instanceof Array){
70arguments.callee(_d,o);
71}else{
72_d.push(o);
73}
74}
75return _d;
76},flattenArray:function(lst){
77return MochiKit.Base._flattenArray([],lst);
78},flattenArguments:function(lst){
79var res=[];
80var m=MochiKit.Base;
81var _15=m.extend(null,arguments);
82while(_15.length){
83var o=_15.shift();
84if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
85for(var i=o.length-1;i>=0;i--){
86_15.unshift(o[i]);
87}
88}else{
89res.push(o);
90}
91}
92return res;
93},extend:function(_18,obj,_1a){
94if(!_1a){
95_1a=0;
96}
97if(obj){
98var l=obj.length;
99if(typeof (l)!="number"){
100if(typeof (MochiKit.Iter)!="undefined"){
101obj=MochiKit.Iter.list(obj);
102l=obj.length;
103}else{
104throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
105}
106}
107if(!_18){
108_18=[];
109}
110for(var i=_1a;i<l;i++){
111_18.push(obj[i]);
112}
113}
114return _18;
115},updatetree:function(_1d,obj){
116if(_1d===null){
117_1d={};
118}
119for(var i=1;i<arguments.length;i++){
120var o=arguments[i];
121if(typeof (o)!="undefined"&&o!==null){
122for(var k in o){
123var v=o[k];
124if(typeof (_1d[k])=="object"&&typeof (v)=="object"){
125arguments.callee(_1d[k],v);
126}else{
127_1d[k]=v;
128}
129}
130}
131}
132return _1d;
133},setdefault:function(_23,obj){
134if(_23===null){
135_23={};
136}
137for(var i=1;i<arguments.length;i++){
138var o=arguments[i];
139for(var k in o){
140if(!(k in _23)){
141_23[k]=o[k];
142}
143}
144}
145return _23;
146},keys:function(obj){
147var _29=[];
148for(var _2a in obj){
149_29.push(_2a);
150}
151return _29;
152},values:function(obj){
153var _2c=[];
154for(var _2d in obj){
155_2c.push(obj[_2d]);
156}
157return _2c;
158},items:function(obj){
159var _2f=[];
160var e;
161for(var _31 in obj){
162var v;
163try{
164v=obj[_31];
165}
166catch(e){
167continue;
168}
169_2f.push([_31,v]);
170}
171return _2f;
172},_newNamedError:function(_33,_34,_35){
173_35.prototype=new MochiKit.Base.NamedError(_33.NAME+"."+_34);
174_33[_34]=_35;
175},operator:{truth:function(a){
176return !!a;
177},lognot:function(a){
178return !a;
179},identity:function(a){
180return a;
181},not:function(a){
182return ~a;
183},neg:function(a){
184return -a;
185},add:function(a,b){
186return a+b;
187},sub:function(a,b){
188return a-b;
189},div:function(a,b){
190return a/b;
191},mod:function(a,b){
192return a%b;
193},mul:function(a,b){
194return a*b;
195},and:function(a,b){
196return a&b;
197},or:function(a,b){
198return a|b;
199},xor:function(a,b){
200return a^b;
201},lshift:function(a,b){
202return a<<b;
203},rshift:function(a,b){
204return a>>b;
205},zrshift:function(a,b){
206return a>>>b;
207},eq:function(a,b){
208return a==b;
209},ne:function(a,b){
210return a!=b;
211},gt:function(a,b){
212return a>b;
213},ge:function(a,b){
214return a>=b;
215},lt:function(a,b){
216return a<b;
217},le:function(a,b){
218return a<=b;
219},seq:function(a,b){
220return a===b;
221},sne:function(a,b){
222return a!==b;
223},ceq:function(a,b){
224return MochiKit.Base.compare(a,b)===0;
225},cne:function(a,b){
226return MochiKit.Base.compare(a,b)!==0;
227},cgt:function(a,b){
228return MochiKit.Base.compare(a,b)==1;
229},cge:function(a,b){
230return MochiKit.Base.compare(a,b)!=-1;
231},clt:function(a,b){
232return MochiKit.Base.compare(a,b)==-1;
233},cle:function(a,b){
234return MochiKit.Base.compare(a,b)!=1;
235},logand:function(a,b){
236return a&&b;
237},logor:function(a,b){
238return a||b;
239},contains:function(a,b){
240return b in a;
241}},forwardCall:function(_73){
242return function(){
243return this[_73].apply(this,arguments);
244};
245},itemgetter:function(_74){
246return function(arg){
247return arg[_74];
248};
249},typeMatcher:function(){
250var _76={};
251for(var i=0;i<arguments.length;i++){
252var typ=arguments[i];
253_76[typ]=typ;
254}
255return function(){
256for(var i=0;i<arguments.length;i++){
257if(!(typeof (arguments[i]) in _76)){
258return false;
259}
260}
261return true;
262};
263},isNull:function(){
264for(var i=0;i<arguments.length;i++){
265if(arguments[i]!==null){
266return false;
267}
268}
269return true;
270},isUndefinedOrNull:function(){
271for(var i=0;i<arguments.length;i++){
272var o=arguments[i];
273if(!(typeof (o)=="undefined"||o===null)){
274return false;
275}
276}
277return true;
278},isEmpty:function(obj){
279return !MochiKit.Base.isNotEmpty.apply(this,arguments);
280},isNotEmpty:function(obj){
281for(var i=0;i<arguments.length;i++){
282var o=arguments[i];
283if(!(o&&o.length)){
284return false;
285}
286}
287return true;
288},isArrayLike:function(){
289for(var i=0;i<arguments.length;i++){
290var o=arguments[i];
291var typ=typeof (o);
292if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
293return false;
294}
295}
296return true;
297},isDateLike:function(){
298for(var i=0;i<arguments.length;i++){
299var o=arguments[i];
300if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
301return false;
302}
303}
304return true;
305},xmap:function(fn){
306if(fn===null){
307return MochiKit.Base.extend(null,arguments,1);
308}
309var _87=[];
310for(var i=1;i<arguments.length;i++){
311_87.push(fn(arguments[i]));
312}
313return _87;
314},map:function(fn,lst){
315var m=MochiKit.Base;
316var itr=MochiKit.Iter;
317var _8d=m.isArrayLike;
318if(arguments.length<=2){
319if(!_8d(lst)){
320if(itr){
321lst=itr.list(lst);
322if(fn===null){
323return lst;
324}
325}else{
326throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
327}
328}
329if(fn===null){
330return m.extend(null,lst);
331}
332var _8e=[];
333for(var i=0;i<lst.length;i++){
334_8e.push(fn(lst[i]));
335}
336return _8e;
337}else{
338if(fn===null){
339fn=Array;
340}
341var _90=null;
342for(i=1;i<arguments.length;i++){
343if(!_8d(arguments[i])){
344if(itr){
345return itr.list(itr.imap.apply(null,arguments));
346}else{
347throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
348}
349}
350var l=arguments[i].length;
351if(_90===null||_90>l){
352_90=l;
353}
354}
355_8e=[];
356for(i=0;i<_90;i++){
357var _92=[];
358for(var j=1;j<arguments.length;j++){
359_92.push(arguments[j][i]);
360}
361_8e.push(fn.apply(this,_92));
362}
363return _8e;
364}
365},xfilter:function(fn){
366var _95=[];
367if(fn===null){
368fn=MochiKit.Base.operator.truth;
369}
370for(var i=1;i<arguments.length;i++){
371var o=arguments[i];
372if(fn(o)){
373_95.push(o);
374}
375}
376return _95;
377},filter:function(fn,lst,_9a){
378var _9b=[];
379var m=MochiKit.Base;
380if(!m.isArrayLike(lst)){
381if(MochiKit.Iter){
382lst=MochiKit.Iter.list(lst);
383}else{
384throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
385}
386}
387if(fn===null){
388fn=m.operator.truth;
389}
390if(typeof (Array.prototype.filter)=="function"){
391return Array.prototype.filter.call(lst,fn,_9a);
392}else{
393if(typeof (_9a)=="undefined"||_9a===null){
394for(var i=0;i<lst.length;i++){
395var o=lst[i];
396if(fn(o)){
397_9b.push(o);
398}
399}
400}else{
401for(i=0;i<lst.length;i++){
402o=lst[i];
403if(fn.call(_9a,o)){
404_9b.push(o);
405}
406}
407}
408}
409return _9b;
410},_wrapDumbFunction:function(_9f){
411return function(){
412switch(arguments.length){
413case 0:
414return _9f();
415case 1:
416return _9f(arguments[0]);
417case 2:
418return _9f(arguments[0],arguments[1]);
419case 3:
420return _9f(arguments[0],arguments[1],arguments[2]);
421}
422var _a0=[];
423for(var i=0;i<arguments.length;i++){
424_a0.push("arguments["+i+"]");
425}
426return eval("(func("+_a0.join(",")+"))");
427};
428},methodcaller:function(_a2){
429var _a3=MochiKit.Base.extend(null,arguments,1);
430if(typeof (_a2)=="function"){
431return function(obj){
432return _a2.apply(obj,_a3);
433};
434}else{
435return function(obj){
436return obj[_a2].apply(obj,_a3);
437};
438}
439},method:function(_a6,_a7){
440var m=MochiKit.Base;
441return m.bind.apply(this,m.extend([_a7,_a6],arguments,2));
442},compose:function(f1,f2){
443var _ab=[];
444var m=MochiKit.Base;
445if(arguments.length===0){
446throw new TypeError("compose() requires at least one argument");
447}
448for(var i=0;i<arguments.length;i++){
449var fn=arguments[i];
450if(typeof (fn)!="function"){
451throw new TypeError(m.repr(fn)+" is not a function");
452}
453_ab.push(fn);
454}
455return function(){
456var _af=arguments;
457for(var i=_ab.length-1;i>=0;i--){
458_af=[_ab[i].apply(this,_af)];
459}
460return _af[0];
461};
462},bind:function(_b1,_b2){
463if(typeof (_b1)=="string"){
464_b1=_b2[_b1];
465}
466var _b3=_b1.im_func;
467var _b4=_b1.im_preargs;
468var _b5=_b1.im_self;
469var m=MochiKit.Base;
470if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){
471_b1=m._wrapDumbFunction(_b1);
472}
473if(typeof (_b3)!="function"){
474_b3=_b1;
475}
476if(typeof (_b2)!="undefined"){
477_b5=_b2;
478}
479if(typeof (_b4)=="undefined"){
480_b4=[];
481}else{
482_b4=_b4.slice();
483}
484m.extend(_b4,arguments,2);
485var _b7=function(){
486var _b8=arguments;
487var me=arguments.callee;
488if(me.im_preargs.length>0){
489_b8=m.concat(me.im_preargs,_b8);
490}
491var _ba=me.im_self;
492if(!_ba){
493_ba=this;
494}
495return me.im_func.apply(_ba,_b8);
496};
497_b7.im_self=_b5;
498_b7.im_func=_b3;
499_b7.im_preargs=_b4;
500return _b7;
501},bindMethods:function(_bb){
502var _bc=MochiKit.Base.bind;
503for(var k in _bb){
504var _be=_bb[k];
505if(typeof (_be)=="function"){
506_bb[k]=_bc(_be,_bb);
507}
508}
509},registerComparator:function(_bf,_c0,_c1,_c2){
510MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2);
511},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
512if(a==b){
513return 0;
514}
515var _c5=(typeof (a)=="undefined"||a===null);
516var _c6=(typeof (b)=="undefined"||b===null);
517if(_c5&&_c6){
518return 0;
519}else{
520if(_c5){
521return -1;
522}else{
523if(_c6){
524return 1;
525}
526}
527}
528var m=MochiKit.Base;
529var _c8=m._primitives;
530if(!(typeof (a) in _c8&&typeof (b) in _c8)){
531try{
532return m.comparatorRegistry.match(a,b);
533}
534catch(e){
535if(e!=m.NotFound){
536throw e;
537}
538}
539}
540if(a<b){
541return -1;
542}else{
543if(a>b){
544return 1;
545}
546}
547var _c9=m.repr;
548throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared");
549},compareDateLike:function(a,b){
550return MochiKit.Base.compare(a.getTime(),b.getTime());
551},compareArrayLike:function(a,b){
552var _ce=MochiKit.Base.compare;
553var _cf=a.length;
554var _d0=0;
555if(_cf>b.length){
556_d0=1;
557_cf=b.length;
558}else{
559if(_cf<b.length){
560_d0=-1;
561}
562}
563for(var i=0;i<_cf;i++){
564var cmp=_ce(a[i],b[i]);
565if(cmp){
566return cmp;
567}
568}
569return _d0;
570},registerRepr:function(_d3,_d4,_d5,_d6){
571MochiKit.Base.reprRegistry.register(_d3,_d4,_d5,_d6);
572},repr:function(o){
573if(typeof (o)=="undefined"){
574return "undefined";
575}else{
576if(o===null){
577return "null";
578}
579}
580try{
581if(typeof (o.__repr__)=="function"){
582return o.__repr__();
583}else{
584if(typeof (o.repr)=="function"&&o.repr!=arguments.callee){
585return o.repr();
586}
587}
588return MochiKit.Base.reprRegistry.match(o);
589}
590catch(e){
591if(typeof (o.NAME)=="string"&&(o.toString==Function.prototype.toString||o.toString==Object.prototype.toString)){
592return o.NAME;
593}
594}
595try{
596var _d8=(o+"");
597}
598catch(e){
599return "["+typeof (o)+"]";
600}
601if(typeof (o)=="function"){
602o=_d8.replace(/^\s+/,"");
603var idx=o.indexOf("{");
604if(idx!=-1){
605o=o.substr(0,idx)+"{...}";
606}
607}
608return _d8;
609},reprArrayLike:function(o){
610var m=MochiKit.Base;
611return "["+m.map(m.repr,o).join(", ")+"]";
612},reprString:function(o){
613return ("\""+o.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");
614},reprNumber:function(o){
615return o+"";
616},registerJSON:function(_de,_df,_e0,_e1){
617MochiKit.Base.jsonRegistry.register(_de,_df,_e0,_e1);
618},evalJSON:function(){
619return eval("("+arguments[0]+")");
620},serializeJSON:function(o){
621var _e3=typeof (o);
622if(_e3=="number"||_e3=="boolean"){
623return o+"";
624}else{
625if(o===null){
626return "null";
627}
628}
629var m=MochiKit.Base;
630var _e5=m.reprString;
631if(_e3=="string"){
632return _e5(o);
633}
634var me=arguments.callee;
635var _e7;
636if(typeof (o.__json__)=="function"){
637_e7=o.__json__();
638if(o!==_e7){
639return me(_e7);
640}
641}
642if(typeof (o.json)=="function"){
643_e7=o.json();
644if(o!==_e7){
645return me(_e7);
646}
647}
648if(_e3!="function"&&typeof (o.length)=="number"){
649var res=[];
650for(var i=0;i<o.length;i++){
651var val=me(o[i]);
652if(typeof (val)!="string"){
653val="undefined";
654}
655res.push(val);
656}
657return "["+res.join(", ")+"]";
658}
659try{
660_e7=m.jsonRegistry.match(o);
661if(o!==_e7){
662return me(_e7);
663}
664}
665catch(e){
666if(e!=m.NotFound){
667throw e;
668}
669}
670if(_e3=="undefined"){
671throw new TypeError("undefined can not be serialized as JSON");
672}
673if(_e3=="function"){
674return null;
675}
676res=[];
677for(var k in o){
678var _ec;
679if(typeof (k)=="number"){
680_ec="\""+k+"\"";
681}else{
682if(typeof (k)=="string"){
683_ec=_e5(k);
684}else{
685continue;
686}
687}
688val=me(o[k]);
689if(typeof (val)!="string"){
690continue;
691}
692res.push(_ec+":"+val);
693}
694return "{"+res.join(", ")+"}";
695},objEqual:function(a,b){
696return (MochiKit.Base.compare(a,b)===0);
697},arrayEqual:function(_ef,arr){
698if(_ef.length!=arr.length){
699return false;
700}
701return (MochiKit.Base.compare(_ef,arr)===0);
702},concat:function(){
703var _f1=[];
704var _f2=MochiKit.Base.extend;
705for(var i=0;i<arguments.length;i++){
706_f2(_f1,arguments[i]);
707}
708return _f1;
709},keyComparator:function(key){
710var m=MochiKit.Base;
711var _f6=m.compare;
712if(arguments.length==1){
713return function(a,b){
714return _f6(a[key],b[key]);
715};
716}
717var _f9=m.extend(null,arguments);
718return function(a,b){
719var _fc=0;
720for(var i=0;(_fc===0)&&(i<_f9.length);i++){
721var key=_f9[i];
722_fc=_f6(a[key],b[key]);
723}
724return _fc;
725};
726},reverseKeyComparator:function(key){
727var _100=MochiKit.Base.keyComparator.apply(this,arguments);
728return function(a,b){
729return _100(b,a);
730};
731},partial:function(func){
732var m=MochiKit.Base;
733return m.bind.apply(this,m.extend([func,undefined],arguments,1));
734},listMinMax:function(_105,lst){
735if(lst.length===0){
736return null;
737}
738var cur=lst[0];
739var _108=MochiKit.Base.compare;
740for(var i=1;i<lst.length;i++){
741var o=lst[i];
742if(_108(o,cur)==_105){
743cur=o;
744}
745}
746return cur;
747},objMax:function(){
748return MochiKit.Base.listMinMax(1,arguments);
749},objMin:function(){
750return MochiKit.Base.listMinMax(-1,arguments);
751},findIdentical:function(lst,_10c,_10d,end){
752if(typeof (end)=="undefined"||end===null){
753end=lst.length;
754}
755if(typeof (_10d)=="undefined"||_10d===null){
756_10d=0;
757}
758for(var i=_10d;i<end;i++){
759if(lst[i]===_10c){
760return i;
761}
762}
763return -1;
764},mean:function(){
765var sum=0;
766var m=MochiKit.Base;
767var args=m.extend(null,arguments);
768var _113=args.length;
769while(args.length){
770var o=args.shift();
771if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
772_113+=o.length-1;
773for(var i=o.length-1;i>=0;i--){
774sum+=o[i];
775}
776}else{
777sum+=o;
778}
779}
780if(_113<=0){
781throw new TypeError("mean() requires at least one argument");
782}
783return sum/_113;
784},median:function(){
785var data=MochiKit.Base.flattenArguments(arguments);
786if(data.length===0){
787throw new TypeError("median() requires at least one argument");
788}
789data.sort(compare);
790if(data.length%2==0){
791var _117=data.length/2;
792return (data[_117]+data[_117-1])/2;
793}else{
794return data[(data.length-1)/2];
795}
796},findValue:function(lst,_119,_11a,end){
797if(typeof (end)=="undefined"||end===null){
798end=lst.length;
799}
800if(typeof (_11a)=="undefined"||_11a===null){
801_11a=0;
802}
803var cmp=MochiKit.Base.compare;
804for(var i=_11a;i<end;i++){
805if(cmp(lst[i],_119)===0){
806return i;
807}
808}
809return -1;
810},nodeWalk:function(node,_11f){
811var _120=[node];
812var _121=MochiKit.Base.extend;
813while(_120.length){
814var res=_11f(_120.shift());
815if(res){
816_121(_120,res);
817}
818}
819},nameFunctions:function(_123){
820var base=_123.NAME;
821if(typeof (base)=="undefined"){
822base="";
823}else{
824base=base+".";
825}
826for(var name in _123){
827var o=_123[name];
828if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
829try{
830o.NAME=base+name;
831}
832catch(e){
833}
834}
835}
836},queryString:function(_127,_128){
837if(typeof (MochiKit.DOM)!="undefined"&&arguments.length==1&&(typeof (_127)=="string"||(typeof (_127.nodeType)!="undefined"&&_127.nodeType>0))){
838var kv=MochiKit.DOM.formContents(_127);
839_127=kv[0];
840_128=kv[1];
841}else{
842if(arguments.length==1){
843if(typeof (_127.length)=="number"&&_127.length==2){
844return arguments.callee(_127[0],_127[1]);
845}
846var o=_127;
847_127=[];
848_128=[];
849for(var k in o){
850var v=o[k];
851if(typeof (v)=="function"){
852continue;
853}else{
854if(typeof (v)!="string"&&typeof (v.length)=="number"){
855for(var i=0;i<v.length;i++){
856_127.push(k);
857_128.push(v[i]);
858}
859}else{
860_127.push(k);
861_128.push(v);
862}
863}
864}
865}
866}
867var rval=[];
868var len=Math.min(_127.length,_128.length);
869var _130=MochiKit.Base.urlEncode;
870for(var i=0;i<len;i++){
871v=_128[i];
872if(typeof (v)!="undefined"&&v!==null){
873rval.push(_130(_127[i])+"="+_130(v));
874}
875}
876return rval.join("&");
877},parseQueryString:function(_131,_132){
878var qstr=(_131.charAt(0)=="?")?_131.substring(1):_131;
879var _134=qstr.replace(/\+/g,"%20").split(/(\&amp\;|\&\#38\;|\&#x26;|\&)/);
880var o={};
881var _136;
882if(typeof (decodeURIComponent)!="undefined"){
883_136=decodeURIComponent;
884}else{
885_136=unescape;
886}
887if(_132){
888for(var i=0;i<_134.length;i++){
889var pair=_134[i].split("=");
890var name=_136(pair.shift());
891if(!name){
892continue;
893}
894var arr=o[name];
895if(!(arr instanceof Array)){
896arr=[];
897o[name]=arr;
898}
899arr.push(_136(pair.join("=")));
900}
901}else{
902for(i=0;i<_134.length;i++){
903pair=_134[i].split("=");
904var name=pair.shift();
905if(!name){
906continue;
907}
908o[_136(name)]=_136(pair.join("="));
909}
910}
911return o;
912}});
913MochiKit.Base.AdapterRegistry=function(){
914this.pairs=[];
915};
916MochiKit.Base.AdapterRegistry.prototype={register:function(name,_13c,wrap,_13e){
917if(_13e){
918this.pairs.unshift([name,_13c,wrap]);
919}else{
920this.pairs.push([name,_13c,wrap]);
921}
922},match:function(){
923for(var i=0;i<this.pairs.length;i++){
924var pair=this.pairs[i];
925if(pair[1].apply(this,arguments)){
926return pair[2].apply(this,arguments);
927}
928}
929throw MochiKit.Base.NotFound;
930},unregister:function(name){
931for(var i=0;i<this.pairs.length;i++){
932var pair=this.pairs[i];
933if(pair[0]==name){
934this.pairs.splice(i,1);
935return true;
936}
937}
938return false;
939}};
940MochiKit.Base.EXPORT=["flattenArray","noop","camelize","counter","clone","extend","update","updatetree","setdefault","keys","values","items","NamedError","operator","forwardCall","itemgetter","typeMatcher","isCallable","isUndefined","isUndefinedOrNull","isNull","isEmpty","isNotEmpty","isArrayLike","isDateLike","xmap","map","xfilter","filter","methodcaller","compose","bind","bindMethods","NotFound","AdapterRegistry","registerComparator","compare","registerRepr","repr","objEqual","arrayEqual","concat","keyComparator","reverseKeyComparator","partial","merge","listMinMax","listMax","listMin","objMax","objMin","nodeWalk","zip","urlEncode","queryString","serializeJSON","registerJSON","evalJSON","parseQueryString","findValue","findIdentical","flattenArguments","method","average","mean","median"];
941MochiKit.Base.EXPORT_OK=["nameFunctions","comparatorRegistry","reprRegistry","jsonRegistry","compareDateLike","compareArrayLike","reprArrayLike","reprString","reprNumber"];
942MochiKit.Base._exportSymbols=function(_144,_145){
943if(!MochiKit.__export__){
944return;
945}
946var all=_145.EXPORT_TAGS[":all"];
947for(var i=0;i<all.length;i++){
948_144[all[i]]=_145[all[i]];
949}
950};
951MochiKit.Base.__new__=function(){
952var m=this;
953m.noop=m.operator.identity;
954m.forward=m.forwardCall;
955m.find=m.findValue;
956if(typeof (encodeURIComponent)!="undefined"){
957m.urlEncode=function(_149){
958return encodeURIComponent(_149).replace(/\'/g,"%27");
959};
960}else{
961m.urlEncode=function(_14a){
962return escape(_14a).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
963};
964}
965m.NamedError=function(name){
966this.message=name;
967this.name=name;
968};
969m.NamedError.prototype=new Error();
970m.update(m.NamedError.prototype,{repr:function(){
971if(this.message&&this.message!=this.name){
972return this.name+"("+m.repr(this.message)+")";
973}else{
974return this.name+"()";
975}
976},toString:m.forwardCall("repr")});
977m.NotFound=new m.NamedError("MochiKit.Base.NotFound");
978m.listMax=m.partial(m.listMinMax,1);
979m.listMin=m.partial(m.listMinMax,-1);
980m.isCallable=m.typeMatcher("function");
981m.isUndefined=m.typeMatcher("undefined");
982m.merge=m.partial(m.update,null);
983m.zip=m.partial(m.map,null);
984m.average=m.mean;
985m.comparatorRegistry=new m.AdapterRegistry();
986m.registerComparator("dateLike",m.isDateLike,m.compareDateLike);
987m.registerComparator("arrayLike",m.isArrayLike,m.compareArrayLike);
988m.reprRegistry=new m.AdapterRegistry();
989m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
990m.registerRepr("string",m.typeMatcher("string"),m.reprString);
991m.registerRepr("numbers",m.typeMatcher("number","boolean"),m.reprNumber);
992m.jsonRegistry=new m.AdapterRegistry();
993var all=m.concat(m.EXPORT,m.EXPORT_OK);
994m.EXPORT_TAGS={":common":m.concat(m.EXPORT_OK),":all":all};
995m.nameFunctions(this);
996};
997MochiKit.Base.__new__();
998if(MochiKit.__export__){
999compare=MochiKit.Base.compare;
1000compose=MochiKit.Base.compose;
1001serializeJSON=MochiKit.Base.serializeJSON;
1002}
1003MochiKit.Base._exportSymbols(this,MochiKit.Base);
1004if(typeof (dojo)!="undefined"){
79f17b42 1005dojo.provide("MochiKit.Format");
078d1d29 1006}
79f17b42
DV
1007if(typeof (MochiKit)=="undefined"){
1008MochiKit={};
078d1d29 1009}
79f17b42
DV
1010if(typeof (MochiKit.Format)=="undefined"){
1011MochiKit.Format={};
078d1d29 1012}
79f17b42
DV
1013MochiKit.Format.NAME="MochiKit.Format";
1014MochiKit.Format.VERSION="1.4";
1015MochiKit.Format.__repr__=function(){
078d1d29 1016return "["+this.NAME+" "+this.VERSION+"]";
79f17b42
DV
1017};
1018MochiKit.Format.toString=function(){
078d1d29 1019return this.__repr__();
79f17b42
DV
1020};
1021MochiKit.Format._numberFormatter=function(_14d,_14e,_14f,_150,_151,_152,_153,_154,_155){
1022return function(num){
1023num=parseFloat(num);
1024if(typeof (num)=="undefined"||num===null||isNaN(num)){
1025return _14d;
078d1d29 1026}
79f17b42
DV
1027var _157=_14e;
1028var _158=_14f;
1029if(num<0){
1030num=-num;
078d1d29 1031}else{
79f17b42 1032_157=_157.replace(/-/,"");
078d1d29 1033}
79f17b42
DV
1034var me=arguments.callee;
1035var fmt=MochiKit.Format.formatLocale(_150);
1036if(_151){
1037num=num*100;
1038_158=fmt.percent+_158;
078d1d29 1039}
79f17b42
DV
1040num=MochiKit.Format.roundToFixed(num,_152);
1041var _15b=num.split(/\./);
1042var _15c=_15b[0];
1043var frac=(_15b.length==1)?"":_15b[1];
1044var res="";
1045while(_15c.length<_153){
1046_15c="0"+_15c;
078d1d29 1047}
79f17b42
DV
1048if(_154){
1049while(_15c.length>_154){
1050var i=_15c.length-_154;
1051res=fmt.separator+_15c.substring(i,_15c.length)+res;
1052_15c=_15c.substring(0,i);
078d1d29 1053}
078d1d29 1054}
79f17b42
DV
1055res=_15c+res;
1056if(_152>0){
1057while(frac.length<_155){
1058frac=frac+"0";
078d1d29 1059}
79f17b42 1060res=res+fmt.decimal+frac;
078d1d29 1061}
79f17b42 1062return _157+res+_158;
078d1d29 1063};
078d1d29 1064};
79f17b42
DV
1065MochiKit.Format.numberFormatter=function(_160,_161,_162){
1066if(typeof (_161)=="undefined"){
1067_161="";
078d1d29 1068}
79f17b42
DV
1069var _163=_160.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
1070if(!_163){
1071throw TypeError("Invalid pattern");
078d1d29 1072}
79f17b42
DV
1073var _164=_160.substr(0,_163.index);
1074var _165=_160.substr(_163.index+_163[0].length);
1075if(_164.search(/-/)==-1){
1076_164=_164+"-";
078d1d29 1077}
79f17b42
DV
1078var _166=_163[1];
1079var frac=(typeof (_163[2])=="string"&&_163[2]!="")?_163[2]:"";
1080var _168=(typeof (_163[3])=="string"&&_163[3]!="");
1081var tmp=_166.split(/,/);
1082var _16a;
1083if(typeof (_162)=="undefined"){
1084_162="default";
078d1d29 1085}
79f17b42
DV
1086if(tmp.length==1){
1087_16a=null;
1088}else{
1089_16a=tmp[1].length;
078d1d29 1090}
79f17b42
DV
1091var _16b=_166.length-_166.replace(/0/g,"").length;
1092var _16c=frac.length-frac.replace(/0/g,"").length;
1093var _16d=frac.length;
1094var rval=MochiKit.Format._numberFormatter(_161,_164,_165,_162,_168,_16d,_16b,_16a,_16c);
078d1d29 1095var m=MochiKit.Base;
79f17b42
DV
1096if(m){
1097var fn=arguments.callee;
1098var args=m.concat(arguments);
1099rval.repr=function(){
1100return [self.NAME,"(",map(m.repr,args).join(", "),")"].join("");
1101};
078d1d29 1102}
078d1d29 1103return rval;
79f17b42
DV
1104};
1105MochiKit.Format.formatLocale=function(_172){
1106if(typeof (_172)=="undefined"||_172===null){
1107_172="default";
078d1d29 1108}
79f17b42
DV
1109if(typeof (_172)=="string"){
1110var rval=MochiKit.Format.LOCALE[_172];
1111if(typeof (rval)=="string"){
1112rval=arguments.callee(rval);
1113MochiKit.Format.LOCALE[_172]=rval;
078d1d29 1114}
078d1d29 1115return rval;
79f17b42
DV
1116}else{
1117return _172;
078d1d29 1118}
79f17b42
DV
1119};
1120MochiKit.Format.twoDigitAverage=function(_174,_175){
1121if(_175){
1122var res=_174/_175;
1123if(!isNaN(res)){
1124return MochiKit.Format.twoDigitFloat(_174/_175);
078d1d29 1125}
078d1d29 1126}
79f17b42
DV
1127return "0";
1128};
1129MochiKit.Format.twoDigitFloat=function(_177){
1130var sign=(_177<0?"-":"");
1131var s=Math.floor(Math.abs(_177)*100).toString();
1132if(s=="0"){
1133return s;
078d1d29 1134}
79f17b42
DV
1135if(s.length<3){
1136while(s.charAt(s.length-1)=="0"){
1137s=s.substring(0,s.length-1);
078d1d29 1138}
79f17b42 1139return sign+"0."+s;
078d1d29 1140}
79f17b42
DV
1141var head=sign+s.substring(0,s.length-2);
1142var tail=s.substring(s.length-2,s.length);
1143if(tail=="00"){
1144return head;
078d1d29 1145}else{
79f17b42
DV
1146if(tail.charAt(1)=="0"){
1147return head+"."+tail.charAt(0);
1148}else{
1149return head+"."+tail;
078d1d29 1150}
078d1d29 1151}
79f17b42
DV
1152};
1153MochiKit.Format.lstrip=function(str,_17d){
1154str=str+"";
1155if(typeof (str)!="string"){
1156return null;
078d1d29 1157}
79f17b42
DV
1158if(!_17d){
1159return str.replace(/^\s+/,"");
1160}else{
1161return str.replace(new RegExp("^["+_17d+"]+"),"");
078d1d29 1162}
79f17b42
DV
1163};
1164MochiKit.Format.rstrip=function(str,_17f){
1165str=str+"";
1166if(typeof (str)!="string"){
1167return null;
078d1d29 1168}
79f17b42
DV
1169if(!_17f){
1170return str.replace(/\s+$/,"");
1171}else{
1172return str.replace(new RegExp("["+_17f+"]+$"),"");
078d1d29 1173}
79f17b42
DV
1174};
1175MochiKit.Format.strip=function(str,_181){
1176var self=MochiKit.Format;
1177return self.rstrip(self.lstrip(str,_181),_181);
1178};
1179MochiKit.Format.truncToFixed=function(_183,_184){
1180_183=Math.floor(_183*Math.pow(10,_184));
1181var res=(_183*Math.pow(10,-_184)).toFixed(_184);
1182if(res.charAt(0)=="."){
1183res="0"+res;
078d1d29 1184}
79f17b42
DV
1185return res;
1186};
1187MochiKit.Format.roundToFixed=function(_186,_187){
1188return MochiKit.Format.truncToFixed(_186+0.5*Math.pow(10,-_187),_187);
1189};
1190MochiKit.Format.percentFormat=function(_188){
1191return MochiKit.Format.twoDigitFloat(100*_188)+"%";
1192};
1193MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"];
1194MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"};
1195MochiKit.Format.EXPORT_OK=[];
1196MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT};
1197MochiKit.Format.__new__=function(){
1198var base=this.NAME+".";
1199var k,v,o;
1200for(k in this.LOCALE){
1201o=this.LOCALE[k];
1202if(typeof (o)=="object"){
1203o.repr=function(){
1204return this.NAME;
1205};
1206o.NAME=base+"LOCALE."+k;
078d1d29 1207}
078d1d29 1208}
79f17b42
DV
1209for(k in this){
1210o=this[k];
1211if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
078d1d29 1212try{
79f17b42 1213o.NAME=base+k;
078d1d29
DV
1214}
1215catch(e){
078d1d29 1216}
078d1d29
DV
1217}
1218}
79f17b42
DV
1219};
1220MochiKit.Format.__new__();
1221if(typeof (MochiKit.Base)!="undefined"){
1222MochiKit.Base._exportSymbols(this,MochiKit.Format);
078d1d29 1223}else{
79f17b42
DV
1224(function(_18d,_18e){
1225if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){
1226var all=_18e.EXPORT_TAGS[":all"];
1227for(var i=0;i<all.length;i++){
1228_18d[all[i]]=_18e[all[i]];
078d1d29
DV
1229}
1230}
79f17b42 1231})(this,MochiKit.Format);
078d1d29 1232}
79f17b42
DV
1233if(typeof (dojo)!="undefined"){
1234dojo.provide("MochiKit.DOM");
1235dojo.require("MochiKit.Base");
078d1d29 1236}
79f17b42
DV
1237if(typeof (JSAN)!="undefined"){
1238JSAN.use("MochiKit.Base",[]);
078d1d29 1239}
078d1d29 1240try{
79f17b42
DV
1241if(typeof (MochiKit.Base)=="undefined"){
1242throw "";
078d1d29
DV
1243}
1244}
1245catch(e){
79f17b42 1246throw "MochiKit.DOM depends on MochiKit.Base!";
078d1d29 1247}
79f17b42
DV
1248if(typeof (MochiKit.DOM)=="undefined"){
1249MochiKit.DOM={};
078d1d29 1250}
79f17b42
DV
1251MochiKit.DOM.NAME="MochiKit.DOM";
1252MochiKit.DOM.VERSION="1.4";
1253MochiKit.DOM.__repr__=function(){
1254return "["+this.NAME+" "+this.VERSION+"]";
1255};
1256MochiKit.DOM.toString=function(){
1257return this.__repr__();
1258};
1259MochiKit.DOM.EXPORT=["removeEmptyTextNodes","formContents","currentWindow","currentDocument","withWindow","withDocument","registerDOMConverter","coerceToDOM","createDOM","createDOMFunc","isChildNode","getNodeAttribute","removeNodeAttribute","setNodeAttribute","updateNodeAttributes","appendChildNodes","insertSiblingNodesAfter","insertSiblingNodesBefore","replaceChildNodes","removeElement","swapDOM","BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG","getElement","$","getElementsByTagAndClassName","addToCallStack","addLoadEvent","focusOnLoad","setElementClass","toggleElementClass","addElementClass","removeElementClass","swapElementClass","hasElementClass","escapeHTML","toHTML","emitHTML","scrapeText","isParent","getFirstParentByTagAndClassName","makeClipping","undoClipping","makePositioned","undoPositioned","getFirstElementByTagAndClassName"];
1260MochiKit.DOM.EXPORT_OK=["domConverters"];
1261MochiKit.DOM.DEPRECATED=[["computedStyle","MochiKit.Style.getStyle","1.4"],["elementDimensions","MochiKit.Style.getElementDimensions","1.4"],["elementPosition","MochiKit.Style.getElementPosition","1.4"],["hideElement","MochiKit.Style.hideElement","1.4"],["setElementDimensions","MochiKit.Style.setElementDimensions","1.4"],["setElementPosition","MochiKit.Style.setElementPosition","1.4"],["setDisplayForElement","MochiKit.Style.setDisplayForElement","1.4"],["setOpacity","MochiKit.Style.setOpacity","1.4"],["showElement","MochiKit.Style.showElement","1.4"],["Coordinates","MochiKit.Style.Coordinates","1.4"],["Dimensions","MochiKit.Style.Dimensions","1.4"]];
1262MochiKit.DOM.getViewportDimensions=new Function(""+"if (!MochiKit[\"Style\"]) {"+" throw new Error(\"This function has been deprecated and depends on MochiKit.Style.\");"+"}"+"return MochiKit.Style.getViewportDimensions.apply(this, arguments);");
1263MochiKit.Base.update(MochiKit.DOM,{currentWindow:function(){
1264return MochiKit.DOM._window;
1265},currentDocument:function(){
1266return MochiKit.DOM._document;
1267},withWindow:function(win,func){
1268var self=MochiKit.DOM;
1269var _194=self._document;
1270var _195=self._window;
1271var rval;
078d1d29 1272try{
79f17b42
DV
1273self._window=win;
1274self._document=win.document;
1275rval=func();
078d1d29
DV
1276}
1277catch(e){
79f17b42
DV
1278self._window=_195;
1279self._document=_194;
078d1d29
DV
1280throw e;
1281}
79f17b42
DV
1282self._window=_195;
1283self._document=_194;
1284return rval;
1285},formContents:function(elem){
1286var _198=[];
1287var _199=[];
078d1d29 1288var m=MochiKit.Base;
79f17b42
DV
1289var self=MochiKit.DOM;
1290if(typeof (elem)=="undefined"||elem===null){
1291elem=self._document.body;
078d1d29 1292}else{
79f17b42 1293elem=self.getElement(elem);
078d1d29 1294}
79f17b42
DV
1295m.nodeWalk(elem,function(elem){
1296var name=elem.name;
1297if(m.isNotEmpty(name)){
1298var _19e=elem.tagName.toUpperCase();
1299if(_19e==="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
1300return null;
078d1d29 1301}
79f17b42
DV
1302if(_19e==="SELECT"){
1303if(elem.type=="select-one"){
1304if(elem.selectedIndex>=0){
1305var opt=elem.options[elem.selectedIndex];
1306var v=opt.value;
1307if(!v){
1308var h=opt.outerHTML;
1309if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1310v=opt.text;
078d1d29 1311}
078d1d29 1312}
79f17b42
DV
1313_198.push(name);
1314_199.push(v);
1315return null;
078d1d29 1316}
79f17b42
DV
1317_198.push(name);
1318_199.push("");
1319return null;
078d1d29 1320}else{
79f17b42
DV
1321var opts=elem.options;
1322if(!opts.length){
1323_198.push(name);
1324_199.push("");
1325return null;
078d1d29 1326}
79f17b42
DV
1327for(var i=0;i<opts.length;i++){
1328var opt=opts[i];
1329if(!opt.selected){
1330continue;
078d1d29 1331}
79f17b42
DV
1332var v=opt.value;
1333if(!v){
1334var h=opt.outerHTML;
1335if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1336v=opt.text;
078d1d29 1337}
078d1d29 1338}
79f17b42
DV
1339_198.push(name);
1340_199.push(v);
078d1d29 1341}
79f17b42 1342return null;
078d1d29 1343}
078d1d29 1344}
79f17b42
DV
1345if(_19e==="FORM"||_19e==="P"||_19e==="SPAN"||_19e==="DIV"){
1346return elem.childNodes;
078d1d29 1347}
79f17b42
DV
1348_198.push(name);
1349_199.push(elem.value||"");
1350return null;
078d1d29 1351}
79f17b42
DV
1352return elem.childNodes;
1353});
1354return [_198,_199];
1355},withDocument:function(doc,func){
1356var self=MochiKit.DOM;
1357var _1a7=self._document;
1358var rval;
078d1d29 1359try{
79f17b42
DV
1360self._document=doc;
1361rval=func();
078d1d29
DV
1362}
1363catch(e){
79f17b42 1364self._document=_1a7;
078d1d29
DV
1365throw e;
1366}
79f17b42
DV
1367self._document=_1a7;
1368return rval;
1369},registerDOMConverter:function(name,_1aa,wrap,_1ac){
1370MochiKit.DOM.domConverters.register(name,_1aa,wrap,_1ac);
1371},coerceToDOM:function(node,ctx){
1372var m=MochiKit.Base;
1373var im=MochiKit.Iter;
1374var self=MochiKit.DOM;
1375if(im){
1376var iter=im.iter;
1377var _1b3=im.repeat;
1378var map=m.map;
078d1d29 1379}
79f17b42
DV
1380var _1b5=self.domConverters;
1381var _1b6=arguments.callee;
1382var _1b7=m.NotFound;
1383while(true){
1384if(typeof (node)=="undefined"||node===null){
1385return null;
078d1d29 1386}
79f17b42
DV
1387if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
1388node=im.list(node);
078d1d29 1389}
79f17b42
DV
1390if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
1391return node;
078d1d29 1392}
79f17b42
DV
1393if(typeof (node)=="number"||typeof (node)=="boolean"){
1394node=node.toString();
078d1d29 1395}
79f17b42
DV
1396if(typeof (node)=="string"){
1397return self._document.createTextNode(node);
078d1d29 1398}
79f17b42
DV
1399if(typeof (node.__dom__)=="function"){
1400node=node.__dom__(ctx);
1401continue;
078d1d29 1402}
79f17b42
DV
1403if(typeof (node.dom)=="function"){
1404node=node.dom(ctx);
1405continue;
078d1d29 1406}
79f17b42
DV
1407if(typeof (node)=="function"){
1408node=node.apply(ctx,[ctx]);
1409continue;
078d1d29 1410}
79f17b42
DV
1411if(im){
1412var _1b8=null;
1413try{
1414_1b8=iter(node);
078d1d29
DV
1415}
1416catch(e){
078d1d29 1417}
79f17b42
DV
1418if(_1b8){
1419return map(_1b6,_1b8,_1b3(ctx));
078d1d29 1420}
078d1d29 1421}
79f17b42
DV
1422try{
1423node=_1b5.match(node,ctx);
1424continue;
078d1d29 1425}
79f17b42
DV
1426catch(e){
1427if(e!=_1b7){
1428throw e;
078d1d29 1429}
078d1d29 1430}
79f17b42 1431return self._document.createTextNode(node.toString());
078d1d29 1432}
79f17b42
DV
1433return undefined;
1434},isChildNode:function(node,_1ba){
1435var self=MochiKit.DOM;
1436if(typeof (node)=="string"){
1437node=self.getElement(node);
078d1d29 1438}
79f17b42
DV
1439if(typeof (_1ba)=="string"){
1440_1ba=self.getElement(_1ba);
078d1d29 1441}
79f17b42
DV
1442if(node===_1ba){
1443return true;
078d1d29 1444}
79f17b42
DV
1445while(node&&node.tagName.toUpperCase()!="BODY"){
1446node=node.parentNode;
1447if(node===_1ba){
1448return true;
078d1d29 1449}
078d1d29 1450}
79f17b42
DV
1451return false;
1452},setNodeAttribute:function(node,attr,_1be){
1453var o={};
1454o[attr]=_1be;
1455try{
1456return MochiKit.DOM.updateNodeAttributes(node,o);
078d1d29 1457}
79f17b42 1458catch(e){
078d1d29 1459}
79f17b42
DV
1460return null;
1461},getNodeAttribute:function(node,attr){
1462var self=MochiKit.DOM;
1463var _1c3=self.attributeArray.renames[attr];
1464node=self.getElement(node);
1465try{
1466if(_1c3){
1467return node[_1c3];
078d1d29 1468}
79f17b42 1469return node.getAttribute(attr);
078d1d29 1470}
79f17b42 1471catch(e){
078d1d29 1472}
078d1d29 1473return null;
79f17b42
DV
1474},removeNodeAttribute:function(node,attr){
1475var self=MochiKit.DOM;
1476var _1c7=self.attributeArray.renames[attr];
1477node=self.getElement(node);
1478try{
1479if(_1c7){
1480return node[_1c7];
078d1d29 1481}
79f17b42
DV
1482return node.removeAttribute(attr);
1483}
1484catch(e){
078d1d29 1485}
078d1d29 1486return null;
79f17b42
DV
1487},updateNodeAttributes:function(node,_1c9){
1488var elem=node;
1489var self=MochiKit.DOM;
1490if(typeof (node)=="string"){
1491elem=self.getElement(node);
078d1d29 1492}
79f17b42
DV
1493if(_1c9){
1494var _1cc=MochiKit.Base.updatetree;
1495if(self.attributeArray.compliant){
1496for(var k in _1c9){
1497var v=_1c9[k];
1498if(typeof (v)=="object"&&typeof (elem[k])=="object"){
1499if(k=="style"&&MochiKit.Style){
1500MochiKit.Style.setStyle(elem,v);
1501}else{
1502_1cc(elem[k],v);
078d1d29 1503}
79f17b42
DV
1504}else{
1505if(k.substring(0,2)=="on"){
1506if(typeof (v)=="string"){
1507v=new Function(v);
078d1d29 1508}
79f17b42 1509elem[k]=v;
078d1d29 1510}else{
79f17b42 1511elem.setAttribute(k,v);
078d1d29 1512}
078d1d29 1513}
078d1d29 1514}
79f17b42
DV
1515}else{
1516var _1cf=self.attributeArray.renames;
1517for(var k in _1c9){
1518v=_1c9[k];
1519var _1d0=_1cf[k];
1520if(k=="style"&&typeof (v)=="string"){
1521elem.style.cssText=v;
1522}else{
1523if(typeof (_1d0)=="string"){
1524elem[_1d0]=v;
1525}else{
1526if(typeof (elem[k])=="object"&&typeof (v)=="object"){
1527if(k=="style"&&MochiKit.Style){
1528MochiKit.Style.setStyle(elem,v);
1529}else{
1530_1cc(elem[k],v);
078d1d29
DV
1531}
1532}else{
79f17b42
DV
1533if(k.substring(0,2)=="on"){
1534if(typeof (v)=="string"){
1535v=new Function(v);
078d1d29 1536}
79f17b42
DV
1537elem[k]=v;
1538}else{
1539elem.setAttribute(k,v);
078d1d29 1540}
078d1d29 1541}
078d1d29 1542}
078d1d29 1543}
078d1d29 1544}
078d1d29 1545}
078d1d29 1546}
79f17b42
DV
1547return elem;
1548},appendChildNodes:function(node){
1549var elem=node;
1550var self=MochiKit.DOM;
1551if(typeof (node)=="string"){
1552elem=self.getElement(node);
078d1d29 1553}
79f17b42
DV
1554var _1d4=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
1555var _1d5=MochiKit.Base.concat;
1556while(_1d4.length){
1557var n=_1d4.shift();
1558if(typeof (n)=="undefined"||n===null){
1559}else{
1560if(typeof (n.nodeType)=="number"){
1561elem.appendChild(n);
1562}else{
1563_1d4=_1d5(n,_1d4);
078d1d29
DV
1564}
1565}
1566}
79f17b42
DV
1567return elem;
1568},insertSiblingNodesBefore:function(node){
1569var elem=node;
1570var self=MochiKit.DOM;
1571if(typeof (node)=="string"){
1572elem=self.getElement(node);
1573}
1574var _1da=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
1575var _1db=elem.parentNode;
1576var _1dc=MochiKit.Base.concat;
1577while(_1da.length){
1578var n=_1da.shift();
1579if(typeof (n)=="undefined"||n===null){
078d1d29 1580}else{
79f17b42
DV
1581if(typeof (n.nodeType)=="number"){
1582_1db.insertBefore(n,elem);
1583}else{
1584_1da=_1dc(n,_1da);
078d1d29
DV
1585}
1586}
078d1d29 1587}
79f17b42
DV
1588return _1db;
1589},insertSiblingNodesAfter:function(node){
1590var elem=node;
1591var self=MochiKit.DOM;
1592if(typeof (node)=="string"){
1593elem=self.getElement(node);
078d1d29 1594}
79f17b42
DV
1595var _1e1=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
1596if(elem.nextSibling){
1597return self.insertSiblingNodesBefore(elem.nextSibling,_1e1);
1598}else{
1599return self.appendChildNodes(elem.parentNode,_1e1);
078d1d29 1600}
79f17b42
DV
1601},replaceChildNodes:function(node){
1602var elem=node;
1603var self=MochiKit.DOM;
1604if(typeof (node)=="string"){
1605elem=self.getElement(node);
1606arguments[0]=elem;
078d1d29 1607}
79f17b42
DV
1608var _1e5;
1609while((_1e5=elem.firstChild)){
1610elem.removeChild(_1e5);
078d1d29 1611}
79f17b42
DV
1612if(arguments.length<2){
1613return elem;
078d1d29 1614}else{
79f17b42 1615return self.appendChildNodes.apply(this,arguments);
078d1d29 1616}
79f17b42
DV
1617},createDOM:function(name,_1e7){
1618var elem;
1619var self=MochiKit.DOM;
1620var m=MochiKit.Base;
1621if(typeof (_1e7)=="string"||typeof (_1e7)=="number"){
1622var args=m.extend([name,null],arguments,1);
1623return arguments.callee.apply(this,args);
078d1d29 1624}
79f17b42
DV
1625if(typeof (name)=="string"){
1626var _1ec=self._xhtml;
1627if(_1e7&&!self.attributeArray.compliant){
1628var _1ed="";
1629if("name" in _1e7){
1630_1ed+=" name=\""+self.escapeHTML(_1e7.name)+"\"";
078d1d29 1631}
79f17b42
DV
1632if(name=="input"&&"type" in _1e7){
1633_1ed+=" type=\""+self.escapeHTML(_1e7.type)+"\"";
078d1d29 1634}
79f17b42
DV
1635if(_1ed){
1636name="<"+name+_1ed+">";
1637_1ec=false;
078d1d29 1638}
078d1d29 1639}
79f17b42
DV
1640var d=self._document;
1641if(_1ec&&d===document){
1642elem=d.createElementNS("http://www.w3.org/1999/xhtml",name);
1643}else{
1644elem=d.createElement(name);
078d1d29 1645}
79f17b42
DV
1646}else{
1647elem=name;
078d1d29 1648}
79f17b42
DV
1649if(_1e7){
1650self.updateNodeAttributes(elem,_1e7);
078d1d29 1651}
79f17b42
DV
1652if(arguments.length<=2){
1653return elem;
1654}else{
1655var args=m.extend([elem],arguments,2);
1656return self.appendChildNodes.apply(this,args);
078d1d29 1657}
79f17b42
DV
1658},createDOMFunc:function(){
1659var m=MochiKit.Base;
1660return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments));
1661},removeElement:function(elem){
1662var e=MochiKit.DOM.getElement(elem);
1663e.parentNode.removeChild(e);
1664return e;
1665},swapDOM:function(dest,src){
1666var self=MochiKit.DOM;
1667dest=self.getElement(dest);
1668var _1f5=dest.parentNode;
1669if(src){
1670src=self.getElement(src);
1671_1f5.replaceChild(src,dest);
1672}else{
1673_1f5.removeChild(dest);
078d1d29 1674}
79f17b42
DV
1675return src;
1676},getElement:function(id){
1677var self=MochiKit.DOM;
1678if(arguments.length==1){
1679return ((typeof (id)=="string")?self._document.getElementById(id):id);
078d1d29 1680}else{
79f17b42 1681return MochiKit.Base.map(self.getElement,arguments);
078d1d29 1682}
79f17b42
DV
1683},getElementsByTagAndClassName:function(_1f8,_1f9,_1fa){
1684var self=MochiKit.DOM;
1685if(typeof (_1f8)=="undefined"||_1f8===null){
1686_1f8="*";
078d1d29 1687}
79f17b42
DV
1688if(typeof (_1fa)=="undefined"||_1fa===null){
1689_1fa=self._document;
078d1d29 1690}
79f17b42
DV
1691_1fa=self.getElement(_1fa);
1692var _1fc=(_1fa.getElementsByTagName(_1f8)||self._document.all);
1693if(typeof (_1f9)=="undefined"||_1f9===null){
1694return MochiKit.Base.extend(null,_1fc);
078d1d29 1695}
79f17b42
DV
1696var _1fd=[];
1697for(var i=0;i<_1fc.length;i++){
1698var _1ff=_1fc[i];
1699var cls=_1ff.className;
1700if(!cls){
1701continue;
078d1d29 1702}
79f17b42
DV
1703var _201=cls.split(" ");
1704for(var j=0;j<_201.length;j++){
1705if(_201[j]==_1f9){
1706_1fd.push(_1ff);
1707break;
078d1d29
DV
1708}
1709}
078d1d29 1710}
79f17b42
DV
1711return _1fd;
1712},_newCallStack:function(path,once){
1713var rval=function(){
1714var _206=arguments.callee.callStack;
1715for(var i=0;i<_206.length;i++){
1716if(_206[i].apply(this,arguments)===false){
1717break;
078d1d29 1718}
078d1d29 1719}
79f17b42
DV
1720if(once){
1721try{
1722this[path]=null;
1723}
1724catch(e){
078d1d29
DV
1725}
1726}
1727};
79f17b42
DV
1728rval.callStack=[];
1729return rval;
1730},addToCallStack:function(_208,path,func,once){
1731var self=MochiKit.DOM;
1732var _20d=_208[path];
1733var _20e=_20d;
1734if(!(typeof (_20d)=="function"&&typeof (_20d.callStack)=="object"&&_20d.callStack!==null)){
1735_20e=self._newCallStack(path,once);
1736if(typeof (_20d)=="function"){
1737_20e.callStack.push(_20d);
078d1d29 1738}
79f17b42 1739_208[path]=_20e;
078d1d29 1740}
79f17b42
DV
1741_20e.callStack.push(func);
1742},addLoadEvent:function(func){
1743var self=MochiKit.DOM;
1744self.addToCallStack(self._window,"onload",func,true);
1745},focusOnLoad:function(_211){
1746var self=MochiKit.DOM;
1747self.addLoadEvent(function(){
1748_211=self.getElement(_211);
1749if(_211){
1750_211.focus();
078d1d29 1751}
79f17b42
DV
1752});
1753},setElementClass:function(_213,_214){
1754var self=MochiKit.DOM;
1755var obj=self.getElement(_213);
1756if(self.attributeArray.compliant){
1757obj.setAttribute("class",_214);
078d1d29 1758}else{
79f17b42 1759obj.setAttribute("className",_214);
078d1d29 1760}
79f17b42
DV
1761},toggleElementClass:function(_217){
1762var self=MochiKit.DOM;
1763for(var i=1;i<arguments.length;i++){
1764var obj=self.getElement(arguments[i]);
1765if(!self.addElementClass(obj,_217)){
1766self.removeElementClass(obj,_217);
078d1d29 1767}
078d1d29 1768}
79f17b42
DV
1769},addElementClass:function(_21b,_21c){
1770var self=MochiKit.DOM;
1771var obj=self.getElement(_21b);
1772var cls=obj.className;
1773if(cls==undefined||cls.length===0){
1774self.setElementClass(obj,_21c);
1775return true;
078d1d29 1776}
79f17b42
DV
1777if(cls==_21c){
1778return false;
078d1d29 1779}
79f17b42
DV
1780var _220=cls.split(" ");
1781for(var i=0;i<_220.length;i++){
1782if(_220[i]==_21c){
1783return false;
078d1d29
DV
1784}
1785}
79f17b42
DV
1786self.setElementClass(obj,cls+" "+_21c);
1787return true;
1788},removeElementClass:function(_222,_223){
1789var self=MochiKit.DOM;
1790var obj=self.getElement(_222);
1791var cls=obj.className;
1792if(cls==undefined||cls.length===0){
1793return false;
078d1d29 1794}
79f17b42
DV
1795if(cls==_223){
1796self.setElementClass(obj,"");
1797return true;
078d1d29 1798}
79f17b42
DV
1799var _227=cls.split(" ");
1800for(var i=0;i<_227.length;i++){
1801if(_227[i]==_223){
1802_227.splice(i,1);
1803self.setElementClass(obj,_227.join(" "));
1804return true;
078d1d29 1805}
078d1d29 1806}
79f17b42
DV
1807return false;
1808},swapElementClass:function(_229,_22a,_22b){
1809var obj=MochiKit.DOM.getElement(_229);
1810var res=MochiKit.DOM.removeElementClass(obj,_22a);
1811if(res){
1812MochiKit.DOM.addElementClass(obj,_22b);
078d1d29 1813}
79f17b42
DV
1814return res;
1815},hasElementClass:function(_22e,_22f){
1816var obj=MochiKit.DOM.getElement(_22e);
1817var cls=obj.className;
1818if(!cls){
1819return false;
078d1d29 1820}
79f17b42
DV
1821var _232=cls.split(" ");
1822for(var i=1;i<arguments.length;i++){
1823var good=false;
1824for(var j=0;j<_232.length;j++){
1825if(_232[j]==arguments[i]){
1826good=true;
1827break;
078d1d29
DV
1828}
1829}
79f17b42
DV
1830if(!good){
1831return false;
078d1d29 1832}
078d1d29 1833}
79f17b42
DV
1834return true;
1835},escapeHTML:function(s){
1836return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
1837},toHTML:function(dom){
1838return MochiKit.DOM.emitHTML(dom).join("");
1839},emitHTML:function(dom,lst){
1840if(typeof (lst)=="undefined"||lst===null){
1841lst=[];
1842}
1843var _23a=[dom];
1844var self=MochiKit.DOM;
1845var _23c=self.escapeHTML;
1846var _23d=self.attributeArray;
1847while(_23a.length){
1848dom=_23a.pop();
1849if(typeof (dom)=="string"){
1850lst.push(dom);
078d1d29 1851}else{
79f17b42
DV
1852if(dom.nodeType==1){
1853lst.push("<"+dom.tagName.toLowerCase());
1854var _23e=[];
1855var _23f=_23d(dom);
1856for(var i=0;i<_23f.length;i++){
1857var a=_23f[i];
1858_23e.push([" ",a.name,"=\"",_23c(a.value),"\""]);
078d1d29 1859}
79f17b42
DV
1860_23e.sort();
1861for(i=0;i<_23e.length;i++){
1862var _242=_23e[i];
1863for(var j=0;j<_242.length;j++){
1864lst.push(_242[j]);
078d1d29 1865}
078d1d29 1866}
79f17b42
DV
1867if(dom.hasChildNodes()){
1868lst.push(">");
1869_23a.push("</"+dom.tagName.toLowerCase()+">");
1870var _244=dom.childNodes;
1871for(i=_244.length-1;i>=0;i--){
1872_23a.push(_244[i]);
078d1d29
DV
1873}
1874}else{
79f17b42 1875lst.push("/>");
078d1d29 1876}
79f17b42
DV
1877}else{
1878if(dom.nodeType==3){
1879lst.push(_23c(dom.nodeValue));
078d1d29 1880}
078d1d29 1881}
078d1d29 1882}
078d1d29 1883}
79f17b42
DV
1884return lst;
1885},scrapeText:function(node,_246){
1886var rval=[];
1887(function(node){
1888var cn=node.childNodes;
1889if(cn){
1890for(var i=0;i<cn.length;i++){
1891arguments.callee.call(this,cn[i]);
078d1d29 1892}
078d1d29 1893}
79f17b42
DV
1894var _24b=node.nodeValue;
1895if(typeof (_24b)=="string"){
1896rval.push(_24b);
078d1d29 1897}
79f17b42
DV
1898})(MochiKit.DOM.getElement(node));
1899if(_246){
1900return rval;
1901}else{
1902return rval.join("");
078d1d29 1903}
79f17b42
DV
1904},removeEmptyTextNodes:function(_24c){
1905_24c=MochiKit.DOM.getElement(_24c);
1906for(var i=0;i<_24c.childNodes.length;i++){
1907var node=_24c.childNodes[i];
1908if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
1909node.parentNode.removeChild(node);
078d1d29 1910}
078d1d29 1911}
79f17b42
DV
1912},makeClipping:function(_24f){
1913_24f=MochiKit.DOM.getElement(_24f);
1914var _250=_24f.style.overflow;
1915if((MochiKit.Style.getStyle(_24f,"overflow")||"visible")!="hidden"){
1916_24f.style.overflow="hidden";
078d1d29 1917}
79f17b42
DV
1918return _250;
1919},undoClipping:function(_251,_252){
1920_251=MochiKit.DOM.getElement(_251);
1921if(!_252){
1922return;
078d1d29 1923}
79f17b42
DV
1924_251.style.overflow=_252;
1925},makePositioned:function(_253){
1926_253=MochiKit.DOM.getElement(_253);
1927var pos=MochiKit.Style.getStyle(_253,"position");
1928if(pos=="static"||!pos){
1929_253.style.position="relative";
1930if(/Opera/.test(navigator.userAgent)){
1931_253.style.top=0;
1932_253.style.left=0;
078d1d29 1933}
078d1d29 1934}
79f17b42
DV
1935},undoPositioned:function(_255){
1936_255=MochiKit.DOM.getElement(_255);
1937if(_255.style.position=="relative"){
1938_255.style.position=_255.style.top=_255.style.left=_255.style.bottom=_255.style.right="";
078d1d29 1939}
79f17b42
DV
1940},getFirstElementByTagAndClassName:function(_256,_257,_258){
1941var self=MochiKit.DOM;
1942if(typeof (_256)=="undefined"||_256===null){
1943_256="*";
078d1d29 1944}
79f17b42
DV
1945if(typeof (_258)=="undefined"||_258===null){
1946_258=self._document;
078d1d29 1947}
79f17b42
DV
1948_258=self.getElement(_258);
1949var _25a=(_258.getElementsByTagName(_256)||self._document.all);
1950if(typeof (_257)=="undefined"||_257===null){
1951return _25a[0];
078d1d29 1952}
79f17b42
DV
1953for(var i=0;i<_25a.length;i++){
1954var _25c=_25a[i];
1955var _25d=_25c.className.split(" ");
1956for(var j=0;j<_25d.length;j++){
1957if(_25d[j]==_257){
1958return _25c;
078d1d29 1959}
078d1d29
DV
1960}
1961}
79f17b42
DV
1962},getFirstParentByTagAndClassName:function(elem,_260,_261){
1963var self=MochiKit.DOM;
1964elem=self.getElement(elem);
1965if(typeof (_260)=="undefined"||_260===null){
1966_260="*";
1967}else{
1968_260=_260.toUpperCase();
078d1d29 1969}
79f17b42
DV
1970if(typeof (_261)=="undefined"||_261===null){
1971_261=null;
078d1d29 1972}
79f17b42
DV
1973var _263="";
1974var _264="";
1975while(elem&&elem.tagName){
1976elem=elem.parentNode;
1977if(_260=="*"&&_261===null){
1978return elem;
078d1d29 1979}
79f17b42
DV
1980_263=elem.className.split(" ");
1981_264=elem.tagName.toUpperCase();
1982if(_261===null&&_260==_264){
1983return elem;
078d1d29 1984}else{
79f17b42
DV
1985if(_261!==null){
1986for(var i=0;i<_263.length;i++){
1987if(_260=="*"&&_263[i]==_261){
1988return elem;
078d1d29 1989}else{
79f17b42
DV
1990if(_260==_264&&_263[i]==_261){
1991return elem;
078d1d29 1992}
078d1d29
DV
1993}
1994}
078d1d29 1995}
078d1d29 1996}
078d1d29 1997}
79f17b42
DV
1998return elem;
1999},isParent:function(_266,_267){
2000if(!_266.parentNode||_266==_267){
2001return false;
078d1d29 2002}
79f17b42
DV
2003if(_266.parentNode==_267){
2004return true;
078d1d29 2005}
79f17b42
DV
2006return MochiKit.DOM.isParent(_266.parentNode,_267);
2007},__new__:function(win){
078d1d29 2008var m=MochiKit.Base;
79f17b42
DV
2009if(typeof (document)!="undefined"){
2010this._document=document;
2011var _26a="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
2012this._xhtml=(document.documentElement&&document.createElementNS&&document.documentElement.namespaceURI===_26a);
078d1d29 2013}else{
79f17b42
DV
2014if(MochiKit.MockDOM){
2015this._document=MochiKit.MockDOM.document;
078d1d29 2016}
078d1d29 2017}
79f17b42
DV
2018this._window=win;
2019this.domConverters=new m.AdapterRegistry();
2020var _26b=this._document.createElement("span");
2021var _26c;
2022if(_26b&&_26b.attributes&&_26b.attributes.length>0){
2023var _26d=m.filter;
2024_26c=function(node){
2025return _26d(_26c.ignoreAttrFilter,node.attributes);
2026};
2027_26c.ignoreAttr={};
2028var _26f=_26b.attributes;
2029var _270=_26c.ignoreAttr;
2030for(var i=0;i<_26f.length;i++){
2031var a=_26f[i];
2032_270[a.name]=a.value;
2033}
2034_26c.ignoreAttrFilter=function(a){
2035return (_26c.ignoreAttr[a.name]!=a.value);
2036};
2037_26c.compliant=false;
2038_26c.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"};
2039}else{
2040_26c=function(node){
2041return node.attributes;
078d1d29 2042};
79f17b42
DV
2043_26c.compliant=true;
2044_26c.renames={};
078d1d29 2045}
79f17b42
DV
2046this.attributeArray=_26c;
2047var _275=function(_276,arr){
2048var _278=arr[1].split(".");
2049var str="";
2050var obj={};
2051str+="if (!MochiKit."+_278[1]+") { throw new Error(\"";
2052str+="This function has been deprecated and depends on MochiKit.";
2053str+=_278[1]+".\");}";
2054str+="return MochiKit."+_278[1]+"."+arr[0];
2055str+=".apply(this, arguments);";
2056obj[_278[2]]=new Function(str);
2057MochiKit.Base.update(MochiKit[_276],obj);
078d1d29 2058};
79f17b42
DV
2059for(var i;i<MochiKit.DOM.DEPRECATED.length;i++){
2060_275("DOM",MochiKit.DOM.DEPRECATED[i]);
2061}
2062var _27b=this.createDOMFunc;
2063this.UL=_27b("ul");
2064this.OL=_27b("ol");
2065this.LI=_27b("li");
2066this.TD=_27b("td");
2067this.TR=_27b("tr");
2068this.TBODY=_27b("tbody");
2069this.THEAD=_27b("thead");
2070this.TFOOT=_27b("tfoot");
2071this.TABLE=_27b("table");
2072this.TH=_27b("th");
2073this.INPUT=_27b("input");
2074this.SPAN=_27b("span");
2075this.A=_27b("a");
2076this.DIV=_27b("div");
2077this.IMG=_27b("img");
2078this.BUTTON=_27b("button");
2079this.TT=_27b("tt");
2080this.PRE=_27b("pre");
2081this.H1=_27b("h1");
2082this.H2=_27b("h2");
2083this.H3=_27b("h3");
2084this.BR=_27b("br");
2085this.HR=_27b("hr");
2086this.LABEL=_27b("label");
2087this.TEXTAREA=_27b("textarea");
2088this.FORM=_27b("form");
2089this.P=_27b("p");
2090this.SELECT=_27b("select");
2091this.OPTION=_27b("option");
2092this.OPTGROUP=_27b("optgroup");
2093this.LEGEND=_27b("legend");
2094this.FIELDSET=_27b("fieldset");
2095this.STRONG=_27b("strong");
2096this.CANVAS=_27b("canvas");
2097this.$=this.getElement;
078d1d29
DV
2098this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2099m.nameFunctions(this);
79f17b42
DV
2100}});
2101MochiKit.DOM.__new__(((typeof (window)=="undefined")?this:window));
2102if(MochiKit.__export__){
2103withWindow=MochiKit.DOM.withWindow;
2104withDocument=MochiKit.DOM.withDocument;
2105}
2106MochiKit.Base._exportSymbols(this,MochiKit.DOM);
078d1d29 2107if(typeof (dojo)!="undefined"){
79f17b42 2108dojo.provide("MochiKit.Style");
078d1d29 2109dojo.require("MochiKit.Base");
79f17b42 2110dojo.require("MochiKit.DOM");
078d1d29
DV
2111}
2112if(typeof (JSAN)!="undefined"){
2113JSAN.use("MochiKit.Base",[]);
79f17b42 2114JSAN.use("MochiKit.DOM",[]);
078d1d29
DV
2115}
2116try{
2117if(typeof (MochiKit.Base)=="undefined"){
2118throw "";
2119}
2120}
2121catch(e){
79f17b42 2122throw "MochiKit.Style depends on MochiKit.Base!";
078d1d29 2123}
79f17b42 2124try{
078d1d29 2125if(typeof (MochiKit.DOM)=="undefined"){
79f17b42 2126throw "";
078d1d29 2127}
79f17b42
DV
2128}
2129catch(e){
2130throw "MochiKit.Style depends on MochiKit.DOM!";
2131}
2132if(typeof (MochiKit.Style)=="undefined"){
2133MochiKit.Style={};
2134}
2135MochiKit.Style.NAME="MochiKit.Style";
2136MochiKit.Style.VERSION="1.4";
2137MochiKit.Style.__repr__=function(){
078d1d29
DV
2138return "["+this.NAME+" "+this.VERSION+"]";
2139};
79f17b42 2140MochiKit.Style.toString=function(){
078d1d29
DV
2141return this.__repr__();
2142};
79f17b42
DV
2143MochiKit.Style.EXPORT_OK=[];
2144MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"];
2145MochiKit.Style.Dimensions=function(w,h){
2146this.w=w;
2147this.h=h;
2148};
2149MochiKit.Style.Dimensions.prototype.__repr__=function(){
2150var repr=MochiKit.Base.repr;
2151return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}";
2152};
2153MochiKit.Style.Dimensions.prototype.toString=function(){
2154return this.__repr__();
2155};
2156MochiKit.Style.Coordinates=function(x,y){
2157this.x=x;
2158this.y=y;
2159};
2160MochiKit.Style.Coordinates.prototype.__repr__=function(){
2161var repr=MochiKit.Base.repr;
2162return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}";
2163};
2164MochiKit.Style.Coordinates.prototype.toString=function(){
2165return this.__repr__();
2166};
2167MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_283){
2168var dom=MochiKit.DOM;
2169var d=dom._document;
2170elem=dom.getElement(elem);
2171_283=MochiKit.Base.camelize(_283);
2172if(!elem||elem==d){
2173return undefined;
078d1d29 2174}
79f17b42
DV
2175if(_283=="opacity"&&elem.filters){
2176var _286=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/);
2177if(_286&&_286[1]){
2178return parseFloat(_286[1])/100;
078d1d29 2179}
79f17b42 2180return 1;
078d1d29 2181}
79f17b42
DV
2182var _287=elem.style?elem.style[_283]:null;
2183if(!_287){
2184if(d.defaultView&&d.defaultView.getComputedStyle){
2185var css=d.defaultView.getComputedStyle(elem,null);
2186_283=_283.replace(/([A-Z])/g,"-$1").toLowerCase();
2187_287=css?css.getPropertyValue(_283):null;
2188}else{
2189if(elem.currentStyle){
2190_287=elem.currentStyle[_283];
078d1d29 2191}
078d1d29
DV
2192}
2193}
79f17b42
DV
2194if(_283=="opacity"){
2195_287=parseFloat(_287);
078d1d29 2196}
79f17b42
DV
2197if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_283)!=-1)){
2198if(MochiKit.Style.getStyle(elem,"position")=="static"){
2199_287="auto";
078d1d29 2200}
078d1d29 2201}
79f17b42
DV
2202return _287=="auto"?null:_287;
2203},setStyle:function(elem,_28a){
2204elem=MochiKit.DOM.getElement(elem);
2205for(var name in _28a){
2206if(name=="opacity"){
2207MochiKit.Style.setOpacity(elem,_28a[name]);
2208}else{
2209elem.style[MochiKit.Base.camelize(name)]=_28a[name];
078d1d29
DV
2210}
2211}
79f17b42
DV
2212},setOpacity:function(elem,o){
2213elem=MochiKit.DOM.getElement(elem);
2214var self=MochiKit.Style;
2215if(o==1){
2216var _28f=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
2217elem.style["opacity"]=_28f?0.999999:1;
2218if(/MSIE/.test(navigator.userAgent)){
2219elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"");
078d1d29 2220}
79f17b42
DV
2221}else{
2222if(o<0.00001){
2223o=0;
078d1d29 2224}
79f17b42
DV
2225elem.style["opacity"]=o;
2226if(/MSIE/.test(navigator.userAgent)){
2227elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")";
078d1d29 2228}
078d1d29 2229}
79f17b42
DV
2230},getElementPosition:function(elem,_291){
2231var self=MochiKit.Style;
2232var dom=MochiKit.DOM;
2233elem=dom.getElement(elem);
2234if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){
2235return undefined;
078d1d29 2236}
79f17b42
DV
2237var c=new self.Coordinates(0,0);
2238var box=null;
2239var _296=null;
2240var d=MochiKit.DOM._document;
2241var de=d.documentElement;
2242var b=d.body;
2243if(!elem.parentNode&&elem.x&&elem.y){
2244c.x+=elem.x||0;
2245c.y+=elem.y||0;
2246}else{
2247if(elem.getBoundingClientRect){
2248box=elem.getBoundingClientRect();
2249c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
2250c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
2251}else{
2252if(elem.offsetParent){
2253c.x+=elem.offsetLeft;
2254c.y+=elem.offsetTop;
2255_296=elem.offsetParent;
2256if(_296!=elem){
2257while(_296){
2258c.x+=_296.offsetLeft;
2259c.y+=_296.offsetTop;
2260_296=_296.offsetParent;
078d1d29 2261}
078d1d29 2262}
79f17b42
DV
2263var ua=navigator.userAgent.toLowerCase();
2264if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){
2265c.x-=b.offsetLeft;
2266c.y-=b.offsetTop;
078d1d29 2267}
078d1d29 2268}
078d1d29 2269}
078d1d29 2270}
79f17b42
DV
2271if(typeof (_291)!="undefined"){
2272_291=arguments.callee(_291);
2273if(_291){
2274c.x-=(_291.x||0);
2275c.y-=(_291.y||0);
078d1d29 2276}
078d1d29 2277}
79f17b42
DV
2278if(elem.parentNode){
2279_296=elem.parentNode;
2280}else{
2281_296=null;
078d1d29 2282}
79f17b42
DV
2283while(_296){
2284var _29b=_296.tagName.toUpperCase();
2285if(_29b==="BODY"||_29b==="HTML"){
2286break;
078d1d29 2287}
79f17b42
DV
2288var disp=self.getStyle(_296,"display");
2289if(disp!="inline"&&disp!="table-row"){
2290c.x-=_296.scrollLeft;
2291c.y-=_296.scrollTop;
078d1d29 2292}
79f17b42
DV
2293if(_296.parentNode){
2294_296=_296.parentNode;
2295}else{
2296_296=null;
078d1d29
DV
2297}
2298}
79f17b42
DV
2299return c;
2300},setElementPosition:function(elem,_29e,_29f){
2301elem=MochiKit.DOM.getElement(elem);
2302if(typeof (_29f)=="undefined"){
2303_29f="px";
078d1d29 2304}
79f17b42
DV
2305var _2a0={};
2306var _2a1=MochiKit.Base.isUndefinedOrNull;
2307if(!_2a1(_29e.x)){
2308_2a0["left"]=_29e.x+_29f;
078d1d29 2309}
79f17b42
DV
2310if(!_2a1(_29e.y)){
2311_2a0["top"]=_29e.y+_29f;
078d1d29 2312}
79f17b42
DV
2313MochiKit.DOM.updateNodeAttributes(elem,{"style":_2a0});
2314},getElementDimensions:function(elem){
2315var self=MochiKit.Style;
2316var dom=MochiKit.DOM;
2317if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){
2318return new self.Dimensions(elem.w||0,elem.h||0);
078d1d29 2319}
79f17b42
DV
2320elem=dom.getElement(elem);
2321if(!elem){
078d1d29 2322return undefined;
078d1d29 2323}
79f17b42
DV
2324var disp=self.getStyle(elem,"display");
2325if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){
2326return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
078d1d29 2327}
79f17b42
DV
2328var s=elem.style;
2329var _2a7=s.visibility;
2330var _2a8=s.position;
2331s.visibility="hidden";
2332s.position="absolute";
2333s.display="";
2334var _2a9=elem.offsetWidth;
2335var _2aa=elem.offsetHeight;
2336s.display="none";
2337s.position=_2a8;
2338s.visibility=_2a7;
2339return new self.Dimensions(_2a9,_2aa);
2340},setElementDimensions:function(elem,_2ac,_2ad){
2341elem=MochiKit.DOM.getElement(elem);
2342if(typeof (_2ad)=="undefined"){
2343_2ad="px";
078d1d29 2344}
79f17b42
DV
2345var _2ae={};
2346var _2af=MochiKit.Base.isUndefinedOrNull;
2347if(!_2af(_2ac.w)){
2348_2ae["width"]=_2ac.w+_2ad;
078d1d29 2349}
79f17b42
DV
2350if(!_2af(_2ac.h)){
2351_2ae["height"]=_2ac.h+_2ad;
078d1d29 2352}
79f17b42
DV
2353MochiKit.DOM.updateNodeAttributes(elem,{"style":_2ae});
2354},setDisplayForElement:function(_2b0,_2b1){
2355var _2b2=MochiKit.Base.extend(null,arguments,1);
2356var _2b3=MochiKit.DOM.getElement;
2357for(var i=0;i<_2b2.length;i++){
2358_2b1=_2b3(_2b2[i]);
2359if(_2b1){
2360_2b1.style.display=_2b0;
078d1d29 2361}
078d1d29 2362}
79f17b42
DV
2363},getViewportDimensions:function(){
2364var d=new MochiKit.Style.Dimensions();
2365var w=MochiKit.DOM._window;
2366var b=MochiKit.DOM._document.body;
2367if(w.innerWidth){
2368d.w=w.innerWidth;
2369d.h=w.innerHeight;
078d1d29 2370}else{
79f17b42
DV
2371if(b.parentElement.clientWidth){
2372d.w=b.parentElement.clientWidth;
2373d.h=b.parentElement.clientHeight;
078d1d29 2374}else{
79f17b42
DV
2375if(b&&b.clientWidth){
2376d.w=b.clientWidth;
2377d.h=b.clientHeight;
078d1d29 2378}
078d1d29 2379}
078d1d29 2380}
79f17b42
DV
2381return d;
2382},getViewportPosition:function(){
2383var c=new MochiKit.Style.Coordinates(0,0);
2384var d=MochiKit.DOM._document;
2385var de=d.documentElement;
2386var db=d.body;
2387if(de&&(de.scrollTop||de.scrollLeft)){
2388c.x=de.scrollLeft;
2389c.y=de.scrollTop;
078d1d29 2390}else{
79f17b42
DV
2391if(db){
2392c.x=db.scrollLeft;
2393c.y=db.scrollTop;
078d1d29
DV
2394}
2395}
79f17b42
DV
2396return c;
2397},__new__:function(){
2398var m=MochiKit.Base;
2399this.elementPosition=this.getElementPosition;
2400this.elementDimensions=this.getElementDimensions;
2401this.hideElement=m.partial(this.setDisplayForElement,"none");
2402this.showElement=m.partial(this.setDisplayForElement,"block");
2403this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2404m.nameFunctions(this);
2405}});
2406MochiKit.Style.__new__();
2407MochiKit.Base._exportSymbols(this,MochiKit.Style);
2408if(typeof (dojo)!="undefined"){
2409dojo.provide("MochiKit.Color");
2410dojo.require("MochiKit.Base");
2411dojo.require("MochiKit.DOM");
2412dojo.require("MochiKit.Style");
078d1d29 2413}
79f17b42
DV
2414if(typeof (JSAN)!="undefined"){
2415JSAN.use("MochiKit.Base",[]);
2416JSAN.use("MochiKit.DOM",[]);
2417JSAN.use("MochiKit.Style",[]);
078d1d29 2418}
79f17b42
DV
2419try{
2420if(typeof (MochiKit.Base)=="undefined"){
2421throw "";
078d1d29
DV
2422}
2423}
79f17b42
DV
2424catch(e){
2425throw "MochiKit.Color depends on MochiKit.Base";
078d1d29 2426}
79f17b42
DV
2427try{
2428if(typeof (MochiKit.DOM)=="undefined"){
2429throw "";
078d1d29
DV
2430}
2431}
79f17b42
DV
2432catch(e){
2433throw "MochiKit.Color depends on MochiKit.DOM";
078d1d29 2434}
79f17b42
DV
2435try{
2436if(typeof (MochiKit.Style)=="undefined"){
2437throw "";
078d1d29 2438}
078d1d29 2439}
79f17b42
DV
2440catch(e){
2441throw "MochiKit.Color depends on MochiKit.Style";
078d1d29 2442}
79f17b42
DV
2443if(typeof (MochiKit.Color)=="undefined"){
2444MochiKit.Color={};
078d1d29 2445}
79f17b42
DV
2446MochiKit.Color.NAME="MochiKit.Color";
2447MochiKit.Color.VERSION="1.4";
2448MochiKit.Color.__repr__=function(){
2449return "["+this.NAME+" "+this.VERSION+"]";
2450};
2451MochiKit.Color.toString=function(){
2452return this.__repr__();
2453};
2454MochiKit.Color.Color=function(red,_2be,blue,_2c0){
2455if(typeof (_2c0)=="undefined"||_2c0===null){
2456_2c0=1;
078d1d29 2457}
79f17b42
DV
2458this.rgb={r:red,g:_2be,b:blue,a:_2c0};
2459};
2460MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_2c1){
2461var rgb=this.rgb;
2462var m=MochiKit.Color;
2463return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_2c1);
2464},colorWithHue:function(hue){
2465var hsl=this.asHSL();
2466hsl.h=hue;
2467var m=MochiKit.Color;
2468return m.Color.fromHSL(hsl);
2469},colorWithSaturation:function(_2c7){
2470var hsl=this.asHSL();
2471hsl.s=_2c7;
2472var m=MochiKit.Color;
2473return m.Color.fromHSL(hsl);
2474},colorWithLightness:function(_2ca){
2475var hsl=this.asHSL();
2476hsl.l=_2ca;
2477var m=MochiKit.Color;
2478return m.Color.fromHSL(hsl);
2479},darkerColorWithLevel:function(_2cd){
2480var hsl=this.asHSL();
2481hsl.l=Math.max(hsl.l-_2cd,0);
2482var m=MochiKit.Color;
2483return m.Color.fromHSL(hsl);
2484},lighterColorWithLevel:function(_2d0){
2485var hsl=this.asHSL();
2486hsl.l=Math.min(hsl.l+_2d0,1);
2487var m=MochiKit.Color;
2488return m.Color.fromHSL(hsl);
2489},blendedColor:function(_2d3,_2d4){
2490if(typeof (_2d4)=="undefined"||_2d4===null){
2491_2d4=0.5;
2492}
2493var sf=1-_2d4;
2494var s=this.rgb;
2495var d=_2d3.rgb;
2496var df=_2d4;
2497return MochiKit.Color.Color.fromRGB((s.r*sf)+(d.r*df),(s.g*sf)+(d.g*df),(s.b*sf)+(d.b*df),(s.a*sf)+(d.a*df));
2498},compareRGB:function(_2d9){
2499var a=this.asRGB();
2500var b=_2d9.asRGB();
2501return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]);
2502},isLight:function(){
2503return this.asHSL().b>0.5;
2504},isDark:function(){
2505return (!this.isLight());
2506},toHSLString:function(){
2507var c=this.asHSL();
2508var ccc=MochiKit.Color.clampColorComponent;
2509var rval=this._hslString;
2510if(!rval){
2511var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%");
2512var a=c.a;
2513if(a>=1){
2514a=1;
2515rval="hsl("+mid+")";
078d1d29 2516}else{
79f17b42
DV
2517if(a<=0){
2518a=0;
078d1d29 2519}
79f17b42 2520rval="hsla("+mid+","+a+")";
078d1d29 2521}
79f17b42 2522this._hslString=rval;
078d1d29 2523}
79f17b42
DV
2524return rval;
2525},toRGBString:function(){
2526var c=this.rgb;
2527var ccc=MochiKit.Color.clampColorComponent;
2528var rval=this._rgbString;
2529if(!rval){
2530var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0));
2531if(c.a!=1){
2532rval="rgba("+mid+","+c.a+")";
078d1d29 2533}else{
79f17b42 2534rval="rgb("+mid+")";
078d1d29 2535}
79f17b42 2536this._rgbString=rval;
078d1d29 2537}
79f17b42
DV
2538return rval;
2539},asRGB:function(){
2540return MochiKit.Base.clone(this.rgb);
2541},toHexString:function(){
2542var m=MochiKit.Color;
2543var c=this.rgb;
2544var ccc=MochiKit.Color.clampColorComponent;
2545var rval=this._hexString;
2546if(!rval){
2547rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255)));
2548this._hexString=rval;
078d1d29 2549}
79f17b42
DV
2550return rval;
2551},asHSV:function(){
2552var hsv=this.hsv;
2553var c=this.rgb;
2554if(typeof (hsv)=="undefined"||hsv===null){
2555hsv=MochiKit.Color.rgbToHSV(this.rgb);
2556this.hsv=hsv;
078d1d29 2557}
79f17b42
DV
2558return MochiKit.Base.clone(hsv);
2559},asHSL:function(){
2560var hsl=this.hsl;
2561var c=this.rgb;
2562if(typeof (hsl)=="undefined"||hsl===null){
2563hsl=MochiKit.Color.rgbToHSL(this.rgb);
2564this.hsl=hsl;
078d1d29 2565}
79f17b42
DV
2566return MochiKit.Base.clone(hsl);
2567},toString:function(){
2568return this.toRGBString();
2569},repr:function(){
2570var c=this.rgb;
2571var col=[c.r,c.g,c.b,c.a];
2572return this.__class__.NAME+"("+col.join(", ")+")";
2573}};
2574MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_2f0,blue,_2f2){
2575var _2f3=MochiKit.Color.Color;
2576if(arguments.length==1){
2577var rgb=red;
2578red=rgb.r;
2579_2f0=rgb.g;
2580blue=rgb.b;
2581if(typeof (rgb.a)=="undefined"){
2582_2f2=undefined;
078d1d29 2583}else{
79f17b42 2584_2f2=rgb.a;
078d1d29 2585}
078d1d29 2586}
79f17b42
DV
2587return new _2f3(red,_2f0,blue,_2f2);
2588},fromHSL:function(hue,_2f6,_2f7,_2f8){
2589var m=MochiKit.Color;
2590return m.Color.fromRGB(m.hslToRGB.apply(m,arguments));
2591},fromHSV:function(hue,_2fb,_2fc,_2fd){
2592var m=MochiKit.Color;
2593return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments));
2594},fromName:function(name){
2595var _300=MochiKit.Color.Color;
2596if(name.charAt(0)=="\""){
2597name=name.substr(1,name.length-2);
078d1d29 2598}
79f17b42
DV
2599var _301=_300._namedColors[name.toLowerCase()];
2600if(typeof (_301)=="string"){
2601return _300.fromHexString(_301);
078d1d29 2602}else{
79f17b42
DV
2603if(name=="transparent"){
2604return _300.transparentColor();
078d1d29 2605}
078d1d29 2606}
79f17b42
DV
2607return null;
2608},fromString:function(_302){
2609var self=MochiKit.Color.Color;
2610var _304=_302.substr(0,3);
2611if(_304=="rgb"){
2612return self.fromRGBString(_302);
078d1d29 2613}else{
79f17b42
DV
2614if(_304=="hsl"){
2615return self.fromHSLString(_302);
2616}else{
2617if(_302.charAt(0)=="#"){
2618return self.fromHexString(_302);
078d1d29 2619}
078d1d29 2620}
078d1d29 2621}
79f17b42
DV
2622return self.fromName(_302);
2623},fromHexString:function(_305){
2624if(_305.charAt(0)=="#"){
2625_305=_305.substring(1);
078d1d29 2626}
79f17b42
DV
2627var _306=[];
2628var i,hex;
2629if(_305.length==3){
2630for(i=0;i<3;i++){
2631hex=_305.substr(i,1);
2632_306.push(parseInt(hex+hex,16)/255);
078d1d29 2633}
79f17b42
DV
2634}else{
2635for(i=0;i<6;i+=2){
2636hex=_305.substr(i,2);
2637_306.push(parseInt(hex,16)/255);
078d1d29
DV
2638}
2639}
79f17b42
DV
2640var _309=MochiKit.Color.Color;
2641return _309.fromRGB.apply(_309,_306);
2642},_fromColorString:function(pre,_30b,_30c,_30d){
2643if(_30d.indexOf(pre)===0){
2644_30d=_30d.substring(_30d.indexOf("(",3)+1,_30d.length-1);
078d1d29 2645}
79f17b42
DV
2646var _30e=_30d.split(/\s*,\s*/);
2647var _30f=[];
2648for(var i=0;i<_30e.length;i++){
2649var c=_30e[i];
2650var val;
2651var _313=c.substring(c.length-3);
2652if(c.charAt(c.length-1)=="%"){
2653val=0.01*parseFloat(c.substring(0,c.length-1));
2654}else{
2655if(_313=="deg"){
2656val=parseFloat(c)/360;
2657}else{
2658if(_313=="rad"){
2659val=parseFloat(c)/(Math.PI*2);
2660}else{
2661val=_30c[i]*parseFloat(c);
078d1d29
DV
2662}
2663}
078d1d29 2664}
79f17b42 2665_30f.push(val);
078d1d29 2666}
79f17b42
DV
2667return this[_30b].apply(this,_30f);
2668},fromComputedStyle:function(elem,_315){
2669var d=MochiKit.DOM;
2670var cls=MochiKit.Color.Color;
2671for(elem=d.getElement(elem);elem;elem=elem.parentNode){
2672var _318=MochiKit.Style.getStyle.apply(d,arguments);
2673if(!_318){
2674continue;
078d1d29 2675}
79f17b42
DV
2676var _319=cls.fromString(_318);
2677if(!_319){
2678break;
078d1d29 2679}
79f17b42
DV
2680if(_319.asRGB().a>0){
2681return _319;
078d1d29 2682}
078d1d29 2683}
79f17b42
DV
2684return null;
2685},fromBackground:function(elem){
2686var cls=MochiKit.Color.Color;
2687return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor();
2688},fromText:function(elem){
2689var cls=MochiKit.Color.Color;
2690return cls.fromComputedStyle(elem,"color","color")||cls.blackColor();
2691},namedColors:function(){
2692return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
2693}});
2694MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_31f){
2695v*=_31f;
2696if(v<0){
2697return 0;
078d1d29 2698}else{
79f17b42
DV
2699if(v>_31f){
2700return _31f;
2701}else{
2702return v;
078d1d29 2703}
078d1d29 2704}
79f17b42
DV
2705},_hslValue:function(n1,n2,hue){
2706if(hue>6){
2707hue-=6;
2708}else{
2709if(hue<0){
2710hue+=6;
078d1d29 2711}
078d1d29 2712}
79f17b42
DV
2713var val;
2714if(hue<1){
2715val=n1+(n2-n1)*hue;
2716}else{
2717if(hue<3){
2718val=n2;
2719}else{
2720if(hue<4){
2721val=n1+(n2-n1)*(4-hue);
2722}else{
2723val=n1;
078d1d29 2724}
078d1d29 2725}
078d1d29 2726}
79f17b42
DV
2727return val;
2728},hsvToRGB:function(hue,_325,_326,_327){
2729if(arguments.length==1){
2730var hsv=hue;
2731hue=hsv.h;
2732_325=hsv.s;
2733_326=hsv.v;
2734_327=hsv.a;
078d1d29 2735}
79f17b42
DV
2736var red;
2737var _32a;
2738var blue;
2739if(_325===0){
2740red=_326;
2741_32a=_326;
2742blue=_326;
078d1d29 2743}else{
79f17b42
DV
2744var i=Math.floor(hue*6);
2745var f=(hue*6)-i;
2746var p=_326*(1-_325);
2747var q=_326*(1-(_325*f));
2748var t=_326*(1-(_325*(1-f)));
2749switch(i){
2750case 1:
2751red=q;
2752_32a=_326;
2753blue=p;
2754break;
2755case 2:
2756red=p;
2757_32a=_326;
2758blue=t;
2759break;
2760case 3:
2761red=p;
2762_32a=q;
2763blue=_326;
2764break;
2765case 4:
2766red=t;
2767_32a=p;
2768blue=_326;
2769break;
2770case 5:
2771red=_326;
2772_32a=p;
2773blue=q;
2774break;
2775case 6:
2776case 0:
2777red=_326;
2778_32a=t;
2779blue=p;
2780break;
078d1d29
DV
2781}
2782}
79f17b42
DV
2783return {r:red,g:_32a,b:blue,a:_327};
2784},hslToRGB:function(hue,_332,_333,_334){
2785if(arguments.length==1){
2786var hsl=hue;
2787hue=hsl.h;
2788_332=hsl.s;
2789_333=hsl.l;
2790_334=hsl.a;
078d1d29 2791}
79f17b42
DV
2792var red;
2793var _337;
2794var blue;
2795if(_332===0){
2796red=_333;
2797_337=_333;
2798blue=_333;
078d1d29 2799}else{
79f17b42
DV
2800var m2;
2801if(_333<=0.5){
2802m2=_333*(1+_332);
078d1d29 2803}else{
79f17b42 2804m2=_333+_332-(_333*_332);
078d1d29 2805}
79f17b42
DV
2806var m1=(2*_333)-m2;
2807var f=MochiKit.Color._hslValue;
2808var h6=hue*6;
2809red=f(m1,m2,h6+2);
2810_337=f(m1,m2,h6);
2811blue=f(m1,m2,h6-2);
078d1d29 2812}
79f17b42
DV
2813return {r:red,g:_337,b:blue,a:_334};
2814},rgbToHSV:function(red,_33e,blue,_340){
2815if(arguments.length==1){
2816var rgb=red;
2817red=rgb.r;
2818_33e=rgb.g;
2819blue=rgb.b;
2820_340=rgb.a;
078d1d29 2821}
79f17b42
DV
2822var max=Math.max(Math.max(red,_33e),blue);
2823var min=Math.min(Math.min(red,_33e),blue);
2824var hue;
2825var _345;
2826var _346=max;
2827if(min==max){
2828hue=0;
2829_345=0;
078d1d29 2830}else{
79f17b42
DV
2831var _347=(max-min);
2832_345=_347/max;
2833if(red==max){
2834hue=(_33e-blue)/_347;
2835}else{
2836if(_33e==max){
2837hue=2+((blue-red)/_347);
2838}else{
2839hue=4+((red-_33e)/_347);
078d1d29 2840}
078d1d29 2841}
79f17b42
DV
2842hue/=6;
2843if(hue<0){
2844hue+=1;
078d1d29 2845}
79f17b42
DV
2846if(hue>1){
2847hue-=1;
078d1d29
DV
2848}
2849}
79f17b42
DV
2850return {h:hue,s:_345,v:_346,a:_340};
2851},rgbToHSL:function(red,_349,blue,_34b){
2852if(arguments.length==1){
2853var rgb=red;
2854red=rgb.r;
2855_349=rgb.g;
2856blue=rgb.b;
2857_34b=rgb.a;
078d1d29 2858}
79f17b42
DV
2859var max=Math.max(red,Math.max(_349,blue));
2860var min=Math.min(red,Math.min(_349,blue));
2861var hue;
2862var _350;
2863var _351=(max+min)/2;
2864var _352=max-min;
2865if(_352===0){
2866hue=0;
2867_350=0;
078d1d29 2868}else{
79f17b42
DV
2869if(_351<=0.5){
2870_350=_352/(max+min);
2871}else{
2872_350=_352/(2-max-min);
078d1d29 2873}
79f17b42
DV
2874if(red==max){
2875hue=(_349-blue)/_352;
078d1d29 2876}else{
79f17b42
DV
2877if(_349==max){
2878hue=2+((blue-red)/_352);
078d1d29 2879}else{
79f17b42 2880hue=4+((red-_349)/_352);
078d1d29
DV
2881}
2882}
79f17b42
DV
2883hue/=6;
2884if(hue<0){
2885hue+=1;
078d1d29 2886}
79f17b42
DV
2887if(hue>1){
2888hue-=1;
078d1d29 2889}
078d1d29 2890}
79f17b42
DV
2891return {h:hue,s:_350,l:_351,a:_34b};
2892},toColorPart:function(num){
2893num=Math.round(num);
2894var _354=num.toString(16);
2895if(num<16){
2896return "0"+_354;
078d1d29 2897}
79f17b42
DV
2898return _354;
2899},__new__:function(){
078d1d29 2900var m=MochiKit.Base;
79f17b42
DV
2901this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]);
2902this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]);
2903var _356=1/3;
2904var _357={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_356,_356,_356],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_356,2*_356,2*_356],magenta:[1,0,1],orange:[1,0.5,0],purple:[0.5,0,0.5],red:[1,0,0],transparent:[0,0,0,0],white:[1,1,1],yellow:[1,1,0]};
2905var _358=function(name,r,g,b,a){
2906var rval=this.fromRGB(r,g,b,a);
2907this[name]=function(){
2908return rval;
2909};
2910return rval;
2911};
2912for(var k in _357){
2913var name=k+"Color";
2914var _361=m.concat([_358,this.Color,name],_357[k]);
2915this.Color[name]=m.bind.apply(null,_361);
078d1d29 2916}
79f17b42
DV
2917var _362=function(){
2918for(var i=0;i<arguments.length;i++){
2919if(!(arguments[i] instanceof Color)){
2920return false;
078d1d29 2921}
078d1d29 2922}
79f17b42
DV
2923return true;
2924};
2925var _364=function(a,b){
2926return a.compareRGB(b);
078d1d29 2927};
078d1d29 2928m.nameFunctions(this);
79f17b42
DV
2929m.registerComparator(this.Color.NAME,_362,_364);
2930this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
078d1d29 2931}});
79f17b42
DV
2932MochiKit.Color.EXPORT=["Color"];
2933MochiKit.Color.EXPORT_OK=["clampColorComponent","rgbToHSL","hslToRGB","rgbToHSV","hsvToRGB","toColorPart"];
2934MochiKit.Color.__new__();
2935MochiKit.Base._exportSymbols(this,MochiKit.Color);
2936MochiKit.Color.Color._namedColors={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",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",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",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",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:"#db7093",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",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};
078d1d29 2937if(typeof (dojo)!="undefined"){
79f17b42 2938dojo.provide("MochiKit.Signal");
078d1d29
DV
2939dojo.require("MochiKit.Base");
2940dojo.require("MochiKit.DOM");
79f17b42 2941dojo.require("MochiKit.Style");
078d1d29
DV
2942}
2943if(typeof (JSAN)!="undefined"){
2944JSAN.use("MochiKit.Base",[]);
2945JSAN.use("MochiKit.DOM",[]);
79f17b42 2946JSAN.use("MochiKit.Style",[]);
078d1d29
DV
2947}
2948try{
79f17b42 2949if(typeof (MochiKit.Base)=="undefined"){
078d1d29
DV
2950throw "";
2951}
2952}
2953catch(e){
79f17b42 2954throw "MochiKit.Signal depends on MochiKit.Base!";
078d1d29 2955}
79f17b42
DV
2956try{
2957if(typeof (MochiKit.DOM)=="undefined"){
2958throw "";
078d1d29 2959}
078d1d29 2960}
79f17b42
DV
2961catch(e){
2962throw "MochiKit.Signal depends on MochiKit.DOM!";
078d1d29 2963}
79f17b42
DV
2964try{
2965if(typeof (MochiKit.Style)=="undefined"){
2966throw "";
078d1d29 2967}
078d1d29 2968}
79f17b42
DV
2969catch(e){
2970throw "MochiKit.Signal depends on MochiKit.Style!";
078d1d29 2971}
79f17b42
DV
2972if(typeof (MochiKit.Signal)=="undefined"){
2973MochiKit.Signal={};
078d1d29 2974}
79f17b42
DV
2975MochiKit.Signal.NAME="MochiKit.Signal";
2976MochiKit.Signal.VERSION="1.4";
2977MochiKit.Signal._observers=[];
2978MochiKit.Signal.Event=function(src,e){
2979this._event=e||window.event;
2980this._src=src;
078d1d29 2981};
79f17b42
DV
2982MochiKit.Base.update(MochiKit.Signal.Event.prototype,{__repr__:function(){
2983var repr=MochiKit.Base.repr;
2984var str="{event(): "+repr(this.event())+", src(): "+repr(this.src())+", type(): "+repr(this.type())+", target(): "+repr(this.target());
2985if(this.type()&&this.type().indexOf("key")===0||this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu"){
2986str+=", modifier(): "+"{alt: "+repr(this.modifier().alt)+", ctrl: "+repr(this.modifier().ctrl)+", meta: "+repr(this.modifier().meta)+", shift: "+repr(this.modifier().shift)+", any: "+repr(this.modifier().any)+"}";
078d1d29 2987}
79f17b42
DV
2988if(this.type()&&this.type().indexOf("key")===0){
2989str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
078d1d29 2990}
79f17b42
DV
2991if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
2992str+=", mouse(): {page: "+repr(this.mouse().page)+", client: "+repr(this.mouse().client);
2993if(this.type()!="mousemove"){
2994str+=", button: {left: "+repr(this.mouse().button.left)+", middle: "+repr(this.mouse().button.middle)+", right: "+repr(this.mouse().button.right)+"}}";
078d1d29 2995}else{
79f17b42 2996str+="}";
078d1d29
DV
2997}
2998}
79f17b42
DV
2999if(this.type()=="mouseover"||this.type()=="mouseout"){
3000str+=", relatedTarget(): "+repr(this.relatedTarget());
078d1d29 3001}
79f17b42
DV
3002str+="}";
3003return str;
3004},toString:function(){
3005return this.__repr__();
3006},src:function(){
3007return this._src;
3008},event:function(){
3009return this._event;
3010},type:function(){
3011return this._event.type||undefined;
3012},target:function(){
3013return this._event.target||this._event.srcElement;
3014},_relatedTarget:null,relatedTarget:function(){
3015if(this._relatedTarget!==null){
3016return this._relatedTarget;
078d1d29 3017}
79f17b42
DV
3018var elem=null;
3019if(this.type()=="mouseover"){
3020elem=(this._event.relatedTarget||this._event.fromElement);
3021}else{
3022if(this.type()=="mouseout"){
3023elem=(this._event.relatedTarget||this._event.toElement);
078d1d29
DV
3024}
3025}
79f17b42
DV
3026if(elem!==null){
3027this._relatedTarget=elem;
3028return elem;
078d1d29 3029}
79f17b42
DV
3030return undefined;
3031},_modifier:null,modifier:function(){
3032if(this._modifier!==null){
3033return this._modifier;
078d1d29 3034}
79f17b42
DV
3035var m={};
3036m.alt=this._event.altKey;
3037m.ctrl=this._event.ctrlKey;
3038m.meta=this._event.metaKey||false;
3039m.shift=this._event.shiftKey;
3040m.any=m.alt||m.ctrl||m.shift||m.meta;
3041this._modifier=m;
3042return m;
3043},_key:null,key:function(){
3044if(this._key!==null){
3045return this._key;
078d1d29 3046}
79f17b42
DV
3047var k={};
3048if(this.type()&&this.type().indexOf("key")===0){
3049if(this.type()=="keydown"||this.type()=="keyup"){
3050k.code=this._event.keyCode;
3051k.string=(MochiKit.Signal._specialKeys[k.code]||"KEY_UNKNOWN");
3052this._key=k;
3053return k;
078d1d29 3054}else{
79f17b42
DV
3055if(this.type()=="keypress"){
3056k.code=0;
3057k.string="";
3058if(typeof (this._event.charCode)!="undefined"&&this._event.charCode!==0&&!MochiKit.Signal._specialMacKeys[this._event.charCode]){
3059k.code=this._event.charCode;
3060k.string=String.fromCharCode(k.code);
078d1d29 3061}else{
79f17b42
DV
3062if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
3063k.code=this._event.keyCode;
3064k.string=String.fromCharCode(k.code);
078d1d29 3065}
078d1d29 3066}
79f17b42
DV
3067this._key=k;
3068return k;
078d1d29 3069}
078d1d29
DV
3070}
3071}
79f17b42
DV
3072return undefined;
3073},_mouse:null,mouse:function(){
3074if(this._mouse!==null){
3075return this._mouse;
078d1d29 3076}
79f17b42
DV
3077var m={};
3078var e=this._event;
3079if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
3080m.client=new MochiKit.Style.Coordinates(0,0);
3081if(e.clientX||e.clientY){
3082m.client.x=(!e.clientX||e.clientX<0)?0:e.clientX;
3083m.client.y=(!e.clientY||e.clientY<0)?0:e.clientY;
078d1d29 3084}
79f17b42
DV
3085m.page=new MochiKit.Style.Coordinates(0,0);
3086if(e.pageX||e.pageY){
3087m.page.x=(!e.pageX||e.pageX<0)?0:e.pageX;
3088m.page.y=(!e.pageY||e.pageY<0)?0:e.pageY;
3089}else{
3090var de=MochiKit.DOM._document.documentElement;
3091var b=MochiKit.DOM._document.body;
3092m.page.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
3093m.page.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
078d1d29 3094}
79f17b42
DV
3095if(this.type()!="mousemove"){
3096m.button={};
3097m.button.left=false;
3098m.button.right=false;
3099m.button.middle=false;
3100if(e.which){
3101m.button.left=(e.which==1);
3102m.button.middle=(e.which==2);
3103m.button.right=(e.which==3);
3104}else{
3105m.button.left=!!(e.button&1);
3106m.button.right=!!(e.button&2);
3107m.button.middle=!!(e.button&4);
078d1d29 3108}
078d1d29 3109}
79f17b42
DV
3110this._mouse=m;
3111return m;
078d1d29 3112}
79f17b42
DV
3113return undefined;
3114},stop:function(){
3115this.stopPropagation();
3116this.preventDefault();
3117},stopPropagation:function(){
3118if(this._event.stopPropagation){
3119this._event.stopPropagation();
3120}else{
3121this._event.cancelBubble=true;
078d1d29 3122}
79f17b42
DV
3123},preventDefault:function(){
3124if(this._event.preventDefault){
3125this._event.preventDefault();
3126}else{
3127if(this._confirmUnload===null){
3128this._event.returnValue=false;
078d1d29 3129}
078d1d29 3130}
79f17b42
DV
3131},_confirmUnload:null,confirmUnload:function(msg){
3132if(this.type()=="beforeunload"){
3133this._confirmUnload=msg;
3134this._event.returnValue=msg;
078d1d29 3135}
79f17b42
DV
3136}});
3137MochiKit.Signal._specialMacKeys={3:"KEY_ENTER",63289:"KEY_NUM_PAD_CLEAR",63276:"KEY_PAGE_UP",63277:"KEY_PAGE_DOWN",63275:"KEY_END",63273:"KEY_HOME",63234:"KEY_ARROW_LEFT",63232:"KEY_ARROW_UP",63235:"KEY_ARROW_RIGHT",63233:"KEY_ARROW_DOWN",63302:"KEY_INSERT",63272:"KEY_DELETE"};
3138(function(){
3139var _373=MochiKit.Signal._specialMacKeys;
3140for(i=63236;i<=63242;i++){
3141_373[i]="KEY_F"+(i-63236+1);
078d1d29 3142}
79f17b42
DV
3143})();
3144MochiKit.Signal._specialKeys={8:"KEY_BACKSPACE",9:"KEY_TAB",12:"KEY_NUM_PAD_CLEAR",13:"KEY_ENTER",16:"KEY_SHIFT",17:"KEY_CTRL",18:"KEY_ALT",19:"KEY_PAUSE",20:"KEY_CAPS_LOCK",27:"KEY_ESCAPE",32:"KEY_SPACEBAR",33:"KEY_PAGE_UP",34:"KEY_PAGE_DOWN",35:"KEY_END",36:"KEY_HOME",37:"KEY_ARROW_LEFT",38:"KEY_ARROW_UP",39:"KEY_ARROW_RIGHT",40:"KEY_ARROW_DOWN",44:"KEY_PRINT_SCREEN",45:"KEY_INSERT",46:"KEY_DELETE",59:"KEY_SEMICOLON",91:"KEY_WINDOWS_LEFT",92:"KEY_WINDOWS_RIGHT",93:"KEY_SELECT",106:"KEY_NUM_PAD_ASTERISK",107:"KEY_NUM_PAD_PLUS_SIGN",109:"KEY_NUM_PAD_HYPHEN-MINUS",110:"KEY_NUM_PAD_FULL_STOP",111:"KEY_NUM_PAD_SOLIDUS",144:"KEY_NUM_LOCK",145:"KEY_SCROLL_LOCK",186:"KEY_SEMICOLON",187:"KEY_EQUALS_SIGN",188:"KEY_COMMA",189:"KEY_HYPHEN-MINUS",190:"KEY_FULL_STOP",191:"KEY_SOLIDUS",192:"KEY_GRAVE_ACCENT",219:"KEY_LEFT_SQUARE_BRACKET",220:"KEY_REVERSE_SOLIDUS",221:"KEY_RIGHT_SQUARE_BRACKET",222:"KEY_APOSTROPHE"};
3145(function(){
3146var _374=MochiKit.Signal._specialKeys;
3147for(var i=48;i<=57;i++){
3148_374[i]="KEY_"+(i-48);
078d1d29 3149}
79f17b42
DV
3150for(i=65;i<=90;i++){
3151_374[i]="KEY_"+String.fromCharCode(i);
3152}
3153for(i=96;i<=105;i++){
3154_374[i]="KEY_NUM_PAD_"+(i-96);
3155}
3156for(i=112;i<=123;i++){
3157_374[i]="KEY_F"+(i-112+1);
3158}
3159})();
3160MochiKit.Signal.Ident=function(_376){
3161this.source=_376.source;
3162this.signal=_376.signal;
3163this.listener=_376.listener;
3164this.isDOM=_376.isDOM;
3165this.objOrFunc=_376.objOrFunc;
3166this.funcOrStr=_376.funcOrStr;
3167this.connected=_376.connected;
078d1d29 3168};
79f17b42
DV
3169MochiKit.Signal.Ident.prototype={};
3170MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
3171return "["+this.NAME+" "+this.VERSION+"]";
3172},toString:function(){
078d1d29 3173return this.__repr__();
79f17b42
DV
3174},_unloadCache:function(){
3175var self=MochiKit.Signal;
3176var _378=self._observers;
3177for(var i=0;i<_378.length;i++){
3178if(_378[i].signal!=="onload"&&_378[i].signal!=="onunload"){
3179self._disconnect(_378[i]);
078d1d29 3180}
078d1d29 3181}
79f17b42
DV
3182},_listener:function(src,sig,func,obj,_37e){
3183var self=MochiKit.Signal;
3184var E=self.Event;
3185if(!_37e){
3186return MochiKit.Base.bind(func,obj);
078d1d29 3187}
79f17b42
DV
3188obj=obj||src;
3189if(typeof (func)=="string"){
3190if(sig==="onload"||sig==="onunload"){
3191return function(_381){
3192obj[func].apply(obj,[new E(src,_381)]);
3193var _382=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:obj,funcOrStr:func});
3194MochiKit.Signal._disconnect(_382);
3195};
078d1d29 3196}else{
79f17b42
DV
3197return function(_383){
3198obj[func].apply(obj,[new E(src,_383)]);
3199};
078d1d29 3200}
79f17b42
DV
3201}else{
3202if(sig==="onload"||sig==="onunload"){
3203return function(_384){
3204func.apply(obj,[new E(src,_384)]);
3205MochiKit.Signal.disconnect(src,sig,func);
3206var _385=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:func});
3207MochiKit.Signal._disconnect(_385);
3208};
3209}else{
3210return function(_386){
3211func.apply(obj,[new E(src,_386)]);
3212};
078d1d29
DV
3213}
3214}
79f17b42
DV
3215},_browserAlreadyHasMouseEnterAndLeave:function(){
3216return /MSIE/.test(navigator.userAgent);
3217},_mouseEnterListener:function(src,sig,func,obj){
3218var E=MochiKit.Signal.Event;
3219return function(_38c){
3220var e=new E(src,_38c);
3221try{
3222e.relatedTarget().nodeName;
078d1d29 3223}
79f17b42
DV
3224catch(err){
3225return;
078d1d29 3226}
79f17b42
DV
3227e.stop();
3228if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
3229return;
078d1d29 3230}
79f17b42
DV
3231e.type=function(){
3232return sig;
3233};
3234if(typeof (func)=="string"){
3235return obj[func].apply(obj,[e]);
078d1d29 3236}else{
79f17b42 3237return func.apply(obj,[e]);
078d1d29 3238}
79f17b42
DV
3239};
3240},_getDestPair:function(_38e,_38f){
3241var obj=null;
3242var func=null;
3243if(typeof (_38f)!="undefined"){
3244obj=_38e;
3245func=_38f;
3246if(typeof (_38f)=="string"){
3247if(typeof (_38e[_38f])!="function"){
3248throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
078d1d29
DV
3249}
3250}else{
79f17b42
DV
3251if(typeof (_38f)!="function"){
3252throw new Error("'funcOrStr' must be a function or string");
078d1d29 3253}
078d1d29 3254}
79f17b42
DV
3255}else{
3256if(typeof (_38e)!="function"){
3257throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
3258}else{
3259func=_38e;
078d1d29 3260}
078d1d29 3261}
79f17b42
DV
3262return [obj,func];
3263},connect:function(src,sig,_394,_395){
3264src=MochiKit.DOM.getElement(src);
3265var self=MochiKit.Signal;
3266if(typeof (sig)!="string"){
3267throw new Error("'sig' must be a string");
3268}
3269var _397=self._getDestPair(_394,_395);
3270var obj=_397[0];
3271var func=_397[1];
3272if(typeof (obj)=="undefined"||obj===null){
3273obj=src;
3274}
3275var _39a=!!(src.addEventListener||src.attachEvent);
3276if(_39a&&(sig==="onmouseenter"||sig==="onmouseleave")&&!self._browserAlreadyHasMouseEnterAndLeave()){
3277var _39b=self._mouseEnterListener(src,sig.substr(2),func,obj);
3278if(sig==="onmouseenter"){
3279sig="onmouseover";
078d1d29 3280}else{
79f17b42
DV
3281sig="onmouseout";
3282}
078d1d29 3283}else{
79f17b42 3284var _39b=self._listener(src,sig,func,obj,_39a);
078d1d29 3285}
79f17b42
DV
3286if(src.addEventListener){
3287src.addEventListener(sig.substr(2),_39b,false);
3288}else{
3289if(src.attachEvent){
3290src.attachEvent(sig,_39b);
078d1d29 3291}
078d1d29 3292}
79f17b42
DV
3293var _39c=new MochiKit.Signal.Ident({source:src,signal:sig,listener:_39b,isDOM:_39a,objOrFunc:_394,funcOrStr:_395,connected:true});
3294self._observers.push(_39c);
3295if(!_39a&&typeof (src.__connect__)=="function"){
3296var args=MochiKit.Base.extend([_39c],arguments,1);
3297src.__connect__.apply(src,args);
078d1d29 3298}
79f17b42
DV
3299return _39c;
3300},_disconnect:function(_39e){
3301if(!_39e.connected){
3302return;
078d1d29 3303}
79f17b42
DV
3304_39e.connected=false;
3305if(!_39e.isDOM){
3306return;
078d1d29 3307}
79f17b42
DV
3308var src=_39e.source;
3309var sig=_39e.signal;
3310var _3a1=_39e.listener;
3311if(src.removeEventListener){
3312src.removeEventListener(sig.substr(2),_3a1,false);
3313}else{
3314if(src.detachEvent){
3315src.detachEvent(sig,_3a1);
3316}else{
3317throw new Error("'src' must be a DOM element");
078d1d29
DV
3318}
3319}
79f17b42
DV
3320},disconnect:function(_3a2){
3321var self=MochiKit.Signal;
3322var _3a4=self._observers;
3323var m=MochiKit.Base;
3324if(arguments.length>1){
3325var src=MochiKit.DOM.getElement(arguments[0]);
3326var sig=arguments[1];
3327var obj=arguments[2];
3328var func=arguments[3];
3329for(var i=_3a4.length-1;i>=0;i--){
3330var o=_3a4[i];
3331if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){
3332self._disconnect(o);
3333if(!self._lock){
3334_3a4.splice(i,1);
078d1d29 3335}else{
79f17b42 3336self._dirty=true;
078d1d29 3337}
79f17b42 3338return true;
078d1d29 3339}
078d1d29 3340}
078d1d29 3341}else{
79f17b42
DV
3342var idx=m.findIdentical(_3a4,_3a2);
3343if(idx>=0){
3344self._disconnect(_3a2);
3345if(!self._lock){
3346_3a4.splice(idx,1);
3347}else{
3348self._dirty=true;
078d1d29 3349}
79f17b42 3350return true;
078d1d29 3351}
078d1d29 3352}
79f17b42
DV
3353return false;
3354},disconnectAllTo:function(_3ad,_3ae){
3355var self=MochiKit.Signal;
3356var _3b0=self._observers;
3357var _3b1=self._disconnect;
3358var _3b2=self._lock;
3359var _3b3=self._dirty;
3360if(typeof (_3ae)==="undefined"){
3361_3ae=null;
078d1d29 3362}
79f17b42
DV
3363for(var i=_3b0.length-1;i>=0;i--){
3364var _3b5=_3b0[i];
3365if(_3b5.objOrFunc===_3ad&&(_3ae===null||_3b5.funcOrStr===_3ae)){
3366_3b1(_3b5);
3367if(_3b2){
3368_3b3=true;
3369}else{
3370_3b0.splice(i,1);
078d1d29 3371}
078d1d29 3372}
078d1d29 3373}
79f17b42
DV
3374self._dirty=_3b3;
3375},disconnectAll:function(src,sig){
3376src=MochiKit.DOM.getElement(src);
3377var m=MochiKit.Base;
3378var _3b9=m.flattenArguments(m.extend(null,arguments,1));
3379var self=MochiKit.Signal;
3380var _3bb=self._disconnect;
3381var _3bc=self._observers;
3382var i,_3be;
3383var _3bf=self._lock;
3384var _3c0=self._dirty;
3385if(_3b9.length===0){
3386for(i=_3bc.length-1;i>=0;i--){
3387_3be=_3bc[i];
3388if(_3be.source===src){
3389_3bb(_3be);
3390if(!_3bf){
3391_3bc.splice(i,1);
3392}else{
3393_3c0=true;
078d1d29 3394}
078d1d29 3395}
078d1d29 3396}
79f17b42
DV
3397}else{
3398var sigs={};
3399for(i=0;i<_3b9.length;i++){
3400sigs[_3b9[i]]=true;
078d1d29 3401}
79f17b42
DV
3402for(i=_3bc.length-1;i>=0;i--){
3403_3be=_3bc[i];
3404if(_3be.source===src&&_3be.signal in sigs){
3405_3bb(_3be);
3406if(!_3bf){
3407_3bc.splice(i,1);
3408}else{
3409_3c0=true;
078d1d29
DV
3410}
3411}
078d1d29
DV
3412}
3413}
79f17b42
DV
3414self._dirty=_3c0;
3415},signal:function(src,sig){
3416var self=MochiKit.Signal;
3417var _3c5=self._observers;
3418src=MochiKit.DOM.getElement(src);
3419var args=MochiKit.Base.extend(null,arguments,2);
3420var _3c7=[];
3421self._lock=true;
3422for(var i=0;i<_3c5.length;i++){
3423var _3c9=_3c5[i];
3424if(_3c9.source===src&&_3c9.signal===sig){
3425try{
3426_3c9.listener.apply(src,args);
078d1d29 3427}
79f17b42
DV
3428catch(e){
3429_3c7.push(e);
3430}
3431}
3432}
3433self._lock=false;
3434if(self._dirty){
3435self._dirty=false;
3436for(var i=_3c5.length-1;i>=0;i--){
3437if(!_3c5[i].connected){
3438_3c5.splice(i,1);
3439}
3440}
3441}
3442if(_3c7.length==1){
3443throw _3c7[0];
078d1d29 3444}else{
79f17b42
DV
3445if(_3c7.length>1){
3446var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
3447e.errors=_3c7;
3448throw e;
078d1d29
DV
3449}
3450}
79f17b42
DV
3451}});
3452MochiKit.Signal.EXPORT_OK=[];
3453MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"];
3454MochiKit.Signal.__new__=function(win){
078d1d29 3455var m=MochiKit.Base;
79f17b42
DV
3456this._document=document;
3457this._window=win;
3458this._lock=false;
3459this._dirty=false;
3460try{
3461this.connect(window,"onunload",this._unloadCache);
3462}
3463catch(e){
3464}
078d1d29
DV
3465this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3466m.nameFunctions(this);
79f17b42
DV
3467};
3468MochiKit.Signal.__new__(this);
3469if(MochiKit.__export__){
3470connect=MochiKit.Signal.connect;
3471disconnect=MochiKit.Signal.disconnect;
3472disconnectAll=MochiKit.Signal.disconnectAll;
3473signal=MochiKit.Signal.signal;
078d1d29 3474}
79f17b42
DV
3475MochiKit.Base._exportSymbols(this,MochiKit.Signal);
3476
3477
3478/***
3479
3480 PlotKit.PlotKit 0.9.1 : PACKED VERSION
3481
3482 THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please
3483 diff against the source tree, not this file.
3484
3485 For more information, <http://www.liquidx.net/plotkit/>.
3486
3487 Copyright (c) 2006. Alastair Tse.
3488
3489***/
3490
078d1d29 3491try{
79f17b42 3492if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){
078d1d29
DV
3493throw "";
3494}
3495}
3496catch(e){
79f17b42 3497throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}";
078d1d29 3498}
79f17b42
DV
3499MochiKit.Base.update(MochiKit.Color.Color.prototype,{asFillColor:function(){
3500return this.lighterColorWithLevel(0.3);
3501},asStrokeColor:function(){
3502return this.darkerColorWithLevel(0.1);
3503},asPointColor:function(){
3504return this.lighterColorWithLevel(0.1);
3505}});
3506if(typeof (PlotKit)=="undefined"){
3507PlotKit={};
078d1d29 3508}
79f17b42
DV
3509PlotKit.NAME="PlotKit";
3510PlotKit.VERSION="0.8";
3511PlotKit.__repr__=function(){
078d1d29
DV
3512return "["+this.NAME+" "+this.VERSION+"]";
3513};
79f17b42 3514PlotKit.toString=function(){
078d1d29
DV
3515return this.__repr__();
3516};
79f17b42
DV
3517if(typeof (PlotKit.Base)=="undefined"){
3518PlotKit.Base={};
078d1d29 3519}
79f17b42
DV
3520PlotKit.Base.NAME="PlotKit.Base";
3521PlotKit.Base.VERSION=PlotKit.VERSION;
3522PlotKit.Base.__repr__=function(){
3523return "["+this.NAME+" "+this.VERSION+"]";
078d1d29 3524};
79f17b42
DV
3525PlotKit.Base.toString=function(){
3526return this.__repr__();
3527};
3528PlotKit.Base.usingPrototype=function(){
078d1d29 3529try{
79f17b42 3530return (typeof (Object.extend)=="function");
078d1d29
DV
3531}
3532catch(e){
79f17b42 3533return false;
078d1d29
DV
3534}
3535};
79f17b42
DV
3536MochiKit.Base.update(PlotKit.Base,{roundInterval:function(_1,_2,_3){
3537var _4=MochiKit.Format.roundToFixed;
3538var _5=_1/_2;
3539return parseFloat(_4(_5,_3));
3540},collapse:function(_6){
3541var m=MochiKit.Base;
3542var _8=new Array();
3543for(var i=0;i<_6.length;i++){
3544_8=m.concat(_8,_6[i]);
078d1d29 3545}
79f17b42
DV
3546if(PlotKit.Base.usingPrototype()){
3547delete _8.extend;
3548delete _8.from;
3549delete _8.inspect;
078d1d29 3550}
79f17b42
DV
3551return _8;
3552},uniq:function(_10){
3553var m=MochiKit.Base;
3554if(!m.isArrayLike(_10)||(_10.length<1)){
3555return new Array();
078d1d29 3556}
79f17b42
DV
3557var _11=new Array();
3558var _12=_10[0];
3559_11.push(_10[0]);
3560for(var i=1;i<_10.length;i++){
3561if(m.compare(_10[i],_12)!=0){
3562_12=_10[i];
3563_11.push(_10[i]);
078d1d29 3564}
078d1d29 3565}
79f17b42
DV
3566return _11;
3567},colorScheme:function(){
3568var mb=MochiKit.Base;
3569var mc=MochiKit.Color;
3570var _15=["red","orange","yellow","green","cyan","blue","purple","magenta"];
3571var _16=function(_17){
3572return mc.Color[_17+"Color"]();
3573};
3574return mb.map(_16,_15);
3575},baseDarkPrimaryColors:function(){
3576var _18=MochiKit.Color.Color.fromHexString;
3577return [_18("#ad3f40"),_18("#ddac2c"),_18("#dfdd0c"),_18("#5276c4"),_18("#739c5a")];
3578},basePrimaryColors:function(){
3579var _19=MochiKit.Color.Color.fromHexString;
3580return [_19("#d24c4d"),_19("#f2b32f"),_19("#ece90e"),_19("#5d83da"),_19("#78a15d")];
3581},baseBlueColors:function(){
3582var _20=MochiKit.Color.Color.fromHexString;
3583return [_20("#4b6b94"),_20("#5d81b4"),_20("#acbad2")];
3584},palette:function(_21,_22,_23,_24){
3585var _25=MochiKit.Base.isUndefinedOrNull;
3586var _26=new Array();
3587if(_25(_24)){
3588_24=0.1;
078d1d29 3589}
79f17b42
DV
3590if(_25(_23)){
3591_23=0.4;
078d1d29 3592}
79f17b42
DV
3593if(_25(_22)){
3594_22=-0.2;
078d1d29 3595}
79f17b42
DV
3596var _27=_22;
3597while(_27<=_23){
3598_26.push(_27);
3599_27+=_24;
078d1d29 3600}
79f17b42
DV
3601var _28=function(_29,_30){
3602return _29.lighterColorWithLevel(_30);
078d1d29 3603};
79f17b42
DV
3604return MochiKit.Base.map(partial(_28,_21),_26);
3605},excanvasSupported:function(){
3606if(/MSIE/.test(navigator.userAgent)&&!window.opera){
3607return true;
078d1d29 3608}
79f17b42
DV
3609return false;
3610},findPosX:function(obj){
3611var _32=0;
3612if(obj.offsetParent){
3613while(obj.offsetParent){
3614_32+=obj.offsetLeft;
3615obj=obj.offsetParent;
078d1d29 3616}
078d1d29 3617}else{
79f17b42
DV
3618if(obj.x){
3619_32+=obj.x;
078d1d29 3620}
078d1d29 3621}
79f17b42
DV
3622return _32;
3623},findPosY:function(obj){
3624var _33=0;
3625if(obj.offsetParent){
3626while(obj.offsetParent){
3627_33+=obj.offsetTop;
3628obj=obj.offsetParent;
078d1d29 3629}
078d1d29 3630}else{
79f17b42
DV
3631if(obj.y){
3632_33+=obj.y;
078d1d29 3633}
078d1d29 3634}
79f17b42
DV
3635return _33;
3636},isFuncLike:function(obj){
3637return (typeof (obj)=="function");
3638}});
3639PlotKit.Base.map=function(fn,lst){
3640if(PlotKit.Base.usingPrototype()){
3641var _36=[];
3642for(var x in lst){
3643if(typeof (lst[x])=="function"){
3644continue;
078d1d29 3645}
79f17b42 3646_36.push(fn(lst[x]));
078d1d29 3647}
79f17b42 3648return _36;
078d1d29 3649}else{
79f17b42 3650return MochiKit.Base.map(fn,lst);
078d1d29 3651}
79f17b42
DV
3652};
3653PlotKit.Base.items=function(lst){
3654if(PlotKit.Base.usingPrototype()){
3655var _38=[];
3656for(var x in lst){
3657if(typeof (lst[x])=="function"){
3658continue;
078d1d29 3659}
79f17b42 3660_38.push([x,lst[x]]);
078d1d29 3661}
79f17b42 3662return _38;
078d1d29 3663}else{
79f17b42 3664return MochiKit.Base.items(lst);
078d1d29 3665}
79f17b42
DV
3666};
3667PlotKit.Base.keys=function(lst){
3668if(PlotKit.Base.usingPrototype()){
3669var _39=[];
3670for(var x in lst){
3671if(typeof (lst[x])=="function"){
3672continue;
078d1d29 3673}
79f17b42 3674_39.push(x);
078d1d29 3675}
79f17b42 3676return _39;
078d1d29 3677}else{
79f17b42 3678return MochiKit.Base.keys(lst);
078d1d29 3679}
79f17b42
DV
3680};
3681PlotKit.Base.baseColors=function(){
3682var _40=MochiKit.Color.Color.fromHexString;
3683return [_40("#476fb2"),_40("#be2c2b"),_40("#85b730"),_40("#734a99"),_40("#26a1c5"),_40("#fb8707"),_40("#000000")];
3684};
3685PlotKit.Base.officeBaseStyle={"axisLineWidth":2,"axisLabelColor":Color.grayColor(),"axisLineColor":Color.whiteColor(),"padding":{top:5,bottom:10,left:30,right:30}};
3686MochiKit.Base.update(PlotKit.Base,{officeBlue:function(){
3687var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"backgroundColor":PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45)};
3688MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3689return r;
3690},officeRed:function(){
3691var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"backgroundColor":PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5)};
3692MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3693return r;
3694},officeGreen:function(){
3695var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[2]),"backgroundColor":PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5)};
3696MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3697return r;
3698},officePurple:function(){
3699var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[3]),"backgroundColor":PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5)};
3700MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3701return r;
3702},officeCyan:function(){
3703var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[4]),"backgroundColor":PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5)};
3704MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3705return r;
3706},officeOrange:function(){
3707var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[5]),"backgroundColor":PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4)};
3708MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3709return r;
3710},officeBlack:function(){
3711var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[6],0,0.6),"backgroundColor":PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9)};
3712MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
3713return r;
3714}});
3715PlotKit.Base.EXPORT=["baseColors","collapse","colorScheme","findPosX","findPosY","officeBaseStyle","officeBlue","officeRed","officeGreen","officePurple","officeCyan","officeOrange","officeBlack","roundInterval","uniq","isFuncLike","excanvasSupported"];
3716PlotKit.Base.EXPORT_OK=[];
3717PlotKit.Base.__new__=function(){
3718var m=MochiKit.Base;
3719m.nameFunctions(this);
3720this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3721};
3722PlotKit.Base.__new__();
3723MochiKit.Base._exportSymbols(this,PlotKit.Base);
3724try{
3725if(typeof (PlotKit.Base)=="undefined"){
3726throw "";
078d1d29
DV
3727}
3728}
79f17b42
DV
3729catch(e){
3730throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base";
078d1d29 3731}
79f17b42
DV
3732if(typeof (PlotKit.Layout)=="undefined"){
3733PlotKit.Layout={};
078d1d29 3734}
79f17b42
DV
3735PlotKit.Layout.NAME="PlotKit.Layout";
3736PlotKit.Layout.VERSION=PlotKit.VERSION;
3737PlotKit.Layout.__repr__=function(){
3738return "["+this.NAME+" "+this.VERSION+"]";
3739};
3740PlotKit.Layout.toString=function(){
3741return this.__repr__();
3742};
3743PlotKit.Layout.valid_styles=["bar","line","pie","point"];
3744PlotKit.Layout=function(_42,_43){
3745this.options={"barWidthFillFraction":0.75,"barOrientation":"vertical","xOriginIsZero":true,"yOriginIsZero":true,"xAxis":null,"yAxis":null,"xTicks":null,"yTicks":null,"xNumberOfTicks":10,"yNumberOfTicks":5,"xTickPrecision":1,"yTickPrecision":1,"pieRadius":0.4};
3746this.style=_42;
3747MochiKit.Base.update(this.options,_43?_43:{});
3748if(!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)){
3749this.minxval=this.options.xAxis[0];
3750this.maxxval=this.options.xAxis[1];
3751this.xscale=this.maxxval-this.minxval;
3752}else{
3753this.minxval=0;
3754this.maxxval=null;
3755this.xscale=null;
078d1d29 3756}
79f17b42
DV
3757if(!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)){
3758this.minyval=this.options.yAxis[0];
3759this.maxyval=this.options.yAxis[1];
3760this.yscale=this.maxyval-this.minyval;
3761}else{
3762this.minyval=0;
3763this.maxyval=null;
3764this.yscale=null;
078d1d29 3765}
79f17b42
DV
3766this.bars=new Array();
3767this.points=new Array();
3768this.slices=new Array();
3769this.xticks=new Array();
3770this.yticks=new Array();
3771this.datasets=new Array();
3772this.minxdelta=0;
3773this.xrange=1;
3774this.yrange=1;
3775this.hitTestCache={x2maxy:null};
3776};
3777PlotKit.Layout.prototype.addDataset=function(_44,_45){
3778this.datasets[_44]=_45;
3779};
3780PlotKit.Layout.prototype.removeDataset=function(_46,_47){
3781delete this.datasets[_46];
3782};
3783PlotKit.Layout.prototype.addDatasetFromTable=function(_48,_49,_50,_51,_52){
3784var _53=MochiKit.Base.isUndefinedOrNull;
3785var _54=MochiKit.DOM.scrapeText;
3786var _55=MochiKit.Format.strip;
3787if(_53(_50)){
3788_50=0;
078d1d29 3789}
79f17b42
DV
3790if(_53(_51)){
3791_51=1;
078d1d29 3792}
79f17b42
DV
3793if(_53(_52)){
3794_52=-1;
078d1d29 3795}
79f17b42
DV
3796var _56=_49.tBodies[0].rows;
3797var _57=new Array();
3798var _58=new Array();
3799if(!_53(_56)){
3800for(var i=0;i<_56.length;i++){
3801_57.push([parseFloat(_55(_54(_56[i].cells[_50]))),parseFloat(_55(_54(_56[i].cells[_51])))]);
3802if(_52>=0){
3803_58.push({v:parseFloat(_55(_54(_56[i].cells[_50]))),label:_55(_54(_56[i].cells[_52]))});
078d1d29 3804}
078d1d29 3805}
79f17b42
DV
3806this.addDataset(_48,_57);
3807if(_52>=0){
3808this.options.xTicks=_58;
3809}
3810return true;
078d1d29 3811}
79f17b42
DV
3812return false;
3813};
3814PlotKit.Layout.prototype.evaluate=function(){
3815this._evaluateLimits();
3816this._evaluateScales();
3817if(this.style=="bar"){
3818if(this.options.barOrientation=="horizontal"){
3819this._evaluateHorizBarCharts();
078d1d29 3820}else{
79f17b42
DV
3821this._evaluateBarCharts();
3822}
3823this._evaluateBarTicks();
078d1d29 3824}else{
79f17b42
DV
3825if(this.style=="line"){
3826this._evaluateLineCharts();
3827this._evaluateLineTicks();
078d1d29 3828}else{
79f17b42
DV
3829if(this.style=="pie"){
3830this._evaluatePieCharts();
3831this._evaluatePieTicks();
078d1d29
DV
3832}
3833}
3834}
79f17b42
DV
3835};
3836PlotKit.Layout.prototype.hitTest=function(x,y){
3837var f=MochiKit.Format.twoDigitFloat;
3838if((this.style=="bar")&&this.bars&&(this.bars.length>0)){
3839for(var i=0;i<this.bars.length;i++){
3840var bar=this.bars[i];
3841if((x>=bar.x)&&(x<=bar.x+bar.w)&&(y>=bar.y)&&(y-bar.y<=bar.h)){
3842return bar;
3843}
078d1d29 3844}
078d1d29 3845}else{
79f17b42
DV
3846if(this.style=="line"){
3847if(this.hitTestCache.x2maxy==null){
3848this._regenerateHitTestCache();
3849}
3850var _62=x/this.xscale;
3851var _63=this.hitTestCache.xvalues;
3852var _64=null;
3853var _65=null;
3854for(var i=1;i<_63.length;i++){
3855if(_63[i]>_62){
3856_64=_63[i-1];
3857_65=_63[i];
078d1d29
DV
3858break;
3859}
3860}
79f17b42
DV
3861if((_64!=null)){
3862var _66=this.hitTestCache.x2maxy[_64];
3863var _67=this.hitTestCache.x2maxy[_65];
3864var _68=(1-y)/this.yscale;
3865var _69=(_67-_66)/(_65-_64);
3866var _70=_66+_69*(_62-_64);
3867if(_70>=_68){
3868var obj={xval:_62,yval:_68,xafter:_65,yafter:_67,xbefore:_64,ybefore:_66,yprojected:_70};
3869return obj;
3870}
078d1d29 3871}
078d1d29 3872}else{
79f17b42
DV
3873if(this.style=="pie"){
3874var _71=Math.sqrt((y-0.5)*(y-0.5)+(x-0.5)*(x-0.5));
3875if(_71>this.options.pieRadius){
3876return null;
078d1d29 3877}
79f17b42
DV
3878var _72=Math.atan2(y-0.5,x-0.5)-Math.PI/2;
3879for(var i=0;i<this.slices.length;i++){
3880var _73=this.slices[i];
3881if(_73.startAngle<_72&&_73.endAngle>=_72){
3882return _73;
078d1d29 3883}
078d1d29
DV
3884}
3885}
078d1d29 3886}
078d1d29 3887}
79f17b42
DV
3888return null;
3889};
3890PlotKit.Layout.prototype.rectForX=function(x){
3891return null;
3892};
3893PlotKit.Layout.prototype.angleRangeForX=function(x){
3894return null;
3895};
3896PlotKit.Layout.prototype._evaluateLimits=function(){
3897var map=PlotKit.Base.map;
3898var _75=PlotKit.Base.items;
3899var _76=MochiKit.Base.itemgetter;
3900var _77=PlotKit.Base.collapse;
3901var _78=MochiKit.Base.listMin;
3902var _79=MochiKit.Base.listMax;
3903var _80=MochiKit.Base.isUndefinedOrNull;
3904var all=_77(map(_76(1),_75(this.datasets)));
3905if(_80(this.options.xAxis)){
3906if(this.options.xOriginIsZero){
3907this.minxval=0;
3908}else{
3909this.minxval=_78(map(parseFloat,map(_76(0),all)));
078d1d29 3910}
79f17b42
DV
3911this.maxxval=_79(map(parseFloat,map(_76(0),all)));
3912}else{
3913this.minxval=this.options.xAxis[0];
3914this.maxxval=this.options.xAxis[1];
3915this.xscale=this.maxval-this.minxval;
078d1d29 3916}
79f17b42
DV
3917if(_80(this.options.yAxis)){
3918if(this.options.yOriginIsZero){
3919this.minyval=0;
078d1d29 3920}else{
79f17b42
DV
3921this.minyval=_78(map(parseFloat,map(_76(1),all)));
3922}
3923this.maxyval=_79(map(parseFloat,map(_76(1),all)));
078d1d29 3924}else{
79f17b42
DV
3925this.minyval=this.options.yAxis[0];
3926this.maxyval=this.options.yAxis[1];
3927this.yscale=this.maxyval-this.minyval;
078d1d29 3928}
79f17b42
DV
3929};
3930PlotKit.Layout.prototype._evaluateScales=function(){
3931var _82=MochiKit.Base.isUndefinedOrNull;
3932this.xrange=this.maxxval-this.minxval;
3933if(this.xrange==0){
3934this.xscale=1;
078d1d29 3935}else{
79f17b42
DV
3936this.xscale=1/this.xrange;
3937}
3938this.yrange=this.maxyval-this.minyval;
3939if(this.yrange==0){
3940this.yscale=1;
078d1d29 3941}else{
79f17b42 3942this.yscale=1/this.yrange;
078d1d29 3943}
79f17b42
DV
3944};
3945PlotKit.Layout.prototype._uniqueXValues=function(){
3946var _83=PlotKit.Base.collapse;
3947var map=PlotKit.Base.map;
3948var _84=PlotKit.Base.uniq;
3949var _85=MochiKit.Base.itemgetter;
3950var _86=PlotKit.Base.items;
3951var _87=map(parseFloat,map(_85(0),_83(map(_85(1),_86(this.datasets)))));
3952_87.sort(MochiKit.Base.compare);
3953return _84(_87);
3954};
3955PlotKit.Layout.prototype._evaluateBarCharts=function(){
3956var _88=PlotKit.Base.items;
3957var _89=_88(this.datasets).length;
3958var _90=10000000;
3959var _91=this._uniqueXValues();
3960for(var i=1;i<_91.length;i++){
3961_90=Math.min(Math.abs(_91[i]-_91[i-1]),_90);
078d1d29 3962}
79f17b42
DV
3963var _92=0;
3964var _93=0;
3965var _94=0;
3966if(_91.length==1){
3967_90=1;
3968this.xscale=1;
3969this.minxval=_91[0];
3970_92=1*this.options.barWidthFillFraction;
3971_93=_92/_89;
3972_94=(1-this.options.barWidthFillFraction)/2;
3973}else{
3974if(this.xrange==1){
3975this.xscale=0.5;
3976}else{
3977if(this.xrange==2){
3978this.xscale=1/3;
3979}else{
3980this.xscale=(1-_90/this.xrange)/this.xrange;
078d1d29 3981}
078d1d29 3982}
79f17b42
DV
3983_92=_90*this.xscale*this.options.barWidthFillFraction;
3984_93=_92/_89;
3985_94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2;
078d1d29 3986}
79f17b42
DV
3987this.minxdelta=_90;
3988this.bars=new Array();
3989var i=0;
3990for(var _95 in this.datasets){
3991var _96=this.datasets[_95];
3992if(PlotKit.Base.isFuncLike(_96)){
3993continue;
078d1d29 3994}
79f17b42
DV
3995for(var j=0;j<_96.length;j++){
3996var _98=_96[j];
3997var _99={x:((parseFloat(_98[0])-this.minxval)*this.xscale)+(i*_93)+_94,y:1-((parseFloat(_98[1])-this.minyval)*this.yscale),w:_93,h:((parseFloat(_98[1])-this.minyval)*this.yscale),xval:parseFloat(_98[0]),yval:parseFloat(_98[1]),name:_95};
3998if((_99.x>=0)&&(_99.x<=1)&&(_99.y>=0)&&(_99.y<=1)){
3999this.bars.push(_99);
078d1d29 4000}
078d1d29 4001}
79f17b42 4002i++;
078d1d29 4003}
078d1d29 4004};
79f17b42
DV
4005PlotKit.Layout.prototype._evaluateHorizBarCharts=function(){
4006var _100=PlotKit.Base.items;
4007var _101=_100(this.datasets).length;
4008var _102=10000000;
4009var _103=this._uniqueXValues();
4010for(var i=1;i<_103.length;i++){
4011_102=Math.min(Math.abs(_103[i]-_103[i-1]),_102);
078d1d29 4012}
79f17b42
DV
4013var _104=0;
4014var _105=0;
4015var _106=0;
4016if(_103.length==1){
4017_102=1;
4018this.xscale=1;
4019this.minxval=_103[0];
4020_104=1*this.options.barWidthFillFraction;
4021_105=_104/_101;
4022_106=(1-this.options.barWidthFillFraction)/2;
4023}else{
4024this.xscale=(1-_102/this.xrange)/this.xrange;
4025_104=_102*this.xscale*this.options.barWidthFillFraction;
4026_105=_104/_101;
4027_106=_102*this.xscale*(1-this.options.barWidthFillFraction)/2;
078d1d29 4028}
79f17b42
DV
4029this.minxdelta=_102;
4030this.bars=new Array();
4031var i=0;
4032for(var _107 in this.datasets){
4033var _108=this.datasets[_107];
4034if(PlotKit.Base.isFuncLike(_108)){
4035continue;
078d1d29 4036}
79f17b42
DV
4037for(var j=0;j<_108.length;j++){
4038var item=_108[j];
4039var rect={y:((parseFloat(item[0])-this.minxval)*this.xscale)+(i*_105)+_106,x:0,h:_105,w:((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_107};
4040if(rect.y<=0){
4041rect.y=0;
078d1d29 4042}
79f17b42
DV
4043if(rect.y>=1){
4044rect.y=1;
078d1d29 4045}
79f17b42
DV
4046if((rect.x>=0)&&(rect.x<=1)){
4047this.bars.push(rect);
078d1d29 4048}
078d1d29 4049}
79f17b42 4050i++;
078d1d29 4051}
79f17b42
DV
4052};
4053PlotKit.Layout.prototype._evaluateLineCharts=function(){
4054var _111=PlotKit.Base.items;
4055var _112=_111(this.datasets).length;
4056this.points=new Array();
4057var i=0;
4058for(var _113 in this.datasets){
4059var _114=this.datasets[_113];
4060if(PlotKit.Base.isFuncLike(_114)){
4061continue;
078d1d29 4062}
79f17b42
DV
4063_114.sort(function(a,b){
4064return compare(parseFloat(a[0]),parseFloat(b[0]));
4065});
4066for(var j=0;j<_114.length;j++){
4067var item=_114[j];
4068var _117={x:((parseFloat(item[0])-this.minxval)*this.xscale),y:1-((parseFloat(item[1])-this.minyval)*this.yscale),xval:parseFloat(item[0]),yval:parseFloat(item[1]),name:_113};
4069if(_117.y<=0){
4070_117.y=0;
078d1d29 4071}
79f17b42
DV
4072if(_117.y>=1){
4073_117.y=1;
078d1d29 4074}
79f17b42
DV
4075if((_117.x>=0)&&(_117.x<=1)){
4076this.points.push(_117);
078d1d29 4077}
078d1d29 4078}
79f17b42
DV
4079i++;
4080}
078d1d29 4081};
79f17b42
DV
4082PlotKit.Layout.prototype._evaluatePieCharts=function(){
4083var _118=PlotKit.Base.items;
4084var sum=MochiKit.Iter.sum;
4085var _120=MochiKit.Base.itemgetter;
4086var _121=_118(this.datasets).length;
4087var _122=_118(this.datasets)[0][1];
4088var _123=sum(map(_120(1),_122));
4089this.slices=new Array();
4090var _124=0;
4091for(var i=0;i<_122.length;i++){
4092var _125=_122[i][1]/_123;
4093var _126=_124*Math.PI*2;
4094var _127=(_124+_125)*Math.PI*2;
4095var _128={fraction:_125,xval:_122[i][0],yval:_122[i][1],startAngle:_126,endAngle:_127};
4096if(_122[i][1]!=0){
4097this.slices.push(_128);
078d1d29 4098}
79f17b42 4099_124+=_125;
078d1d29 4100}
078d1d29 4101};
79f17b42
DV
4102PlotKit.Layout.prototype._evaluateLineTicksForXAxis=function(){
4103var _129=MochiKit.Base.isUndefinedOrNull;
4104if(this.options.xTicks){
4105this.xticks=new Array();
4106var _130=function(tick){
4107var _132=tick.label;
4108if(_129(_132)){
4109_132=tick.v.toString();
078d1d29 4110}
79f17b42
DV
4111var pos=this.xscale*(tick.v-this.minxval);
4112if((pos>=0)&&(pos<=1)){
4113this.xticks.push([pos,_132]);
078d1d29 4114}
79f17b42
DV
4115};
4116MochiKit.Iter.forEach(this.options.xTicks,bind(_130,this));
4117}else{
4118if(this.options.xNumberOfTicks){
4119var _134=this._uniqueXValues();
4120var _135=this.xrange/this.options.xNumberOfTicks;
4121var _136=0;
4122this.xticks=new Array();
4123for(var i=0;i<=_134.length;i++){
4124if((_134[i]-this.minxval)>=(_136*_135)){
4125var pos=this.xscale*(_134[i]-this.minxval);
4126if((pos>1)||(pos<0)){
078d1d29
DV
4127continue;
4128}
79f17b42
DV
4129this.xticks.push([pos,_134[i]]);
4130_136++;
078d1d29 4131}
79f17b42
DV
4132if(_136>this.options.xNumberOfTicks){
4133break;
078d1d29 4134}
078d1d29
DV
4135}
4136}
4137}
79f17b42
DV
4138};
4139PlotKit.Layout.prototype._evaluateLineTicksForYAxis=function(){
4140var _137=MochiKit.Base.isUndefinedOrNull;
4141if(this.options.yTicks){
4142this.yticks=new Array();
4143var _138=function(tick){
4144var _139=tick.label;
4145if(_137(_139)){
4146_139=tick.v.toString();
078d1d29 4147}
79f17b42
DV
4148var pos=1-(this.yscale*(tick.v-this.minyval));
4149if((pos>=0)&&(pos<=1)){
4150this.yticks.push([pos,_139]);
078d1d29
DV
4151}
4152};
79f17b42
DV
4153MochiKit.Iter.forEach(this.options.yTicks,bind(_138,this));
4154}else{
4155if(this.options.yNumberOfTicks){
4156this.yticks=new Array();
4157var _140=PlotKit.Base.roundInterval;
4158var prec=this.options.yTickPrecision;
4159var _142=_140(this.yrange,this.options.yNumberOfTicks,prec);
4160for(var i=0;i<=this.options.yNumberOfTicks;i++){
4161var yval=this.minyval+(i*_142);
4162var pos=1-((yval-this.minyval)*this.yscale);
4163if((pos>1)||(pos<0)){
4164continue;
078d1d29 4165}
79f17b42 4166this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]);
078d1d29 4167}
078d1d29
DV
4168}
4169}
078d1d29 4170};
79f17b42
DV
4171PlotKit.Layout.prototype._evaluateLineTicks=function(){
4172this._evaluateLineTicksForXAxis();
4173this._evaluateLineTicksForYAxis();
078d1d29 4174};
79f17b42
DV
4175PlotKit.Layout.prototype._evaluateBarTicks=function(){
4176this._evaluateLineTicks();
4177var _144=function(tick){
4178return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]];
078d1d29 4179};
79f17b42
DV
4180this.xticks=MochiKit.Base.map(bind(_144,this),this.xticks);
4181if(this.options.barOrientation=="horizontal"){
4182var _145=this.xticks;
4183this.xticks=this.yticks;
4184this.yticks=_145;
4185var _146=function(tick){
4186return [1-tick[0],tick[1]];
078d1d29 4187};
79f17b42 4188this.xticks=MochiKit.Base.map(_146,this.xticks);
078d1d29
DV
4189}
4190};
79f17b42
DV
4191PlotKit.Layout.prototype._evaluatePieTicks=function(){
4192var _147=MochiKit.Base.isUndefinedOrNull;
4193var _148=MochiKit.Format.numberFormatter("#%");
4194this.xticks=new Array();
4195if(this.options.xTicks){
4196var _149=new Array();
4197for(var i=0;i<this.slices.length;i++){
4198_149[this.slices[i].xval]=this.slices[i];
078d1d29 4199}
79f17b42
DV
4200for(var i=0;i<this.options.xTicks.length;i++){
4201var tick=this.options.xTicks[i];
4202var _150=_149[tick.v];
4203var _151=tick.label;
4204if(_150){
4205if(_147(_151)){
4206_151=tick.v.toString();
078d1d29 4207}
79f17b42
DV
4208_151+=" ("+_148(_150.fraction)+")";
4209this.xticks.push([tick.v,_151]);
078d1d29 4210}
078d1d29 4211}
79f17b42
DV
4212}else{
4213for(var i=0;i<this.slices.length;i++){
4214var _150=this.slices[i];
4215var _151=_150.xval+" ("+_148(_150.fraction)+")";
4216this.xticks.push([_150.xval,_151]);
078d1d29 4217}
078d1d29 4218}
078d1d29 4219};
79f17b42
DV
4220PlotKit.Layout.prototype._regenerateHitTestCache=function(){
4221this.hitTestCache.xvalues=this._uniqueXValues();
4222this.hitTestCache.xlookup=new Array();
4223this.hitTestCache.x2maxy=new Array();
4224var _152=MochiKit.Base.listMax;
4225var _153=MochiKit.Base.itemgetter;
4226var map=MochiKit.Base.map;
4227var _154=keys(this.datasets);
4228for(var i=0;i<_154.length;i++){
4229var _155=this.datasets[_154[i]];
4230for(var j=0;j<_155.length;j++){
4231var xval=_155[j][0];
4232var yval=_155[j][1];
4233if(this.hitTestCache.xlookup[xval]){
4234this.hitTestCache.xlookup[xval].push([yval,_154[i]]);
078d1d29 4235}else{
79f17b42 4236this.hitTestCache.xlookup[xval]=[[yval,_154[i]]];
078d1d29 4237}
078d1d29 4238}
078d1d29 4239}
79f17b42
DV
4240for(var x in this.hitTestCache.xlookup){
4241var _157=this.hitTestCache.xlookup[x];
4242this.hitTestCache.x2maxy[x]=_152(map(_153(0),_157));
078d1d29 4243}
078d1d29 4244};
79f17b42
DV
4245PlotKit.LayoutModule={};
4246PlotKit.LayoutModule.Layout=PlotKit.Layout;
4247PlotKit.LayoutModule.EXPORT=["Layout"];
4248PlotKit.LayoutModule.EXPORT_OK=[];
4249PlotKit.LayoutModule.__new__=function(){
078d1d29
DV
4250var m=MochiKit.Base;
4251m.nameFunctions(this);
4252this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4253};
79f17b42
DV
4254PlotKit.LayoutModule.__new__();
4255MochiKit.Base._exportSymbols(this,PlotKit.LayoutModule);
078d1d29 4256try{
79f17b42 4257if((typeof (PlotKit.Base)=="undefined")||(typeof (PlotKit.Layout)=="undefined")){
078d1d29
DV
4258throw "";
4259}
4260}
4261catch(e){
79f17b42 4262throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Base,Layout}";
078d1d29 4263}
79f17b42
DV
4264if(typeof (PlotKit.CanvasRenderer)=="undefined"){
4265PlotKit.CanvasRenderer={};
078d1d29 4266}
79f17b42
DV
4267PlotKit.CanvasRenderer.NAME="PlotKit.CanvasRenderer";
4268PlotKit.CanvasRenderer.VERSION=PlotKit.VERSION;
4269PlotKit.CanvasRenderer.__repr__=function(){
078d1d29
DV
4270return "["+this.NAME+" "+this.VERSION+"]";
4271};
79f17b42 4272PlotKit.CanvasRenderer.toString=function(){
078d1d29
DV
4273return this.__repr__();
4274};
79f17b42
DV
4275PlotKit.CanvasRenderer=function(_158,_159,_160){
4276if(arguments.length>0){
4277this.__init__(_158,_159,_160);
4278}
4279};
4280PlotKit.CanvasRenderer.prototype.__init__=function(_161,_162,_163){
4281var _164=MochiKit.Base.isUndefinedOrNull;
4282var _165=MochiKit.Color.Color;
4283this.options={"drawBackground":true,"backgroundColor":_165.whiteColor(),"padding":{left:30,right:30,top:5,bottom:10},"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"strokeColor":_165.whiteColor(),"strokeColorTransform":"asStrokeColor","strokeWidth":0.5,"shouldFill":true,"shouldStroke":true,"drawXAxis":true,"drawYAxis":true,"axisLineColor":_165.blackColor(),"axisLineWidth":0.5,"axisTickSize":3,"axisLabelColor":_165.blackColor(),"axisLabelFont":"Arial","axisLabelFontSize":9,"axisLabelWidth":50,"pieRadius":0.4,"enableEvents":true};
4284MochiKit.Base.update(this.options,_163?_163:{});
4285this.layout=_162;
4286this.element=MochiKit.DOM.getElement(_161);
078d1d29 4287this.container=this.element.parentNode;
79f17b42
DV
4288this.isIE=PlotKit.Base.excanvasSupported();
4289if(this.isIE&&!_164(G_vmlCanvasManager)){
4290this.IEDelay=0.5;
4291this.maxTries=5;
4292this.renderDelay=null;
4293this.clearDelay=null;
4294this.element=G_vmlCanvasManager.initElement(this.element);
078d1d29 4295}
79f17b42
DV
4296this.height=this.element.height;
4297this.width=this.element.width;
4298if(_164(this.element)){
4299throw "CanvasRenderer() - passed canvas is not found";
078d1d29 4300}
79f17b42
DV
4301if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){
4302throw "CanvasRenderer() - Canvas is not supported.";
078d1d29 4303}
79f17b42
DV
4304if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){
4305throw "CanvasRenderer() - <canvas> needs to be enclosed in <div>";
078d1d29
DV
4306}
4307this.xlabels=new Array();
4308this.ylabels=new Array();
79f17b42 4309this.isFirstRender=true;
078d1d29
DV
4310this.area={x:this.options.padding.left,y:this.options.padding.top,w:this.width-this.options.padding.left-this.options.padding.right,h:this.height-this.options.padding.top-this.options.padding.bottom};
4311MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}});
4312};
79f17b42
DV
4313PlotKit.CanvasRenderer.prototype.render=function(){
4314if(this.isIE){
4315try{
4316if(this.renderDelay){
4317this.renderDelay.cancel();
4318this.renderDelay=null;
4319}
4320var _166=this.element.getContext("2d");
4321}
4322catch(e){
4323this.isFirstRender=false;
4324if(this.maxTries-->0){
4325this.renderDelay=MochiKit.Async.wait(this.IEDelay);
4326this.renderDelay.addCallback(bind(this.render,this));
4327}
4328return;
4329}
4330}
078d1d29
DV
4331if(this.options.drawBackground){
4332this._renderBackground();
4333}
4334if(this.layout.style=="bar"){
4335this._renderBarChart();
4336this._renderBarAxis();
4337}else{
4338if(this.layout.style=="pie"){
4339this._renderPieChart();
4340this._renderPieAxis();
4341}else{
4342if(this.layout.style=="line"){
4343this._renderLineChart();
4344this._renderLineAxis();
4345}
4346}
4347}
4348};
79f17b42
DV
4349PlotKit.CanvasRenderer.prototype._renderBarChartWrap=function(data,_168){
4350var _169=this.element.getContext("2d");
4351var _170=this.options.colorScheme.length;
4352var _171=this.options.colorScheme;
4353var _172=MochiKit.Base.keys(this.layout.datasets);
4354var _173=_172.length;
4355for(var i=0;i<_173;i++){
4356var _174=_172[i];
4357var _175=_171[i%_170];
4358_169.save();
4359_169.fillStyle=_175.toRGBString();
078d1d29 4360if(this.options.strokeColor){
79f17b42 4361_169.strokeStyle=this.options.strokeColor.toRGBString();
078d1d29
DV
4362}else{
4363if(this.options.strokeColorTransform){
79f17b42 4364_169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString();
078d1d29 4365}
078d1d29 4366}
79f17b42
DV
4367_169.lineWidth=this.options.strokeWidth;
4368var _176=function(obj){
4369if(obj.name==_174){
4370_168(_169,obj);
078d1d29
DV
4371}
4372};
79f17b42
DV
4373MochiKit.Iter.forEach(data,bind(_176,this));
4374_169.restore();
078d1d29
DV
4375}
4376};
79f17b42 4377PlotKit.CanvasRenderer.prototype._renderBarChart=function(){
078d1d29 4378var bind=MochiKit.Base.bind;
79f17b42 4379var _178=function(_179,bar){
078d1d29
DV
4380var x=this.area.w*bar.x+this.area.x;
4381var y=this.area.h*bar.y+this.area.y;
4382var w=this.area.w*bar.w;
4383var h=this.area.h*bar.h;
79f17b42
DV
4384if((w<1)||(h<1)){
4385return;
4386}
4387if(this.options.shouldFill){
4388_179.fillRect(x,y,w,h);
4389}
4390if(this.options.shouldStroke){
4391_179.strokeRect(x,y,w,h);
4392}
078d1d29 4393};
79f17b42 4394this._renderBarChartWrap(this.layout.bars,bind(_178,this));
078d1d29 4395};
79f17b42
DV
4396PlotKit.CanvasRenderer.prototype._renderLineChart=function(){
4397var _182=this.element.getContext("2d");
4398var _183=this.options.colorScheme.length;
4399var _184=this.options.colorScheme;
4400var _185=MochiKit.Base.keys(this.layout.datasets);
4401var _186=_185.length;
078d1d29 4402var bind=MochiKit.Base.bind;
79f17b42
DV
4403var _187=MochiKit.Base.partial;
4404for(var i=0;i<_186;i++){
4405var _188=_185[i];
4406var _189=_184[i%_183];
4407var _190=this.options.strokeColorTransform;
4408_182.save();
4409_182.fillStyle=_189.toRGBString();
078d1d29 4410if(this.options.strokeColor){
79f17b42 4411_182.strokeStyle=this.options.strokeColor.toRGBString();
078d1d29
DV
4412}else{
4413if(this.options.strokeColorTransform){
79f17b42 4414_182.strokeStyle=_189[_190]().toRGBString();
078d1d29
DV
4415}
4416}
79f17b42
DV
4417_182.lineWidth=this.options.strokeWidth;
4418var _191=function(ctx){
4419ctx.beginPath();
4420ctx.moveTo(this.area.x,this.area.y+this.area.h);
4421var _193=function(ctx_,_195){
4422if(_195.name==_188){
4423ctx_.lineTo(this.area.w*_195.x+this.area.x,this.area.h*_195.y+this.area.y);
4424}
4425};
4426MochiKit.Iter.forEach(this.layout.points,_187(_193,ctx),this);
4427ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y);
4428ctx.lineTo(this.area.x,this.area.y+this.area.h);
4429ctx.closePath();
4430};
4431if(this.options.shouldFill){
4432bind(_191,this)(_182);
4433_182.fill();
078d1d29 4434}
79f17b42
DV
4435if(this.options.shouldStroke){
4436bind(_191,this)(_182);
4437_182.stroke();
4438}
4439_182.restore();
4440}
4441};
4442PlotKit.CanvasRenderer.prototype._renderPieChart=function(){
4443var _196=this.element.getContext("2d");
4444var _197=this.options.colorScheme.length;
4445var _198=this.layout.slices;
4446var _199=this.area.x+this.area.w*0.5;
4447var _200=this.area.y+this.area.h*0.5;
4448var _201=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
4449if(this.isIE){
4450_199=parseInt(_199);
4451_200=parseInt(_200);
4452_201=parseInt(_201);
078d1d29 4453}
79f17b42
DV
4454for(var i=0;i<_198.length;i++){
4455var _202=this.options.colorScheme[i%_197];
4456_196.save();
4457_196.fillStyle=_202.toRGBString();
4458var _203=function(){
4459_196.beginPath();
4460_196.moveTo(_199,_200);
4461_196.arc(_199,_200,_201,_198[i].startAngle-Math.PI/2,_198[i].endAngle-Math.PI/2,false);
4462_196.lineTo(_199,_200);
4463_196.closePath();
4464};
4465if(Math.abs(_198[i].startAngle-_198[i].endAngle)>0.001){
078d1d29 4466if(this.options.shouldFill){
79f17b42
DV
4467_203();
4468_196.fill();
078d1d29 4469}
79f17b42
DV
4470if(this.options.shouldStroke){
4471_203();
4472_196.lineWidth=this.options.strokeWidth;
078d1d29 4473if(this.options.strokeColor){
79f17b42 4474_196.strokeStyle=this.options.strokeColor.toRGBString();
078d1d29
DV
4475}else{
4476if(this.options.strokeColorTransform){
79f17b42 4477_196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString();
078d1d29
DV
4478}
4479}
79f17b42 4480_196.stroke();
078d1d29 4481}
078d1d29 4482}
79f17b42 4483_196.restore();
078d1d29
DV
4484}
4485};
79f17b42 4486PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){
078d1d29
DV
4487this._renderAxis();
4488};
79f17b42 4489PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){
078d1d29
DV
4490this._renderAxis();
4491};
79f17b42 4492PlotKit.CanvasRenderer.prototype._renderAxis=function(){
078d1d29
DV
4493if(!this.options.drawXAxis&&!this.options.drawYAxis){
4494return;
4495}
79f17b42
DV
4496var _204=this.element.getContext("2d");
4497var _205={"style":{"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}};
4498_204.save();
4499_204.strokeStyle=this.options.axisLineColor.toRGBString();
4500_204.lineWidth=this.options.axisLineWidth;
078d1d29
DV
4501if(this.options.drawYAxis){
4502if(this.layout.yticks){
79f17b42
DV
4503var _206=function(tick){
4504if(typeof (tick)=="function"){
4505return;
4506}
078d1d29
DV
4507var x=this.area.x;
4508var y=this.area.y+tick[0]*this.area.h;
79f17b42
DV
4509_204.beginPath();
4510_204.moveTo(x,y);
4511_204.lineTo(x-this.options.axisTickSize,y);
4512_204.closePath();
4513_204.stroke();
4514var _207=DIV(_205,tick[1]);
4515_207.style.top=(y-this.options.axisLabelFontSize)+"px";
4516_207.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px";
4517_207.style.textAlign="right";
4518_207.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px";
4519MochiKit.DOM.appendChildNodes(this.container,_207);
4520this.ylabels.push(_207);
078d1d29 4521};
79f17b42 4522MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this));
078d1d29 4523}
79f17b42
DV
4524_204.beginPath();
4525_204.moveTo(this.area.x,this.area.y);
4526_204.lineTo(this.area.x,this.area.y+this.area.h);
4527_204.closePath();
4528_204.stroke();
078d1d29
DV
4529}
4530if(this.options.drawXAxis){
4531if(this.layout.xticks){
79f17b42
DV
4532var _206=function(tick){
4533if(typeof (dataset)=="function"){
4534return;
4535}
078d1d29
DV
4536var x=this.area.x+tick[0]*this.area.w;
4537var y=this.area.y+this.area.h;
79f17b42
DV
4538_204.beginPath();
4539_204.moveTo(x,y);
4540_204.lineTo(x,y+this.options.axisTickSize);
4541_204.closePath();
4542_204.stroke();
4543var _208=DIV(_205,tick[1]);
4544_208.style.top=(y+this.options.axisTickSize)+"px";
4545_208.style.left=(x-this.options.axisLabelWidth/2)+"px";
4546_208.style.textAlign="center";
4547_208.style.width=this.options.axisLabelWidth+"px";
4548MochiKit.DOM.appendChildNodes(this.container,_208);
4549this.xlabels.push(_208);
4550};
4551MochiKit.Iter.forEach(this.layout.xticks,bind(_206,this));
4552}
4553_204.beginPath();
4554_204.moveTo(this.area.x,this.area.y+this.area.h);
4555_204.lineTo(this.area.x+this.area.w,this.area.y+this.area.h);
4556_204.closePath();
4557_204.stroke();
078d1d29 4558}
79f17b42 4559_204.restore();
078d1d29 4560};
79f17b42
DV
4561PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){
4562if(!this.options.drawXAxis){
4563return;
078d1d29 4564}
078d1d29 4565if(this.layout.xticks){
79f17b42 4566var _209=new Array();
078d1d29 4567for(var i=0;i<this.layout.slices.length;i++){
79f17b42 4568_209[this.layout.slices[i].xval]=this.layout.slices[i];
078d1d29 4569}
79f17b42
DV
4570var _210=this.area.x+this.area.w*0.5;
4571var _211=this.area.y+this.area.h*0.5;
4572var _212=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
4573var _213=this.options.axisLabelWidth;
078d1d29 4574for(var i=0;i<this.layout.xticks.length;i++){
79f17b42
DV
4575var _214=_209[this.layout.xticks[i][0]];
4576if(MochiKit.Base.isUndefinedOrNull(_214)){
078d1d29
DV
4577continue;
4578}
79f17b42
DV
4579var _215=(_214.startAngle+_214.endAngle)/2;
4580var _216=_215;
4581if(_216>Math.PI*2){
4582_216=_216-Math.PI*2;
078d1d29 4583}else{
79f17b42
DV
4584if(_216<0){
4585_216=_216+Math.PI*2;
078d1d29
DV
4586}
4587}
79f17b42
DV
4588var _217=_210+Math.sin(_216)*(_212+10);
4589var _218=_211-Math.cos(_216)*(_212+10);
4590var _219={"position":"absolute","zIndex":11,"width":_213+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()};
4591if(_216<=Math.PI*0.5){
4592_219["textAlign"]="left";
4593_219["verticalAlign"]="top";
4594_219["left"]=_217+"px";
4595_219["top"]=(_218-this.options.axisLabelFontSize)+"px";
078d1d29 4596}else{
79f17b42
DV
4597if((_216>Math.PI*0.5)&&(_216<=Math.PI)){
4598_219["textAlign"]="left";
4599_219["verticalAlign"]="bottom";
4600_219["left"]=_217+"px";
4601_219["top"]=_218+"px";
078d1d29 4602}else{
79f17b42
DV
4603if((_216>Math.PI)&&(_216<=Math.PI*1.5)){
4604_219["textAlign"]="right";
4605_219["verticalAlign"]="bottom";
4606_219["left"]=(_217-_213)+"px";
4607_219["top"]=_218+"px";
078d1d29 4608}else{
79f17b42
DV
4609_219["textAlign"]="right";
4610_219["verticalAlign"]="bottom";
4611_219["left"]=(_217-_213)+"px";
4612_219["top"]=(_218-this.options.axisLabelFontSize)+"px";
078d1d29 4613}
078d1d29
DV
4614}
4615}
79f17b42
DV
4616var _220=DIV({"style":_219},this.layout.xticks[i][1]);
4617this.xlabels.push(_220);
4618MochiKit.DOM.appendChildNodes(this.container,_220);
078d1d29 4619}
078d1d29 4620}
078d1d29 4621};
79f17b42
DV
4622PlotKit.CanvasRenderer.prototype._renderBackground=function(){
4623var _221=this.element.getContext("2d");
4624_221.save();
4625_221.fillStyle=this.options.backgroundColor.toRGBString();
4626_221.fillRect(0,0,this.width,this.height);
4627_221.restore();
078d1d29 4628};
79f17b42
DV
4629PlotKit.CanvasRenderer.prototype.clear=function(){
4630if(this.isIE){
4631try{
4632if(this.clearDelay){
4633this.clearDelay.cancel();
4634this.clearDelay=null;
078d1d29 4635}
79f17b42 4636var _222=this.element.getContext("2d");
078d1d29 4637}
79f17b42
DV
4638catch(e){
4639this.isFirstRender=false;
4640this.clearDelay=MochiKit.Async.wait(this.IEDelay);
4641this.clearDelay.addCallback(bind(this.clear,this));
4642return;
078d1d29
DV
4643}
4644}
79f17b42
DV
4645var _222=this.element.getContext("2d");
4646_222.clearRect(0,0,this.width,this.height);
4647MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement);
4648MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement);
078d1d29
DV
4649this.xlabels=new Array();
4650this.ylabels=new Array();
4651};
79f17b42
DV
4652PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){
4653var _223=MochiKit.Signal.connect;
4654var bind=MochiKit.Base.bind;
4655_223(this.element,"onclick",bind(this.onclick,this));
078d1d29 4656};
79f17b42
DV
4657PlotKit.CanvasRenderer.prototype._resolveObject=function(e){
4658var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w;
4659var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h;
4660var _225=this.layout.hitTest(x,y);
4661if(_225){
4662return _225;
078d1d29 4663}
79f17b42 4664return null;
078d1d29 4665};
79f17b42
DV
4666PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){
4667if(_226==null){
4668return null;
078d1d29 4669}
79f17b42
DV
4670e.chart=_226;
4671return e;
078d1d29 4672};
79f17b42
DV
4673PlotKit.CanvasRenderer.prototype.onclick=function(e){
4674var _227=this._resolveObject(e);
4675var _228=this._createEventObject(_227,e);
4676if(_228!=null){
4677MochiKit.Signal.signal(this,"onclick",_228);
078d1d29 4678}
078d1d29 4679};
79f17b42
DV
4680PlotKit.CanvasRenderer.prototype.onmouseover=function(e){
4681var _229=this._resolveObject(e);
4682var _230=this._createEventObject(_229,e);
4683if(_230!=null){
4684signal(this,"onmouseover",_230);
078d1d29
DV
4685}
4686};
79f17b42
DV
4687PlotKit.CanvasRenderer.prototype.onmouseout=function(e){
4688var _231=this._resolveObject(e);
4689var _232=this._createEventObject(_231,e);
4690if(_232==null){
4691signal(this,"onmouseout",e);
078d1d29 4692}else{
79f17b42 4693signal(this,"onmouseout",_232);
078d1d29
DV
4694}
4695};
79f17b42
DV
4696PlotKit.CanvasRenderer.prototype.onmousemove=function(e){
4697var _233=this._resolveObject(e);
4698var _234=this._createEventObject(_233,e);
4699if((_233==null)&&(this.event_isinside==null)){
078d1d29
DV
4700return;
4701}
79f17b42
DV
4702if((_233!=null)&&(this.event_isinside==null)){
4703signal(this,"onmouseover",_234);
078d1d29 4704}
79f17b42
DV
4705if((_233==null)&&(this.event_isinside!=null)){
4706signal(this,"onmouseout",_234);
078d1d29 4707}
79f17b42
DV
4708if((_233!=null)&&(this.event_isinside!=null)){
4709signal(this,"onmousemove",_234);
078d1d29 4710}
79f17b42 4711this.event_isinside=_233;
078d1d29 4712};
79f17b42
DV
4713PlotKit.CanvasRenderer.isSupported=function(_235){
4714var _236=null;
4715try{
4716if(MochiKit.Base.isUndefinedOrNull(_235)){
4717_236=MochiKit.DOM.CANVAS({});
078d1d29 4718}else{
79f17b42 4719_236=MochiKit.DOM.getElement(_235);
078d1d29 4720}
79f17b42 4721var _237=_236.getContext("2d");
078d1d29 4722}
79f17b42
DV
4723catch(e){
4724var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);
4725var _239=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
4726if((!ie)||(ie[1]<6)||(_239)){
4727return false;
078d1d29 4728}
79f17b42 4729return true;
078d1d29 4730}
79f17b42 4731return true;
078d1d29 4732};
79f17b42
DV
4733PlotKit.Canvas={};
4734PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer;
4735PlotKit.Canvas.EXPORT=["CanvasRenderer"];
4736PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"];
4737PlotKit.Canvas.__new__=function(){
078d1d29
DV
4738var m=MochiKit.Base;
4739m.nameFunctions(this);
4740this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4741};
79f17b42
DV
4742PlotKit.Canvas.__new__();
4743MochiKit.Base._exportSymbols(this,PlotKit.Canvas);
078d1d29
DV
4744
4745
4746// Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
4747// All Rights Reserved.
4748
4749/**
4750 * @fileoverview Subclasses various parts of PlotKit to meet the additional
4751 * needs of DateGraph: grid overlays and error bars
4752 */
4753
4754// Subclass PlotKit.Layout to add:
4755// 1. Sigma/errorBars properties
4756// 2. Copy error terms for PlotKit.CanvasRenderer._renderLineChart
4757
4758/**
4759 * Creates a new DateGraphLayout object. Options are the same as those allowed
4760 * by the PlotKit.Layout constructor.
4761 * @param {Object} options Options for PlotKit.Layout
4762 * @return {Object} The DateGraphLayout object
4763 */
4764DateGraphLayout = function(options) {
4765 PlotKit.Layout.call(this, "line", options);
4766};
4767DateGraphLayout.prototype = new PlotKit.Layout();
4768
4769/**
4770 * Behaves the same way as PlotKit.Layout, but also copies the errors
4771 * @private
4772 */
4773DateGraphLayout.prototype.evaluateWithError = function() {
4774 this.evaluate();
4775 if (!this.options.errorBars) return;
4776
4777 // Copy over the error terms
4778 var i = 0; // index in this.points
4779 for (var setName in this.datasets) {
4780 var j = 0;
4781 var dataset = this.datasets[setName];
4782 if (PlotKit.Base.isFuncLike(dataset)) continue;
4783 for (var j = 0; j < dataset.length; j++, i++) {
4784 var item = dataset[j];
4785 var xv = parseFloat(item[0]);
4786 var yv = parseFloat(item[1]);
4787
4788 if (xv == this.points[i].xval &&
4789 yv == this.points[i].yval) {
4790 this.points[i].errorMinus = parseFloat(item[2]);
4791 this.points[i].errorPlus = parseFloat(item[3]);
4792 }
4793 }
4794 }
4795};
4796
4797/**
4798 * Convenience function to remove all the data sets from a graph
4799 */
4800DateGraphLayout.prototype.removeAllDatasets = function() {
4801 delete this.datasets;
4802 this.datasets = new Array();
4803};
4804
4805/**
4806 * Change the values of various layout options
4807 * @param {Object} new_options an associative array of new properties
4808 */
4809DateGraphLayout.prototype.updateOptions = function(new_options) {
4810 MochiKit.Base.update(this.options, new_options ? new_options : {});
4811};
4812
4813// Subclass PlotKit.CanvasRenderer to add:
4814// 1. X/Y grid overlay
4815// 2. Ability to draw error bars (if required)
4816
4817/**
4818 * Sets some PlotKit.CanvasRenderer options
4819 * @param {Object} element The canvas to attach to
4820 * @param {Layout} layout The DateGraphLayout object for this graph.
4821 * @param {Object} options Options to pass on to CanvasRenderer
4822 */
4823DateGraphCanvasRenderer = function(element, layout, options) {
4824 PlotKit.CanvasRenderer.call(this, element, layout, options);
4825 this.options.shouldFill = false;
4826 this.options.shouldStroke = true;
4827 this.options.drawYGrid = true;
4828 this.options.drawXGrid = true;
4829 this.options.gridLineColor = MochiKit.Color.Color.grayColor();
4830 MochiKit.Base.update(this.options, options);
4831
4832 // TODO(danvk) This shouldn't be necessary: effects should be overlaid
4833 this.options.drawBackground = false;
4834};
4835DateGraphCanvasRenderer.prototype = new PlotKit.CanvasRenderer();
4836
4837/**
4838 * Draw an X/Y grid on top of the existing plot
4839 */
4840DateGraphCanvasRenderer.prototype.render = function() {
4841 // Do the ordinary rendering, as before
4842 // TODO(danvk) Call super.render()
4843 this._renderLineChart();
4844 this._renderLineAxis();
4845
4846 // Draw the new X/Y grid
4847 var ctx = this.element.getContext("2d");
4848 if (this.options.drawYGrid) {
4849 var ticks = this.layout.yticks;
4850 ctx.save();
4851 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
4852 ctx.lineWidth = this.options.axisLineWidth;
4853 for (var i = 0; i < ticks.length; i++) {
4854 var x = this.area.x;
4855 var y = this.area.y + ticks[i][0] * this.area.h;
4856 ctx.beginPath();
4857 ctx.moveTo(x, y);
4858 ctx.lineTo(x + this.area.w, y);
4859 ctx.closePath();
4860 ctx.stroke();
4861 }
4862 }
4863
4864 if (this.options.drawXGrid) {
4865 var ticks = this.layout.xticks;
4866 ctx.save();
4867 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
4868 ctx.lineWidth = this.options.axisLineWidth;
4869 for (var i=0; i<ticks.length; i++) {
4870 var x = this.area.x + ticks[i][0] * this.area.w;
4871 var y = this.area.y + this.area.h;
4872 ctx.beginPath();
4873 ctx.moveTo(x, y);
4874 ctx.lineTo(x, this.area.y);
4875 ctx.closePath();
4876 ctx.stroke();
4877 }
4878 }
4879};
4880
4881/**
4882 * Overrides the CanvasRenderer method to draw error bars
4883 */
4884DateGraphCanvasRenderer.prototype._renderLineChart = function() {
4885 var context = this.element.getContext("2d");
4886 var colorCount = this.options.colorScheme.length;
4887 var colorScheme = this.options.colorScheme;
4888 var setNames = MochiKit.Base.keys(this.layout.datasets);
4889 var errorBars = this.layout.options.errorBars;
4890 var setCount = setNames.length;
4891 var bind = MochiKit.Base.bind;
4892 var partial = MochiKit.Base.partial;
4893
4894 //Update Points
4895 var updatePoint = function(point) {
4896 point.canvasx = this.area.w * point.x + this.area.x;
4897 point.canvasy = this.area.h * point.y + this.area.y;
4898 }
4899 MochiKit.Iter.forEach(this.layout.points, updatePoint, this);
4900
4901 // create paths
4902 var makePath = function(ctx) {
4903 for (var i = 0; i < setCount; i++) {
4904 var setName = setNames[i];
4905 var color = colorScheme[i%colorCount];
4906 var strokeX = this.options.strokeColorTransform;
4907
4908 // setup graphics context
4909 context.save();
4910 context.strokeStyle = color.toRGBString();
4911 context.lineWidth = this.options.strokeWidth;
4912 ctx.beginPath();
4913 var point = this.layout.points[0];
4914 var first_point = true;
4915 var addPoint = function(ctx_, point) {
4916 if (point.name == setName) {
4917 if (first_point)
4918 ctx_.moveTo(point.canvasx, point.canvasy);
4919 else
4920 ctx_.lineTo(point.canvasx, point.canvasy);
4921 first_point = false;
4922 }
4923 };
4924 MochiKit.Iter.forEach(this.layout.points, partial(addPoint, ctx), this);
4925 ctx.stroke();
4926 }
4927 };
4928
4929 var makeErrorBars = function(ctx) {
4930 for (var i = 0; i < setCount; i++) {
4931 var setName = setNames[i];
4932 var color = colorScheme[i % colorCount];
4933 var strokeX = this.options.strokeColorTransform;
4934
4935 // setup graphics context
4936 context.save();
4937 context.strokeStyle = color.toRGBString();
4938 context.lineWidth = this.options.strokeWidth;
4939 var prevX = -1;
4940 var prevYs = [-1, -1];
4941 var count = 0;
4942 var yscale = this.layout.yscale;
4943 var errorTrapezoid = function(ctx_,point) {
4944 count++;
4945 if (point.name == setName) {
4946 var newYs = [ point.y - point.errorPlus * yscale,
4947 point.y + point.errorMinus * yscale ];
4948 newYs[0] = this.area.h * newYs[0] + this.area.y;
4949 newYs[1] = this.area.h * newYs[1] + this.area.y;
4950 if (prevX >= 0) {
4951 ctx_.moveTo(prevX, prevYs[0]);
4952 ctx_.lineTo(point.canvasx, newYs[0]);
4953 ctx_.lineTo(point.canvasx, newYs[1]);
4954 ctx_.lineTo(prevX, prevYs[1]);
4955 ctx_.closePath();
4956 }
4957 prevYs[0] = newYs[0];
4958 prevYs[1] = newYs[1];
4959 prevX = point.canvasx;
4960 }
4961 };
4962 // should be same color as the lines
4963 var err_color = color.colorWithAlpha(0.15);
4964 ctx.fillStyle = err_color.toRGBString();
4965 ctx.beginPath();
4966 MochiKit.Iter.forEach(this.layout.points, partial(errorTrapezoid, ctx), this);
4967 ctx.fill();
4968 }
4969 };
4970
4971 if (errorBars)
4972 bind(makeErrorBars, this)(context);
4973 bind(makePath, this)(context);
4974 context.restore();
4975};
4976// Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
4977// All Rights Reserved.
4978
4979/**
4980 * @fileoverview Creates an interactive, zoomable graph based on a CSV file or
4981 * string. DateGraph can handle multiple series with or without error bars. The
4982 * date/value ranges will be automatically set. DateGraph uses the
4983 * &lt;canvas&gt; tag, so it only works in FF1.5+.
4984 * @author danvdk@gmail.com (Dan Vanderkam)
4985
4986 Usage:
4987 <div id="graphdiv" style="width:800px; height:500px;"></div>
4988 <script type="text/javascript">
4989 new DateGraph(document.getElementById("graphdiv"),
4990 "datafile.csv",
4991 ["Series 1", "Series 2"],
4992 { }); // options
4993 </script>
4994
4995 The CSV file is of the form
4996
4997 YYYYMMDD,A1,B1,C1
4998 YYYYMMDD,A2,B2,C2
4999
5000 If null is passed as the third parameter (series names), then the first line
5001 of the CSV file is assumed to contain names for each series.
5002
5003 If the 'errorBars' option is set in the constructor, the input should be of
5004 the form
5005
5006 YYYYMMDD,A1,sigmaA1,B1,sigmaB1,...
5007 YYYYMMDD,A2,sigmaA2,B2,sigmaB2,...
5008
5009 If the 'fractions' option is set, the input should be of the form:
5010
5011 YYYYMMDD,A1/B1,A2/B2,...
5012 YYYYMMDD,A1/B1,A2/B2,...
5013
5014 And error bars will be calculated automatically using a binomial distribution.
5015
5016 For further documentation and examples, see http://www/~danvk/dg/
5017
5018 */
5019
5020/**
5021 * An interactive, zoomable graph
5022 * @param {String | Function} file A file containing CSV data or a function that
5023 * returns this data. The expected format for each line is
5024 * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set,
5025 * YYYYMMDD,val1,stddev1,val2,stddev2,...
5026 * @param {Array.<String>} labels Labels for the data series
5027 * @param {Object} attrs Various other attributes, e.g. errorBars determines
5028 * whether the input data contains error ranges.
5029 */
5030DateGraph = function(div, file, labels, attrs) {
5031 if (arguments.length > 0)
5032 this.__init__(div, file, labels, attrs);
5033};
5034
5035DateGraph.NAME = "DateGraph";
5036DateGraph.VERSION = "1.1";
5037DateGraph.__repr__ = function() {
5038 return "[" + this.NAME + " " + this.VERSION + "]";
5039};
5040DateGraph.toString = function() {
5041 return this.__repr__();
5042};
5043
5044// Various default values
5045DateGraph.DEFAULT_ROLL_PERIOD = 1;
5046DateGraph.DEFAULT_WIDTH = 480;
5047DateGraph.DEFAULT_HEIGHT = 320;
5048DateGraph.DEFAULT_STROKE_WIDTH = 1.0;
5049DateGraph.AXIS_LINE_WIDTH = 0.3;
5050
5051/**
5052 * Initializes the DateGraph. This creates a new DIV and constructs the PlotKit
5053 * and interaction &lt;canvas&gt; inside of it. See the constructor for details
5054 * on the parameters.
5055 * @param {String | Function} file Source data
5056 * @param {Array.<String>} labels Names of the data series
5057 * @param {Object} attrs Miscellaneous other options
5058 * @private
5059 */
5060DateGraph.prototype.__init__ = function(div, file, labels, attrs) {
5061 // Copy the important bits into the object
5062 this.maindiv_ = div;
5063 this.labels_ = labels;
5064 this.file_ = file;
5065 this.rollPeriod_ = attrs.rollPeriod || DateGraph.DEFAULT_ROLL_PERIOD;
5066 this.previousVerticalX_ = -1;
5067 this.width_ = parseInt(div.style.width, 10);
5068 this.height_ = parseInt(div.style.height, 10);
5069 this.errorBars_ = attrs.errorBars || false;
5070 this.fractions_ = attrs.fractions || false;
5071 this.strokeWidth_ = attrs.strokeWidth || DateGraph.DEFAULT_STROKE_WIDTH;
5072 this.dateWindow_ = attrs.dateWindow || null;
5073 this.valueRange_ = attrs.valueRange || null;
5074 this.labelsSeparateLines = attrs.labelsSeparateLines || false;
5075 this.labelsDiv_ = attrs.labelsDiv || null;
5076 this.labelsKMB_ = attrs.labelsKMB || false;
5077 this.minTickSize_ = attrs.minTickSize || 0;
5078 this.xValueParser_ = attrs.xValueParser || DateGraph.prototype.dateParser;
5079 this.xValueFormatter_ = attrs.xValueFormatter ||
5080 DateGraph.prototype.dateString_;
5081 this.xTicker_ = attrs.xTicker || DateGraph.prototype.dateTicker;
5082 this.sigma_ = attrs.sigma || 2.0;
5083 this.wilsonInterval_ = attrs.wilsonInterval || true;
5084 this.customBars_ = attrs.customBars || false;
5085 this.attrs_ = attrs;
5086
5087 // Make a note of whether labels will be pulled from the CSV file.
5088 this.labelsFromCSV_ = (this.labels_ == null);
5089 if (this.labels_ == null)
5090 this.labels_ = [];
5091
5092 // Prototype of the callback is "void clickCallback(event, date)"
5093 this.clickCallback_ = attrs.clickCallback || null;
5094
5095 // Prototype of zoom callback is "void dragCallback(minDate, maxDate)"
5096 this.zoomCallback_ = attrs.zoomCallback || null;
5097
5098 // Create the containing DIV and other interactive elements
5099 this.createInterface_();
5100
5101 // Create the PlotKit grapher
5102 this.layoutOptions_ = { 'errorBars': (this.errorBars_ || this.customBars_),
5103 'xOriginIsZero': false };
5104 MochiKit.Base.update(this.layoutOptions_, attrs);
5105 this.setColors_(attrs);
5106
5107 this.layout_ = new DateGraphLayout(this.layoutOptions_);
5108
5109 this.renderOptions_ = { colorScheme: this.colors_,
5110 strokeColor: null,
5111 strokeWidth: this.strokeWidth_,
5112 axisLabelFontSize: 14,
5113 axisLineWidth: DateGraph.AXIS_LINE_WIDTH };
5114 MochiKit.Base.update(this.renderOptions_, attrs);
5115 this.plotter_ = new DateGraphCanvasRenderer(this.hidden_, this.layout_,
5116 this.renderOptions_);
5117
5118 this.createStatusMessage_();
5119 this.createRollInterface_();
5120 this.createDragInterface_();
5121
79f17b42 5122 connect(window, 'onload', this, function(e) { this.start_(); });
078d1d29
DV
5123};
5124
5125/**
5126 * Returns the current rolling period, as set by the user or an option.
5127 * @return {Number} The number of days in the rolling window
5128 */
5129DateGraph.prototype.rollPeriod = function() {
5130 return this.rollPeriod_;
5131}
5132
5133/**
5134 * Generates interface elements for the DateGraph: a containing div, a div to
5135 * display the current point, and a textbox to adjust the rolling average
5136 * period.
5137 * @private
5138 */
5139DateGraph.prototype.createInterface_ = function() {
5140 // Create the all-enclosing graph div
5141 var enclosing = this.maindiv_;
5142
5143 this.graphDiv = MochiKit.DOM.DIV( { style: { 'width': this.width_ + "px",
5144 'height': this.height_ + "px"
5145 }});
5146 appendChildNodes(enclosing, this.graphDiv);
5147
5148 // Create the canvas to store
5149 var canvas = MochiKit.DOM.CANVAS;
5150 this.canvas_ = canvas( { style: { 'position': 'absolute' },
5151 width: this.width_,
5152 height: this.height_});
5153 appendChildNodes(this.graphDiv, this.canvas_);
5154
5155 this.hidden_ = this.createPlotKitCanvas_(this.canvas_);
5156 connect(this.hidden_, 'onmousemove', this, function(e) { this.mouseMove_(e) });
5157 connect(this.hidden_, 'onmouseout', this, function(e) { this.mouseOut_(e) });
5158}
5159
5160/**
5161 * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on
5162 * this particular canvas. All DateGraph work is done on this.canvas_.
5163 * @param {Object} canvas The DateGraph canvas to over which to overlay the plot
5164 * @return {Object} The newly-created canvas
5165 * @private
5166 */
5167DateGraph.prototype.createPlotKitCanvas_ = function(canvas) {
5168 var h = document.createElement("canvas");
5169 h.style.position = "absolute";
5170 h.style.top = canvas.style.top;
5171 h.style.left = canvas.style.left;
5172 h.width = this.width_;
5173 h.height = this.height_;
5174 MochiKit.DOM.appendChildNodes(this.graphDiv, h);
5175 return h;
5176};
5177
5178/**
5179 * Generate a set of distinct colors for the data series. This is done with a
5180 * color wheel. Saturation/Value are customizable, and the hue is
5181 * equally-spaced around the color wheel. If a custom set of colors is
5182 * specified, that is used instead.
5183 * @param {Object} attrs Various attributes, e.g. saturation and value
5184 * @private
5185 */
5186DateGraph.prototype.setColors_ = function(attrs) {
5187 var num = this.labels_.length;
5188 this.colors_ = [];
5189 if (!attrs.colors) {
5190 var sat = attrs.colorSaturation || 1.0;
5191 var val = attrs.colorValue || 0.5;
5192 for (var i = 1; i <= num; i++) {
5193 var hue = (1.0*i/(1+num));
5194 this.colors_.push( MochiKit.Color.Color.fromHSV(hue, sat, val) );
5195 }
5196 } else {
5197 for (var i = 0; i < num; i++) {
5198 var colorStr = attrs.colors[i % attrs.colors.length];
5199 this.colors_.push( MochiKit.Color.Color.fromString(colorStr) );
5200 }
5201 }
5202}
5203
5204/**
5205 * Create the div that contains information on the selected point(s)
5206 * This goes in the top right of the canvas, unless an external div has already
5207 * been specified.
5208 * @private
5209 */
5210DateGraph.prototype.createStatusMessage_ = function(){
5211 if (!this.labelsDiv_) {
5212 var divWidth = 250;
5213 var messagestyle = { "style": {
5214 "position": "absolute",
5215 "fontSize": "14px",
5216 "zIndex": 10,
5217 "width": divWidth + "px",
5218 "top": "0px",
5219 "left": this.width_ - divWidth + "px",
5220 "background": "white",
5221 "textAlign": "left",
5222 "overflow": "hidden"}};
5223 this.labelsDiv_ = MochiKit.DOM.DIV(messagestyle);
5224 MochiKit.DOM.appendChildNodes(this.graphDiv, this.labelsDiv_);
5225 }
5226};
5227
5228/**
5229 * Create the text box to adjust the averaging period
5230 * @return {Object} The newly-created text box
5231 * @private
5232 */
5233DateGraph.prototype.createRollInterface_ = function() {
5234 var padding = this.plotter_.options.padding;
5235 var textAttr = { "type": "text",
5236 "size": "2",
5237 "value": this.rollPeriod_,
5238 "style": { "position": "absolute",
5239 "zIndex": 10,
5240 "top": (this.height_ - 25 - padding.bottom) + "px",
5241 "left": (padding.left+1) + "px" }
5242 };
5243 var roller = MochiKit.DOM.INPUT(textAttr);
5244 var pa = this.graphDiv;
5245 MochiKit.DOM.appendChildNodes(pa, roller);
5246 connect(roller, 'onchange', this,
5247 function() { this.adjustRoll(roller.value); });
5248 return roller;
5249}
5250
5251/**
5252 * Set up all the mouse handlers needed to capture dragging behavior for zoom
5253 * events. Uses MochiKit.Signal to attach all the event handlers.
5254 * @private
5255 */
5256DateGraph.prototype.createDragInterface_ = function() {
5257 var self = this;
5258
5259 // Tracks whether the mouse is down right now
5260 var mouseDown = false;
5261 var dragStartX = null;
5262 var dragStartY = null;
5263 var dragEndX = null;
5264 var dragEndY = null;
5265 var prevEndX = null;
5266
5267 // Utility function to convert page-wide coordinates to canvas coords
5268 var px = PlotKit.Base.findPosX(this.canvas_);
5269 var py = PlotKit.Base.findPosY(this.canvas_);
5270 var getX = function(e) { return e.mouse().page.x - px };
5271 var getY = function(e) { return e.mouse().page.y - py };
5272
5273 // Draw zoom rectangles when the mouse is down and the user moves around
5274 connect(this.hidden_, 'onmousemove', function(event) {
5275 if (mouseDown) {
5276 dragEndX = getX(event);
5277 dragEndY = getY(event);
5278
5279 self.drawZoomRect_(dragStartX, dragEndX, prevEndX);
5280 prevEndX = dragEndX;
5281 }
5282 });
5283
5284 // Track the beginning of drag events
5285 connect(this.hidden_, 'onmousedown', function(event) {
5286 mouseDown = true;
5287 dragStartX = getX(event);
5288 dragStartY = getY(event);
5289 });
5290
5291 // If the user releases the mouse button during a drag, but not over the
5292 // canvas, then it doesn't count as a zooming action.
5293 connect(document, 'onmouseup', this, function(event) {
5294 if (mouseDown) {
5295 mouseDown = false;
5296 dragStartX = null;
5297 dragStartY = null;
5298 }
5299 });
5300
5301 // Temporarily cancel the dragging event when the mouse leaves the graph
5302 connect(this.hidden_, 'onmouseout', this, function(event) {
5303 if (mouseDown) {
5304 dragEndX = null;
5305 dragEndY = null;
5306 }
5307 });
5308
5309 // If the mouse is released on the canvas during a drag event, then it's a
5310 // zoom. Only do the zoom if it's over a large enough area (>= 10 pixels)
5311 connect(this.hidden_, 'onmouseup', this, function(event) {
5312 if (mouseDown) {
5313 mouseDown = false;
5314 dragEndX = getX(event);
5315 dragEndY = getY(event);
5316 var regionWidth = Math.abs(dragEndX - dragStartX);
5317 var regionHeight = Math.abs(dragEndY - dragStartY);
5318
5319 if (regionWidth < 2 && regionHeight < 2 &&
5320 self.clickCallback_ != null &&
5321 self.lastx_ != undefined) {
5322 self.clickCallback_(event, new Date(self.lastx_));
5323 }
5324
5325 if (regionWidth >= 10) {
5326 self.doZoom_(Math.min(dragStartX, dragEndX),
5327 Math.max(dragStartX, dragEndX));
5328 } else {
5329 self.canvas_.getContext("2d").clearRect(0, 0,
5330 self.canvas_.width,
5331 self.canvas_.height);
5332 }
5333
5334 dragStartX = null;
5335 dragStartY = null;
5336 }
5337 });
5338
5339 // Double-clicking zooms back out
5340 connect(this.hidden_, 'ondblclick', this, function(event) {
5341 self.dateWindow_ = null;
5342 self.drawGraph_(self.rawData_);
5343 var minDate = self.rawData_[0][0];
5344 var maxDate = self.rawData_[self.rawData_.length - 1][0];
5345 self.zoomCallback_(minDate, maxDate);
5346 });
5347};
5348
5349/**
5350 * Draw a gray zoom rectangle over the desired area of the canvas. Also clears
5351 * up any previous zoom rectangles that were drawn. This could be optimized to
5352 * avoid extra redrawing, but it's tricky to avoid interactions with the status
5353 * dots.
5354 * @param {Number} startX The X position where the drag started, in canvas
5355 * coordinates.
5356 * @param {Number} endX The current X position of the drag, in canvas coords.
5357 * @param {Number} prevEndX The value of endX on the previous call to this
5358 * function. Used to avoid excess redrawing
5359 * @private
5360 */
5361DateGraph.prototype.drawZoomRect_ = function(startX, endX, prevEndX) {
5362 var ctx = this.canvas_.getContext("2d");
5363
5364 // Clean up from the previous rect if necessary
5365 if (prevEndX) {
5366 ctx.clearRect(Math.min(startX, prevEndX), 0,
5367 Math.abs(startX - prevEndX), this.height_);
5368 }
5369
5370 // Draw a light-grey rectangle to show the new viewing area
5371 if (endX && startX) {
5372 ctx.fillStyle = "rgba(128,128,128,0.33)";
5373 ctx.fillRect(Math.min(startX, endX), 0,
5374 Math.abs(endX - startX), this.height_);
5375 }
5376};
5377
5378/**
5379 * Zoom to something containing [lowX, highX]. These are pixel coordinates
5380 * in the canvas. The exact zoom window may be slightly larger if there are no
5381 * data points near lowX or highX. This function redraws the graph.
5382 * @param {Number} lowX The leftmost pixel value that should be visible.
5383 * @param {Number} highX The rightmost pixel value that should be visible.
5384 * @private
5385 */
5386DateGraph.prototype.doZoom_ = function(lowX, highX) {
5387 // Find the earliest and latest dates contained in this canvasx range.
5388 var points = this.layout_.points;
5389 var minDate = null;
5390 var maxDate = null;
5391 // Find the nearest [minDate, maxDate] that contains [lowX, highX]
5392 for (var i = 0; i < points.length; i++) {
5393 var cx = points[i].canvasx;
5394 var x = points[i].xval;
5395 if (cx < lowX && (minDate == null || x > minDate)) minDate = x;
5396 if (cx > highX && (maxDate == null || x < maxDate)) maxDate = x;
5397 }
5398 // Use the extremes if either is missing
5399 if (minDate == null) minDate = points[0].xval;
5400 if (maxDate == null) maxDate = points[points.length-1].xval;
5401
5402 this.dateWindow_ = [minDate, maxDate];
5403 this.drawGraph_(this.rawData_);
5404 this.zoomCallback_(minDate, maxDate);
5405};
5406
5407/**
5408 * When the mouse moves in the canvas, display information about a nearby data
5409 * point and draw dots over those points in the data series. This function
5410 * takes care of cleanup of previously-drawn dots.
5411 * @param {Object} event The mousemove event from the browser.
5412 * @private
5413 */
5414DateGraph.prototype.mouseMove_ = function(event) {
5415 var canvasx = event.mouse().page.x - PlotKit.Base.findPosX(this.hidden_);
5416 var points = this.layout_.points;
5417
5418 var lastx = -1;
5419 var lasty = -1;
5420
5421 // Loop through all the points and find the date nearest to our current
5422 // location.
5423 var minDist = 1e+100;
5424 var idx = -1;
5425 for (var i = 0; i < points.length; i++) {
5426 var dist = Math.abs(points[i].canvasx - canvasx);
5427 if (dist > minDist) break;
5428 minDist = dist;
5429 idx = i;
5430 }
5431 if (idx >= 0) lastx = points[idx].xval;
5432 // Check that you can really highlight the last day's data
5433 if (canvasx > points[points.length-1].canvasx)
5434 lastx = points[points.length-1].xval;
5435
5436 // Extract the points we've selected
5437 var selPoints = [];
5438 for (var i = 0; i < points.length; i++) {
5439 if (points[i].xval == lastx) {
5440 selPoints.push(points[i]);
5441 }
5442 }
5443
5444 // Clear the previously drawn vertical, if there is one
5445 var circleSize = 3;
5446 var ctx = this.canvas_.getContext("2d");
5447 if (this.previousVerticalX_ >= 0) {
5448 var px = this.previousVerticalX_;
5449 ctx.clearRect(px - circleSize - 1, 0, 2 * circleSize + 2, this.height_);
5450 }
5451
5452 if (selPoints.length > 0) {
5453 var canvasx = selPoints[0].canvasx;
5454
5455 // Set the status message to indicate the selected point(s)
5456 var replace = this.xValueFormatter_(lastx) + ":";
5457 var clen = this.colors_.length;
5458 for (var i = 0; i < selPoints.length; i++) {
5459 if (this.labelsSeparateLines) {
5460 replace += "<br/>";
5461 }
5462 var point = selPoints[i];
5463 replace += " <b><font color='" + this.colors_[i%clen].toHexString() + "'>"
5464 + point.name + "</font></b>:"
5465 + this.round_(point.yval, 2);
5466 }
5467 this.labelsDiv_.innerHTML = replace;
5468
5469 // Save last x position for callbacks.
5470 this.lastx_ = lastx;
5471
5472 // Draw colored circles over the center of each selected point
5473 ctx.save()
5474 for (var i = 0; i < selPoints.length; i++) {
5475 ctx.beginPath();
5476 ctx.fillStyle = this.colors_[i%clen].toRGBString();
5477 ctx.arc(canvasx, selPoints[i%clen].canvasy, circleSize, 0, 360, false);
5478 ctx.fill();
5479 }
5480 ctx.restore();
5481
5482 this.previousVerticalX_ = canvasx;
5483 }
5484};
5485
5486/**
5487 * The mouse has left the canvas. Clear out whatever artifacts remain
5488 * @param {Object} event the mouseout event from the browser.
5489 * @private
5490 */
5491DateGraph.prototype.mouseOut_ = function(event) {
5492 // Get rid of the overlay data
5493 var ctx = this.canvas_.getContext("2d");
5494 ctx.clearRect(0, 0, this.width_, this.height_);
5495 this.labelsDiv_.innerHTML = "";
5496};
5497
5498/**
5499 * Convert a JS date (millis since epoch) to YYYY/MM/DD
5500 * @param {Number} date The JavaScript date (ms since epoch)
5501 * @return {String} A date of the form "YYYY/MM/DD"
5502 * @private
5503 */
5504DateGraph.prototype.dateString_ = function(date) {
5505 var d = new Date(date);
5506
5507 // Get the year:
5508 var year = "" + d.getFullYear();
5509 // Get a 0 padded month string
5510 var month = "" + (d.getMonth() + 1); //months are 0-offset, sigh
5511 if (month.length < 2) month = "0" + month;
5512 // Get a 0 padded day string
5513 var day = "" + d.getDate();
5514 if (day.length < 2) day = "0" + day;
5515
5516 return year + "/" + month + "/" + day;
5517};
5518
5519/**
5520 * Round a number to the specified number of digits past the decimal point.
5521 * @param {Number} num The number to round
5522 * @param {Number} places The number of decimals to which to round
5523 * @return {Number} The rounded number
5524 * @private
5525 */
5526DateGraph.prototype.round_ = function(num, places) {
5527 var shift = Math.pow(10, places);
5528 return Math.round(num * shift)/shift;
5529};
5530
5531/**
5532 * Fires when there's data available to be graphed.
5533 * @param {String} data Raw CSV data to be plotted
5534 * @private
5535 */
5536DateGraph.prototype.loadedEvent_ = function(data) {
5537 this.rawData_ = this.parseCSV_(data);
5538 this.drawGraph_(this.rawData_);
5539};
5540
5541DateGraph.prototype.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
5542 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
5543DateGraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"];
5544
5545/**
5546 * Add ticks on the x-axis representing years, months, quarters, weeks, or days
5547 * @private
5548 */
5549DateGraph.prototype.addXTicks_ = function() {
5550 // Determine the correct ticks scale on the x-axis: quarterly, monthly, ...
5551 var startDate, endDate;
5552 if (this.dateWindow_) {
5553 startDate = this.dateWindow_[0];
5554 endDate = this.dateWindow_[1];
5555 } else {
5556 startDate = this.rawData_[0][0];
5557 endDate = this.rawData_[this.rawData_.length - 1][0];
5558 }
5559
5560 var xTicks = this.xTicker_(startDate, endDate);
5561 this.layout_.updateOptions({xTicks: xTicks});
5562}
5563
5564/**
5565 * Add ticks to the x-axis based on a date range.
5566 * @param {Number} startDate Start of the date window (millis since epoch)
5567 * @param {Number} endDate End of the date window (millis since epoch)
5568 * @return {Array.<Object>} Array of {label, value} tuples.
5569 * @public
5570 */
5571DateGraph.prototype.dateTicker = function(startDate, endDate) {
5572 var ONE_DAY = 24*60*60*1000;
5573 startDate = startDate / ONE_DAY;
5574 endDate = endDate / ONE_DAY;
5575 var dateSpan = endDate - startDate;
5576
5577 var scale = [];
5578 var isMonthly = false;
5579 var yearMod = 1;
5580 if (dateSpan > 30 * 366) { // decadal
5581 isMonthly = true;
5582 scale = ["Jan"];
5583 yearMod = 10;
5584 } else if (dateSpan > 4*366) { // annual
5585 scale = ["Jan"];
5586 isMonthly = true;
5587 } else if (dateSpan > 366) { // quarterly
5588 scale = this.quarters;
5589 isMonthly = true;
5590 } else if (dateSpan > 40) { // monthly
5591 scale = this.months;
5592 isMonthly = true;
5593 } else if (dateSpan > 10) { // weekly
5594 for (var week = startDate - 14; week < endDate + 14; week += 7) {
5595 scale.push(week * ONE_DAY);
5596 }
5597 } else { // daily
5598 for (var day = startDate - 14; day < endDate + 14; day += 1) {
5599 scale.push(day * ONE_DAY);
5600 }
5601 }
5602
5603 var xTicks = [];
5604
5605 if (isMonthly) {
5606 var startYear = 1900 + (new Date(startDate* ONE_DAY)).getYear();
5607 var endYear = 1900 + (new Date(endDate * ONE_DAY)).getYear();
5608 for (var i = startYear; i <= endYear; i++) {
5609 if (i % yearMod != 0) continue;
5610 for (var j = 0; j < scale.length; j++ ) {
5611 var date = Date.parse(scale[j] + " 1, " + i);
5612 xTicks.push( {label: scale[j] + "'" + ("" + i).substr(2,2), v: date } );
5613 }
5614 }
5615 } else {
5616 for (var i = 0; i < scale.length; i++) {
5617 var date = new Date(scale[i]);
5618 var year = date.getFullYear().toString();
5619 var label = this.months[date.getMonth()] + date.getDate();
5620 label += "'" + year.substr(year.length - 2, 2);
5621 xTicks.push( {label: label, v: date} );
5622 }
5623 }
5624 return xTicks;
5625};
5626
5627/**
5628 * Add ticks when the x axis has numbers on it (instead of dates)
5629 * @param {Number} startDate Start of the date window (millis since epoch)
5630 * @param {Number} endDate End of the date window (millis since epoch)
5631 * @return {Array.<Object>} Array of {label, value} tuples.
5632 * @public
5633 */
5634DateGraph.prototype.numericTicks = function(minV, maxV) {
5635 var scale;
5636 if (maxV <= 0.0) {
5637 scale = 1.0;
5638 } else {
5639 scale = Math.pow( 10, Math.floor(Math.log(maxV)/Math.log(10.0)) );
5640 }
5641
5642 // Add a smallish number of ticks at human-friendly points
5643 var nTicks = (maxV - minV) / scale;
5644 while (2 * nTicks < 20) {
5645 nTicks *= 2;
5646 }
5647 if ((maxV - minV) / nTicks < this.minTickSize_) {
5648 nTicks = this.round_((maxV - minV) / this.minTickSize_, 1);
5649 }
5650
5651 // Construct labels for the ticks
5652 var ticks = [];
5653 for (var i = 0; i <= nTicks; i++) {
5654 var tickV = minV + i * (maxV - minV) / nTicks;
5655 var label = this.round_(tickV, 2);
5656 if (this.labelsKMB_) {
5657 var k = 1000;
5658 if (tickV >= k*k*k) {
5659 label = this.round_(tickV/(k*k*k), 1) + "B";
5660 } else if (tickV >= k*k) {
5661 label = this.round_(tickV/(k*k), 1) + "M";
5662 } else if (tickV >= k) {
5663 label = this.round_(tickV/k, 1) + "K";
5664 }
5665 }
5666 ticks.push( {label: label, v: tickV} );
5667 }
5668 return ticks;
5669};
5670
5671/**
5672 * Adds appropriate ticks on the y-axis
5673 * @param {Number} minY The minimum Y value in the data set
5674 * @param {Number} maxY The maximum Y value in the data set
5675 * @private
5676 */
5677DateGraph.prototype.addYTicks_ = function(minY, maxY) {
5678 // Set the number of ticks so that the labels are human-friendly.
5679 var ticks = this.numericTicks(minY, maxY);
5680 this.layout_.updateOptions( { yAxis: [minY, maxY],
5681 yTicks: ticks } );
5682};
5683
5684/**
5685 * Update the graph with new data. Data is in the format
5686 * [ [date1, val1, val2, ...], [date2, val1, val2, ...] if errorBars=false
5687 * or, if errorBars=true,
5688 * [ [date1, [val1,stddev1], [val2,stddev2], ...], [date2, ...], ...]
5689 * @param {Array.<Object>} data The data (see above)
5690 * @private
5691 */
5692DateGraph.prototype.drawGraph_ = function(data) {
5693 var maxY = null;
5694 this.layout_.removeAllDatasets();
5695 // Loop over all fields in the dataset
5696 for (var i = 1; i < data[0].length; i++) {
5697 var series = [];
5698 for (var j = 0; j < data.length; j++) {
5699 var date = data[j][0];
5700 series[j] = [date, data[j][i]];
5701 }
5702 series = this.rollingAverage(series, this.rollPeriod_);
5703
5704 // Prune down to the desired range, if necessary (for zooming)
5705 var bars = this.errorBars_ || this.customBars_;
5706 if (this.dateWindow_) {
5707 var low = this.dateWindow_[0];
5708 var high= this.dateWindow_[1];
5709 var pruned = [];
5710 for (var k = 0; k < series.length; k++) {
5711 if (series[k][0] >= low && series[k][0] <= high) {
5712 pruned.push(series[k]);
5713 var y = bars ? series[k][1][0] : series[k][1];
5714 if (maxY == null || y > maxY) maxY = y;
5715 }
5716 }
5717 series = pruned;
5718 } else {
5719 for (var j = 0; j < series.length; j++) {
5720 var y = bars ? series[j][1][0] : series[j][1];
5721 if (maxY == null || y > maxY) {
5722 maxY = bars ? y + series[j][1][1] : y;
5723 }
5724 }
5725 }
5726
5727 if (bars) {
5728 var vals = [];
5729 for (var j=0; j<series.length; j++)
5730 vals[j] = [series[j][0],
5731 series[j][1][0], series[j][1][1], series[j][1][2]];
5732 this.layout_.addDataset(this.labels_[i - 1], vals);
5733 } else {
5734 this.layout_.addDataset(this.labels_[i - 1], series);
5735 }
5736 }
5737
5738 // Use some heuristics to come up with a good maxY value, unless it's been
5739 // set explicitly by the user.
5740 if (this.valueRange_ != null) {
5741 this.addYTicks_(this.valueRange_[0], this.valueRange_[1]);
5742 } else {
5743 // Add some padding and round up to an integer to be human-friendly.
5744 maxY *= 1.1;
5745 if (maxY <= 0.0) maxY = 1.0;
5746 else {
5747 var scale = Math.pow(10, Math.floor(Math.log(maxY) / Math.log(10.0)));
5748 maxY = scale * Math.ceil(maxY / scale);
5749 }
5750 this.addYTicks_(0, maxY);
5751 }
5752
5753 this.addXTicks_();
5754
5755 // Tell PlotKit to use this new data and render itself
5756 this.layout_.evaluateWithError();
5757 this.plotter_.clear();
5758 this.plotter_.render();
5759 this.canvas_.getContext('2d').clearRect(0, 0,
5760 this.canvas_.width, this.canvas_.height);
5761};
5762
5763/**
5764 * Calculates the rolling average of a data set.
5765 * If originalData is [label, val], rolls the average of those.
5766 * If originalData is [label, [, it's interpreted as [value, stddev]
5767 * and the roll is returned in the same form, with appropriately reduced
5768 * stddev for each value.
5769 * Note that this is where fractional input (i.e. '5/10') is converted into
5770 * decimal values.
5771 * @param {Array} originalData The data in the appropriate format (see above)
5772 * @param {Number} rollPeriod The number of days over which to average the data
5773 */
5774DateGraph.prototype.rollingAverage = function(originalData, rollPeriod) {
5775 if (originalData.length < 2)
5776 return originalData;
5777 var rollPeriod = Math.min(rollPeriod, originalData.length - 1);
5778 var rollingData = [];
5779 var sigma = this.sigma_;
5780
5781 if (this.fractions_) {
5782 var num = 0;
5783 var den = 0; // numerator/denominator
5784 var mult = 100.0;
5785 for (var i = 0; i < originalData.length; i++) {
5786 num += originalData[i][1][0];
5787 den += originalData[i][1][1];
5788 if (i - rollPeriod >= 0) {
5789 num -= originalData[i - rollPeriod][1][0];
5790 den -= originalData[i - rollPeriod][1][1];
5791 }
5792
5793 var date = originalData[i][0];
5794 var value = den ? num / den : 0.0;
5795 if (this.errorBars_) {
5796 if (this.wilsonInterval_) {
5797 // For more details on this confidence interval, see:
5798 // http://en.wikipedia.org/wiki/Binomial_confidence_interval
5799 if (den) {
5800 var p = value < 0 ? 0 : value, n = den;
5801 var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n));
5802 var denom = 1 + sigma * sigma / den;
5803 var low = (p + sigma * sigma / (2 * den) - pm) / denom;
5804 var high = (p + sigma * sigma / (2 * den) + pm) / denom;
5805 rollingData[i] = [date,
5806 [p * mult, (p - low) * mult, (high - p) * mult]];
5807 } else {
5808 rollingData[i] = [date, [0, 0, 0]];
5809 }
5810 } else {
5811 var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
5812 rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]];
5813 }
5814 } else {
5815 rollingData[i] = [date, mult * value];
5816 }
5817 }
5818 } else if (this.customBars_) {
5819 // just ignore the rolling for now.
5820 // TODO(danvk): do something reasonable.
5821 for (var i = 0; i < originalData.length; i++) {
5822 var data = originalData[i][1];
5823 var y = data[1];
5824 rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]];
5825 }
5826 } else {
5827 // Calculate the rolling average for the first rollPeriod - 1 points where
5828 // there is not enough data to roll over the full number of days
5829 var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2);
5830 if (!this.errorBars_){
5831 for (var i = 0; i < num_init_points; i++) {
5832 var sum = 0;
5833 for (var j = 0; j < i + 1; j++)
5834 sum += originalData[j][1];
5835 rollingData[i] = [originalData[i][0], sum / (i + 1)];
5836 }
5837 // Calculate the rolling average for the remaining points
5838 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
5839 i < originalData.length;
5840 i++) {
5841 var sum = 0;
5842 for (var j = i - rollPeriod + 1; j < i + 1; j++)
5843 sum += originalData[j][1];
5844 rollingData[i] = [originalData[i][0], sum / rollPeriod];
5845 }
5846 } else {
5847 for (var i = 0; i < num_init_points; i++) {
5848 var sum = 0;
5849 var variance = 0;
5850 for (var j = 0; j < i + 1; j++) {
5851 sum += originalData[j][1][0];
5852 variance += Math.pow(originalData[j][1][1], 2);
5853 }
5854 var stddev = Math.sqrt(variance)/(i+1);
5855 rollingData[i] = [originalData[i][0],
5856 [sum/(i+1), sigma * stddev, sigma * stddev]];
5857 }
5858 // Calculate the rolling average for the remaining points
5859 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
5860 i < originalData.length;
5861 i++) {
5862 var sum = 0;
5863 var variance = 0;
5864 for (var j = i - rollPeriod + 1; j < i + 1; j++) {
5865 sum += originalData[j][1][0];
5866 variance += Math.pow(originalData[j][1][1], 2);
5867 }
5868 var stddev = Math.sqrt(variance) / rollPeriod;
5869 rollingData[i] = [originalData[i][0],
5870 [sum / rollPeriod, sigma * stddev, sigma * stddev]];
5871 }
5872 }
5873 }
5874
5875 return rollingData;
5876};
5877
5878/**
5879 * Parses a date, returning the number of milliseconds since epoch. This can be
5880 * passed in as an xValueParser in the DateGraph constructor.
5881 * @param {String} A date in YYYYMMDD format.
5882 * @return {Number} Milliseconds since epoch.
5883 * @public
5884 */
5885DateGraph.prototype.dateParser = function(dateStr) {
5886 var dateStrSlashed;
5887 if (dateStr.search("-") != -1) {
5888 dateStrSlashed = dateStr.replace("-", "/", "g");
5889 } else if (dateStr.search("/") != -1) {
5890 return Date.parse(dateStr);
5891 } else {
5892 dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2)
5893 + "/" + dateStr.substr(6,2);
5894 }
5895 return Date.parse(dateStrSlashed);
5896};
5897
5898/**
5899 * Parses a string in a special csv format. We expect a csv file where each
5900 * line is a date point, and the first field in each line is the date string.
5901 * We also expect that all remaining fields represent series.
5902 * if this.errorBars_ is set, then interpret the fields as:
5903 * date, series1, stddev1, series2, stddev2, ...
5904 * @param {Array.<Object>} data See above.
5905 * @private
5906 */
5907DateGraph.prototype.parseCSV_ = function(data) {
5908 var ret = [];
5909 var lines = data.split("\n");
5910 var start = this.labelsFromCSV_ ? 1 : 0;
5911 if (this.labelsFromCSV_) {
5912 var labels = lines[0].split(",");
5913 labels.shift(); // a "date" parameter is assumed.
5914 this.labels_ = labels;
5915 // regenerate automatic colors.
5916 this.setColors_(this.attrs_);
5917 this.renderOptions_.colorScheme = this.colors_;
5918 MochiKit.Base.update(this.plotter_.options, this.renderOptions_);
5919 MochiKit.Base.update(this.layoutOptions_, this.attrs_);
5920 }
5921
5922 for (var i = start; i < lines.length; i++) {
5923 var line = lines[i];
5924 if (line.length == 0) continue; // skip blank lines
5925 var inFields = line.split(',');
5926 if (inFields.length < 2)
5927 continue;
5928
5929 var fields = [];
5930 fields[0] = this.xValueParser_(inFields[0]);
5931
5932 // If fractions are expected, parse the numbers as "A/B"
5933 if (this.fractions_) {
5934 for (var j = 1; j < inFields.length; j++) {
5935 // TODO(danvk): figure out an appropriate way to flag parse errors.
5936 var vals = inFields[j].split("/");
5937 fields[j] = [parseFloat(vals[0]), parseFloat(vals[1])];
5938 }
5939 } else if (this.errorBars_) {
5940 // If there are error bars, values are (value, stddev) pairs
5941 for (var j = 1; j < inFields.length; j += 2)
5942 fields[(j + 1) / 2] = [parseFloat(inFields[j]),
5943 parseFloat(inFields[j + 1])];
5944 } else if (this.customBars_) {
5945 // Bars are a low;center;high tuple
5946 for (var j = 1; j < inFields.length; j++) {
5947 var vals = inFields[j].split(";");
5948 fields[j] = [ parseFloat(vals[0]),
5949 parseFloat(vals[1]),
5950 parseFloat(vals[2]) ];
5951 }
5952 } else {
5953 // Values are just numbers
5954 for (var j = 1; j < inFields.length; j++)
5955 fields[j] = parseFloat(inFields[j]);
5956 }
5957 ret.push(fields);
5958 }
5959 return ret;
5960};
5961
5962/**
5963 * Get the CSV data. If it's in a function, call that function. If it's in a
5964 * file, do an XMLHttpRequest to get it.
5965 * @private
5966 */
5967DateGraph.prototype.start_ = function() {
5968 if (typeof this.file_ == 'function') {
5969 // Stubbed out to allow this to run off a filesystem
5970 this.loadedEvent_(this.file_());
5971 } else {
5972 var req = new XMLHttpRequest();
5973 var caller = this;
5974 req.onreadystatechange = function () {
5975 if (req.readyState == 4) {
5976 if (req.status == 200) {
5977 caller.loadedEvent_(req.responseText);
5978 }
5979 }
5980 };
5981
5982 req.open("GET", this.file_, true);
5983 req.send(null);
5984 }
5985};
5986
5987/**
5988 * Changes various properties of the graph. These can include:
5989 * <ul>
5990 * <li>file: changes the source data for the graph</li>
5991 * <li>errorBars: changes whether the data contains stddev</li>
5992 * </ul>
5993 * @param {Object} attrs The new properties and values
5994 */
5995DateGraph.prototype.updateOptions = function(attrs) {
5996 if (attrs.errorBars) {
5997 this.errorBars_ = attrs.errorBars;
5998 }
5999 if (attrs.customBars) {
6000 this.customBars_ = attrs.customBars;
6001 }
6002 if (attrs.strokeWidth) {
6003 this.strokeWidth_ = attrs.strokeWidth;
6004 }
6005 if (attrs.rollPeriod) {
6006 this.rollPeriod_ = attrs.rollPeriod;
6007 }
6008 if (attrs.dateWindow) {
6009 this.dateWindow_ = attrs.dateWindow;
6010 }
6011 if (attrs.valueRange) {
6012 this.valueRange_ = attrs.valueRange;
6013 }
6014 if (attrs.minTickSize) {
6015 this.minTickSize_ = attrs.minTickSize;
6016 }
6017 if (typeof(attrs.labels) != 'undefined') {
6018 this.labels_ = attrs.labels;
6019 this.labelsFromCSV_ = (attrs.labels == null);
6020 }
6021 this.layout_.updateOptions({ 'errorBars': this.errorBars_ });
6022 if (attrs['file'] && attrs['file'] != this.file_) {
6023 this.file_ = attrs['file'];
6024 this.start_();
6025 } else {
6026 this.drawGraph_(this.rawData_);
6027 }
6028};
6029
6030/**
6031 * Adjusts the number of days in the rolling average. Updates the graph to
6032 * reflect the new averaging period.
6033 * @param {Number} length Number of days over which to average the data.
6034 */
6035DateGraph.prototype.adjustRoll = function(length) {
6036 this.rollPeriod_ = length;
6037 this.drawGraph_(this.rawData_);
6038};