Only pack a subset of MochiKit. This saves another 90k.
[dygraphs.git] / dygraph-combined.js
CommitLineData
6a1aa64f
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");
6a1aa64f 1006}
79f17b42
DV
1007if(typeof (MochiKit)=="undefined"){
1008MochiKit={};
6a1aa64f 1009}
79f17b42
DV
1010if(typeof (MochiKit.Format)=="undefined"){
1011MochiKit.Format={};
6a1aa64f 1012}
79f17b42
DV
1013MochiKit.Format.NAME="MochiKit.Format";
1014MochiKit.Format.VERSION="1.4";
1015MochiKit.Format.__repr__=function(){
6a1aa64f 1016return "["+this.NAME+" "+this.VERSION+"]";
79f17b42
DV
1017};
1018MochiKit.Format.toString=function(){
6a1aa64f 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;
6a1aa64f 1026}
79f17b42
DV
1027var _157=_14e;
1028var _158=_14f;
1029if(num<0){
1030num=-num;
6a1aa64f 1031}else{
79f17b42 1032_157=_157.replace(/-/,"");
6a1aa64f 1033}
79f17b42
DV
1034var me=arguments.callee;
1035var fmt=MochiKit.Format.formatLocale(_150);
1036if(_151){
1037num=num*100;
1038_158=fmt.percent+_158;
6a1aa64f 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;
6a1aa64f 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);
6a1aa64f 1053}
6a1aa64f 1054}
79f17b42
DV
1055res=_15c+res;
1056if(_152>0){
1057while(frac.length<_155){
1058frac=frac+"0";
6a1aa64f 1059}
79f17b42 1060res=res+fmt.decimal+frac;
6a1aa64f 1061}
79f17b42 1062return _157+res+_158;
6a1aa64f 1063};
6a1aa64f 1064};
79f17b42
DV
1065MochiKit.Format.numberFormatter=function(_160,_161,_162){
1066if(typeof (_161)=="undefined"){
1067_161="";
6a1aa64f 1068}
79f17b42
DV
1069var _163=_160.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
1070if(!_163){
1071throw TypeError("Invalid pattern");
6a1aa64f 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+"-";
6a1aa64f 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";
6a1aa64f 1085}
79f17b42
DV
1086if(tmp.length==1){
1087_16a=null;
1088}else{
1089_16a=tmp[1].length;
6a1aa64f 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);
6a1aa64f 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};
6a1aa64f 1102}
6a1aa64f 1103return rval;
79f17b42
DV
1104};
1105MochiKit.Format.formatLocale=function(_172){
1106if(typeof (_172)=="undefined"||_172===null){
1107_172="default";
6a1aa64f 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;
6a1aa64f 1114}
6a1aa64f 1115return rval;
79f17b42
DV
1116}else{
1117return _172;
6a1aa64f 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);
6a1aa64f 1125}
6a1aa64f 1126}
79f17b42 1127return "0";
6a1aa64f 1128};
79f17b42
DV
1129MochiKit.Format.twoDigitFloat=function(_177){
1130var sign=(_177<0?"-":"");
1131var s=Math.floor(Math.abs(_177)*100).toString();
1132if(s=="0"){
1133return s;
6a1aa64f 1134}
79f17b42
DV
1135if(s.length<3){
1136while(s.charAt(s.length-1)=="0"){
1137s=s.substring(0,s.length-1);
6a1aa64f 1138}
79f17b42 1139return sign+"0."+s;
6a1aa64f 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;
6a1aa64f 1145}else{
79f17b42
DV
1146if(tail.charAt(1)=="0"){
1147return head+"."+tail.charAt(0);
1148}else{
1149return head+"."+tail;
6a1aa64f 1150}
6a1aa64f 1151}
79f17b42
DV
1152};
1153MochiKit.Format.lstrip=function(str,_17d){
1154str=str+"";
1155if(typeof (str)!="string"){
1156return null;
6a1aa64f 1157}
79f17b42
DV
1158if(!_17d){
1159return str.replace(/^\s+/,"");
1160}else{
1161return str.replace(new RegExp("^["+_17d+"]+"),"");
6a1aa64f 1162}
79f17b42
DV
1163};
1164MochiKit.Format.rstrip=function(str,_17f){
1165str=str+"";
1166if(typeof (str)!="string"){
1167return null;
6a1aa64f 1168}
79f17b42
DV
1169if(!_17f){
1170return str.replace(/\s+$/,"");
1171}else{
1172return str.replace(new RegExp("["+_17f+"]+$"),"");
6a1aa64f 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;
6a1aa64f 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;
6a1aa64f 1207}
6a1aa64f 1208}
79f17b42
DV
1209for(k in this){
1210o=this[k];
1211if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
6a1aa64f 1212try{
79f17b42 1213o.NAME=base+k;
6a1aa64f
DV
1214}
1215catch(e){
6a1aa64f 1216}
6a1aa64f
DV
1217}
1218}
79f17b42
DV
1219};
1220MochiKit.Format.__new__();
1221if(typeof (MochiKit.Base)!="undefined"){
1222MochiKit.Base._exportSymbols(this,MochiKit.Format);
6a1aa64f 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]];
6a1aa64f
DV
1229}
1230}
79f17b42 1231})(this,MochiKit.Format);
6a1aa64f 1232}
79f17b42
DV
1233if(typeof (dojo)!="undefined"){
1234dojo.provide("MochiKit.DOM");
1235dojo.require("MochiKit.Base");
6a1aa64f 1236}
79f17b42
DV
1237if(typeof (JSAN)!="undefined"){
1238JSAN.use("MochiKit.Base",[]);
6a1aa64f 1239}
6a1aa64f 1240try{
79f17b42
DV
1241if(typeof (MochiKit.Base)=="undefined"){
1242throw "";
6a1aa64f
DV
1243}
1244}
1245catch(e){
79f17b42 1246throw "MochiKit.DOM depends on MochiKit.Base!";
6a1aa64f 1247}
79f17b42
DV
1248if(typeof (MochiKit.DOM)=="undefined"){
1249MochiKit.DOM={};
6a1aa64f 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;
6a1aa64f 1272try{
79f17b42
DV
1273self._window=win;
1274self._document=win.document;
1275rval=func();
6a1aa64f
DV
1276}
1277catch(e){
79f17b42
DV
1278self._window=_195;
1279self._document=_194;
6a1aa64f
DV
1280throw e;
1281}
79f17b42
DV
1282self._window=_195;
1283self._document=_194;
1284return rval;
1285},formContents:function(elem){
1286var _198=[];
1287var _199=[];
6a1aa64f 1288var m=MochiKit.Base;
79f17b42
DV
1289var self=MochiKit.DOM;
1290if(typeof (elem)=="undefined"||elem===null){
1291elem=self._document.body;
1292}else{
1293elem=self.getElement(elem);
6a1aa64f 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;
6a1aa64f 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;
6a1aa64f 1311}
6a1aa64f 1312}
79f17b42
DV
1313_198.push(name);
1314_199.push(v);
1315return null;
6a1aa64f 1316}
79f17b42
DV
1317_198.push(name);
1318_199.push("");
1319return null;
6a1aa64f 1320}else{
79f17b42
DV
1321var opts=elem.options;
1322if(!opts.length){
1323_198.push(name);
1324_199.push("");
1325return null;
6a1aa64f 1326}
79f17b42
DV
1327for(var i=0;i<opts.length;i++){
1328var opt=opts[i];
1329if(!opt.selected){
1330continue;
6a1aa64f 1331}
79f17b42
DV
1332var v=opt.value;
1333if(!v){
1334var h=opt.outerHTML;
1335if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1336v=opt.text;
6a1aa64f 1337}
6a1aa64f 1338}
79f17b42
DV
1339_198.push(name);
1340_199.push(v);
6a1aa64f 1341}
79f17b42 1342return null;
6a1aa64f 1343}
6a1aa64f 1344}
79f17b42
DV
1345if(_19e==="FORM"||_19e==="P"||_19e==="SPAN"||_19e==="DIV"){
1346return elem.childNodes;
6a1aa64f 1347}
79f17b42
DV
1348_198.push(name);
1349_199.push(elem.value||"");
1350return null;
6a1aa64f 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;
6a1aa64f 1359try{
79f17b42
DV
1360self._document=doc;
1361rval=func();
6a1aa64f
DV
1362}
1363catch(e){
79f17b42 1364self._document=_1a7;
6a1aa64f
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;
1379}
1380var _1b5=self.domConverters;
1381var _1b6=arguments.callee;
1382var _1b7=m.NotFound;
1383while(true){
1384if(typeof (node)=="undefined"||node===null){
1385return null;
6a1aa64f 1386}
79f17b42
DV
1387if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
1388node=im.list(node);
6a1aa64f 1389}
79f17b42
DV
1390if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
1391return node;
6a1aa64f 1392}
79f17b42
DV
1393if(typeof (node)=="number"||typeof (node)=="boolean"){
1394node=node.toString();
6a1aa64f 1395}
79f17b42
DV
1396if(typeof (node)=="string"){
1397return self._document.createTextNode(node);
6a1aa64f 1398}
79f17b42
DV
1399if(typeof (node.__dom__)=="function"){
1400node=node.__dom__(ctx);
1401continue;
6a1aa64f 1402}
79f17b42
DV
1403if(typeof (node.dom)=="function"){
1404node=node.dom(ctx);
1405continue;
6a1aa64f 1406}
79f17b42
DV
1407if(typeof (node)=="function"){
1408node=node.apply(ctx,[ctx]);
1409continue;
6a1aa64f 1410}
79f17b42
DV
1411if(im){
1412var _1b8=null;
6a1aa64f 1413try{
79f17b42 1414_1b8=iter(node);
6a1aa64f
DV
1415}
1416catch(e){
6a1aa64f 1417}
79f17b42
DV
1418if(_1b8){
1419return map(_1b6,_1b8,_1b3(ctx));
1420}
1421}
1422try{
1423node=_1b5.match(node,ctx);
1424continue;
1425}
1426catch(e){
1427if(e!=_1b7){
6a1aa64f
DV
1428throw e;
1429}
6a1aa64f 1430}
79f17b42 1431return self._document.createTextNode(node.toString());
6a1aa64f 1432}
79f17b42
DV
1433return undefined;
1434},isChildNode:function(node,_1ba){
1435var self=MochiKit.DOM;
1436if(typeof (node)=="string"){
1437node=self.getElement(node);
6a1aa64f 1438}
79f17b42
DV
1439if(typeof (_1ba)=="string"){
1440_1ba=self.getElement(_1ba);
6a1aa64f 1441}
79f17b42
DV
1442if(node===_1ba){
1443return true;
6a1aa64f 1444}
79f17b42
DV
1445while(node&&node.tagName.toUpperCase()!="BODY"){
1446node=node.parentNode;
1447if(node===_1ba){
1448return true;
6a1aa64f 1449}
6a1aa64f 1450}
79f17b42
DV
1451return false;
1452},setNodeAttribute:function(node,attr,_1be){
1453var o={};
1454o[attr]=_1be;
1455try{
1456return MochiKit.DOM.updateNodeAttributes(node,o);
6a1aa64f 1457}
79f17b42
DV
1458catch(e){
1459}
1460return null;
1461},getNodeAttribute:function(node,attr){
1462var self=MochiKit.DOM;
1463var _1c3=self.attributeArray.renames[attr];
1464node=self.getElement(node);
6a1aa64f 1465try{
79f17b42
DV
1466if(_1c3){
1467return node[_1c3];
6a1aa64f 1468}
79f17b42 1469return node.getAttribute(attr);
6a1aa64f
DV
1470}
1471catch(e){
6a1aa64f 1472}
79f17b42
DV
1473return null;
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];
6a1aa64f 1481}
79f17b42 1482return node.removeAttribute(attr);
6a1aa64f 1483}
79f17b42 1484catch(e){
6a1aa64f 1485}
79f17b42
DV
1486return null;
1487},updateNodeAttributes:function(node,_1c9){
1488var elem=node;
1489var self=MochiKit.DOM;
1490if(typeof (node)=="string"){
1491elem=self.getElement(node);
1492}
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);
6a1aa64f 1501}else{
79f17b42
DV
1502_1cc(elem[k],v);
1503}
6a1aa64f 1504}else{
79f17b42
DV
1505if(k.substring(0,2)=="on"){
1506if(typeof (v)=="string"){
1507v=new Function(v);
1508}
1509elem[k]=v;
6a1aa64f 1510}else{
79f17b42 1511elem.setAttribute(k,v);
6a1aa64f
DV
1512}
1513}
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);
6a1aa64f 1531}
79f17b42
DV
1532}else{
1533if(k.substring(0,2)=="on"){
1534if(typeof (v)=="string"){
1535v=new Function(v);
6a1aa64f 1536}
79f17b42
DV
1537elem[k]=v;
1538}else{
1539elem.setAttribute(k,v);
6a1aa64f 1540}
6a1aa64f 1541}
6a1aa64f 1542}
6a1aa64f 1543}
6a1aa64f 1544}
6a1aa64f 1545}
6a1aa64f 1546}
79f17b42
DV
1547return elem;
1548},appendChildNodes:function(node){
1549var elem=node;
1550var self=MochiKit.DOM;
1551if(typeof (node)=="string"){
1552elem=self.getElement(node);
6a1aa64f 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);
6a1aa64f 1564}
6a1aa64f 1565}
6a1aa64f 1566}
79f17b42
DV
1567return elem;
1568},insertSiblingNodesBefore:function(node){
1569var elem=node;
1570var self=MochiKit.DOM;
1571if(typeof (node)=="string"){
1572elem=self.getElement(node);
6a1aa64f 1573}
79f17b42
DV
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){
6a1aa64f 1580}else{
79f17b42
DV
1581if(typeof (n.nodeType)=="number"){
1582_1db.insertBefore(n,elem);
1583}else{
1584_1da=_1dc(n,_1da);
6a1aa64f 1585}
6a1aa64f 1586}
6a1aa64f 1587}
79f17b42
DV
1588return _1db;
1589},insertSiblingNodesAfter:function(node){
1590var elem=node;
1591var self=MochiKit.DOM;
1592if(typeof (node)=="string"){
1593elem=self.getElement(node);
6a1aa64f 1594}
79f17b42
DV
1595var _1e1=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
1596if(elem.nextSibling){
1597return self.insertSiblingNodesBefore(elem.nextSibling,_1e1);
6a1aa64f 1598}else{
79f17b42 1599return self.appendChildNodes(elem.parentNode,_1e1);
6a1aa64f 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;
6a1aa64f 1607}
79f17b42
DV
1608var _1e5;
1609while((_1e5=elem.firstChild)){
1610elem.removeChild(_1e5);
6a1aa64f 1611}
79f17b42
DV
1612if(arguments.length<2){
1613return elem;
1614}else{
1615return self.appendChildNodes.apply(this,arguments);
6a1aa64f 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);
6a1aa64f 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)+"\"";
6a1aa64f 1631}
79f17b42
DV
1632if(name=="input"&&"type" in _1e7){
1633_1ed+=" type=\""+self.escapeHTML(_1e7.type)+"\"";
6a1aa64f 1634}
79f17b42
DV
1635if(_1ed){
1636name="<"+name+_1ed+">";
1637_1ec=false;
6a1aa64f 1638}
6a1aa64f 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);
6a1aa64f 1645}
79f17b42
DV
1646}else{
1647elem=name;
6a1aa64f 1648}
79f17b42
DV
1649if(_1e7){
1650self.updateNodeAttributes(elem,_1e7);
6a1aa64f 1651}
79f17b42
DV
1652if(arguments.length<=2){
1653return elem;
6a1aa64f 1654}else{
79f17b42
DV
1655var args=m.extend([elem],arguments,2);
1656return self.appendChildNodes.apply(this,args);
6a1aa64f 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);
6a1aa64f 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);
1680}else{
1681return MochiKit.Base.map(self.getElement,arguments);
6a1aa64f 1682}
79f17b42
DV
1683},getElementsByTagAndClassName:function(_1f8,_1f9,_1fa){
1684var self=MochiKit.DOM;
1685if(typeof (_1f8)=="undefined"||_1f8===null){
1686_1f8="*";
6a1aa64f 1687}
79f17b42
DV
1688if(typeof (_1fa)=="undefined"||_1fa===null){
1689_1fa=self._document;
6a1aa64f 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);
6a1aa64f 1695}
79f17b42
DV
1696var _1fd=[];
1697for(var i=0;i<_1fc.length;i++){
1698var _1ff=_1fc[i];
1699var cls=_1ff.className;
1700if(!cls){
1701continue;
6a1aa64f 1702}
79f17b42
DV
1703var _201=cls.split(" ");
1704for(var j=0;j<_201.length;j++){
1705if(_201[j]==_1f9){
1706_1fd.push(_1ff);
1707break;
6a1aa64f 1708}
6a1aa64f 1709}
6a1aa64f 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;
6a1aa64f
DV
1718}
1719}
79f17b42
DV
1720if(once){
1721try{
1722this[path]=null;
6a1aa64f 1723}
79f17b42 1724catch(e){
6a1aa64f 1725}
6a1aa64f 1726}
79f17b42
DV
1727};
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);
6a1aa64f 1738}
79f17b42 1739_208[path]=_20e;
6a1aa64f 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();
6a1aa64f 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);
6a1aa64f 1758}else{
79f17b42 1759obj.setAttribute("className",_214);
6a1aa64f 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);
6a1aa64f 1767}
6a1aa64f 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;
6a1aa64f 1776}
79f17b42
DV
1777if(cls==_21c){
1778return false;
6a1aa64f 1779}
79f17b42
DV
1780var _220=cls.split(" ");
1781for(var i=0;i<_220.length;i++){
1782if(_220[i]==_21c){
1783return false;
6a1aa64f 1784}
6a1aa64f 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;
6a1aa64f 1794}
79f17b42
DV
1795if(cls==_223){
1796self.setElementClass(obj,"");
1797return true;
6a1aa64f 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;
6a1aa64f
DV
1805}
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);
6a1aa64f 1813}
79f17b42
DV
1814return res;
1815},hasElementClass:function(_22e,_22f){
1816var obj=MochiKit.DOM.getElement(_22e);
1817var cls=obj.className;
1818if(!cls){
1819return false;
6a1aa64f 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;
6a1aa64f 1828}
6a1aa64f 1829}
79f17b42
DV
1830if(!good){
1831return false;
6a1aa64f 1832}
6a1aa64f 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=[];
6a1aa64f 1842}
79f17b42
DV
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);
1851}else{
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),"\""]);
6a1aa64f 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]);
6a1aa64f
DV
1865}
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]);
6a1aa64f 1873}
6a1aa64f 1874}else{
79f17b42 1875lst.push("/>");
6a1aa64f 1876}
79f17b42
DV
1877}else{
1878if(dom.nodeType==3){
1879lst.push(_23c(dom.nodeValue));
6a1aa64f 1880}
6a1aa64f 1881}
6a1aa64f 1882}
6a1aa64f 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]);
6a1aa64f 1892}
6a1aa64f 1893}
79f17b42
DV
1894var _24b=node.nodeValue;
1895if(typeof (_24b)=="string"){
1896rval.push(_24b);
6a1aa64f 1897}
79f17b42
DV
1898})(MochiKit.DOM.getElement(node));
1899if(_246){
1900return rval;
6a1aa64f 1901}else{
79f17b42 1902return rval.join("");
6a1aa64f 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);
6a1aa64f 1910}
6a1aa64f 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";
6a1aa64f 1917}
79f17b42
DV
1918return _250;
1919},undoClipping:function(_251,_252){
1920_251=MochiKit.DOM.getElement(_251);
1921if(!_252){
1922return;
6a1aa64f 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;
6a1aa64f 1933}
6a1aa64f 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="";
6a1aa64f 1939}
79f17b42
DV
1940},getFirstElementByTagAndClassName:function(_256,_257,_258){
1941var self=MochiKit.DOM;
1942if(typeof (_256)=="undefined"||_256===null){
1943_256="*";
6a1aa64f 1944}
79f17b42
DV
1945if(typeof (_258)=="undefined"||_258===null){
1946_258=self._document;
6a1aa64f 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];
6a1aa64f 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;
6a1aa64f 1959}
6a1aa64f 1960}
6a1aa64f 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();
6a1aa64f 1969}
79f17b42
DV
1970if(typeof (_261)=="undefined"||_261===null){
1971_261=null;
6a1aa64f 1972}
79f17b42
DV
1973var _263="";
1974var _264="";
1975while(elem&&elem.tagName){
1976elem=elem.parentNode;
1977if(_260=="*"&&_261===null){
1978return elem;
6a1aa64f 1979}
79f17b42
DV
1980_263=elem.className.split(" ");
1981_264=elem.tagName.toUpperCase();
1982if(_261===null&&_260==_264){
1983return elem;
1984}else{
1985if(_261!==null){
1986for(var i=0;i<_263.length;i++){
1987if(_260=="*"&&_263[i]==_261){
1988return elem;
1989}else{
1990if(_260==_264&&_263[i]==_261){
1991return elem;
6a1aa64f 1992}
6a1aa64f
DV
1993}
1994}
6a1aa64f 1995}
6a1aa64f 1996}
6a1aa64f 1997}
79f17b42
DV
1998return elem;
1999},isParent:function(_266,_267){
2000if(!_266.parentNode||_266==_267){
2001return false;
6a1aa64f 2002}
79f17b42
DV
2003if(_266.parentNode==_267){
2004return true;
6a1aa64f 2005}
79f17b42
DV
2006return MochiKit.DOM.isParent(_266.parentNode,_267);
2007},__new__:function(win){
6a1aa64f 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);
2013}else{
2014if(MochiKit.MockDOM){
2015this._document=MochiKit.MockDOM.document;
2016}
2017}
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;
2042};
2043_26c.compliant=true;
2044_26c.renames={};
2045}
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);
2058};
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;
2098this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2099m.nameFunctions(this);
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);
2107if(typeof (dojo)!="undefined"){
2108dojo.provide("MochiKit.Style");
2109dojo.require("MochiKit.Base");
2110dojo.require("MochiKit.DOM");
2111}
2112if(typeof (JSAN)!="undefined"){
2113JSAN.use("MochiKit.Base",[]);
2114JSAN.use("MochiKit.DOM",[]);
2115}
6a1aa64f 2116try{
79f17b42
DV
2117if(typeof (MochiKit.Base)=="undefined"){
2118throw "";
2119}
6a1aa64f
DV
2120}
2121catch(e){
79f17b42
DV
2122throw "MochiKit.Style depends on MochiKit.Base!";
2123}
6a1aa64f 2124try{
79f17b42
DV
2125if(typeof (MochiKit.DOM)=="undefined"){
2126throw "";
2127}
6a1aa64f
DV
2128}
2129catch(e){
79f17b42 2130throw "MochiKit.Style depends on MochiKit.DOM!";
6a1aa64f 2131}
79f17b42
DV
2132if(typeof (MochiKit.Style)=="undefined"){
2133MochiKit.Style={};
6a1aa64f 2134}
79f17b42
DV
2135MochiKit.Style.NAME="MochiKit.Style";
2136MochiKit.Style.VERSION="1.4";
2137MochiKit.Style.__repr__=function(){
2138return "["+this.NAME+" "+this.VERSION+"]";
2139};
2140MochiKit.Style.toString=function(){
2141return this.__repr__();
2142};
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;
6a1aa64f 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;
6a1aa64f 2179}
79f17b42 2180return 1;
6a1aa64f 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;
6a1aa64f 2188}else{
79f17b42
DV
2189if(elem.currentStyle){
2190_287=elem.currentStyle[_283];
6a1aa64f
DV
2191}
2192}
6a1aa64f 2193}
79f17b42
DV
2194if(_283=="opacity"){
2195_287=parseFloat(_287);
6a1aa64f 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";
6a1aa64f
DV
2200}
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];
6a1aa64f 2210}
6a1aa64f 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,"");
6a1aa64f 2220}
79f17b42
DV
2221}else{
2222if(o<0.00001){
2223o=0;
6a1aa64f 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+")";
6a1aa64f 2228}
6a1aa64f 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;
6a1aa64f 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);
6a1aa64f 2251}else{
79f17b42
DV
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;
6a1aa64f 2261}
6a1aa64f 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;
6a1aa64f 2267}
6a1aa64f
DV
2268}
2269}
6a1aa64f 2270}
79f17b42
DV
2271if(typeof (_291)!="undefined"){
2272_291=arguments.callee(_291);
2273if(_291){
2274c.x-=(_291.x||0);
2275c.y-=(_291.y||0);
6a1aa64f 2276}
6a1aa64f 2277}
79f17b42
DV
2278if(elem.parentNode){
2279_296=elem.parentNode;
6a1aa64f 2280}else{
79f17b42 2281_296=null;
6a1aa64f 2282}
79f17b42
DV
2283while(_296){
2284var _29b=_296.tagName.toUpperCase();
2285if(_29b==="BODY"||_29b==="HTML"){
2286break;
6a1aa64f 2287}
79f17b42
DV
2288var disp=self.getStyle(_296,"display");
2289if(disp!="inline"&&disp!="table-row"){
2290c.x-=_296.scrollLeft;
2291c.y-=_296.scrollTop;
6a1aa64f 2292}
79f17b42
DV
2293if(_296.parentNode){
2294_296=_296.parentNode;
2295}else{
2296_296=null;
6a1aa64f
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";
6a1aa64f 2304}
79f17b42
DV
2305var _2a0={};
2306var _2a1=MochiKit.Base.isUndefinedOrNull;
2307if(!_2a1(_29e.x)){
2308_2a0["left"]=_29e.x+_29f;
6a1aa64f 2309}
79f17b42
DV
2310if(!_2a1(_29e.y)){
2311_2a0["top"]=_29e.y+_29f;
6a1aa64f 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);
6a1aa64f 2319}
79f17b42
DV
2320elem=dom.getElement(elem);
2321if(!elem){
2322return undefined;
6a1aa64f 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);
6a1aa64f 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";
6a1aa64f 2344}
79f17b42
DV
2345var _2ae={};
2346var _2af=MochiKit.Base.isUndefinedOrNull;
2347if(!_2af(_2ac.w)){
2348_2ae["width"]=_2ac.w+_2ad;
6a1aa64f 2349}
79f17b42
DV
2350if(!_2af(_2ac.h)){
2351_2ae["height"]=_2ac.h+_2ad;
6a1aa64f 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;
6a1aa64f 2361}
6a1aa64f 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;
2370}else{
2371if(b.parentElement.clientWidth){
2372d.w=b.parentElement.clientWidth;
2373d.h=b.parentElement.clientHeight;
2374}else{
2375if(b&&b.clientWidth){
2376d.w=b.clientWidth;
2377d.h=b.clientHeight;
6a1aa64f 2378}
6a1aa64f 2379}
6a1aa64f 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;
6a1aa64f 2390}else{
79f17b42
DV
2391if(db){
2392c.x=db.scrollLeft;
2393c.y=db.scrollTop;
6a1aa64f
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");
6a1aa64f 2403this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
79f17b42 2404m.nameFunctions(this);
6a1aa64f 2405}});
79f17b42
DV
2406MochiKit.Style.__new__();
2407MochiKit.Base._exportSymbols(this,MochiKit.Style);
6a1aa64f 2408if(typeof (dojo)!="undefined"){
79f17b42 2409dojo.provide("MochiKit.Color");
6a1aa64f
DV
2410dojo.require("MochiKit.Base");
2411dojo.require("MochiKit.DOM");
2412dojo.require("MochiKit.Style");
2413}
2414if(typeof (JSAN)!="undefined"){
2415JSAN.use("MochiKit.Base",[]);
2416JSAN.use("MochiKit.DOM",[]);
2417JSAN.use("MochiKit.Style",[]);
2418}
2419try{
2420if(typeof (MochiKit.Base)=="undefined"){
2421throw "";
2422}
2423}
2424catch(e){
79f17b42 2425throw "MochiKit.Color depends on MochiKit.Base";
6a1aa64f
DV
2426}
2427try{
2428if(typeof (MochiKit.DOM)=="undefined"){
2429throw "";
2430}
2431}
2432catch(e){
79f17b42 2433throw "MochiKit.Color depends on MochiKit.DOM";
6a1aa64f
DV
2434}
2435try{
2436if(typeof (MochiKit.Style)=="undefined"){
2437throw "";
2438}
2439}
2440catch(e){
79f17b42 2441throw "MochiKit.Color depends on MochiKit.Style";
6a1aa64f 2442}
79f17b42
DV
2443if(typeof (MochiKit.Color)=="undefined"){
2444MochiKit.Color={};
6a1aa64f 2445}
79f17b42
DV
2446MochiKit.Color.NAME="MochiKit.Color";
2447MochiKit.Color.VERSION="1.4";
2448MochiKit.Color.__repr__=function(){
2449return "["+this.NAME+" "+this.VERSION+"]";
6a1aa64f 2450};
79f17b42 2451MochiKit.Color.toString=function(){
6a1aa64f 2452return this.__repr__();
79f17b42
DV
2453};
2454MochiKit.Color.Color=function(red,_2be,blue,_2c0){
2455if(typeof (_2c0)=="undefined"||_2c0===null){
2456_2c0=1;
6a1aa64f 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;
6a1aa64f 2492}
79f17b42
DV
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+")";
6a1aa64f 2516}else{
79f17b42
DV
2517if(a<=0){
2518a=0;
6a1aa64f 2519}
79f17b42 2520rval="hsla("+mid+","+a+")";
6a1aa64f 2521}
79f17b42 2522this._hslString=rval;
6a1aa64f 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+")";
6a1aa64f 2533}else{
79f17b42 2534rval="rgb("+mid+")";
6a1aa64f 2535}
79f17b42 2536this._rgbString=rval;
6a1aa64f 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;
6a1aa64f 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;
6a1aa64f 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;
6a1aa64f 2565}
79f17b42 2566return MochiKit.Base.clone(hsl);
6a1aa64f 2567},toString:function(){
79f17b42
DV
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;
2583}else{
2584_2f2=rgb.a;
6a1aa64f
DV
2585}
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);
6a1aa64f 2598}
79f17b42
DV
2599var _301=_300._namedColors[name.toLowerCase()];
2600if(typeof (_301)=="string"){
2601return _300.fromHexString(_301);
6a1aa64f 2602}else{
79f17b42
DV
2603if(name=="transparent"){
2604return _300.transparentColor();
6a1aa64f 2605}
79f17b42
DV
2606}
2607return null;
2608},fromString:function(_302){
2609var self=MochiKit.Color.Color;
2610var _304=_302.substr(0,3);
2611if(_304=="rgb"){
2612return self.fromRGBString(_302);
6a1aa64f 2613}else{
79f17b42
DV
2614if(_304=="hsl"){
2615return self.fromHSLString(_302);
6a1aa64f 2616}else{
79f17b42
DV
2617if(_302.charAt(0)=="#"){
2618return self.fromHexString(_302);
6a1aa64f
DV
2619}
2620}
6a1aa64f 2621}
79f17b42
DV
2622return self.fromName(_302);
2623},fromHexString:function(_305){
2624if(_305.charAt(0)=="#"){
2625_305=_305.substring(1);
6a1aa64f 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);
6a1aa64f 2633}
6a1aa64f 2634}else{
79f17b42
DV
2635for(i=0;i<6;i+=2){
2636hex=_305.substr(i,2);
2637_306.push(parseInt(hex,16)/255);
6a1aa64f 2638}
6a1aa64f 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);
6a1aa64f 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));
6a1aa64f 2654}else{
79f17b42
DV
2655if(_313=="deg"){
2656val=parseFloat(c)/360;
6a1aa64f 2657}else{
79f17b42
DV
2658if(_313=="rad"){
2659val=parseFloat(c)/(Math.PI*2);
6a1aa64f 2660}else{
79f17b42 2661val=_30c[i]*parseFloat(c);
6a1aa64f 2662}
6a1aa64f 2663}
6a1aa64f 2664}
79f17b42 2665_30f.push(val);
6a1aa64f 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;
6a1aa64f 2675}
79f17b42
DV
2676var _319=cls.fromString(_318);
2677if(!_319){
2678break;
6a1aa64f 2679}
79f17b42
DV
2680if(_319.asRGB().a>0){
2681return _319;
6a1aa64f 2682}
79f17b42
DV
2683}
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;
6a1aa64f 2698}else{
79f17b42
DV
2699if(v>_31f){
2700return _31f;
6a1aa64f 2701}else{
79f17b42 2702return v;
6a1aa64f
DV
2703}
2704}
79f17b42
DV
2705},_hslValue:function(n1,n2,hue){
2706if(hue>6){
2707hue-=6;
6a1aa64f 2708}else{
79f17b42
DV
2709if(hue<0){
2710hue+=6;
6a1aa64f
DV
2711}
2712}
79f17b42
DV
2713var val;
2714if(hue<1){
2715val=n1+(n2-n1)*hue;
6a1aa64f 2716}else{
79f17b42
DV
2717if(hue<3){
2718val=n2;
6a1aa64f 2719}else{
79f17b42
DV
2720if(hue<4){
2721val=n1+(n2-n1)*(4-hue);
2722}else{
2723val=n1;
6a1aa64f 2724}
6a1aa64f
DV
2725}
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;
6a1aa64f 2735}
79f17b42
DV
2736var red;
2737var _32a;
2738var blue;
2739if(_325===0){
2740red=_326;
2741_32a=_326;
2742blue=_326;
6a1aa64f 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;
6a1aa64f
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;
6a1aa64f 2791}
79f17b42
DV
2792var red;
2793var _337;
2794var blue;
2795if(_332===0){
2796red=_333;
2797_337=_333;
2798blue=_333;
2799}else{
2800var m2;
2801if(_333<=0.5){
2802m2=_333*(1+_332);
6a1aa64f 2803}else{
79f17b42 2804m2=_333+_332-(_333*_332);
6a1aa64f 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);
6a1aa64f 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;
6a1aa64f 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;
6a1aa64f 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);
6a1aa64f 2838}else{
79f17b42 2839hue=4+((red-_33e)/_347);
6a1aa64f
DV
2840}
2841}
79f17b42
DV
2842hue/=6;
2843if(hue<0){
2844hue+=1;
6a1aa64f 2845}
79f17b42
DV
2846if(hue>1){
2847hue-=1;
6a1aa64f 2848}
6a1aa64f 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;
6a1aa64f 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;
2868}else{
2869if(_351<=0.5){
2870_350=_352/(max+min);
2871}else{
2872_350=_352/(2-max-min);
6a1aa64f 2873}
79f17b42
DV
2874if(red==max){
2875hue=(_349-blue)/_352;
2876}else{
2877if(_349==max){
2878hue=2+((blue-red)/_352);
2879}else{
2880hue=4+((red-_349)/_352);
6a1aa64f 2881}
6a1aa64f 2882}
79f17b42
DV
2883hue/=6;
2884if(hue<0){
2885hue+=1;
6a1aa64f 2886}
79f17b42
DV
2887if(hue>1){
2888hue-=1;
6a1aa64f 2889}
6a1aa64f 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;
6a1aa64f 2897}
79f17b42
DV
2898return _354;
2899},__new__:function(){
6a1aa64f 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);
6a1aa64f 2916}
79f17b42
DV
2917var _362=function(){
2918for(var i=0;i<arguments.length;i++){
2919if(!(arguments[i] instanceof Color)){
2920return false;
6a1aa64f 2921}
6a1aa64f 2922}
79f17b42
DV
2923return true;
2924};
2925var _364=function(a,b){
2926return a.compareRGB(b);
2927};
2928m.nameFunctions(this);
2929m.registerComparator(this.Color.NAME,_362,_364);
2930this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2931}});
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"};
6a1aa64f 2937if(typeof (dojo)!="undefined"){
79f17b42 2938dojo.provide("MochiKit.Signal");
6a1aa64f
DV
2939dojo.require("MochiKit.Base");
2940dojo.require("MochiKit.DOM");
2941dojo.require("MochiKit.Style");
2942}
2943if(typeof (JSAN)!="undefined"){
2944JSAN.use("MochiKit.Base",[]);
2945JSAN.use("MochiKit.DOM",[]);
2946JSAN.use("MochiKit.Style",[]);
2947}
2948try{
79f17b42 2949if(typeof (MochiKit.Base)=="undefined"){
6a1aa64f
DV
2950throw "";
2951}
2952}
2953catch(e){
79f17b42 2954throw "MochiKit.Signal depends on MochiKit.Base!";
6a1aa64f 2955}
79f17b42
DV
2956try{
2957if(typeof (MochiKit.DOM)=="undefined"){
2958throw "";
6a1aa64f 2959}
6a1aa64f 2960}
79f17b42
DV
2961catch(e){
2962throw "MochiKit.Signal depends on MochiKit.DOM!";
6a1aa64f 2963}
79f17b42
DV
2964try{
2965if(typeof (MochiKit.Style)=="undefined"){
2966throw "";
6a1aa64f
DV
2967}
2968}
79f17b42
DV
2969catch(e){
2970throw "MochiKit.Signal depends on MochiKit.Style!";
6a1aa64f 2971}
79f17b42
DV
2972if(typeof (MochiKit.Signal)=="undefined"){
2973MochiKit.Signal={};
6a1aa64f 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;
6a1aa64f 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)+"}";
6a1aa64f 2987}
79f17b42
DV
2988if(this.type()&&this.type().indexOf("key")===0){
2989str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
6a1aa64f 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)+"}}";
2995}else{
2996str+="}";
6a1aa64f 2997}
6a1aa64f 2998}
79f17b42
DV
2999if(this.type()=="mouseover"||this.type()=="mouseout"){
3000str+=", relatedTarget(): "+repr(this.relatedTarget());
6a1aa64f 3001}
79f17b42
DV
3002str+="}";
3003return str;
3004},toString:function(){
6a1aa64f 3005return this.__repr__();
79f17b42
DV
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;
6a1aa64f 3017}
79f17b42
DV
3018var elem=null;
3019if(this.type()=="mouseover"){
3020elem=(this._event.relatedTarget||this._event.fromElement);
6a1aa64f 3021}else{
79f17b42
DV
3022if(this.type()=="mouseout"){
3023elem=(this._event.relatedTarget||this._event.toElement);
3024}
3025}
3026if(elem!==null){
3027this._relatedTarget=elem;
3028return elem;
3029}
3030return undefined;
3031},_modifier:null,modifier:function(){
3032if(this._modifier!==null){
3033return this._modifier;
6a1aa64f 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;
6a1aa64f 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;
3054}else{
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);
6a1aa64f 3061}else{
79f17b42
DV
3062if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
3063k.code=this._event.keyCode;
3064k.string=String.fromCharCode(k.code);
6a1aa64f
DV
3065}
3066}
79f17b42
DV
3067this._key=k;
3068return k;
6a1aa64f 3069}
6a1aa64f
DV
3070}
3071}
79f17b42
DV
3072return undefined;
3073},_mouse:null,mouse:function(){
3074if(this._mouse!==null){
3075return this._mouse;
6a1aa64f 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;
3084}
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;
6a1aa64f 3089}else{
79f17b42
DV
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);
3094}
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);
6a1aa64f 3104}else{
79f17b42
DV
3105m.button.left=!!(e.button&1);
3106m.button.right=!!(e.button&2);
3107m.button.middle=!!(e.button&4);
6a1aa64f
DV
3108}
3109}
79f17b42
DV
3110this._mouse=m;
3111return m;
6a1aa64f 3112}
79f17b42
DV
3113return undefined;
3114},stop:function(){
3115this.stopPropagation();
3116this.preventDefault();
3117},stopPropagation:function(){
3118if(this._event.stopPropagation){
3119this._event.stopPropagation();
6a1aa64f 3120}else{
79f17b42
DV
3121this._event.cancelBubble=true;
3122}
3123},preventDefault:function(){
3124if(this._event.preventDefault){
3125this._event.preventDefault();
6a1aa64f 3126}else{
79f17b42
DV
3127if(this._confirmUnload===null){
3128this._event.returnValue=false;
3129}
6a1aa64f 3130}
79f17b42
DV
3131},_confirmUnload:null,confirmUnload:function(msg){
3132if(this.type()=="beforeunload"){
3133this._confirmUnload=msg;
3134this._event.returnValue=msg;
6a1aa64f 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);
6a1aa64f 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);
6a1aa64f 3149}
79f17b42
DV
3150for(i=65;i<=90;i++){
3151_374[i]="KEY_"+String.fromCharCode(i);
6a1aa64f 3152}
79f17b42
DV
3153for(i=96;i<=105;i++){
3154_374[i]="KEY_NUM_PAD_"+(i-96);
6a1aa64f 3155}
79f17b42
DV
3156for(i=112;i<=123;i++){
3157_374[i]="KEY_F"+(i-112+1);
6a1aa64f 3158}
79f17b42
DV
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;
6a1aa64f 3168};
79f17b42
DV
3169MochiKit.Signal.Ident.prototype={};
3170MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
3171return "["+this.NAME+" "+this.VERSION+"]";
3172},toString:function(){
3173return this.__repr__();
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]);
6a1aa64f 3180}
6a1aa64f 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);
6a1aa64f 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);
6a1aa64f 3195};
79f17b42
DV
3196}else{
3197return function(_383){
3198obj[func].apply(obj,[new E(src,_383)]);
6a1aa64f 3199};
6a1aa64f 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);
6a1aa64f 3208};
79f17b42
DV
3209}else{
3210return function(_386){
3211func.apply(obj,[new E(src,_386)]);
6a1aa64f 3212};
6a1aa64f 3213}
6a1aa64f 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;
6a1aa64f 3223}
79f17b42
DV
3224catch(err){
3225return;
6a1aa64f 3226}
79f17b42
DV
3227e.stop();
3228if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
3229return;
6a1aa64f 3230}
79f17b42
DV
3231e.type=function(){
3232return sig;
6a1aa64f 3233};
79f17b42
DV
3234if(typeof (func)=="string"){
3235return obj[func].apply(obj,[e]);
3236}else{
3237return func.apply(obj,[e]);
6a1aa64f 3238}
6a1aa64f 3239};
79f17b42
DV
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'");
6a1aa64f 3249}
79f17b42
DV
3250}else{
3251if(typeof (_38f)!="function"){
3252throw new Error("'funcOrStr' must be a function or string");
6a1aa64f 3253}
6a1aa64f 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;
6a1aa64f 3260}
6a1aa64f 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");
6a1aa64f 3268}
79f17b42
DV
3269var _397=self._getDestPair(_394,_395);
3270var obj=_397[0];
3271var func=_397[1];
3272if(typeof (obj)=="undefined"||obj===null){
3273obj=src;
6a1aa64f 3274}
79f17b42
DV
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";
3280}else{
3281sig="onmouseout";
6a1aa64f
DV
3282}
3283}else{
79f17b42 3284var _39b=self._listener(src,sig,func,obj,_39a);
6a1aa64f 3285}
79f17b42
DV
3286if(src.addEventListener){
3287src.addEventListener(sig.substr(2),_39b,false);
3288}else{
3289if(src.attachEvent){
3290src.attachEvent(sig,_39b);
6a1aa64f
DV
3291}
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);
6a1aa64f 3298}
79f17b42
DV
3299return _39c;
3300},_disconnect:function(_39e){
3301if(!_39e.connected){
3302return;
6a1aa64f 3303}
79f17b42
DV
3304_39e.connected=false;
3305if(!_39e.isDOM){
6a1aa64f
DV
3306return;
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");
6a1aa64f 3318}
6a1aa64f 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);
3335}else{
3336self._dirty=true;
6a1aa64f 3337}
79f17b42 3338return true;
6a1aa64f 3339}
6a1aa64f 3340}
6a1aa64f 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;
6a1aa64f 3349}
79f17b42 3350return true;
6a1aa64f 3351}
6a1aa64f 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;
3362}
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);
3371}
3372}
3373}
3374self._dirty=_3b3;
3375},disconnectAll:function(src,sig){
3376src=MochiKit.DOM.getElement(src);
6a1aa64f 3377var m=MochiKit.Base;
79f17b42
DV
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;
6a1aa64f 3394}
6a1aa64f 3395}
6a1aa64f 3396}
79f17b42
DV
3397}else{
3398var sigs={};
3399for(i=0;i<_3b9.length;i++){
3400sigs[_3b9[i]]=true;
6a1aa64f 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;
6a1aa64f 3410}
6a1aa64f 3411}
6a1aa64f 3412}
6a1aa64f 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);
6a1aa64f 3427}
79f17b42
DV
3428catch(e){
3429_3c7.push(e);
6a1aa64f 3430}
6a1aa64f 3431}
6a1aa64f 3432}
79f17b42
DV
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}
6a1aa64f 3440}
79f17b42
DV
3441}
3442if(_3c7.length==1){
3443throw _3c7[0];
6a1aa64f 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;
6a1aa64f
DV
3449}
3450}
79f17b42
DV
3451}});
3452MochiKit.Signal.EXPORT_OK=[];
3453MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"];
3454MochiKit.Signal.__new__=function(win){
3455var m=MochiKit.Base;
3456this._document=document;
3457this._window=win;
3458this._lock=false;
3459this._dirty=false;
3460try{
3461this.connect(window,"onunload",this._unloadCache);
3462}
3463catch(e){
3464}
3465this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3466m.nameFunctions(this);
3467};
3468MochiKit.Signal.__new__(this);
3469if(MochiKit.__export__){
3470connect=MochiKit.Signal.connect;
3471disconnect=MochiKit.Signal.disconnect;
3472disconnectAll=MochiKit.Signal.disconnectAll;
3473signal=MochiKit.Signal.signal;
6a1aa64f 3474}
79f17b42 3475MochiKit.Base._exportSymbols(this,MochiKit.Signal);
6a1aa64f
DV
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
3491try{
3492if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){
3493throw "";
3494}
3495}
3496catch(e){
3497throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}";
3498}
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={};
3508}
3509PlotKit.NAME="PlotKit";
3510PlotKit.VERSION="0.8";
3511PlotKit.__repr__=function(){
3512return "["+this.NAME+" "+this.VERSION+"]";
3513};
3514PlotKit.toString=function(){
3515return this.__repr__();
3516};
3517if(typeof (PlotKit.Base)=="undefined"){
3518PlotKit.Base={};
3519}
3520PlotKit.Base.NAME="PlotKit.Base";
3521PlotKit.Base.VERSION=PlotKit.VERSION;
3522PlotKit.Base.__repr__=function(){
3523return "["+this.NAME+" "+this.VERSION+"]";
3524};
3525PlotKit.Base.toString=function(){
3526return this.__repr__();
3527};
3528PlotKit.Base.usingPrototype=function(){
3529try{
3530return (typeof (Object.extend)=="function");
3531}
3532catch(e){
3533return false;
3534}
3535};
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]);
3545}
3546if(PlotKit.Base.usingPrototype()){
3547delete _8.extend;
3548delete _8.from;
3549delete _8.inspect;
3550}
3551return _8;
3552},uniq:function(_10){
3553var m=MochiKit.Base;
3554if(!m.isArrayLike(_10)||(_10.length<1)){
3555return new Array();
3556}
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]);
3564}
3565}
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;
3589}
3590if(_25(_23)){
3591_23=0.4;
3592}
3593if(_25(_22)){
3594_22=-0.2;
3595}
3596var _27=_22;
3597while(_27<=_23){
3598_26.push(_27);
3599_27+=_24;
3600}
3601var _28=function(_29,_30){
3602return _29.lighterColorWithLevel(_30);
3603};
3604return MochiKit.Base.map(partial(_28,_21),_26);
3605},excanvasSupported:function(){
3606if(/MSIE/.test(navigator.userAgent)&&!window.opera){
3607return true;
3608}
3609return false;
3610},findPosX:function(obj){
3611var _32=0;
3612if(obj.offsetParent){
3613while(obj.offsetParent){
3614_32+=obj.offsetLeft;
3615obj=obj.offsetParent;
3616}
3617}else{
3618if(obj.x){
3619_32+=obj.x;
3620}
3621}
3622return _32;
3623},findPosY:function(obj){
3624var _33=0;
3625if(obj.offsetParent){
3626while(obj.offsetParent){
3627_33+=obj.offsetTop;
3628obj=obj.offsetParent;
3629}
3630}else{
3631if(obj.y){
3632_33+=obj.y;
3633}
3634}
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;
3645}
3646_36.push(fn(lst[x]));
3647}
3648return _36;
3649}else{
3650return MochiKit.Base.map(fn,lst);
3651}
3652};
3653PlotKit.Base.items=function(lst){
3654if(PlotKit.Base.usingPrototype()){
3655var _38=[];
3656for(var x in lst){
3657if(typeof (lst[x])=="function"){
3658continue;
3659}
3660_38.push([x,lst[x]]);
3661}
3662return _38;
3663}else{
3664return MochiKit.Base.items(lst);
3665}
3666};
3667PlotKit.Base.keys=function(lst){
3668if(PlotKit.Base.usingPrototype()){
3669var _39=[];
3670for(var x in lst){
3671if(typeof (lst[x])=="function"){
3672continue;
3673}
3674_39.push(x);
3675}
3676return _39;
3677}else{
3678return MochiKit.Base.keys(lst);
3679}
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 "";
3727}
3728}
3729catch(e){
3730throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base";
3731}
3732if(typeof (PlotKit.Layout)=="undefined"){
3733PlotKit.Layout={};
3734}
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;
3756}
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;
3765}
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;
3789}
3790if(_53(_51)){
3791_51=1;
3792}
3793if(_53(_52)){
3794_52=-1;
3795}
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]))});
3804}
3805}
3806this.addDataset(_48,_57);
3807if(_52>=0){
3808this.options.xTicks=_58;
3809}
3810return true;
3811}
3812return false;
3813};
3814PlotKit.Layout.prototype.evaluate=function(){
3815this._evaluateLimits();
3816this._evaluateScales();
3817if(this.style=="bar"){
3818if(this.options.barOrientation=="horizontal"){
3819this._evaluateHorizBarCharts();
3820}else{
3821this._evaluateBarCharts();
3822}
3823this._evaluateBarTicks();
3824}else{
3825if(this.style=="line"){
3826this._evaluateLineCharts();
3827this._evaluateLineTicks();
3828}else{
3829if(this.style=="pie"){
3830this._evaluatePieCharts();
3831this._evaluatePieTicks();
3832}
3833}
3834}
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}
3844}
3845}else{
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];
3858break;
3859}
3860}
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}
3871}
3872}else{
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;
3877}
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;
3883}
3884}
3885}
3886}
3887}
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)));
3910}
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;
3916}
3917if(_80(this.options.yAxis)){
3918if(this.options.yOriginIsZero){
3919this.minyval=0;
3920}else{
3921this.minyval=_78(map(parseFloat,map(_76(1),all)));
3922}
3923this.maxyval=_79(map(parseFloat,map(_76(1),all)));
3924}else{
3925this.minyval=this.options.yAxis[0];
3926this.maxyval=this.options.yAxis[1];
3927this.yscale=this.maxyval-this.minyval;
3928}
3929};
3930PlotKit.Layout.prototype._evaluateScales=function(){
3931var _82=MochiKit.Base.isUndefinedOrNull;
3932this.xrange=this.maxxval-this.minxval;
3933if(this.xrange==0){
3934this.xscale=1;
3935}else{
3936this.xscale=1/this.xrange;
3937}
3938this.yrange=this.maxyval-this.minyval;
3939if(this.yrange==0){
3940this.yscale=1;
3941}else{
3942this.yscale=1/this.yrange;
3943}
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);
3962}
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;
3981}
3982}
3983_92=_90*this.xscale*this.options.barWidthFillFraction;
3984_93=_92/_89;
3985_94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2;
3986}
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;
3994}
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);
4000}
4001}
4002i++;
4003}
4004};
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);
4012}
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;
4028}
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;
4036}
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;
4042}
4043if(rect.y>=1){
4044rect.y=1;
4045}
4046if((rect.x>=0)&&(rect.x<=1)){
4047this.bars.push(rect);
4048}
4049}
4050i++;
4051}
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;
4062}
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;
4071}
4072if(_117.y>=1){
4073_117.y=1;
4074}
4075if((_117.x>=0)&&(_117.x<=1)){
4076this.points.push(_117);
4077}
4078}
4079i++;
4080}
4081};
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);
4098}
4099_124+=_125;
4100}
4101};
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();
4110}
4111var pos=this.xscale*(tick.v-this.minxval);
4112if((pos>=0)&&(pos<=1)){
4113this.xticks.push([pos,_132]);
4114}
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)){
4127continue;
4128}
4129this.xticks.push([pos,_134[i]]);
4130_136++;
4131}
4132if(_136>this.options.xNumberOfTicks){
4133break;
4134}
4135}
4136}
4137}
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();
4147}
4148var pos=1-(this.yscale*(tick.v-this.minyval));
4149if((pos>=0)&&(pos<=1)){
4150this.yticks.push([pos,_139]);
4151}
4152};
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;
4165}
4166this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]);
4167}
4168}
4169}
4170};
4171PlotKit.Layout.prototype._evaluateLineTicks=function(){
4172this._evaluateLineTicksForXAxis();
4173this._evaluateLineTicksForYAxis();
4174};
4175PlotKit.Layout.prototype._evaluateBarTicks=function(){
4176this._evaluateLineTicks();
4177var _144=function(tick){
4178return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]];
4179};
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]];
4187};
4188this.xticks=MochiKit.Base.map(_146,this.xticks);
4189}
4190};
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];
4199}
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();
4207}
4208_151+=" ("+_148(_150.fraction)+")";
4209this.xticks.push([tick.v,_151]);
4210}
4211}
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]);
4217}
4218}
4219};
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]]);
4235}else{
4236this.hitTestCache.xlookup[xval]=[[yval,_154[i]]];
4237}
4238}
4239}
4240for(var x in this.hitTestCache.xlookup){
4241var _157=this.hitTestCache.xlookup[x];
4242this.hitTestCache.x2maxy[x]=_152(map(_153(0),_157));
4243}
4244};
4245PlotKit.LayoutModule={};
4246PlotKit.LayoutModule.Layout=PlotKit.Layout;
4247PlotKit.LayoutModule.EXPORT=["Layout"];
4248PlotKit.LayoutModule.EXPORT_OK=[];
4249PlotKit.LayoutModule.__new__=function(){
4250var m=MochiKit.Base;
4251m.nameFunctions(this);
4252this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4253};
4254PlotKit.LayoutModule.__new__();
4255MochiKit.Base._exportSymbols(this,PlotKit.LayoutModule);
4256try{
4257if((typeof (PlotKit.Base)=="undefined")||(typeof (PlotKit.Layout)=="undefined")){
4258throw "";
4259}
4260}
4261catch(e){
4262throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Base,Layout}";
4263}
4264if(typeof (PlotKit.CanvasRenderer)=="undefined"){
4265PlotKit.CanvasRenderer={};
4266}
4267PlotKit.CanvasRenderer.NAME="PlotKit.CanvasRenderer";
4268PlotKit.CanvasRenderer.VERSION=PlotKit.VERSION;
4269PlotKit.CanvasRenderer.__repr__=function(){
4270return "["+this.NAME+" "+this.VERSION+"]";
4271};
4272PlotKit.CanvasRenderer.toString=function(){
4273return this.__repr__();
4274};
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);
4287this.container=this.element.parentNode;
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);
4295}
4296this.height=this.element.height;
4297this.width=this.element.width;
4298if(_164(this.element)){
4299throw "CanvasRenderer() - passed canvas is not found";
4300}
4301if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){
4302throw "CanvasRenderer() - Canvas is not supported.";
4303}
4304if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){
4305throw "CanvasRenderer() - <canvas> needs to be enclosed in <div>";
4306}
4307this.xlabels=new Array();
4308this.ylabels=new Array();
4309this.isFirstRender=true;
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};
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}
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};
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();
4360if(this.options.strokeColor){
4361_169.strokeStyle=this.options.strokeColor.toRGBString();
4362}else{
4363if(this.options.strokeColorTransform){
4364_169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString();
4365}
4366}
4367_169.lineWidth=this.options.strokeWidth;
4368var _176=function(obj){
4369if(obj.name==_174){
4370_168(_169,obj);
4371}
4372};
4373MochiKit.Iter.forEach(data,bind(_176,this));
4374_169.restore();
4375}
4376};
4377PlotKit.CanvasRenderer.prototype._renderBarChart=function(){
4378var bind=MochiKit.Base.bind;
4379var _178=function(_179,bar){
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;
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}
4393};
4394this._renderBarChartWrap(this.layout.bars,bind(_178,this));
4395};
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;
4402var bind=MochiKit.Base.bind;
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();
4410if(this.options.strokeColor){
4411_182.strokeStyle=this.options.strokeColor.toRGBString();
4412}else{
4413if(this.options.strokeColorTransform){
4414_182.strokeStyle=_189[_190]().toRGBString();
4415}
4416}
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();
4434}
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);
4453}
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){
4466if(this.options.shouldFill){
4467_203();
4468_196.fill();
4469}
4470if(this.options.shouldStroke){
4471_203();
4472_196.lineWidth=this.options.strokeWidth;
4473if(this.options.strokeColor){
4474_196.strokeStyle=this.options.strokeColor.toRGBString();
4475}else{
4476if(this.options.strokeColorTransform){
4477_196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString();
4478}
4479}
4480_196.stroke();
4481}
4482}
4483_196.restore();
4484}
4485};
4486PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){
4487this._renderAxis();
4488};
4489PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){
4490this._renderAxis();
4491};
4492PlotKit.CanvasRenderer.prototype._renderAxis=function(){
4493if(!this.options.drawXAxis&&!this.options.drawYAxis){
4494return;
4495}
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;
4501if(this.options.drawYAxis){
4502if(this.layout.yticks){
4503var _206=function(tick){
4504if(typeof (tick)=="function"){
4505return;
4506}
4507var x=this.area.x;
4508var y=this.area.y+tick[0]*this.area.h;
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);
4521};
4522MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this));
4523}
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();
4529}
4530if(this.options.drawXAxis){
4531if(this.layout.xticks){
4532var _206=function(tick){
4533if(typeof (dataset)=="function"){
4534return;
4535}
4536var x=this.area.x+tick[0]*this.area.w;
4537var y=this.area.y+this.area.h;
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();
4558}
4559_204.restore();
4560};
4561PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){
4562if(!this.options.drawXAxis){
4563return;
4564}
4565if(this.layout.xticks){
4566var _209=new Array();
4567for(var i=0;i<this.layout.slices.length;i++){
4568_209[this.layout.slices[i].xval]=this.layout.slices[i];
4569}
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;
4574for(var i=0;i<this.layout.xticks.length;i++){
4575var _214=_209[this.layout.xticks[i][0]];
4576if(MochiKit.Base.isUndefinedOrNull(_214)){
4577continue;
4578}
4579var _215=(_214.startAngle+_214.endAngle)/2;
4580var _216=_215;
4581if(_216>Math.PI*2){
4582_216=_216-Math.PI*2;
4583}else{
4584if(_216<0){
4585_216=_216+Math.PI*2;
4586}
4587}
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";
4596}else{
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";
4602}else{
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";
4608}else{
4609_219["textAlign"]="right";
4610_219["verticalAlign"]="bottom";
4611_219["left"]=(_217-_213)+"px";
4612_219["top"]=(_218-this.options.axisLabelFontSize)+"px";
4613}
4614}
4615}
4616var _220=DIV({"style":_219},this.layout.xticks[i][1]);
4617this.xlabels.push(_220);
4618MochiKit.DOM.appendChildNodes(this.container,_220);
4619}
4620}
4621};
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();
4628};
4629PlotKit.CanvasRenderer.prototype.clear=function(){
4630if(this.isIE){
4631try{
4632if(this.clearDelay){
4633this.clearDelay.cancel();
4634this.clearDelay=null;
4635}
4636var _222=this.element.getContext("2d");
4637}
4638catch(e){
4639this.isFirstRender=false;
4640this.clearDelay=MochiKit.Async.wait(this.IEDelay);
4641this.clearDelay.addCallback(bind(this.clear,this));
4642return;
4643}
4644}
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);
4649this.xlabels=new Array();
4650this.ylabels=new Array();
4651};
4652PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){
4653var _223=MochiKit.Signal.connect;
4654var bind=MochiKit.Base.bind;
4655_223(this.element,"onclick",bind(this.onclick,this));
4656};
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;
4663}
4664return null;
4665};
4666PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){
4667if(_226==null){
4668return null;
4669}
4670e.chart=_226;
4671return e;
4672};
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);
4678}
4679};
4680PlotKit.CanvasRenderer.prototype.onmouseover=function(e){
4681var _229=this._resolveObject(e);
4682var _230=this._createEventObject(_229,e);
4683if(_230!=null){
4684signal(this,"onmouseover",_230);
4685}
4686};
4687PlotKit.CanvasRenderer.prototype.onmouseout=function(e){
4688var _231=this._resolveObject(e);
4689var _232=this._createEventObject(_231,e);
4690if(_232==null){
4691signal(this,"onmouseout",e);
4692}else{
4693signal(this,"onmouseout",_232);
4694}
4695};
4696PlotKit.CanvasRenderer.prototype.onmousemove=function(e){
4697var _233=this._resolveObject(e);
4698var _234=this._createEventObject(_233,e);
4699if((_233==null)&&(this.event_isinside==null)){
4700return;
4701}
4702if((_233!=null)&&(this.event_isinside==null)){
4703signal(this,"onmouseover",_234);
4704}
4705if((_233==null)&&(this.event_isinside!=null)){
4706signal(this,"onmouseout",_234);
4707}
4708if((_233!=null)&&(this.event_isinside!=null)){
4709signal(this,"onmousemove",_234);
4710}
4711this.event_isinside=_233;
4712};
4713PlotKit.CanvasRenderer.isSupported=function(_235){
4714var _236=null;
4715try{
4716if(MochiKit.Base.isUndefinedOrNull(_235)){
4717_236=MochiKit.DOM.CANVAS({});
4718}else{
4719_236=MochiKit.DOM.getElement(_235);
4720}
4721var _237=_236.getContext("2d");
4722}
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;
4728}
4729return true;
4730}
4731return true;
4732};
4733PlotKit.Canvas={};
4734PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer;
4735PlotKit.Canvas.EXPORT=["CanvasRenderer"];
4736PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"];
4737PlotKit.Canvas.__new__=function(){
4738var m=MochiKit.Base;
4739m.nameFunctions(this);
4740this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4741};
4742PlotKit.Canvas.__new__();
4743MochiKit.Base._exportSymbols(this,PlotKit.Canvas);
6a1aa64f
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
0949d3e5 5122 connect(window, 'onload', this, function(e) { this.start_(); });
6a1aa64f
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};