update combined files
[dygraphs.git] / dygraph-combined.js
... / ...
CommitLineData
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"){
1005dojo.provide("MochiKit.Iter");
1006dojo.require("MochiKit.Base");
1007}
1008if(typeof (JSAN)!="undefined"){
1009JSAN.use("MochiKit.Base",[]);
1010}
1011try{
1012if(typeof (MochiKit.Base)=="undefined"){
1013throw "";
1014}
1015}
1016catch(e){
1017throw "MochiKit.Iter depends on MochiKit.Base!";
1018}
1019if(typeof (MochiKit.Iter)=="undefined"){
1020MochiKit.Iter={};
1021}
1022MochiKit.Iter.NAME="MochiKit.Iter";
1023MochiKit.Iter.VERSION="1.4";
1024MochiKit.Base.update(MochiKit.Iter,{__repr__:function(){
1025return "["+this.NAME+" "+this.VERSION+"]";
1026},toString:function(){
1027return this.__repr__();
1028},registerIteratorFactory:function(name,_14e,_14f,_150){
1029MochiKit.Iter.iteratorRegistry.register(name,_14e,_14f,_150);
1030},iter:function(_151,_152){
1031var self=MochiKit.Iter;
1032if(arguments.length==2){
1033return self.takewhile(function(a){
1034return a!=_152;
1035},_151);
1036}
1037if(typeof (_151.next)=="function"){
1038return _151;
1039}else{
1040if(typeof (_151.iter)=="function"){
1041return _151.iter();
1042}
1043}
1044try{
1045return self.iteratorRegistry.match(_151);
1046}
1047catch(e){
1048var m=MochiKit.Base;
1049if(e==m.NotFound){
1050e=new TypeError(typeof (_151)+": "+m.repr(_151)+" is not iterable");
1051}
1052throw e;
1053}
1054},count:function(n){
1055if(!n){
1056n=0;
1057}
1058var m=MochiKit.Base;
1059return {repr:function(){
1060return "count("+n+")";
1061},toString:m.forwardCall("repr"),next:m.counter(n)};
1062},cycle:function(p){
1063var self=MochiKit.Iter;
1064var m=MochiKit.Base;
1065var lst=[];
1066var _15c=self.iter(p);
1067return {repr:function(){
1068return "cycle(...)";
1069},toString:m.forwardCall("repr"),next:function(){
1070try{
1071var rval=_15c.next();
1072lst.push(rval);
1073return rval;
1074}
1075catch(e){
1076if(e!=self.StopIteration){
1077throw e;
1078}
1079if(lst.length===0){
1080this.next=function(){
1081throw self.StopIteration;
1082};
1083}else{
1084var i=-1;
1085this.next=function(){
1086i=(i+1)%lst.length;
1087return lst[i];
1088};
1089}
1090return this.next();
1091}
1092}};
1093},repeat:function(elem,n){
1094var m=MochiKit.Base;
1095if(typeof (n)=="undefined"){
1096return {repr:function(){
1097return "repeat("+m.repr(elem)+")";
1098},toString:m.forwardCall("repr"),next:function(){
1099return elem;
1100}};
1101}
1102return {repr:function(){
1103return "repeat("+m.repr(elem)+", "+n+")";
1104},toString:m.forwardCall("repr"),next:function(){
1105if(n<=0){
1106throw MochiKit.Iter.StopIteration;
1107}
1108n-=1;
1109return elem;
1110}};
1111},next:function(_162){
1112return _162.next();
1113},izip:function(p,q){
1114var m=MochiKit.Base;
1115var self=MochiKit.Iter;
1116var next=self.next;
1117var _168=m.map(self.iter,arguments);
1118return {repr:function(){
1119return "izip(...)";
1120},toString:m.forwardCall("repr"),next:function(){
1121return m.map(next,_168);
1122}};
1123},ifilter:function(pred,seq){
1124var m=MochiKit.Base;
1125seq=MochiKit.Iter.iter(seq);
1126if(pred===null){
1127pred=m.operator.truth;
1128}
1129return {repr:function(){
1130return "ifilter(...)";
1131},toString:m.forwardCall("repr"),next:function(){
1132while(true){
1133var rval=seq.next();
1134if(pred(rval)){
1135return rval;
1136}
1137}
1138return undefined;
1139}};
1140},ifilterfalse:function(pred,seq){
1141var m=MochiKit.Base;
1142seq=MochiKit.Iter.iter(seq);
1143if(pred===null){
1144pred=m.operator.truth;
1145}
1146return {repr:function(){
1147return "ifilterfalse(...)";
1148},toString:m.forwardCall("repr"),next:function(){
1149while(true){
1150var rval=seq.next();
1151if(!pred(rval)){
1152return rval;
1153}
1154}
1155return undefined;
1156}};
1157},islice:function(seq){
1158var self=MochiKit.Iter;
1159var m=MochiKit.Base;
1160seq=self.iter(seq);
1161var _174=0;
1162var stop=0;
1163var step=1;
1164var i=-1;
1165if(arguments.length==2){
1166stop=arguments[1];
1167}else{
1168if(arguments.length==3){
1169_174=arguments[1];
1170stop=arguments[2];
1171}else{
1172_174=arguments[1];
1173stop=arguments[2];
1174step=arguments[3];
1175}
1176}
1177return {repr:function(){
1178return "islice("+["...",_174,stop,step].join(", ")+")";
1179},toString:m.forwardCall("repr"),next:function(){
1180var rval;
1181while(i<_174){
1182rval=seq.next();
1183i++;
1184}
1185if(_174>=stop){
1186throw self.StopIteration;
1187}
1188_174+=step;
1189return rval;
1190}};
1191},imap:function(fun,p,q){
1192var m=MochiKit.Base;
1193var self=MochiKit.Iter;
1194var _17e=m.map(self.iter,m.extend(null,arguments,1));
1195var map=m.map;
1196var next=self.next;
1197return {repr:function(){
1198return "imap(...)";
1199},toString:m.forwardCall("repr"),next:function(){
1200return fun.apply(this,map(next,_17e));
1201}};
1202},applymap:function(fun,seq,self){
1203seq=MochiKit.Iter.iter(seq);
1204var m=MochiKit.Base;
1205return {repr:function(){
1206return "applymap(...)";
1207},toString:m.forwardCall("repr"),next:function(){
1208return fun.apply(self,seq.next());
1209}};
1210},chain:function(p,q){
1211var self=MochiKit.Iter;
1212var m=MochiKit.Base;
1213if(arguments.length==1){
1214return self.iter(arguments[0]);
1215}
1216var _189=m.map(self.iter,arguments);
1217return {repr:function(){
1218return "chain(...)";
1219},toString:m.forwardCall("repr"),next:function(){
1220while(_189.length>1){
1221try{
1222return _189[0].next();
1223}
1224catch(e){
1225if(e!=self.StopIteration){
1226throw e;
1227}
1228_189.shift();
1229}
1230}
1231if(_189.length==1){
1232var arg=_189.shift();
1233this.next=m.bind("next",arg);
1234return this.next();
1235}
1236throw self.StopIteration;
1237}};
1238},takewhile:function(pred,seq){
1239var self=MochiKit.Iter;
1240seq=self.iter(seq);
1241return {repr:function(){
1242return "takewhile(...)";
1243},toString:MochiKit.Base.forwardCall("repr"),next:function(){
1244var rval=seq.next();
1245if(!pred(rval)){
1246this.next=function(){
1247throw self.StopIteration;
1248};
1249this.next();
1250}
1251return rval;
1252}};
1253},dropwhile:function(pred,seq){
1254seq=MochiKit.Iter.iter(seq);
1255var m=MochiKit.Base;
1256var bind=m.bind;
1257return {"repr":function(){
1258return "dropwhile(...)";
1259},"toString":m.forwardCall("repr"),"next":function(){
1260while(true){
1261var rval=seq.next();
1262if(!pred(rval)){
1263break;
1264}
1265}
1266this.next=bind("next",seq);
1267return rval;
1268}};
1269},_tee:function(_194,sync,_196){
1270sync.pos[_194]=-1;
1271var m=MochiKit.Base;
1272var _198=m.listMin;
1273return {repr:function(){
1274return "tee("+_194+", ...)";
1275},toString:m.forwardCall("repr"),next:function(){
1276var rval;
1277var i=sync.pos[_194];
1278if(i==sync.max){
1279rval=_196.next();
1280sync.deque.push(rval);
1281sync.max+=1;
1282sync.pos[_194]+=1;
1283}else{
1284rval=sync.deque[i-sync.min];
1285sync.pos[_194]+=1;
1286if(i==sync.min&&_198(sync.pos)!=sync.min){
1287sync.min+=1;
1288sync.deque.shift();
1289}
1290}
1291return rval;
1292}};
1293},tee:function(_19b,n){
1294var rval=[];
1295var sync={"pos":[],"deque":[],"max":-1,"min":-1};
1296if(arguments.length==1||typeof (n)=="undefined"||n===null){
1297n=2;
1298}
1299var self=MochiKit.Iter;
1300_19b=self.iter(_19b);
1301var _tee=self._tee;
1302for(var i=0;i<n;i++){
1303rval.push(_tee(i,sync,_19b));
1304}
1305return rval;
1306},list:function(_1a2){
1307var rval;
1308if(_1a2 instanceof Array){
1309return _1a2.slice();
1310}
1311if(typeof (_1a2)=="function"&&!(_1a2 instanceof Function)&&typeof (_1a2.length)=="number"){
1312rval=[];
1313for(var i=0;i<_1a2.length;i++){
1314rval.push(_1a2[i]);
1315}
1316return rval;
1317}
1318var self=MochiKit.Iter;
1319_1a2=self.iter(_1a2);
1320var rval=[];
1321try{
1322while(true){
1323rval.push(_1a2.next());
1324}
1325}
1326catch(e){
1327if(e!=self.StopIteration){
1328throw e;
1329}
1330return rval;
1331}
1332return undefined;
1333},reduce:function(fn,_1a7,_1a8){
1334var i=0;
1335var x=_1a8;
1336var self=MochiKit.Iter;
1337_1a7=self.iter(_1a7);
1338if(arguments.length<3){
1339try{
1340x=_1a7.next();
1341}
1342catch(e){
1343if(e==self.StopIteration){
1344e=new TypeError("reduce() of empty sequence with no initial value");
1345}
1346throw e;
1347}
1348i++;
1349}
1350try{
1351while(true){
1352x=fn(x,_1a7.next());
1353}
1354}
1355catch(e){
1356if(e!=self.StopIteration){
1357throw e;
1358}
1359}
1360return x;
1361},range:function(){
1362var _1ac=0;
1363var stop=0;
1364var step=1;
1365if(arguments.length==1){
1366stop=arguments[0];
1367}else{
1368if(arguments.length==2){
1369_1ac=arguments[0];
1370stop=arguments[1];
1371}else{
1372if(arguments.length==3){
1373_1ac=arguments[0];
1374stop=arguments[1];
1375step=arguments[2];
1376}else{
1377throw new TypeError("range() takes 1, 2, or 3 arguments!");
1378}
1379}
1380}
1381if(step===0){
1382throw new TypeError("range() step must not be 0");
1383}
1384return {next:function(){
1385if((step>0&&_1ac>=stop)||(step<0&&_1ac<=stop)){
1386throw MochiKit.Iter.StopIteration;
1387}
1388var rval=_1ac;
1389_1ac+=step;
1390return rval;
1391},repr:function(){
1392return "range("+[_1ac,stop,step].join(", ")+")";
1393},toString:MochiKit.Base.forwardCall("repr")};
1394},sum:function(_1b0,_1b1){
1395if(typeof (_1b1)=="undefined"||_1b1===null){
1396_1b1=0;
1397}
1398var x=_1b1;
1399var self=MochiKit.Iter;
1400_1b0=self.iter(_1b0);
1401try{
1402while(true){
1403x+=_1b0.next();
1404}
1405}
1406catch(e){
1407if(e!=self.StopIteration){
1408throw e;
1409}
1410}
1411return x;
1412},exhaust:function(_1b4){
1413var self=MochiKit.Iter;
1414_1b4=self.iter(_1b4);
1415try{
1416while(true){
1417_1b4.next();
1418}
1419}
1420catch(e){
1421if(e!=self.StopIteration){
1422throw e;
1423}
1424}
1425},forEach:function(_1b6,func,self){
1426var m=MochiKit.Base;
1427if(arguments.length>2){
1428func=m.bind(func,self);
1429}
1430if(m.isArrayLike(_1b6)){
1431try{
1432for(var i=0;i<_1b6.length;i++){
1433func(_1b6[i]);
1434}
1435}
1436catch(e){
1437if(e!=MochiKit.Iter.StopIteration){
1438throw e;
1439}
1440}
1441}else{
1442self=MochiKit.Iter;
1443self.exhaust(self.imap(func,_1b6));
1444}
1445},every:function(_1bb,func){
1446var self=MochiKit.Iter;
1447try{
1448self.ifilterfalse(func,_1bb).next();
1449return false;
1450}
1451catch(e){
1452if(e!=self.StopIteration){
1453throw e;
1454}
1455return true;
1456}
1457},sorted:function(_1be,cmp){
1458var rval=MochiKit.Iter.list(_1be);
1459if(arguments.length==1){
1460cmp=MochiKit.Base.compare;
1461}
1462rval.sort(cmp);
1463return rval;
1464},reversed:function(_1c1){
1465var rval=MochiKit.Iter.list(_1c1);
1466rval.reverse();
1467return rval;
1468},some:function(_1c3,func){
1469var self=MochiKit.Iter;
1470try{
1471self.ifilter(func,_1c3).next();
1472return true;
1473}
1474catch(e){
1475if(e!=self.StopIteration){
1476throw e;
1477}
1478return false;
1479}
1480},iextend:function(lst,_1c7){
1481if(MochiKit.Base.isArrayLike(_1c7)){
1482for(var i=0;i<_1c7.length;i++){
1483lst.push(_1c7[i]);
1484}
1485}else{
1486var self=MochiKit.Iter;
1487_1c7=self.iter(_1c7);
1488try{
1489while(true){
1490lst.push(_1c7.next());
1491}
1492}
1493catch(e){
1494if(e!=self.StopIteration){
1495throw e;
1496}
1497}
1498}
1499return lst;
1500},groupby:function(_1ca,_1cb){
1501var m=MochiKit.Base;
1502var self=MochiKit.Iter;
1503if(arguments.length<2){
1504_1cb=m.operator.identity;
1505}
1506_1ca=self.iter(_1ca);
1507var pk=undefined;
1508var k=undefined;
1509var v;
1510function fetch(){
1511v=_1ca.next();
1512k=_1cb(v);
1513}
1514function eat(){
1515var ret=v;
1516v=undefined;
1517return ret;
1518}
1519var _1d2=true;
1520var _1d3=m.compare;
1521return {repr:function(){
1522return "groupby(...)";
1523},next:function(){
1524while(_1d3(k,pk)===0){
1525fetch();
1526if(_1d2){
1527_1d2=false;
1528break;
1529}
1530}
1531pk=k;
1532return [k,{next:function(){
1533if(v==undefined){
1534fetch();
1535}
1536if(_1d3(k,pk)!==0){
1537throw self.StopIteration;
1538}
1539return eat();
1540}}];
1541}};
1542},groupby_as_array:function(_1d4,_1d5){
1543var m=MochiKit.Base;
1544var self=MochiKit.Iter;
1545if(arguments.length<2){
1546_1d5=m.operator.identity;
1547}
1548_1d4=self.iter(_1d4);
1549var _1d8=[];
1550var _1d9=true;
1551var _1da;
1552var _1db=m.compare;
1553while(true){
1554try{
1555var _1dc=_1d4.next();
1556var key=_1d5(_1dc);
1557}
1558catch(e){
1559if(e==self.StopIteration){
1560break;
1561}
1562throw e;
1563}
1564if(_1d9||_1db(key,_1da)!==0){
1565var _1de=[];
1566_1d8.push([key,_1de]);
1567}
1568_1de.push(_1dc);
1569_1d9=false;
1570_1da=key;
1571}
1572return _1d8;
1573},arrayLikeIter:function(_1df){
1574var i=0;
1575return {repr:function(){
1576return "arrayLikeIter(...)";
1577},toString:MochiKit.Base.forwardCall("repr"),next:function(){
1578if(i>=_1df.length){
1579throw MochiKit.Iter.StopIteration;
1580}
1581return _1df[i++];
1582}};
1583},hasIterateNext:function(_1e1){
1584return (_1e1&&typeof (_1e1.iterateNext)=="function");
1585},iterateNextIter:function(_1e2){
1586return {repr:function(){
1587return "iterateNextIter(...)";
1588},toString:MochiKit.Base.forwardCall("repr"),next:function(){
1589var rval=_1e2.iterateNext();
1590if(rval===null||rval===undefined){
1591throw MochiKit.Iter.StopIteration;
1592}
1593return rval;
1594}};
1595}});
1596MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",];
1597MochiKit.Iter.EXPORT=["StopIteration","registerIteratorFactory","iter","count","cycle","repeat","next","izip","ifilter","ifilterfalse","islice","imap","applymap","chain","takewhile","dropwhile","tee","list","reduce","range","sum","exhaust","forEach","every","sorted","reversed","some","iextend","groupby","groupby_as_array"];
1598MochiKit.Iter.__new__=function(){
1599var m=MochiKit.Base;
1600if(typeof (StopIteration)!="undefined"){
1601this.StopIteration=StopIteration;
1602}else{
1603this.StopIteration=new m.NamedError("StopIteration");
1604}
1605this.iteratorRegistry=new m.AdapterRegistry();
1606this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter);
1607this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter);
1608this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
1609m.nameFunctions(this);
1610};
1611MochiKit.Iter.__new__();
1612if(MochiKit.__export__){
1613reduce=MochiKit.Iter.reduce;
1614}
1615MochiKit.Base._exportSymbols(this,MochiKit.Iter);
1616if(typeof (dojo)!="undefined"){
1617dojo.provide("MochiKit.Format");
1618}
1619if(typeof (MochiKit)=="undefined"){
1620MochiKit={};
1621}
1622if(typeof (MochiKit.Format)=="undefined"){
1623MochiKit.Format={};
1624}
1625MochiKit.Format.NAME="MochiKit.Format";
1626MochiKit.Format.VERSION="1.4";
1627MochiKit.Format.__repr__=function(){
1628return "["+this.NAME+" "+this.VERSION+"]";
1629};
1630MochiKit.Format.toString=function(){
1631return this.__repr__();
1632};
1633MochiKit.Format._numberFormatter=function(_1e5,_1e6,_1e7,_1e8,_1e9,_1ea,_1eb,_1ec,_1ed){
1634return function(num){
1635num=parseFloat(num);
1636if(typeof (num)=="undefined"||num===null||isNaN(num)){
1637return _1e5;
1638}
1639var _1ef=_1e6;
1640var _1f0=_1e7;
1641if(num<0){
1642num=-num;
1643}else{
1644_1ef=_1ef.replace(/-/,"");
1645}
1646var me=arguments.callee;
1647var fmt=MochiKit.Format.formatLocale(_1e8);
1648if(_1e9){
1649num=num*100;
1650_1f0=fmt.percent+_1f0;
1651}
1652num=MochiKit.Format.roundToFixed(num,_1ea);
1653var _1f3=num.split(/\./);
1654var _1f4=_1f3[0];
1655var frac=(_1f3.length==1)?"":_1f3[1];
1656var res="";
1657while(_1f4.length<_1eb){
1658_1f4="0"+_1f4;
1659}
1660if(_1ec){
1661while(_1f4.length>_1ec){
1662var i=_1f4.length-_1ec;
1663res=fmt.separator+_1f4.substring(i,_1f4.length)+res;
1664_1f4=_1f4.substring(0,i);
1665}
1666}
1667res=_1f4+res;
1668if(_1ea>0){
1669while(frac.length<_1ed){
1670frac=frac+"0";
1671}
1672res=res+fmt.decimal+frac;
1673}
1674return _1ef+res+_1f0;
1675};
1676};
1677MochiKit.Format.numberFormatter=function(_1f8,_1f9,_1fa){
1678if(typeof (_1f9)=="undefined"){
1679_1f9="";
1680}
1681var _1fb=_1f8.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
1682if(!_1fb){
1683throw TypeError("Invalid pattern");
1684}
1685var _1fc=_1f8.substr(0,_1fb.index);
1686var _1fd=_1f8.substr(_1fb.index+_1fb[0].length);
1687if(_1fc.search(/-/)==-1){
1688_1fc=_1fc+"-";
1689}
1690var _1fe=_1fb[1];
1691var frac=(typeof (_1fb[2])=="string"&&_1fb[2]!="")?_1fb[2]:"";
1692var _200=(typeof (_1fb[3])=="string"&&_1fb[3]!="");
1693var tmp=_1fe.split(/,/);
1694var _202;
1695if(typeof (_1fa)=="undefined"){
1696_1fa="default";
1697}
1698if(tmp.length==1){
1699_202=null;
1700}else{
1701_202=tmp[1].length;
1702}
1703var _203=_1fe.length-_1fe.replace(/0/g,"").length;
1704var _204=frac.length-frac.replace(/0/g,"").length;
1705var _205=frac.length;
1706var rval=MochiKit.Format._numberFormatter(_1f9,_1fc,_1fd,_1fa,_200,_205,_203,_202,_204);
1707var m=MochiKit.Base;
1708if(m){
1709var fn=arguments.callee;
1710var args=m.concat(arguments);
1711rval.repr=function(){
1712return [self.NAME,"(",map(m.repr,args).join(", "),")"].join("");
1713};
1714}
1715return rval;
1716};
1717MochiKit.Format.formatLocale=function(_20a){
1718if(typeof (_20a)=="undefined"||_20a===null){
1719_20a="default";
1720}
1721if(typeof (_20a)=="string"){
1722var rval=MochiKit.Format.LOCALE[_20a];
1723if(typeof (rval)=="string"){
1724rval=arguments.callee(rval);
1725MochiKit.Format.LOCALE[_20a]=rval;
1726}
1727return rval;
1728}else{
1729return _20a;
1730}
1731};
1732MochiKit.Format.twoDigitAverage=function(_20c,_20d){
1733if(_20d){
1734var res=_20c/_20d;
1735if(!isNaN(res)){
1736return MochiKit.Format.twoDigitFloat(_20c/_20d);
1737}
1738}
1739return "0";
1740};
1741MochiKit.Format.twoDigitFloat=function(_20f){
1742var sign=(_20f<0?"-":"");
1743var s=Math.floor(Math.abs(_20f)*100).toString();
1744if(s=="0"){
1745return s;
1746}
1747if(s.length<3){
1748while(s.charAt(s.length-1)=="0"){
1749s=s.substring(0,s.length-1);
1750}
1751return sign+"0."+s;
1752}
1753var head=sign+s.substring(0,s.length-2);
1754var tail=s.substring(s.length-2,s.length);
1755if(tail=="00"){
1756return head;
1757}else{
1758if(tail.charAt(1)=="0"){
1759return head+"."+tail.charAt(0);
1760}else{
1761return head+"."+tail;
1762}
1763}
1764};
1765MochiKit.Format.lstrip=function(str,_215){
1766str=str+"";
1767if(typeof (str)!="string"){
1768return null;
1769}
1770if(!_215){
1771return str.replace(/^\s+/,"");
1772}else{
1773return str.replace(new RegExp("^["+_215+"]+"),"");
1774}
1775};
1776MochiKit.Format.rstrip=function(str,_217){
1777str=str+"";
1778if(typeof (str)!="string"){
1779return null;
1780}
1781if(!_217){
1782return str.replace(/\s+$/,"");
1783}else{
1784return str.replace(new RegExp("["+_217+"]+$"),"");
1785}
1786};
1787MochiKit.Format.strip=function(str,_219){
1788var self=MochiKit.Format;
1789return self.rstrip(self.lstrip(str,_219),_219);
1790};
1791MochiKit.Format.truncToFixed=function(_21b,_21c){
1792_21b=Math.floor(_21b*Math.pow(10,_21c));
1793var res=(_21b*Math.pow(10,-_21c)).toFixed(_21c);
1794if(res.charAt(0)=="."){
1795res="0"+res;
1796}
1797return res;
1798};
1799MochiKit.Format.roundToFixed=function(_21e,_21f){
1800return MochiKit.Format.truncToFixed(_21e+0.5*Math.pow(10,-_21f),_21f);
1801};
1802MochiKit.Format.percentFormat=function(_220){
1803return MochiKit.Format.twoDigitFloat(100*_220)+"%";
1804};
1805MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"];
1806MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"};
1807MochiKit.Format.EXPORT_OK=[];
1808MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT};
1809MochiKit.Format.__new__=function(){
1810var base=this.NAME+".";
1811var k,v,o;
1812for(k in this.LOCALE){
1813o=this.LOCALE[k];
1814if(typeof (o)=="object"){
1815o.repr=function(){
1816return this.NAME;
1817};
1818o.NAME=base+"LOCALE."+k;
1819}
1820}
1821for(k in this){
1822o=this[k];
1823if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
1824try{
1825o.NAME=base+k;
1826}
1827catch(e){
1828}
1829}
1830}
1831};
1832MochiKit.Format.__new__();
1833if(typeof (MochiKit.Base)!="undefined"){
1834MochiKit.Base._exportSymbols(this,MochiKit.Format);
1835}else{
1836(function(_225,_226){
1837if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){
1838var all=_226.EXPORT_TAGS[":all"];
1839for(var i=0;i<all.length;i++){
1840_225[all[i]]=_226[all[i]];
1841}
1842}
1843})(this,MochiKit.Format);
1844}
1845if(typeof (dojo)!="undefined"){
1846dojo.provide("MochiKit.DOM");
1847dojo.require("MochiKit.Base");
1848}
1849if(typeof (JSAN)!="undefined"){
1850JSAN.use("MochiKit.Base",[]);
1851}
1852try{
1853if(typeof (MochiKit.Base)=="undefined"){
1854throw "";
1855}
1856}
1857catch(e){
1858throw "MochiKit.DOM depends on MochiKit.Base!";
1859}
1860if(typeof (MochiKit.DOM)=="undefined"){
1861MochiKit.DOM={};
1862}
1863MochiKit.DOM.NAME="MochiKit.DOM";
1864MochiKit.DOM.VERSION="1.4";
1865MochiKit.DOM.__repr__=function(){
1866return "["+this.NAME+" "+this.VERSION+"]";
1867};
1868MochiKit.DOM.toString=function(){
1869return this.__repr__();
1870};
1871MochiKit.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"];
1872MochiKit.DOM.EXPORT_OK=["domConverters"];
1873MochiKit.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"]];
1874MochiKit.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);");
1875MochiKit.Base.update(MochiKit.DOM,{currentWindow:function(){
1876return MochiKit.DOM._window;
1877},currentDocument:function(){
1878return MochiKit.DOM._document;
1879},withWindow:function(win,func){
1880var self=MochiKit.DOM;
1881var _22c=self._document;
1882var _22d=self._window;
1883var rval;
1884try{
1885self._window=win;
1886self._document=win.document;
1887rval=func();
1888}
1889catch(e){
1890self._window=_22d;
1891self._document=_22c;
1892throw e;
1893}
1894self._window=_22d;
1895self._document=_22c;
1896return rval;
1897},formContents:function(elem){
1898var _230=[];
1899var _231=[];
1900var m=MochiKit.Base;
1901var self=MochiKit.DOM;
1902if(typeof (elem)=="undefined"||elem===null){
1903elem=self._document.body;
1904}else{
1905elem=self.getElement(elem);
1906}
1907m.nodeWalk(elem,function(elem){
1908var name=elem.name;
1909if(m.isNotEmpty(name)){
1910var _236=elem.tagName.toUpperCase();
1911if(_236==="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
1912return null;
1913}
1914if(_236==="SELECT"){
1915if(elem.type=="select-one"){
1916if(elem.selectedIndex>=0){
1917var opt=elem.options[elem.selectedIndex];
1918var v=opt.value;
1919if(!v){
1920var h=opt.outerHTML;
1921if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1922v=opt.text;
1923}
1924}
1925_230.push(name);
1926_231.push(v);
1927return null;
1928}
1929_230.push(name);
1930_231.push("");
1931return null;
1932}else{
1933var opts=elem.options;
1934if(!opts.length){
1935_230.push(name);
1936_231.push("");
1937return null;
1938}
1939for(var i=0;i<opts.length;i++){
1940var opt=opts[i];
1941if(!opt.selected){
1942continue;
1943}
1944var v=opt.value;
1945if(!v){
1946var h=opt.outerHTML;
1947if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1948v=opt.text;
1949}
1950}
1951_230.push(name);
1952_231.push(v);
1953}
1954return null;
1955}
1956}
1957if(_236==="FORM"||_236==="P"||_236==="SPAN"||_236==="DIV"){
1958return elem.childNodes;
1959}
1960_230.push(name);
1961_231.push(elem.value||"");
1962return null;
1963}
1964return elem.childNodes;
1965});
1966return [_230,_231];
1967},withDocument:function(doc,func){
1968var self=MochiKit.DOM;
1969var _23f=self._document;
1970var rval;
1971try{
1972self._document=doc;
1973rval=func();
1974}
1975catch(e){
1976self._document=_23f;
1977throw e;
1978}
1979self._document=_23f;
1980return rval;
1981},registerDOMConverter:function(name,_242,wrap,_244){
1982MochiKit.DOM.domConverters.register(name,_242,wrap,_244);
1983},coerceToDOM:function(node,ctx){
1984var m=MochiKit.Base;
1985var im=MochiKit.Iter;
1986var self=MochiKit.DOM;
1987if(im){
1988var iter=im.iter;
1989var _24b=im.repeat;
1990var map=m.map;
1991}
1992var _24d=self.domConverters;
1993var _24e=arguments.callee;
1994var _24f=m.NotFound;
1995while(true){
1996if(typeof (node)=="undefined"||node===null){
1997return null;
1998}
1999if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
2000node=im.list(node);
2001}
2002if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
2003return node;
2004}
2005if(typeof (node)=="number"||typeof (node)=="boolean"){
2006node=node.toString();
2007}
2008if(typeof (node)=="string"){
2009return self._document.createTextNode(node);
2010}
2011if(typeof (node.__dom__)=="function"){
2012node=node.__dom__(ctx);
2013continue;
2014}
2015if(typeof (node.dom)=="function"){
2016node=node.dom(ctx);
2017continue;
2018}
2019if(typeof (node)=="function"){
2020node=node.apply(ctx,[ctx]);
2021continue;
2022}
2023if(im){
2024var _250=null;
2025try{
2026_250=iter(node);
2027}
2028catch(e){
2029}
2030if(_250){
2031return map(_24e,_250,_24b(ctx));
2032}
2033}
2034try{
2035node=_24d.match(node,ctx);
2036continue;
2037}
2038catch(e){
2039if(e!=_24f){
2040throw e;
2041}
2042}
2043return self._document.createTextNode(node.toString());
2044}
2045return undefined;
2046},isChildNode:function(node,_252){
2047var self=MochiKit.DOM;
2048if(typeof (node)=="string"){
2049node=self.getElement(node);
2050}
2051if(typeof (_252)=="string"){
2052_252=self.getElement(_252);
2053}
2054if(node===_252){
2055return true;
2056}
2057while(node&&node.tagName.toUpperCase()!="BODY"){
2058node=node.parentNode;
2059if(node===_252){
2060return true;
2061}
2062}
2063return false;
2064},setNodeAttribute:function(node,attr,_256){
2065var o={};
2066o[attr]=_256;
2067try{
2068return MochiKit.DOM.updateNodeAttributes(node,o);
2069}
2070catch(e){
2071}
2072return null;
2073},getNodeAttribute:function(node,attr){
2074var self=MochiKit.DOM;
2075var _25b=self.attributeArray.renames[attr];
2076node=self.getElement(node);
2077try{
2078if(_25b){
2079return node[_25b];
2080}
2081return node.getAttribute(attr);
2082}
2083catch(e){
2084}
2085return null;
2086},removeNodeAttribute:function(node,attr){
2087var self=MochiKit.DOM;
2088var _25f=self.attributeArray.renames[attr];
2089node=self.getElement(node);
2090try{
2091if(_25f){
2092return node[_25f];
2093}
2094return node.removeAttribute(attr);
2095}
2096catch(e){
2097}
2098return null;
2099},updateNodeAttributes:function(node,_261){
2100var elem=node;
2101var self=MochiKit.DOM;
2102if(typeof (node)=="string"){
2103elem=self.getElement(node);
2104}
2105if(_261){
2106var _264=MochiKit.Base.updatetree;
2107if(self.attributeArray.compliant){
2108for(var k in _261){
2109var v=_261[k];
2110if(typeof (v)=="object"&&typeof (elem[k])=="object"){
2111if(k=="style"&&MochiKit.Style){
2112MochiKit.Style.setStyle(elem,v);
2113}else{
2114_264(elem[k],v);
2115}
2116}else{
2117if(k.substring(0,2)=="on"){
2118if(typeof (v)=="string"){
2119v=new Function(v);
2120}
2121elem[k]=v;
2122}else{
2123elem.setAttribute(k,v);
2124}
2125}
2126}
2127}else{
2128var _267=self.attributeArray.renames;
2129for(var k in _261){
2130v=_261[k];
2131var _268=_267[k];
2132if(k=="style"&&typeof (v)=="string"){
2133elem.style.cssText=v;
2134}else{
2135if(typeof (_268)=="string"){
2136elem[_268]=v;
2137}else{
2138if(typeof (elem[k])=="object"&&typeof (v)=="object"){
2139if(k=="style"&&MochiKit.Style){
2140MochiKit.Style.setStyle(elem,v);
2141}else{
2142_264(elem[k],v);
2143}
2144}else{
2145if(k.substring(0,2)=="on"){
2146if(typeof (v)=="string"){
2147v=new Function(v);
2148}
2149elem[k]=v;
2150}else{
2151elem.setAttribute(k,v);
2152}
2153}
2154}
2155}
2156}
2157}
2158}
2159return elem;
2160},appendChildNodes:function(node){
2161var elem=node;
2162var self=MochiKit.DOM;
2163if(typeof (node)=="string"){
2164elem=self.getElement(node);
2165}
2166var _26c=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2167var _26d=MochiKit.Base.concat;
2168while(_26c.length){
2169var n=_26c.shift();
2170if(typeof (n)=="undefined"||n===null){
2171}else{
2172if(typeof (n.nodeType)=="number"){
2173elem.appendChild(n);
2174}else{
2175_26c=_26d(n,_26c);
2176}
2177}
2178}
2179return elem;
2180},insertSiblingNodesBefore:function(node){
2181var elem=node;
2182var self=MochiKit.DOM;
2183if(typeof (node)=="string"){
2184elem=self.getElement(node);
2185}
2186var _272=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2187var _273=elem.parentNode;
2188var _274=MochiKit.Base.concat;
2189while(_272.length){
2190var n=_272.shift();
2191if(typeof (n)=="undefined"||n===null){
2192}else{
2193if(typeof (n.nodeType)=="number"){
2194_273.insertBefore(n,elem);
2195}else{
2196_272=_274(n,_272);
2197}
2198}
2199}
2200return _273;
2201},insertSiblingNodesAfter:function(node){
2202var elem=node;
2203var self=MochiKit.DOM;
2204if(typeof (node)=="string"){
2205elem=self.getElement(node);
2206}
2207var _279=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2208if(elem.nextSibling){
2209return self.insertSiblingNodesBefore(elem.nextSibling,_279);
2210}else{
2211return self.appendChildNodes(elem.parentNode,_279);
2212}
2213},replaceChildNodes:function(node){
2214var elem=node;
2215var self=MochiKit.DOM;
2216if(typeof (node)=="string"){
2217elem=self.getElement(node);
2218arguments[0]=elem;
2219}
2220var _27d;
2221while((_27d=elem.firstChild)){
2222elem.removeChild(_27d);
2223}
2224if(arguments.length<2){
2225return elem;
2226}else{
2227return self.appendChildNodes.apply(this,arguments);
2228}
2229},createDOM:function(name,_27f){
2230var elem;
2231var self=MochiKit.DOM;
2232var m=MochiKit.Base;
2233if(typeof (_27f)=="string"||typeof (_27f)=="number"){
2234var args=m.extend([name,null],arguments,1);
2235return arguments.callee.apply(this,args);
2236}
2237if(typeof (name)=="string"){
2238var _284=self._xhtml;
2239if(_27f&&!self.attributeArray.compliant){
2240var _285="";
2241if("name" in _27f){
2242_285+=" name=\""+self.escapeHTML(_27f.name)+"\"";
2243}
2244if(name=="input"&&"type" in _27f){
2245_285+=" type=\""+self.escapeHTML(_27f.type)+"\"";
2246}
2247if(_285){
2248name="<"+name+_285+">";
2249_284=false;
2250}
2251}
2252var d=self._document;
2253if(_284&&d===document){
2254elem=d.createElementNS("http://www.w3.org/1999/xhtml",name);
2255}else{
2256elem=d.createElement(name);
2257}
2258}else{
2259elem=name;
2260}
2261if(_27f){
2262self.updateNodeAttributes(elem,_27f);
2263}
2264if(arguments.length<=2){
2265return elem;
2266}else{
2267var args=m.extend([elem],arguments,2);
2268return self.appendChildNodes.apply(this,args);
2269}
2270},createDOMFunc:function(){
2271var m=MochiKit.Base;
2272return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments));
2273},removeElement:function(elem){
2274var e=MochiKit.DOM.getElement(elem);
2275e.parentNode.removeChild(e);
2276return e;
2277},swapDOM:function(dest,src){
2278var self=MochiKit.DOM;
2279dest=self.getElement(dest);
2280var _28d=dest.parentNode;
2281if(src){
2282src=self.getElement(src);
2283_28d.replaceChild(src,dest);
2284}else{
2285_28d.removeChild(dest);
2286}
2287return src;
2288},getElement:function(id){
2289var self=MochiKit.DOM;
2290if(arguments.length==1){
2291return ((typeof (id)=="string")?self._document.getElementById(id):id);
2292}else{
2293return MochiKit.Base.map(self.getElement,arguments);
2294}
2295},getElementsByTagAndClassName:function(_290,_291,_292){
2296var self=MochiKit.DOM;
2297if(typeof (_290)=="undefined"||_290===null){
2298_290="*";
2299}
2300if(typeof (_292)=="undefined"||_292===null){
2301_292=self._document;
2302}
2303_292=self.getElement(_292);
2304var _294=(_292.getElementsByTagName(_290)||self._document.all);
2305if(typeof (_291)=="undefined"||_291===null){
2306return MochiKit.Base.extend(null,_294);
2307}
2308var _295=[];
2309for(var i=0;i<_294.length;i++){
2310var _297=_294[i];
2311var cls=_297.className;
2312if(!cls){
2313continue;
2314}
2315var _299=cls.split(" ");
2316for(var j=0;j<_299.length;j++){
2317if(_299[j]==_291){
2318_295.push(_297);
2319break;
2320}
2321}
2322}
2323return _295;
2324},_newCallStack:function(path,once){
2325var rval=function(){
2326var _29e=arguments.callee.callStack;
2327for(var i=0;i<_29e.length;i++){
2328if(_29e[i].apply(this,arguments)===false){
2329break;
2330}
2331}
2332if(once){
2333try{
2334this[path]=null;
2335}
2336catch(e){
2337}
2338}
2339};
2340rval.callStack=[];
2341return rval;
2342},addToCallStack:function(_2a0,path,func,once){
2343var self=MochiKit.DOM;
2344var _2a5=_2a0[path];
2345var _2a6=_2a5;
2346if(!(typeof (_2a5)=="function"&&typeof (_2a5.callStack)=="object"&&_2a5.callStack!==null)){
2347_2a6=self._newCallStack(path,once);
2348if(typeof (_2a5)=="function"){
2349_2a6.callStack.push(_2a5);
2350}
2351_2a0[path]=_2a6;
2352}
2353_2a6.callStack.push(func);
2354},addLoadEvent:function(func){
2355var self=MochiKit.DOM;
2356self.addToCallStack(self._window,"onload",func,true);
2357},focusOnLoad:function(_2a9){
2358var self=MochiKit.DOM;
2359self.addLoadEvent(function(){
2360_2a9=self.getElement(_2a9);
2361if(_2a9){
2362_2a9.focus();
2363}
2364});
2365},setElementClass:function(_2ab,_2ac){
2366var self=MochiKit.DOM;
2367var obj=self.getElement(_2ab);
2368if(self.attributeArray.compliant){
2369obj.setAttribute("class",_2ac);
2370}else{
2371obj.setAttribute("className",_2ac);
2372}
2373},toggleElementClass:function(_2af){
2374var self=MochiKit.DOM;
2375for(var i=1;i<arguments.length;i++){
2376var obj=self.getElement(arguments[i]);
2377if(!self.addElementClass(obj,_2af)){
2378self.removeElementClass(obj,_2af);
2379}
2380}
2381},addElementClass:function(_2b3,_2b4){
2382var self=MochiKit.DOM;
2383var obj=self.getElement(_2b3);
2384var cls=obj.className;
2385if(cls==undefined||cls.length===0){
2386self.setElementClass(obj,_2b4);
2387return true;
2388}
2389if(cls==_2b4){
2390return false;
2391}
2392var _2b8=cls.split(" ");
2393for(var i=0;i<_2b8.length;i++){
2394if(_2b8[i]==_2b4){
2395return false;
2396}
2397}
2398self.setElementClass(obj,cls+" "+_2b4);
2399return true;
2400},removeElementClass:function(_2ba,_2bb){
2401var self=MochiKit.DOM;
2402var obj=self.getElement(_2ba);
2403var cls=obj.className;
2404if(cls==undefined||cls.length===0){
2405return false;
2406}
2407if(cls==_2bb){
2408self.setElementClass(obj,"");
2409return true;
2410}
2411var _2bf=cls.split(" ");
2412for(var i=0;i<_2bf.length;i++){
2413if(_2bf[i]==_2bb){
2414_2bf.splice(i,1);
2415self.setElementClass(obj,_2bf.join(" "));
2416return true;
2417}
2418}
2419return false;
2420},swapElementClass:function(_2c1,_2c2,_2c3){
2421var obj=MochiKit.DOM.getElement(_2c1);
2422var res=MochiKit.DOM.removeElementClass(obj,_2c2);
2423if(res){
2424MochiKit.DOM.addElementClass(obj,_2c3);
2425}
2426return res;
2427},hasElementClass:function(_2c6,_2c7){
2428var obj=MochiKit.DOM.getElement(_2c6);
2429var cls=obj.className;
2430if(!cls){
2431return false;
2432}
2433var _2ca=cls.split(" ");
2434for(var i=1;i<arguments.length;i++){
2435var good=false;
2436for(var j=0;j<_2ca.length;j++){
2437if(_2ca[j]==arguments[i]){
2438good=true;
2439break;
2440}
2441}
2442if(!good){
2443return false;
2444}
2445}
2446return true;
2447},escapeHTML:function(s){
2448return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
2449},toHTML:function(dom){
2450return MochiKit.DOM.emitHTML(dom).join("");
2451},emitHTML:function(dom,lst){
2452if(typeof (lst)=="undefined"||lst===null){
2453lst=[];
2454}
2455var _2d2=[dom];
2456var self=MochiKit.DOM;
2457var _2d4=self.escapeHTML;
2458var _2d5=self.attributeArray;
2459while(_2d2.length){
2460dom=_2d2.pop();
2461if(typeof (dom)=="string"){
2462lst.push(dom);
2463}else{
2464if(dom.nodeType==1){
2465lst.push("<"+dom.tagName.toLowerCase());
2466var _2d6=[];
2467var _2d7=_2d5(dom);
2468for(var i=0;i<_2d7.length;i++){
2469var a=_2d7[i];
2470_2d6.push([" ",a.name,"=\"",_2d4(a.value),"\""]);
2471}
2472_2d6.sort();
2473for(i=0;i<_2d6.length;i++){
2474var _2da=_2d6[i];
2475for(var j=0;j<_2da.length;j++){
2476lst.push(_2da[j]);
2477}
2478}
2479if(dom.hasChildNodes()){
2480lst.push(">");
2481_2d2.push("</"+dom.tagName.toLowerCase()+">");
2482var _2dc=dom.childNodes;
2483for(i=_2dc.length-1;i>=0;i--){
2484_2d2.push(_2dc[i]);
2485}
2486}else{
2487lst.push("/>");
2488}
2489}else{
2490if(dom.nodeType==3){
2491lst.push(_2d4(dom.nodeValue));
2492}
2493}
2494}
2495}
2496return lst;
2497},scrapeText:function(node,_2de){
2498var rval=[];
2499(function(node){
2500var cn=node.childNodes;
2501if(cn){
2502for(var i=0;i<cn.length;i++){
2503arguments.callee.call(this,cn[i]);
2504}
2505}
2506var _2e3=node.nodeValue;
2507if(typeof (_2e3)=="string"){
2508rval.push(_2e3);
2509}
2510})(MochiKit.DOM.getElement(node));
2511if(_2de){
2512return rval;
2513}else{
2514return rval.join("");
2515}
2516},removeEmptyTextNodes:function(_2e4){
2517_2e4=MochiKit.DOM.getElement(_2e4);
2518for(var i=0;i<_2e4.childNodes.length;i++){
2519var node=_2e4.childNodes[i];
2520if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
2521node.parentNode.removeChild(node);
2522}
2523}
2524},makeClipping:function(_2e7){
2525_2e7=MochiKit.DOM.getElement(_2e7);
2526var _2e8=_2e7.style.overflow;
2527if((MochiKit.Style.getStyle(_2e7,"overflow")||"visible")!="hidden"){
2528_2e7.style.overflow="hidden";
2529}
2530return _2e8;
2531},undoClipping:function(_2e9,_2ea){
2532_2e9=MochiKit.DOM.getElement(_2e9);
2533if(!_2ea){
2534return;
2535}
2536_2e9.style.overflow=_2ea;
2537},makePositioned:function(_2eb){
2538_2eb=MochiKit.DOM.getElement(_2eb);
2539var pos=MochiKit.Style.getStyle(_2eb,"position");
2540if(pos=="static"||!pos){
2541_2eb.style.position="relative";
2542if(/Opera/.test(navigator.userAgent)){
2543_2eb.style.top=0;
2544_2eb.style.left=0;
2545}
2546}
2547},undoPositioned:function(_2ed){
2548_2ed=MochiKit.DOM.getElement(_2ed);
2549if(_2ed.style.position=="relative"){
2550_2ed.style.position=_2ed.style.top=_2ed.style.left=_2ed.style.bottom=_2ed.style.right="";
2551}
2552},getFirstElementByTagAndClassName:function(_2ee,_2ef,_2f0){
2553var self=MochiKit.DOM;
2554if(typeof (_2ee)=="undefined"||_2ee===null){
2555_2ee="*";
2556}
2557if(typeof (_2f0)=="undefined"||_2f0===null){
2558_2f0=self._document;
2559}
2560_2f0=self.getElement(_2f0);
2561var _2f2=(_2f0.getElementsByTagName(_2ee)||self._document.all);
2562if(typeof (_2ef)=="undefined"||_2ef===null){
2563return _2f2[0];
2564}
2565for(var i=0;i<_2f2.length;i++){
2566var _2f4=_2f2[i];
2567var _2f5=_2f4.className.split(" ");
2568for(var j=0;j<_2f5.length;j++){
2569if(_2f5[j]==_2ef){
2570return _2f4;
2571}
2572}
2573}
2574},getFirstParentByTagAndClassName:function(elem,_2f8,_2f9){
2575var self=MochiKit.DOM;
2576elem=self.getElement(elem);
2577if(typeof (_2f8)=="undefined"||_2f8===null){
2578_2f8="*";
2579}else{
2580_2f8=_2f8.toUpperCase();
2581}
2582if(typeof (_2f9)=="undefined"||_2f9===null){
2583_2f9=null;
2584}
2585var _2fb="";
2586var _2fc="";
2587while(elem&&elem.tagName){
2588elem=elem.parentNode;
2589if(_2f8=="*"&&_2f9===null){
2590return elem;
2591}
2592_2fb=elem.className.split(" ");
2593_2fc=elem.tagName.toUpperCase();
2594if(_2f9===null&&_2f8==_2fc){
2595return elem;
2596}else{
2597if(_2f9!==null){
2598for(var i=0;i<_2fb.length;i++){
2599if(_2f8=="*"&&_2fb[i]==_2f9){
2600return elem;
2601}else{
2602if(_2f8==_2fc&&_2fb[i]==_2f9){
2603return elem;
2604}
2605}
2606}
2607}
2608}
2609}
2610return elem;
2611},isParent:function(_2fe,_2ff){
2612if(!_2fe.parentNode||_2fe==_2ff){
2613return false;
2614}
2615if(_2fe.parentNode==_2ff){
2616return true;
2617}
2618return MochiKit.DOM.isParent(_2fe.parentNode,_2ff);
2619},__new__:function(win){
2620var m=MochiKit.Base;
2621if(typeof (document)!="undefined"){
2622this._document=document;
2623var _302="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
2624this._xhtml=(document.documentElement&&document.createElementNS&&document.documentElement.namespaceURI===_302);
2625}else{
2626if(MochiKit.MockDOM){
2627this._document=MochiKit.MockDOM.document;
2628}
2629}
2630this._window=win;
2631this.domConverters=new m.AdapterRegistry();
2632var _303=this._document.createElement("span");
2633var _304;
2634if(_303&&_303.attributes&&_303.attributes.length>0){
2635var _305=m.filter;
2636_304=function(node){
2637return _305(_304.ignoreAttrFilter,node.attributes);
2638};
2639_304.ignoreAttr={};
2640var _307=_303.attributes;
2641var _308=_304.ignoreAttr;
2642for(var i=0;i<_307.length;i++){
2643var a=_307[i];
2644_308[a.name]=a.value;
2645}
2646_304.ignoreAttrFilter=function(a){
2647return (_304.ignoreAttr[a.name]!=a.value);
2648};
2649_304.compliant=false;
2650_304.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"};
2651}else{
2652_304=function(node){
2653return node.attributes;
2654};
2655_304.compliant=true;
2656_304.renames={};
2657}
2658this.attributeArray=_304;
2659var _30d=function(_30e,arr){
2660var _310=arr[1].split(".");
2661var str="";
2662var obj={};
2663str+="if (!MochiKit."+_310[1]+") { throw new Error(\"";
2664str+="This function has been deprecated and depends on MochiKit.";
2665str+=_310[1]+".\");}";
2666str+="return MochiKit."+_310[1]+"."+arr[0];
2667str+=".apply(this, arguments);";
2668obj[_310[2]]=new Function(str);
2669MochiKit.Base.update(MochiKit[_30e],obj);
2670};
2671for(var i;i<MochiKit.DOM.DEPRECATED.length;i++){
2672_30d("DOM",MochiKit.DOM.DEPRECATED[i]);
2673}
2674var _313=this.createDOMFunc;
2675this.UL=_313("ul");
2676this.OL=_313("ol");
2677this.LI=_313("li");
2678this.TD=_313("td");
2679this.TR=_313("tr");
2680this.TBODY=_313("tbody");
2681this.THEAD=_313("thead");
2682this.TFOOT=_313("tfoot");
2683this.TABLE=_313("table");
2684this.TH=_313("th");
2685this.INPUT=_313("input");
2686this.SPAN=_313("span");
2687this.A=_313("a");
2688this.DIV=_313("div");
2689this.IMG=_313("img");
2690this.BUTTON=_313("button");
2691this.TT=_313("tt");
2692this.PRE=_313("pre");
2693this.H1=_313("h1");
2694this.H2=_313("h2");
2695this.H3=_313("h3");
2696this.BR=_313("br");
2697this.HR=_313("hr");
2698this.LABEL=_313("label");
2699this.TEXTAREA=_313("textarea");
2700this.FORM=_313("form");
2701this.P=_313("p");
2702this.SELECT=_313("select");
2703this.OPTION=_313("option");
2704this.OPTGROUP=_313("optgroup");
2705this.LEGEND=_313("legend");
2706this.FIELDSET=_313("fieldset");
2707this.STRONG=_313("strong");
2708this.CANVAS=_313("canvas");
2709this.$=this.getElement;
2710this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2711m.nameFunctions(this);
2712}});
2713MochiKit.DOM.__new__(((typeof (window)=="undefined")?this:window));
2714if(MochiKit.__export__){
2715withWindow=MochiKit.DOM.withWindow;
2716withDocument=MochiKit.DOM.withDocument;
2717}
2718MochiKit.Base._exportSymbols(this,MochiKit.DOM);
2719if(typeof (dojo)!="undefined"){
2720dojo.provide("MochiKit.Style");
2721dojo.require("MochiKit.Base");
2722dojo.require("MochiKit.DOM");
2723}
2724if(typeof (JSAN)!="undefined"){
2725JSAN.use("MochiKit.Base",[]);
2726JSAN.use("MochiKit.DOM",[]);
2727}
2728try{
2729if(typeof (MochiKit.Base)=="undefined"){
2730throw "";
2731}
2732}
2733catch(e){
2734throw "MochiKit.Style depends on MochiKit.Base!";
2735}
2736try{
2737if(typeof (MochiKit.DOM)=="undefined"){
2738throw "";
2739}
2740}
2741catch(e){
2742throw "MochiKit.Style depends on MochiKit.DOM!";
2743}
2744if(typeof (MochiKit.Style)=="undefined"){
2745MochiKit.Style={};
2746}
2747MochiKit.Style.NAME="MochiKit.Style";
2748MochiKit.Style.VERSION="1.4";
2749MochiKit.Style.__repr__=function(){
2750return "["+this.NAME+" "+this.VERSION+"]";
2751};
2752MochiKit.Style.toString=function(){
2753return this.__repr__();
2754};
2755MochiKit.Style.EXPORT_OK=[];
2756MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"];
2757MochiKit.Style.Dimensions=function(w,h){
2758this.w=w;
2759this.h=h;
2760};
2761MochiKit.Style.Dimensions.prototype.__repr__=function(){
2762var repr=MochiKit.Base.repr;
2763return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}";
2764};
2765MochiKit.Style.Dimensions.prototype.toString=function(){
2766return this.__repr__();
2767};
2768MochiKit.Style.Coordinates=function(x,y){
2769this.x=x;
2770this.y=y;
2771};
2772MochiKit.Style.Coordinates.prototype.__repr__=function(){
2773var repr=MochiKit.Base.repr;
2774return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}";
2775};
2776MochiKit.Style.Coordinates.prototype.toString=function(){
2777return this.__repr__();
2778};
2779MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_31b){
2780var dom=MochiKit.DOM;
2781var d=dom._document;
2782elem=dom.getElement(elem);
2783_31b=MochiKit.Base.camelize(_31b);
2784if(!elem||elem==d){
2785return undefined;
2786}
2787if(_31b=="opacity"&&elem.filters){
2788var _31e=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/);
2789if(_31e&&_31e[1]){
2790return parseFloat(_31e[1])/100;
2791}
2792return 1;
2793}
2794var _31f=elem.style?elem.style[_31b]:null;
2795if(!_31f){
2796if(d.defaultView&&d.defaultView.getComputedStyle){
2797var css=d.defaultView.getComputedStyle(elem,null);
2798_31b=_31b.replace(/([A-Z])/g,"-$1").toLowerCase();
2799_31f=css?css.getPropertyValue(_31b):null;
2800}else{
2801if(elem.currentStyle){
2802_31f=elem.currentStyle[_31b];
2803}
2804}
2805}
2806if(_31b=="opacity"){
2807_31f=parseFloat(_31f);
2808}
2809if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_31b)!=-1)){
2810if(MochiKit.Style.getStyle(elem,"position")=="static"){
2811_31f="auto";
2812}
2813}
2814return _31f=="auto"?null:_31f;
2815},setStyle:function(elem,_322){
2816elem=MochiKit.DOM.getElement(elem);
2817for(var name in _322){
2818if(name=="opacity"){
2819MochiKit.Style.setOpacity(elem,_322[name]);
2820}else{
2821elem.style[MochiKit.Base.camelize(name)]=_322[name];
2822}
2823}
2824},setOpacity:function(elem,o){
2825elem=MochiKit.DOM.getElement(elem);
2826var self=MochiKit.Style;
2827if(o==1){
2828var _327=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
2829elem.style["opacity"]=_327?0.999999:1;
2830if(/MSIE/.test(navigator.userAgent)){
2831elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"");
2832}
2833}else{
2834if(o<0.00001){
2835o=0;
2836}
2837elem.style["opacity"]=o;
2838if(/MSIE/.test(navigator.userAgent)){
2839elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")";
2840}
2841}
2842},getElementPosition:function(elem,_329){
2843var self=MochiKit.Style;
2844var dom=MochiKit.DOM;
2845elem=dom.getElement(elem);
2846if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){
2847return undefined;
2848}
2849var c=new self.Coordinates(0,0);
2850var box=null;
2851var _32e=null;
2852var d=MochiKit.DOM._document;
2853var de=d.documentElement;
2854var b=d.body;
2855if(!elem.parentNode&&elem.x&&elem.y){
2856c.x+=elem.x||0;
2857c.y+=elem.y||0;
2858}else{
2859if(elem.getBoundingClientRect){
2860box=elem.getBoundingClientRect();
2861c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
2862c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
2863}else{
2864if(elem.offsetParent){
2865c.x+=elem.offsetLeft;
2866c.y+=elem.offsetTop;
2867_32e=elem.offsetParent;
2868if(_32e!=elem){
2869while(_32e){
2870c.x+=_32e.offsetLeft;
2871c.y+=_32e.offsetTop;
2872_32e=_32e.offsetParent;
2873}
2874}
2875var ua=navigator.userAgent.toLowerCase();
2876if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){
2877c.x-=b.offsetLeft;
2878c.y-=b.offsetTop;
2879}
2880}
2881}
2882}
2883if(typeof (_329)!="undefined"){
2884_329=arguments.callee(_329);
2885if(_329){
2886c.x-=(_329.x||0);
2887c.y-=(_329.y||0);
2888}
2889}
2890if(elem.parentNode){
2891_32e=elem.parentNode;
2892}else{
2893_32e=null;
2894}
2895while(_32e){
2896var _333=_32e.tagName.toUpperCase();
2897if(_333==="BODY"||_333==="HTML"){
2898break;
2899}
2900var disp=self.getStyle(_32e,"display");
2901if(disp!="inline"&&disp!="table-row"){
2902c.x-=_32e.scrollLeft;
2903c.y-=_32e.scrollTop;
2904}
2905if(_32e.parentNode){
2906_32e=_32e.parentNode;
2907}else{
2908_32e=null;
2909}
2910}
2911return c;
2912},setElementPosition:function(elem,_336,_337){
2913elem=MochiKit.DOM.getElement(elem);
2914if(typeof (_337)=="undefined"){
2915_337="px";
2916}
2917var _338={};
2918var _339=MochiKit.Base.isUndefinedOrNull;
2919if(!_339(_336.x)){
2920_338["left"]=_336.x+_337;
2921}
2922if(!_339(_336.y)){
2923_338["top"]=_336.y+_337;
2924}
2925MochiKit.DOM.updateNodeAttributes(elem,{"style":_338});
2926},getElementDimensions:function(elem){
2927var self=MochiKit.Style;
2928var dom=MochiKit.DOM;
2929if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){
2930return new self.Dimensions(elem.w||0,elem.h||0);
2931}
2932elem=dom.getElement(elem);
2933if(!elem){
2934return undefined;
2935}
2936var disp=self.getStyle(elem,"display");
2937if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){
2938return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
2939}
2940var s=elem.style;
2941var _33f=s.visibility;
2942var _340=s.position;
2943s.visibility="hidden";
2944s.position="absolute";
2945s.display="";
2946var _341=elem.offsetWidth;
2947var _342=elem.offsetHeight;
2948s.display="none";
2949s.position=_340;
2950s.visibility=_33f;
2951return new self.Dimensions(_341,_342);
2952},setElementDimensions:function(elem,_344,_345){
2953elem=MochiKit.DOM.getElement(elem);
2954if(typeof (_345)=="undefined"){
2955_345="px";
2956}
2957var _346={};
2958var _347=MochiKit.Base.isUndefinedOrNull;
2959if(!_347(_344.w)){
2960_346["width"]=_344.w+_345;
2961}
2962if(!_347(_344.h)){
2963_346["height"]=_344.h+_345;
2964}
2965MochiKit.DOM.updateNodeAttributes(elem,{"style":_346});
2966},setDisplayForElement:function(_348,_349){
2967var _34a=MochiKit.Base.extend(null,arguments,1);
2968var _34b=MochiKit.DOM.getElement;
2969for(var i=0;i<_34a.length;i++){
2970_349=_34b(_34a[i]);
2971if(_349){
2972_349.style.display=_348;
2973}
2974}
2975},getViewportDimensions:function(){
2976var d=new MochiKit.Style.Dimensions();
2977var w=MochiKit.DOM._window;
2978var b=MochiKit.DOM._document.body;
2979if(w.innerWidth){
2980d.w=w.innerWidth;
2981d.h=w.innerHeight;
2982}else{
2983if(b.parentElement.clientWidth){
2984d.w=b.parentElement.clientWidth;
2985d.h=b.parentElement.clientHeight;
2986}else{
2987if(b&&b.clientWidth){
2988d.w=b.clientWidth;
2989d.h=b.clientHeight;
2990}
2991}
2992}
2993return d;
2994},getViewportPosition:function(){
2995var c=new MochiKit.Style.Coordinates(0,0);
2996var d=MochiKit.DOM._document;
2997var de=d.documentElement;
2998var db=d.body;
2999if(de&&(de.scrollTop||de.scrollLeft)){
3000c.x=de.scrollLeft;
3001c.y=de.scrollTop;
3002}else{
3003if(db){
3004c.x=db.scrollLeft;
3005c.y=db.scrollTop;
3006}
3007}
3008return c;
3009},__new__:function(){
3010var m=MochiKit.Base;
3011this.elementPosition=this.getElementPosition;
3012this.elementDimensions=this.getElementDimensions;
3013this.hideElement=m.partial(this.setDisplayForElement,"none");
3014this.showElement=m.partial(this.setDisplayForElement,"block");
3015this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3016m.nameFunctions(this);
3017}});
3018MochiKit.Style.__new__();
3019MochiKit.Base._exportSymbols(this,MochiKit.Style);
3020if(typeof (dojo)!="undefined"){
3021dojo.provide("MochiKit.Color");
3022dojo.require("MochiKit.Base");
3023dojo.require("MochiKit.DOM");
3024dojo.require("MochiKit.Style");
3025}
3026if(typeof (JSAN)!="undefined"){
3027JSAN.use("MochiKit.Base",[]);
3028JSAN.use("MochiKit.DOM",[]);
3029JSAN.use("MochiKit.Style",[]);
3030}
3031try{
3032if(typeof (MochiKit.Base)=="undefined"){
3033throw "";
3034}
3035}
3036catch(e){
3037throw "MochiKit.Color depends on MochiKit.Base";
3038}
3039try{
3040if(typeof (MochiKit.DOM)=="undefined"){
3041throw "";
3042}
3043}
3044catch(e){
3045throw "MochiKit.Color depends on MochiKit.DOM";
3046}
3047try{
3048if(typeof (MochiKit.Style)=="undefined"){
3049throw "";
3050}
3051}
3052catch(e){
3053throw "MochiKit.Color depends on MochiKit.Style";
3054}
3055if(typeof (MochiKit.Color)=="undefined"){
3056MochiKit.Color={};
3057}
3058MochiKit.Color.NAME="MochiKit.Color";
3059MochiKit.Color.VERSION="1.4";
3060MochiKit.Color.__repr__=function(){
3061return "["+this.NAME+" "+this.VERSION+"]";
3062};
3063MochiKit.Color.toString=function(){
3064return this.__repr__();
3065};
3066MochiKit.Color.Color=function(red,_356,blue,_358){
3067if(typeof (_358)=="undefined"||_358===null){
3068_358=1;
3069}
3070this.rgb={r:red,g:_356,b:blue,a:_358};
3071};
3072MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_359){
3073var rgb=this.rgb;
3074var m=MochiKit.Color;
3075return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_359);
3076},colorWithHue:function(hue){
3077var hsl=this.asHSL();
3078hsl.h=hue;
3079var m=MochiKit.Color;
3080return m.Color.fromHSL(hsl);
3081},colorWithSaturation:function(_35f){
3082var hsl=this.asHSL();
3083hsl.s=_35f;
3084var m=MochiKit.Color;
3085return m.Color.fromHSL(hsl);
3086},colorWithLightness:function(_362){
3087var hsl=this.asHSL();
3088hsl.l=_362;
3089var m=MochiKit.Color;
3090return m.Color.fromHSL(hsl);
3091},darkerColorWithLevel:function(_365){
3092var hsl=this.asHSL();
3093hsl.l=Math.max(hsl.l-_365,0);
3094var m=MochiKit.Color;
3095return m.Color.fromHSL(hsl);
3096},lighterColorWithLevel:function(_368){
3097var hsl=this.asHSL();
3098hsl.l=Math.min(hsl.l+_368,1);
3099var m=MochiKit.Color;
3100return m.Color.fromHSL(hsl);
3101},blendedColor:function(_36b,_36c){
3102if(typeof (_36c)=="undefined"||_36c===null){
3103_36c=0.5;
3104}
3105var sf=1-_36c;
3106var s=this.rgb;
3107var d=_36b.rgb;
3108var df=_36c;
3109return 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));
3110},compareRGB:function(_371){
3111var a=this.asRGB();
3112var b=_371.asRGB();
3113return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]);
3114},isLight:function(){
3115return this.asHSL().b>0.5;
3116},isDark:function(){
3117return (!this.isLight());
3118},toHSLString:function(){
3119var c=this.asHSL();
3120var ccc=MochiKit.Color.clampColorComponent;
3121var rval=this._hslString;
3122if(!rval){
3123var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%");
3124var a=c.a;
3125if(a>=1){
3126a=1;
3127rval="hsl("+mid+")";
3128}else{
3129if(a<=0){
3130a=0;
3131}
3132rval="hsla("+mid+","+a+")";
3133}
3134this._hslString=rval;
3135}
3136return rval;
3137},toRGBString:function(){
3138var c=this.rgb;
3139var ccc=MochiKit.Color.clampColorComponent;
3140var rval=this._rgbString;
3141if(!rval){
3142var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0));
3143if(c.a!=1){
3144rval="rgba("+mid+","+c.a+")";
3145}else{
3146rval="rgb("+mid+")";
3147}
3148this._rgbString=rval;
3149}
3150return rval;
3151},asRGB:function(){
3152return MochiKit.Base.clone(this.rgb);
3153},toHexString:function(){
3154var m=MochiKit.Color;
3155var c=this.rgb;
3156var ccc=MochiKit.Color.clampColorComponent;
3157var rval=this._hexString;
3158if(!rval){
3159rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255)));
3160this._hexString=rval;
3161}
3162return rval;
3163},asHSV:function(){
3164var hsv=this.hsv;
3165var c=this.rgb;
3166if(typeof (hsv)=="undefined"||hsv===null){
3167hsv=MochiKit.Color.rgbToHSV(this.rgb);
3168this.hsv=hsv;
3169}
3170return MochiKit.Base.clone(hsv);
3171},asHSL:function(){
3172var hsl=this.hsl;
3173var c=this.rgb;
3174if(typeof (hsl)=="undefined"||hsl===null){
3175hsl=MochiKit.Color.rgbToHSL(this.rgb);
3176this.hsl=hsl;
3177}
3178return MochiKit.Base.clone(hsl);
3179},toString:function(){
3180return this.toRGBString();
3181},repr:function(){
3182var c=this.rgb;
3183var col=[c.r,c.g,c.b,c.a];
3184return this.__class__.NAME+"("+col.join(", ")+")";
3185}};
3186MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_388,blue,_38a){
3187var _38b=MochiKit.Color.Color;
3188if(arguments.length==1){
3189var rgb=red;
3190red=rgb.r;
3191_388=rgb.g;
3192blue=rgb.b;
3193if(typeof (rgb.a)=="undefined"){
3194_38a=undefined;
3195}else{
3196_38a=rgb.a;
3197}
3198}
3199return new _38b(red,_388,blue,_38a);
3200},fromHSL:function(hue,_38e,_38f,_390){
3201var m=MochiKit.Color;
3202return m.Color.fromRGB(m.hslToRGB.apply(m,arguments));
3203},fromHSV:function(hue,_393,_394,_395){
3204var m=MochiKit.Color;
3205return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments));
3206},fromName:function(name){
3207var _398=MochiKit.Color.Color;
3208if(name.charAt(0)=="\""){
3209name=name.substr(1,name.length-2);
3210}
3211var _399=_398._namedColors[name.toLowerCase()];
3212if(typeof (_399)=="string"){
3213return _398.fromHexString(_399);
3214}else{
3215if(name=="transparent"){
3216return _398.transparentColor();
3217}
3218}
3219return null;
3220},fromString:function(_39a){
3221var self=MochiKit.Color.Color;
3222var _39c=_39a.substr(0,3);
3223if(_39c=="rgb"){
3224return self.fromRGBString(_39a);
3225}else{
3226if(_39c=="hsl"){
3227return self.fromHSLString(_39a);
3228}else{
3229if(_39a.charAt(0)=="#"){
3230return self.fromHexString(_39a);
3231}
3232}
3233}
3234return self.fromName(_39a);
3235},fromHexString:function(_39d){
3236if(_39d.charAt(0)=="#"){
3237_39d=_39d.substring(1);
3238}
3239var _39e=[];
3240var i,hex;
3241if(_39d.length==3){
3242for(i=0;i<3;i++){
3243hex=_39d.substr(i,1);
3244_39e.push(parseInt(hex+hex,16)/255);
3245}
3246}else{
3247for(i=0;i<6;i+=2){
3248hex=_39d.substr(i,2);
3249_39e.push(parseInt(hex,16)/255);
3250}
3251}
3252var _3a1=MochiKit.Color.Color;
3253return _3a1.fromRGB.apply(_3a1,_39e);
3254},_fromColorString:function(pre,_3a3,_3a4,_3a5){
3255if(_3a5.indexOf(pre)===0){
3256_3a5=_3a5.substring(_3a5.indexOf("(",3)+1,_3a5.length-1);
3257}
3258var _3a6=_3a5.split(/\s*,\s*/);
3259var _3a7=[];
3260for(var i=0;i<_3a6.length;i++){
3261var c=_3a6[i];
3262var val;
3263var _3ab=c.substring(c.length-3);
3264if(c.charAt(c.length-1)=="%"){
3265val=0.01*parseFloat(c.substring(0,c.length-1));
3266}else{
3267if(_3ab=="deg"){
3268val=parseFloat(c)/360;
3269}else{
3270if(_3ab=="rad"){
3271val=parseFloat(c)/(Math.PI*2);
3272}else{
3273val=_3a4[i]*parseFloat(c);
3274}
3275}
3276}
3277_3a7.push(val);
3278}
3279return this[_3a3].apply(this,_3a7);
3280},fromComputedStyle:function(elem,_3ad){
3281var d=MochiKit.DOM;
3282var cls=MochiKit.Color.Color;
3283for(elem=d.getElement(elem);elem;elem=elem.parentNode){
3284var _3b0=MochiKit.Style.getStyle.apply(d,arguments);
3285if(!_3b0){
3286continue;
3287}
3288var _3b1=cls.fromString(_3b0);
3289if(!_3b1){
3290break;
3291}
3292if(_3b1.asRGB().a>0){
3293return _3b1;
3294}
3295}
3296return null;
3297},fromBackground:function(elem){
3298var cls=MochiKit.Color.Color;
3299return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor();
3300},fromText:function(elem){
3301var cls=MochiKit.Color.Color;
3302return cls.fromComputedStyle(elem,"color","color")||cls.blackColor();
3303},namedColors:function(){
3304return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
3305}});
3306MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_3b7){
3307v*=_3b7;
3308if(v<0){
3309return 0;
3310}else{
3311if(v>_3b7){
3312return _3b7;
3313}else{
3314return v;
3315}
3316}
3317},_hslValue:function(n1,n2,hue){
3318if(hue>6){
3319hue-=6;
3320}else{
3321if(hue<0){
3322hue+=6;
3323}
3324}
3325var val;
3326if(hue<1){
3327val=n1+(n2-n1)*hue;
3328}else{
3329if(hue<3){
3330val=n2;
3331}else{
3332if(hue<4){
3333val=n1+(n2-n1)*(4-hue);
3334}else{
3335val=n1;
3336}
3337}
3338}
3339return val;
3340},hsvToRGB:function(hue,_3bd,_3be,_3bf){
3341if(arguments.length==1){
3342var hsv=hue;
3343hue=hsv.h;
3344_3bd=hsv.s;
3345_3be=hsv.v;
3346_3bf=hsv.a;
3347}
3348var red;
3349var _3c2;
3350var blue;
3351if(_3bd===0){
3352red=_3be;
3353_3c2=_3be;
3354blue=_3be;
3355}else{
3356var i=Math.floor(hue*6);
3357var f=(hue*6)-i;
3358var p=_3be*(1-_3bd);
3359var q=_3be*(1-(_3bd*f));
3360var t=_3be*(1-(_3bd*(1-f)));
3361switch(i){
3362case 1:
3363red=q;
3364_3c2=_3be;
3365blue=p;
3366break;
3367case 2:
3368red=p;
3369_3c2=_3be;
3370blue=t;
3371break;
3372case 3:
3373red=p;
3374_3c2=q;
3375blue=_3be;
3376break;
3377case 4:
3378red=t;
3379_3c2=p;
3380blue=_3be;
3381break;
3382case 5:
3383red=_3be;
3384_3c2=p;
3385blue=q;
3386break;
3387case 6:
3388case 0:
3389red=_3be;
3390_3c2=t;
3391blue=p;
3392break;
3393}
3394}
3395return {r:red,g:_3c2,b:blue,a:_3bf};
3396},hslToRGB:function(hue,_3ca,_3cb,_3cc){
3397if(arguments.length==1){
3398var hsl=hue;
3399hue=hsl.h;
3400_3ca=hsl.s;
3401_3cb=hsl.l;
3402_3cc=hsl.a;
3403}
3404var red;
3405var _3cf;
3406var blue;
3407if(_3ca===0){
3408red=_3cb;
3409_3cf=_3cb;
3410blue=_3cb;
3411}else{
3412var m2;
3413if(_3cb<=0.5){
3414m2=_3cb*(1+_3ca);
3415}else{
3416m2=_3cb+_3ca-(_3cb*_3ca);
3417}
3418var m1=(2*_3cb)-m2;
3419var f=MochiKit.Color._hslValue;
3420var h6=hue*6;
3421red=f(m1,m2,h6+2);
3422_3cf=f(m1,m2,h6);
3423blue=f(m1,m2,h6-2);
3424}
3425return {r:red,g:_3cf,b:blue,a:_3cc};
3426},rgbToHSV:function(red,_3d6,blue,_3d8){
3427if(arguments.length==1){
3428var rgb=red;
3429red=rgb.r;
3430_3d6=rgb.g;
3431blue=rgb.b;
3432_3d8=rgb.a;
3433}
3434var max=Math.max(Math.max(red,_3d6),blue);
3435var min=Math.min(Math.min(red,_3d6),blue);
3436var hue;
3437var _3dd;
3438var _3de=max;
3439if(min==max){
3440hue=0;
3441_3dd=0;
3442}else{
3443var _3df=(max-min);
3444_3dd=_3df/max;
3445if(red==max){
3446hue=(_3d6-blue)/_3df;
3447}else{
3448if(_3d6==max){
3449hue=2+((blue-red)/_3df);
3450}else{
3451hue=4+((red-_3d6)/_3df);
3452}
3453}
3454hue/=6;
3455if(hue<0){
3456hue+=1;
3457}
3458if(hue>1){
3459hue-=1;
3460}
3461}
3462return {h:hue,s:_3dd,v:_3de,a:_3d8};
3463},rgbToHSL:function(red,_3e1,blue,_3e3){
3464if(arguments.length==1){
3465var rgb=red;
3466red=rgb.r;
3467_3e1=rgb.g;
3468blue=rgb.b;
3469_3e3=rgb.a;
3470}
3471var max=Math.max(red,Math.max(_3e1,blue));
3472var min=Math.min(red,Math.min(_3e1,blue));
3473var hue;
3474var _3e8;
3475var _3e9=(max+min)/2;
3476var _3ea=max-min;
3477if(_3ea===0){
3478hue=0;
3479_3e8=0;
3480}else{
3481if(_3e9<=0.5){
3482_3e8=_3ea/(max+min);
3483}else{
3484_3e8=_3ea/(2-max-min);
3485}
3486if(red==max){
3487hue=(_3e1-blue)/_3ea;
3488}else{
3489if(_3e1==max){
3490hue=2+((blue-red)/_3ea);
3491}else{
3492hue=4+((red-_3e1)/_3ea);
3493}
3494}
3495hue/=6;
3496if(hue<0){
3497hue+=1;
3498}
3499if(hue>1){
3500hue-=1;
3501}
3502}
3503return {h:hue,s:_3e8,l:_3e9,a:_3e3};
3504},toColorPart:function(num){
3505num=Math.round(num);
3506var _3ec=num.toString(16);
3507if(num<16){
3508return "0"+_3ec;
3509}
3510return _3ec;
3511},__new__:function(){
3512var m=MochiKit.Base;
3513this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]);
3514this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]);
3515var _3ee=1/3;
3516var _3ef={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_3ee,_3ee,_3ee],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_3ee,2*_3ee,2*_3ee],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]};
3517var _3f0=function(name,r,g,b,a){
3518var rval=this.fromRGB(r,g,b,a);
3519this[name]=function(){
3520return rval;
3521};
3522return rval;
3523};
3524for(var k in _3ef){
3525var name=k+"Color";
3526var _3f9=m.concat([_3f0,this.Color,name],_3ef[k]);
3527this.Color[name]=m.bind.apply(null,_3f9);
3528}
3529var _3fa=function(){
3530for(var i=0;i<arguments.length;i++){
3531if(!(arguments[i] instanceof Color)){
3532return false;
3533}
3534}
3535return true;
3536};
3537var _3fc=function(a,b){
3538return a.compareRGB(b);
3539};
3540m.nameFunctions(this);
3541m.registerComparator(this.Color.NAME,_3fa,_3fc);
3542this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3543}});
3544MochiKit.Color.EXPORT=["Color"];
3545MochiKit.Color.EXPORT_OK=["clampColorComponent","rgbToHSL","hslToRGB","rgbToHSV","hsvToRGB","toColorPart"];
3546MochiKit.Color.__new__();
3547MochiKit.Base._exportSymbols(this,MochiKit.Color);
3548MochiKit.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"};
3549if(typeof (dojo)!="undefined"){
3550dojo.provide("MochiKit.Signal");
3551dojo.require("MochiKit.Base");
3552dojo.require("MochiKit.DOM");
3553dojo.require("MochiKit.Style");
3554}
3555if(typeof (JSAN)!="undefined"){
3556JSAN.use("MochiKit.Base",[]);
3557JSAN.use("MochiKit.DOM",[]);
3558JSAN.use("MochiKit.Style",[]);
3559}
3560try{
3561if(typeof (MochiKit.Base)=="undefined"){
3562throw "";
3563}
3564}
3565catch(e){
3566throw "MochiKit.Signal depends on MochiKit.Base!";
3567}
3568try{
3569if(typeof (MochiKit.DOM)=="undefined"){
3570throw "";
3571}
3572}
3573catch(e){
3574throw "MochiKit.Signal depends on MochiKit.DOM!";
3575}
3576try{
3577if(typeof (MochiKit.Style)=="undefined"){
3578throw "";
3579}
3580}
3581catch(e){
3582throw "MochiKit.Signal depends on MochiKit.Style!";
3583}
3584if(typeof (MochiKit.Signal)=="undefined"){
3585MochiKit.Signal={};
3586}
3587MochiKit.Signal.NAME="MochiKit.Signal";
3588MochiKit.Signal.VERSION="1.4";
3589MochiKit.Signal._observers=[];
3590MochiKit.Signal.Event=function(src,e){
3591this._event=e||window.event;
3592this._src=src;
3593};
3594MochiKit.Base.update(MochiKit.Signal.Event.prototype,{__repr__:function(){
3595var repr=MochiKit.Base.repr;
3596var str="{event(): "+repr(this.event())+", src(): "+repr(this.src())+", type(): "+repr(this.type())+", target(): "+repr(this.target());
3597if(this.type()&&this.type().indexOf("key")===0||this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu"){
3598str+=", 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)+"}";
3599}
3600if(this.type()&&this.type().indexOf("key")===0){
3601str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
3602}
3603if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
3604str+=", mouse(): {page: "+repr(this.mouse().page)+", client: "+repr(this.mouse().client);
3605if(this.type()!="mousemove"){
3606str+=", button: {left: "+repr(this.mouse().button.left)+", middle: "+repr(this.mouse().button.middle)+", right: "+repr(this.mouse().button.right)+"}}";
3607}else{
3608str+="}";
3609}
3610}
3611if(this.type()=="mouseover"||this.type()=="mouseout"){
3612str+=", relatedTarget(): "+repr(this.relatedTarget());
3613}
3614str+="}";
3615return str;
3616},toString:function(){
3617return this.__repr__();
3618},src:function(){
3619return this._src;
3620},event:function(){
3621return this._event;
3622},type:function(){
3623return this._event.type||undefined;
3624},target:function(){
3625return this._event.target||this._event.srcElement;
3626},_relatedTarget:null,relatedTarget:function(){
3627if(this._relatedTarget!==null){
3628return this._relatedTarget;
3629}
3630var elem=null;
3631if(this.type()=="mouseover"){
3632elem=(this._event.relatedTarget||this._event.fromElement);
3633}else{
3634if(this.type()=="mouseout"){
3635elem=(this._event.relatedTarget||this._event.toElement);
3636}
3637}
3638if(elem!==null){
3639this._relatedTarget=elem;
3640return elem;
3641}
3642return undefined;
3643},_modifier:null,modifier:function(){
3644if(this._modifier!==null){
3645return this._modifier;
3646}
3647var m={};
3648m.alt=this._event.altKey;
3649m.ctrl=this._event.ctrlKey;
3650m.meta=this._event.metaKey||false;
3651m.shift=this._event.shiftKey;
3652m.any=m.alt||m.ctrl||m.shift||m.meta;
3653this._modifier=m;
3654return m;
3655},_key:null,key:function(){
3656if(this._key!==null){
3657return this._key;
3658}
3659var k={};
3660if(this.type()&&this.type().indexOf("key")===0){
3661if(this.type()=="keydown"||this.type()=="keyup"){
3662k.code=this._event.keyCode;
3663k.string=(MochiKit.Signal._specialKeys[k.code]||"KEY_UNKNOWN");
3664this._key=k;
3665return k;
3666}else{
3667if(this.type()=="keypress"){
3668k.code=0;
3669k.string="";
3670if(typeof (this._event.charCode)!="undefined"&&this._event.charCode!==0&&!MochiKit.Signal._specialMacKeys[this._event.charCode]){
3671k.code=this._event.charCode;
3672k.string=String.fromCharCode(k.code);
3673}else{
3674if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
3675k.code=this._event.keyCode;
3676k.string=String.fromCharCode(k.code);
3677}
3678}
3679this._key=k;
3680return k;
3681}
3682}
3683}
3684return undefined;
3685},_mouse:null,mouse:function(){
3686if(this._mouse!==null){
3687return this._mouse;
3688}
3689var m={};
3690var e=this._event;
3691if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
3692m.client=new MochiKit.Style.Coordinates(0,0);
3693if(e.clientX||e.clientY){
3694m.client.x=(!e.clientX||e.clientX<0)?0:e.clientX;
3695m.client.y=(!e.clientY||e.clientY<0)?0:e.clientY;
3696}
3697m.page=new MochiKit.Style.Coordinates(0,0);
3698if(e.pageX||e.pageY){
3699m.page.x=(!e.pageX||e.pageX<0)?0:e.pageX;
3700m.page.y=(!e.pageY||e.pageY<0)?0:e.pageY;
3701}else{
3702var de=MochiKit.DOM._document.documentElement;
3703var b=MochiKit.DOM._document.body;
3704m.page.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
3705m.page.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
3706}
3707if(this.type()!="mousemove"){
3708m.button={};
3709m.button.left=false;
3710m.button.right=false;
3711m.button.middle=false;
3712if(e.which){
3713m.button.left=(e.which==1);
3714m.button.middle=(e.which==2);
3715m.button.right=(e.which==3);
3716}else{
3717m.button.left=!!(e.button&1);
3718m.button.right=!!(e.button&2);
3719m.button.middle=!!(e.button&4);
3720}
3721}
3722this._mouse=m;
3723return m;
3724}
3725return undefined;
3726},stop:function(){
3727this.stopPropagation();
3728this.preventDefault();
3729},stopPropagation:function(){
3730if(this._event.stopPropagation){
3731this._event.stopPropagation();
3732}else{
3733this._event.cancelBubble=true;
3734}
3735},preventDefault:function(){
3736if(this._event.preventDefault){
3737this._event.preventDefault();
3738}else{
3739if(this._confirmUnload===null){
3740this._event.returnValue=false;
3741}
3742}
3743},_confirmUnload:null,confirmUnload:function(msg){
3744if(this.type()=="beforeunload"){
3745this._confirmUnload=msg;
3746this._event.returnValue=msg;
3747}
3748}});
3749MochiKit.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"};
3750(function(){
3751var _40b=MochiKit.Signal._specialMacKeys;
3752for(i=63236;i<=63242;i++){
3753_40b[i]="KEY_F"+(i-63236+1);
3754}
3755})();
3756MochiKit.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"};
3757(function(){
3758var _40c=MochiKit.Signal._specialKeys;
3759for(var i=48;i<=57;i++){
3760_40c[i]="KEY_"+(i-48);
3761}
3762for(i=65;i<=90;i++){
3763_40c[i]="KEY_"+String.fromCharCode(i);
3764}
3765for(i=96;i<=105;i++){
3766_40c[i]="KEY_NUM_PAD_"+(i-96);
3767}
3768for(i=112;i<=123;i++){
3769_40c[i]="KEY_F"+(i-112+1);
3770}
3771})();
3772MochiKit.Signal.Ident=function(_40e){
3773this.source=_40e.source;
3774this.signal=_40e.signal;
3775this.listener=_40e.listener;
3776this.isDOM=_40e.isDOM;
3777this.objOrFunc=_40e.objOrFunc;
3778this.funcOrStr=_40e.funcOrStr;
3779this.connected=_40e.connected;
3780};
3781MochiKit.Signal.Ident.prototype={};
3782MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
3783return "["+this.NAME+" "+this.VERSION+"]";
3784},toString:function(){
3785return this.__repr__();
3786},_unloadCache:function(){
3787var self=MochiKit.Signal;
3788var _410=self._observers;
3789for(var i=0;i<_410.length;i++){
3790if(_410[i].signal!=="onload"&&_410[i].signal!=="onunload"){
3791self._disconnect(_410[i]);
3792}
3793}
3794},_listener:function(src,sig,func,obj,_416){
3795var self=MochiKit.Signal;
3796var E=self.Event;
3797if(!_416){
3798return MochiKit.Base.bind(func,obj);
3799}
3800obj=obj||src;
3801if(typeof (func)=="string"){
3802if(sig==="onload"||sig==="onunload"){
3803return function(_419){
3804obj[func].apply(obj,[new E(src,_419)]);
3805var _41a=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:obj,funcOrStr:func});
3806MochiKit.Signal._disconnect(_41a);
3807};
3808}else{
3809return function(_41b){
3810obj[func].apply(obj,[new E(src,_41b)]);
3811};
3812}
3813}else{
3814if(sig==="onload"||sig==="onunload"){
3815return function(_41c){
3816func.apply(obj,[new E(src,_41c)]);
3817MochiKit.Signal.disconnect(src,sig,func);
3818var _41d=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:func});
3819MochiKit.Signal._disconnect(_41d);
3820};
3821}else{
3822return function(_41e){
3823func.apply(obj,[new E(src,_41e)]);
3824};
3825}
3826}
3827},_browserAlreadyHasMouseEnterAndLeave:function(){
3828return /MSIE/.test(navigator.userAgent);
3829},_mouseEnterListener:function(src,sig,func,obj){
3830var E=MochiKit.Signal.Event;
3831return function(_424){
3832var e=new E(src,_424);
3833try{
3834e.relatedTarget().nodeName;
3835}
3836catch(err){
3837return;
3838}
3839e.stop();
3840if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
3841return;
3842}
3843e.type=function(){
3844return sig;
3845};
3846if(typeof (func)=="string"){
3847return obj[func].apply(obj,[e]);
3848}else{
3849return func.apply(obj,[e]);
3850}
3851};
3852},_getDestPair:function(_426,_427){
3853var obj=null;
3854var func=null;
3855if(typeof (_427)!="undefined"){
3856obj=_426;
3857func=_427;
3858if(typeof (_427)=="string"){
3859if(typeof (_426[_427])!="function"){
3860throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
3861}
3862}else{
3863if(typeof (_427)!="function"){
3864throw new Error("'funcOrStr' must be a function or string");
3865}
3866}
3867}else{
3868if(typeof (_426)!="function"){
3869throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
3870}else{
3871func=_426;
3872}
3873}
3874return [obj,func];
3875},connect:function(src,sig,_42c,_42d){
3876src=MochiKit.DOM.getElement(src);
3877var self=MochiKit.Signal;
3878if(typeof (sig)!="string"){
3879throw new Error("'sig' must be a string");
3880}
3881var _42f=self._getDestPair(_42c,_42d);
3882var obj=_42f[0];
3883var func=_42f[1];
3884if(typeof (obj)=="undefined"||obj===null){
3885obj=src;
3886}
3887var _432=!!(src.addEventListener||src.attachEvent);
3888if(_432&&(sig==="onmouseenter"||sig==="onmouseleave")&&!self._browserAlreadyHasMouseEnterAndLeave()){
3889var _433=self._mouseEnterListener(src,sig.substr(2),func,obj);
3890if(sig==="onmouseenter"){
3891sig="onmouseover";
3892}else{
3893sig="onmouseout";
3894}
3895}else{
3896var _433=self._listener(src,sig,func,obj,_432);
3897}
3898if(src.addEventListener){
3899src.addEventListener(sig.substr(2),_433,false);
3900}else{
3901if(src.attachEvent){
3902src.attachEvent(sig,_433);
3903}
3904}
3905var _434=new MochiKit.Signal.Ident({source:src,signal:sig,listener:_433,isDOM:_432,objOrFunc:_42c,funcOrStr:_42d,connected:true});
3906self._observers.push(_434);
3907if(!_432&&typeof (src.__connect__)=="function"){
3908var args=MochiKit.Base.extend([_434],arguments,1);
3909src.__connect__.apply(src,args);
3910}
3911return _434;
3912},_disconnect:function(_436){
3913if(!_436.connected){
3914return;
3915}
3916_436.connected=false;
3917if(!_436.isDOM){
3918return;
3919}
3920var src=_436.source;
3921var sig=_436.signal;
3922var _439=_436.listener;
3923if(src.removeEventListener){
3924src.removeEventListener(sig.substr(2),_439,false);
3925}else{
3926if(src.detachEvent){
3927src.detachEvent(sig,_439);
3928}else{
3929throw new Error("'src' must be a DOM element");
3930}
3931}
3932},disconnect:function(_43a){
3933var self=MochiKit.Signal;
3934var _43c=self._observers;
3935var m=MochiKit.Base;
3936if(arguments.length>1){
3937var src=MochiKit.DOM.getElement(arguments[0]);
3938var sig=arguments[1];
3939var obj=arguments[2];
3940var func=arguments[3];
3941for(var i=_43c.length-1;i>=0;i--){
3942var o=_43c[i];
3943if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){
3944self._disconnect(o);
3945if(!self._lock){
3946_43c.splice(i,1);
3947}else{
3948self._dirty=true;
3949}
3950return true;
3951}
3952}
3953}else{
3954var idx=m.findIdentical(_43c,_43a);
3955if(idx>=0){
3956self._disconnect(_43a);
3957if(!self._lock){
3958_43c.splice(idx,1);
3959}else{
3960self._dirty=true;
3961}
3962return true;
3963}
3964}
3965return false;
3966},disconnectAllTo:function(_445,_446){
3967var self=MochiKit.Signal;
3968var _448=self._observers;
3969var _449=self._disconnect;
3970var _44a=self._lock;
3971var _44b=self._dirty;
3972if(typeof (_446)==="undefined"){
3973_446=null;
3974}
3975for(var i=_448.length-1;i>=0;i--){
3976var _44d=_448[i];
3977if(_44d.objOrFunc===_445&&(_446===null||_44d.funcOrStr===_446)){
3978_449(_44d);
3979if(_44a){
3980_44b=true;
3981}else{
3982_448.splice(i,1);
3983}
3984}
3985}
3986self._dirty=_44b;
3987},disconnectAll:function(src,sig){
3988src=MochiKit.DOM.getElement(src);
3989var m=MochiKit.Base;
3990var _451=m.flattenArguments(m.extend(null,arguments,1));
3991var self=MochiKit.Signal;
3992var _453=self._disconnect;
3993var _454=self._observers;
3994var i,_456;
3995var _457=self._lock;
3996var _458=self._dirty;
3997if(_451.length===0){
3998for(i=_454.length-1;i>=0;i--){
3999_456=_454[i];
4000if(_456.source===src){
4001_453(_456);
4002if(!_457){
4003_454.splice(i,1);
4004}else{
4005_458=true;
4006}
4007}
4008}
4009}else{
4010var sigs={};
4011for(i=0;i<_451.length;i++){
4012sigs[_451[i]]=true;
4013}
4014for(i=_454.length-1;i>=0;i--){
4015_456=_454[i];
4016if(_456.source===src&&_456.signal in sigs){
4017_453(_456);
4018if(!_457){
4019_454.splice(i,1);
4020}else{
4021_458=true;
4022}
4023}
4024}
4025}
4026self._dirty=_458;
4027},signal:function(src,sig){
4028var self=MochiKit.Signal;
4029var _45d=self._observers;
4030src=MochiKit.DOM.getElement(src);
4031var args=MochiKit.Base.extend(null,arguments,2);
4032var _45f=[];
4033self._lock=true;
4034for(var i=0;i<_45d.length;i++){
4035var _461=_45d[i];
4036if(_461.source===src&&_461.signal===sig){
4037try{
4038_461.listener.apply(src,args);
4039}
4040catch(e){
4041_45f.push(e);
4042}
4043}
4044}
4045self._lock=false;
4046if(self._dirty){
4047self._dirty=false;
4048for(var i=_45d.length-1;i>=0;i--){
4049if(!_45d[i].connected){
4050_45d.splice(i,1);
4051}
4052}
4053}
4054if(_45f.length==1){
4055throw _45f[0];
4056}else{
4057if(_45f.length>1){
4058var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
4059e.errors=_45f;
4060throw e;
4061}
4062}
4063}});
4064MochiKit.Signal.EXPORT_OK=[];
4065MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"];
4066MochiKit.Signal.__new__=function(win){
4067var m=MochiKit.Base;
4068this._document=document;
4069this._window=win;
4070this._lock=false;
4071this._dirty=false;
4072try{
4073this.connect(window,"onunload",this._unloadCache);
4074}
4075catch(e){
4076}
4077this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4078m.nameFunctions(this);
4079};
4080MochiKit.Signal.__new__(this);
4081if(MochiKit.__export__){
4082connect=MochiKit.Signal.connect;
4083disconnect=MochiKit.Signal.disconnect;
4084disconnectAll=MochiKit.Signal.disconnectAll;
4085signal=MochiKit.Signal.signal;
4086}
4087MochiKit.Base._exportSymbols(this,MochiKit.Signal);
4088
4089
4090/***
4091
4092 PlotKit.PlotKit 0.9.1 : PACKED VERSION
4093
4094 THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please
4095 diff against the source tree, not this file.
4096
4097 For more information, <http://www.liquidx.net/plotkit/>.
4098
4099 Copyright (c) 2006. Alastair Tse.
4100
4101***/
4102
4103try{
4104if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){
4105throw "";
4106}
4107}
4108catch(e){
4109throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}";
4110}
4111MochiKit.Base.update(MochiKit.Color.Color.prototype,{asFillColor:function(){
4112return this.lighterColorWithLevel(0.3);
4113},asStrokeColor:function(){
4114return this.darkerColorWithLevel(0.1);
4115},asPointColor:function(){
4116return this.lighterColorWithLevel(0.1);
4117}});
4118if(typeof (PlotKit)=="undefined"){
4119PlotKit={};
4120}
4121PlotKit.NAME="PlotKit";
4122PlotKit.VERSION="0.8";
4123PlotKit.__repr__=function(){
4124return "["+this.NAME+" "+this.VERSION+"]";
4125};
4126PlotKit.toString=function(){
4127return this.__repr__();
4128};
4129if(typeof (PlotKit.Base)=="undefined"){
4130PlotKit.Base={};
4131}
4132PlotKit.Base.NAME="PlotKit.Base";
4133PlotKit.Base.VERSION=PlotKit.VERSION;
4134PlotKit.Base.__repr__=function(){
4135return "["+this.NAME+" "+this.VERSION+"]";
4136};
4137PlotKit.Base.toString=function(){
4138return this.__repr__();
4139};
4140PlotKit.Base.usingPrototype=function(){
4141try{
4142return (typeof (Object.extend)=="function");
4143}
4144catch(e){
4145return false;
4146}
4147};
4148MochiKit.Base.update(PlotKit.Base,{roundInterval:function(_1,_2,_3){
4149var _4=MochiKit.Format.roundToFixed;
4150var _5=_1/_2;
4151return parseFloat(_4(_5,_3));
4152},collapse:function(_6){
4153var m=MochiKit.Base;
4154var _8=new Array();
4155for(var i=0;i<_6.length;i++){
4156_8=m.concat(_8,_6[i]);
4157}
4158if(PlotKit.Base.usingPrototype()){
4159delete _8.extend;
4160delete _8.from;
4161delete _8.inspect;
4162}
4163return _8;
4164},uniq:function(_10){
4165var m=MochiKit.Base;
4166if(!m.isArrayLike(_10)||(_10.length<1)){
4167return new Array();
4168}
4169var _11=new Array();
4170var _12=_10[0];
4171_11.push(_10[0]);
4172for(var i=1;i<_10.length;i++){
4173if(m.compare(_10[i],_12)!=0){
4174_12=_10[i];
4175_11.push(_10[i]);
4176}
4177}
4178return _11;
4179},colorScheme:function(){
4180var mb=MochiKit.Base;
4181var mc=MochiKit.Color;
4182var _15=["red","orange","yellow","green","cyan","blue","purple","magenta"];
4183var _16=function(_17){
4184return mc.Color[_17+"Color"]();
4185};
4186return mb.map(_16,_15);
4187},baseDarkPrimaryColors:function(){
4188var _18=MochiKit.Color.Color.fromHexString;
4189return [_18("#ad3f40"),_18("#ddac2c"),_18("#dfdd0c"),_18("#5276c4"),_18("#739c5a")];
4190},basePrimaryColors:function(){
4191var _19=MochiKit.Color.Color.fromHexString;
4192return [_19("#d24c4d"),_19("#f2b32f"),_19("#ece90e"),_19("#5d83da"),_19("#78a15d")];
4193},baseBlueColors:function(){
4194var _20=MochiKit.Color.Color.fromHexString;
4195return [_20("#4b6b94"),_20("#5d81b4"),_20("#acbad2")];
4196},palette:function(_21,_22,_23,_24){
4197var _25=MochiKit.Base.isUndefinedOrNull;
4198var _26=new Array();
4199if(_25(_24)){
4200_24=0.1;
4201}
4202if(_25(_23)){
4203_23=0.4;
4204}
4205if(_25(_22)){
4206_22=-0.2;
4207}
4208var _27=_22;
4209while(_27<=_23){
4210_26.push(_27);
4211_27+=_24;
4212}
4213var _28=function(_29,_30){
4214return _29.lighterColorWithLevel(_30);
4215};
4216return MochiKit.Base.map(partial(_28,_21),_26);
4217},excanvasSupported:function(){
4218if(/MSIE/.test(navigator.userAgent)&&!window.opera){
4219return true;
4220}
4221return false;
4222},findPosX:function(obj){
4223var _32=0;
4224if(obj.offsetParent){
4225while(obj.offsetParent){
4226_32+=obj.offsetLeft;
4227obj=obj.offsetParent;
4228}
4229}else{
4230if(obj.x){
4231_32+=obj.x;
4232}
4233}
4234return _32;
4235},findPosY:function(obj){
4236var _33=0;
4237if(obj.offsetParent){
4238while(obj.offsetParent){
4239_33+=obj.offsetTop;
4240obj=obj.offsetParent;
4241}
4242}else{
4243if(obj.y){
4244_33+=obj.y;
4245}
4246}
4247return _33;
4248},isFuncLike:function(obj){
4249return (typeof (obj)=="function");
4250}});
4251PlotKit.Base.map=function(fn,lst){
4252if(PlotKit.Base.usingPrototype()){
4253var _36=[];
4254for(var x in lst){
4255if(typeof (lst[x])=="function"){
4256continue;
4257}
4258_36.push(fn(lst[x]));
4259}
4260return _36;
4261}else{
4262return MochiKit.Base.map(fn,lst);
4263}
4264};
4265PlotKit.Base.items=function(lst){
4266if(PlotKit.Base.usingPrototype()){
4267var _38=[];
4268for(var x in lst){
4269if(typeof (lst[x])=="function"){
4270continue;
4271}
4272_38.push([x,lst[x]]);
4273}
4274return _38;
4275}else{
4276return MochiKit.Base.items(lst);
4277}
4278};
4279PlotKit.Base.keys=function(lst){
4280if(PlotKit.Base.usingPrototype()){
4281var _39=[];
4282for(var x in lst){
4283if(typeof (lst[x])=="function"){
4284continue;
4285}
4286_39.push(x);
4287}
4288return _39;
4289}else{
4290return MochiKit.Base.keys(lst);
4291}
4292};
4293PlotKit.Base.baseColors=function(){
4294var _40=MochiKit.Color.Color.fromHexString;
4295return [_40("#476fb2"),_40("#be2c2b"),_40("#85b730"),_40("#734a99"),_40("#26a1c5"),_40("#fb8707"),_40("#000000")];
4296};
4297PlotKit.Base.officeBaseStyle={"axisLineWidth":2,"axisLabelColor":Color.grayColor(),"axisLineColor":Color.whiteColor(),"padding":{top:5,bottom:10,left:30,right:30}};
4298MochiKit.Base.update(PlotKit.Base,{officeBlue:function(){
4299var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"backgroundColor":PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45)};
4300MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4301return r;
4302},officeRed:function(){
4303var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"backgroundColor":PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5)};
4304MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4305return r;
4306},officeGreen:function(){
4307var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[2]),"backgroundColor":PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5)};
4308MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4309return r;
4310},officePurple:function(){
4311var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[3]),"backgroundColor":PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5)};
4312MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4313return r;
4314},officeCyan:function(){
4315var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[4]),"backgroundColor":PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5)};
4316MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4317return r;
4318},officeOrange:function(){
4319var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[5]),"backgroundColor":PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4)};
4320MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4321return r;
4322},officeBlack:function(){
4323var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[6],0,0.6),"backgroundColor":PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9)};
4324MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
4325return r;
4326}});
4327PlotKit.Base.EXPORT=["baseColors","collapse","colorScheme","findPosX","findPosY","officeBaseStyle","officeBlue","officeRed","officeGreen","officePurple","officeCyan","officeOrange","officeBlack","roundInterval","uniq","isFuncLike","excanvasSupported"];
4328PlotKit.Base.EXPORT_OK=[];
4329PlotKit.Base.__new__=function(){
4330var m=MochiKit.Base;
4331m.nameFunctions(this);
4332this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4333};
4334PlotKit.Base.__new__();
4335MochiKit.Base._exportSymbols(this,PlotKit.Base);
4336try{
4337if(typeof (PlotKit.Base)=="undefined"){
4338throw "";
4339}
4340}
4341catch(e){
4342throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base";
4343}
4344if(typeof (PlotKit.Layout)=="undefined"){
4345PlotKit.Layout={};
4346}
4347PlotKit.Layout.NAME="PlotKit.Layout";
4348PlotKit.Layout.VERSION=PlotKit.VERSION;
4349PlotKit.Layout.__repr__=function(){
4350return "["+this.NAME+" "+this.VERSION+"]";
4351};
4352PlotKit.Layout.toString=function(){
4353return this.__repr__();
4354};
4355PlotKit.Layout.valid_styles=["bar","line","pie","point"];
4356PlotKit.Layout=function(_42,_43){
4357this.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};
4358this.style=_42;
4359MochiKit.Base.update(this.options,_43?_43:{});
4360if(!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)){
4361this.minxval=this.options.xAxis[0];
4362this.maxxval=this.options.xAxis[1];
4363this.xscale=this.maxxval-this.minxval;
4364}else{
4365this.minxval=0;
4366this.maxxval=null;
4367this.xscale=null;
4368}
4369if(!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)){
4370this.minyval=this.options.yAxis[0];
4371this.maxyval=this.options.yAxis[1];
4372this.yscale=this.maxyval-this.minyval;
4373}else{
4374this.minyval=0;
4375this.maxyval=null;
4376this.yscale=null;
4377}
4378this.bars=new Array();
4379this.points=new Array();
4380this.slices=new Array();
4381this.xticks=new Array();
4382this.yticks=new Array();
4383this.datasets=new Array();
4384this.minxdelta=0;
4385this.xrange=1;
4386this.yrange=1;
4387this.hitTestCache={x2maxy:null};
4388};
4389PlotKit.Layout.prototype.addDataset=function(_44,_45){
4390this.datasets[_44]=_45;
4391};
4392PlotKit.Layout.prototype.removeDataset=function(_46,_47){
4393delete this.datasets[_46];
4394};
4395PlotKit.Layout.prototype.addDatasetFromTable=function(_48,_49,_50,_51,_52){
4396var _53=MochiKit.Base.isUndefinedOrNull;
4397var _54=MochiKit.DOM.scrapeText;
4398var _55=MochiKit.Format.strip;
4399if(_53(_50)){
4400_50=0;
4401}
4402if(_53(_51)){
4403_51=1;
4404}
4405if(_53(_52)){
4406_52=-1;
4407}
4408var _56=_49.tBodies[0].rows;
4409var _57=new Array();
4410var _58=new Array();
4411if(!_53(_56)){
4412for(var i=0;i<_56.length;i++){
4413_57.push([parseFloat(_55(_54(_56[i].cells[_50]))),parseFloat(_55(_54(_56[i].cells[_51])))]);
4414if(_52>=0){
4415_58.push({v:parseFloat(_55(_54(_56[i].cells[_50]))),label:_55(_54(_56[i].cells[_52]))});
4416}
4417}
4418this.addDataset(_48,_57);
4419if(_52>=0){
4420this.options.xTicks=_58;
4421}
4422return true;
4423}
4424return false;
4425};
4426PlotKit.Layout.prototype.evaluate=function(){
4427this._evaluateLimits();
4428this._evaluateScales();
4429if(this.style=="bar"){
4430if(this.options.barOrientation=="horizontal"){
4431this._evaluateHorizBarCharts();
4432}else{
4433this._evaluateBarCharts();
4434}
4435this._evaluateBarTicks();
4436}else{
4437if(this.style=="line"){
4438this._evaluateLineCharts();
4439this._evaluateLineTicks();
4440}else{
4441if(this.style=="pie"){
4442this._evaluatePieCharts();
4443this._evaluatePieTicks();
4444}
4445}
4446}
4447};
4448PlotKit.Layout.prototype.hitTest=function(x,y){
4449var f=MochiKit.Format.twoDigitFloat;
4450if((this.style=="bar")&&this.bars&&(this.bars.length>0)){
4451for(var i=0;i<this.bars.length;i++){
4452var bar=this.bars[i];
4453if((x>=bar.x)&&(x<=bar.x+bar.w)&&(y>=bar.y)&&(y-bar.y<=bar.h)){
4454return bar;
4455}
4456}
4457}else{
4458if(this.style=="line"){
4459if(this.hitTestCache.x2maxy==null){
4460this._regenerateHitTestCache();
4461}
4462var _62=x/this.xscale;
4463var _63=this.hitTestCache.xvalues;
4464var _64=null;
4465var _65=null;
4466for(var i=1;i<_63.length;i++){
4467if(_63[i]>_62){
4468_64=_63[i-1];
4469_65=_63[i];
4470break;
4471}
4472}
4473if((_64!=null)){
4474var _66=this.hitTestCache.x2maxy[_64];
4475var _67=this.hitTestCache.x2maxy[_65];
4476var _68=(1-y)/this.yscale;
4477var _69=(_67-_66)/(_65-_64);
4478var _70=_66+_69*(_62-_64);
4479if(_70>=_68){
4480var obj={xval:_62,yval:_68,xafter:_65,yafter:_67,xbefore:_64,ybefore:_66,yprojected:_70};
4481return obj;
4482}
4483}
4484}else{
4485if(this.style=="pie"){
4486var _71=Math.sqrt((y-0.5)*(y-0.5)+(x-0.5)*(x-0.5));
4487if(_71>this.options.pieRadius){
4488return null;
4489}
4490var _72=Math.atan2(y-0.5,x-0.5)-Math.PI/2;
4491for(var i=0;i<this.slices.length;i++){
4492var _73=this.slices[i];
4493if(_73.startAngle<_72&&_73.endAngle>=_72){
4494return _73;
4495}
4496}
4497}
4498}
4499}
4500return null;
4501};
4502PlotKit.Layout.prototype.rectForX=function(x){
4503return null;
4504};
4505PlotKit.Layout.prototype.angleRangeForX=function(x){
4506return null;
4507};
4508PlotKit.Layout.prototype._evaluateLimits=function(){
4509var map=PlotKit.Base.map;
4510var _75=PlotKit.Base.items;
4511var _76=MochiKit.Base.itemgetter;
4512var _77=PlotKit.Base.collapse;
4513var _78=MochiKit.Base.listMin;
4514var _79=MochiKit.Base.listMax;
4515var _80=MochiKit.Base.isUndefinedOrNull;
4516var all=_77(map(_76(1),_75(this.datasets)));
4517if(_80(this.options.xAxis)){
4518if(this.options.xOriginIsZero){
4519this.minxval=0;
4520}else{
4521this.minxval=_78(map(parseFloat,map(_76(0),all)));
4522}
4523this.maxxval=_79(map(parseFloat,map(_76(0),all)));
4524}else{
4525this.minxval=this.options.xAxis[0];
4526this.maxxval=this.options.xAxis[1];
4527this.xscale=this.maxval-this.minxval;
4528}
4529if(_80(this.options.yAxis)){
4530if(this.options.yOriginIsZero){
4531this.minyval=0;
4532}else{
4533this.minyval=_78(map(parseFloat,map(_76(1),all)));
4534}
4535this.maxyval=_79(map(parseFloat,map(_76(1),all)));
4536}else{
4537this.minyval=this.options.yAxis[0];
4538this.maxyval=this.options.yAxis[1];
4539this.yscale=this.maxyval-this.minyval;
4540}
4541};
4542PlotKit.Layout.prototype._evaluateScales=function(){
4543var _82=MochiKit.Base.isUndefinedOrNull;
4544this.xrange=this.maxxval-this.minxval;
4545if(this.xrange==0){
4546this.xscale=1;
4547}else{
4548this.xscale=1/this.xrange;
4549}
4550this.yrange=this.maxyval-this.minyval;
4551if(this.yrange==0){
4552this.yscale=1;
4553}else{
4554this.yscale=1/this.yrange;
4555}
4556};
4557PlotKit.Layout.prototype._uniqueXValues=function(){
4558var _83=PlotKit.Base.collapse;
4559var map=PlotKit.Base.map;
4560var _84=PlotKit.Base.uniq;
4561var _85=MochiKit.Base.itemgetter;
4562var _86=PlotKit.Base.items;
4563var _87=map(parseFloat,map(_85(0),_83(map(_85(1),_86(this.datasets)))));
4564_87.sort(MochiKit.Base.compare);
4565return _84(_87);
4566};
4567PlotKit.Layout.prototype._evaluateBarCharts=function(){
4568var _88=PlotKit.Base.items;
4569var _89=_88(this.datasets).length;
4570var _90=10000000;
4571var _91=this._uniqueXValues();
4572for(var i=1;i<_91.length;i++){
4573_90=Math.min(Math.abs(_91[i]-_91[i-1]),_90);
4574}
4575var _92=0;
4576var _93=0;
4577var _94=0;
4578if(_91.length==1){
4579_90=1;
4580this.xscale=1;
4581this.minxval=_91[0];
4582_92=1*this.options.barWidthFillFraction;
4583_93=_92/_89;
4584_94=(1-this.options.barWidthFillFraction)/2;
4585}else{
4586if(this.xrange==1){
4587this.xscale=0.5;
4588}else{
4589if(this.xrange==2){
4590this.xscale=1/3;
4591}else{
4592this.xscale=(1-_90/this.xrange)/this.xrange;
4593}
4594}
4595_92=_90*this.xscale*this.options.barWidthFillFraction;
4596_93=_92/_89;
4597_94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2;
4598}
4599this.minxdelta=_90;
4600this.bars=new Array();
4601var i=0;
4602for(var _95 in this.datasets){
4603var _96=this.datasets[_95];
4604if(PlotKit.Base.isFuncLike(_96)){
4605continue;
4606}
4607for(var j=0;j<_96.length;j++){
4608var _98=_96[j];
4609var _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};
4610if((_99.x>=0)&&(_99.x<=1)&&(_99.y>=0)&&(_99.y<=1)){
4611this.bars.push(_99);
4612}
4613}
4614i++;
4615}
4616};
4617PlotKit.Layout.prototype._evaluateHorizBarCharts=function(){
4618var _100=PlotKit.Base.items;
4619var _101=_100(this.datasets).length;
4620var _102=10000000;
4621var _103=this._uniqueXValues();
4622for(var i=1;i<_103.length;i++){
4623_102=Math.min(Math.abs(_103[i]-_103[i-1]),_102);
4624}
4625var _104=0;
4626var _105=0;
4627var _106=0;
4628if(_103.length==1){
4629_102=1;
4630this.xscale=1;
4631this.minxval=_103[0];
4632_104=1*this.options.barWidthFillFraction;
4633_105=_104/_101;
4634_106=(1-this.options.barWidthFillFraction)/2;
4635}else{
4636this.xscale=(1-_102/this.xrange)/this.xrange;
4637_104=_102*this.xscale*this.options.barWidthFillFraction;
4638_105=_104/_101;
4639_106=_102*this.xscale*(1-this.options.barWidthFillFraction)/2;
4640}
4641this.minxdelta=_102;
4642this.bars=new Array();
4643var i=0;
4644for(var _107 in this.datasets){
4645var _108=this.datasets[_107];
4646if(PlotKit.Base.isFuncLike(_108)){
4647continue;
4648}
4649for(var j=0;j<_108.length;j++){
4650var item=_108[j];
4651var 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};
4652if(rect.y<=0){
4653rect.y=0;
4654}
4655if(rect.y>=1){
4656rect.y=1;
4657}
4658if((rect.x>=0)&&(rect.x<=1)){
4659this.bars.push(rect);
4660}
4661}
4662i++;
4663}
4664};
4665PlotKit.Layout.prototype._evaluateLineCharts=function(){
4666var _111=PlotKit.Base.items;
4667var _112=_111(this.datasets).length;
4668this.points=new Array();
4669var i=0;
4670for(var _113 in this.datasets){
4671var _114=this.datasets[_113];
4672if(PlotKit.Base.isFuncLike(_114)){
4673continue;
4674}
4675_114.sort(function(a,b){
4676return compare(parseFloat(a[0]),parseFloat(b[0]));
4677});
4678for(var j=0;j<_114.length;j++){
4679var item=_114[j];
4680var _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};
4681if(_117.y<=0){
4682_117.y=0;
4683}
4684if(_117.y>=1){
4685_117.y=1;
4686}
4687if((_117.x>=0)&&(_117.x<=1)){
4688this.points.push(_117);
4689}
4690}
4691i++;
4692}
4693};
4694PlotKit.Layout.prototype._evaluatePieCharts=function(){
4695var _118=PlotKit.Base.items;
4696var sum=MochiKit.Iter.sum;
4697var _120=MochiKit.Base.itemgetter;
4698var _121=_118(this.datasets).length;
4699var _122=_118(this.datasets)[0][1];
4700var _123=sum(map(_120(1),_122));
4701this.slices=new Array();
4702var _124=0;
4703for(var i=0;i<_122.length;i++){
4704var _125=_122[i][1]/_123;
4705var _126=_124*Math.PI*2;
4706var _127=(_124+_125)*Math.PI*2;
4707var _128={fraction:_125,xval:_122[i][0],yval:_122[i][1],startAngle:_126,endAngle:_127};
4708if(_122[i][1]!=0){
4709this.slices.push(_128);
4710}
4711_124+=_125;
4712}
4713};
4714PlotKit.Layout.prototype._evaluateLineTicksForXAxis=function(){
4715var _129=MochiKit.Base.isUndefinedOrNull;
4716if(this.options.xTicks){
4717this.xticks=new Array();
4718var _130=function(tick){
4719var _132=tick.label;
4720if(_129(_132)){
4721_132=tick.v.toString();
4722}
4723var pos=this.xscale*(tick.v-this.minxval);
4724if((pos>=0)&&(pos<=1)){
4725this.xticks.push([pos,_132]);
4726}
4727};
4728MochiKit.Iter.forEach(this.options.xTicks,bind(_130,this));
4729}else{
4730if(this.options.xNumberOfTicks){
4731var _134=this._uniqueXValues();
4732var _135=this.xrange/this.options.xNumberOfTicks;
4733var _136=0;
4734this.xticks=new Array();
4735for(var i=0;i<=_134.length;i++){
4736if((_134[i]-this.minxval)>=(_136*_135)){
4737var pos=this.xscale*(_134[i]-this.minxval);
4738if((pos>1)||(pos<0)){
4739continue;
4740}
4741this.xticks.push([pos,_134[i]]);
4742_136++;
4743}
4744if(_136>this.options.xNumberOfTicks){
4745break;
4746}
4747}
4748}
4749}
4750};
4751PlotKit.Layout.prototype._evaluateLineTicksForYAxis=function(){
4752var _137=MochiKit.Base.isUndefinedOrNull;
4753if(this.options.yTicks){
4754this.yticks=new Array();
4755var _138=function(tick){
4756var _139=tick.label;
4757if(_137(_139)){
4758_139=tick.v.toString();
4759}
4760var pos=1-(this.yscale*(tick.v-this.minyval));
4761if((pos>=0)&&(pos<=1)){
4762this.yticks.push([pos,_139]);
4763}
4764};
4765MochiKit.Iter.forEach(this.options.yTicks,bind(_138,this));
4766}else{
4767if(this.options.yNumberOfTicks){
4768this.yticks=new Array();
4769var _140=PlotKit.Base.roundInterval;
4770var prec=this.options.yTickPrecision;
4771var _142=_140(this.yrange,this.options.yNumberOfTicks,prec);
4772for(var i=0;i<=this.options.yNumberOfTicks;i++){
4773var yval=this.minyval+(i*_142);
4774var pos=1-((yval-this.minyval)*this.yscale);
4775if((pos>1)||(pos<0)){
4776continue;
4777}
4778this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]);
4779}
4780}
4781}
4782};
4783PlotKit.Layout.prototype._evaluateLineTicks=function(){
4784this._evaluateLineTicksForXAxis();
4785this._evaluateLineTicksForYAxis();
4786};
4787PlotKit.Layout.prototype._evaluateBarTicks=function(){
4788this._evaluateLineTicks();
4789var _144=function(tick){
4790return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]];
4791};
4792this.xticks=MochiKit.Base.map(bind(_144,this),this.xticks);
4793if(this.options.barOrientation=="horizontal"){
4794var _145=this.xticks;
4795this.xticks=this.yticks;
4796this.yticks=_145;
4797var _146=function(tick){
4798return [1-tick[0],tick[1]];
4799};
4800this.xticks=MochiKit.Base.map(_146,this.xticks);
4801}
4802};
4803PlotKit.Layout.prototype._evaluatePieTicks=function(){
4804var _147=MochiKit.Base.isUndefinedOrNull;
4805var _148=MochiKit.Format.numberFormatter("#%");
4806this.xticks=new Array();
4807if(this.options.xTicks){
4808var _149=new Array();
4809for(var i=0;i<this.slices.length;i++){
4810_149[this.slices[i].xval]=this.slices[i];
4811}
4812for(var i=0;i<this.options.xTicks.length;i++){
4813var tick=this.options.xTicks[i];
4814var _150=_149[tick.v];
4815var _151=tick.label;
4816if(_150){
4817if(_147(_151)){
4818_151=tick.v.toString();
4819}
4820_151+=" ("+_148(_150.fraction)+")";
4821this.xticks.push([tick.v,_151]);
4822}
4823}
4824}else{
4825for(var i=0;i<this.slices.length;i++){
4826var _150=this.slices[i];
4827var _151=_150.xval+" ("+_148(_150.fraction)+")";
4828this.xticks.push([_150.xval,_151]);
4829}
4830}
4831};
4832PlotKit.Layout.prototype._regenerateHitTestCache=function(){
4833this.hitTestCache.xvalues=this._uniqueXValues();
4834this.hitTestCache.xlookup=new Array();
4835this.hitTestCache.x2maxy=new Array();
4836var _152=MochiKit.Base.listMax;
4837var _153=MochiKit.Base.itemgetter;
4838var map=MochiKit.Base.map;
4839var _154=keys(this.datasets);
4840for(var i=0;i<_154.length;i++){
4841var _155=this.datasets[_154[i]];
4842for(var j=0;j<_155.length;j++){
4843var xval=_155[j][0];
4844var yval=_155[j][1];
4845if(this.hitTestCache.xlookup[xval]){
4846this.hitTestCache.xlookup[xval].push([yval,_154[i]]);
4847}else{
4848this.hitTestCache.xlookup[xval]=[[yval,_154[i]]];
4849}
4850}
4851}
4852for(var x in this.hitTestCache.xlookup){
4853var _157=this.hitTestCache.xlookup[x];
4854this.hitTestCache.x2maxy[x]=_152(map(_153(0),_157));
4855}
4856};
4857PlotKit.LayoutModule={};
4858PlotKit.LayoutModule.Layout=PlotKit.Layout;
4859PlotKit.LayoutModule.EXPORT=["Layout"];
4860PlotKit.LayoutModule.EXPORT_OK=[];
4861PlotKit.LayoutModule.__new__=function(){
4862var m=MochiKit.Base;
4863m.nameFunctions(this);
4864this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4865};
4866PlotKit.LayoutModule.__new__();
4867MochiKit.Base._exportSymbols(this,PlotKit.LayoutModule);
4868try{
4869if((typeof (PlotKit.Base)=="undefined")||(typeof (PlotKit.Layout)=="undefined")){
4870throw "";
4871}
4872}
4873catch(e){
4874throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Base,Layout}";
4875}
4876if(typeof (PlotKit.CanvasRenderer)=="undefined"){
4877PlotKit.CanvasRenderer={};
4878}
4879PlotKit.CanvasRenderer.NAME="PlotKit.CanvasRenderer";
4880PlotKit.CanvasRenderer.VERSION=PlotKit.VERSION;
4881PlotKit.CanvasRenderer.__repr__=function(){
4882return "["+this.NAME+" "+this.VERSION+"]";
4883};
4884PlotKit.CanvasRenderer.toString=function(){
4885return this.__repr__();
4886};
4887PlotKit.CanvasRenderer=function(_158,_159,_160){
4888if(arguments.length>0){
4889this.__init__(_158,_159,_160);
4890}
4891};
4892PlotKit.CanvasRenderer.prototype.__init__=function(_161,_162,_163){
4893var _164=MochiKit.Base.isUndefinedOrNull;
4894var _165=MochiKit.Color.Color;
4895this.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};
4896MochiKit.Base.update(this.options,_163?_163:{});
4897this.layout=_162;
4898this.element=MochiKit.DOM.getElement(_161);
4899this.container=this.element.parentNode;
4900this.isIE=PlotKit.Base.excanvasSupported();
4901if(this.isIE&&!_164(G_vmlCanvasManager)){
4902this.IEDelay=0.5;
4903this.maxTries=5;
4904this.renderDelay=null;
4905this.clearDelay=null;
4906this.element=G_vmlCanvasManager.initElement(this.element);
4907}
4908this.height=this.element.height;
4909this.width=this.element.width;
4910if(_164(this.element)){
4911throw "CanvasRenderer() - passed canvas is not found";
4912}
4913if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){
4914throw "CanvasRenderer() - Canvas is not supported.";
4915}
4916if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){
4917throw "CanvasRenderer() - <canvas> needs to be enclosed in <div>";
4918}
4919this.xlabels=new Array();
4920this.ylabels=new Array();
4921this.isFirstRender=true;
4922this.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};
4923MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}});
4924};
4925PlotKit.CanvasRenderer.prototype.render=function(){
4926if(this.isIE){
4927try{
4928if(this.renderDelay){
4929this.renderDelay.cancel();
4930this.renderDelay=null;
4931}
4932var _166=this.element.getContext("2d");
4933}
4934catch(e){
4935this.isFirstRender=false;
4936if(this.maxTries-->0){
4937this.renderDelay=MochiKit.Async.wait(this.IEDelay);
4938this.renderDelay.addCallback(bind(this.render,this));
4939}
4940return;
4941}
4942}
4943if(this.options.drawBackground){
4944this._renderBackground();
4945}
4946if(this.layout.style=="bar"){
4947this._renderBarChart();
4948this._renderBarAxis();
4949}else{
4950if(this.layout.style=="pie"){
4951this._renderPieChart();
4952this._renderPieAxis();
4953}else{
4954if(this.layout.style=="line"){
4955this._renderLineChart();
4956this._renderLineAxis();
4957}
4958}
4959}
4960};
4961PlotKit.CanvasRenderer.prototype._renderBarChartWrap=function(data,_168){
4962var _169=this.element.getContext("2d");
4963var _170=this.options.colorScheme.length;
4964var _171=this.options.colorScheme;
4965var _172=MochiKit.Base.keys(this.layout.datasets);
4966var _173=_172.length;
4967for(var i=0;i<_173;i++){
4968var _174=_172[i];
4969var _175=_171[i%_170];
4970_169.save();
4971_169.fillStyle=_175.toRGBString();
4972if(this.options.strokeColor){
4973_169.strokeStyle=this.options.strokeColor.toRGBString();
4974}else{
4975if(this.options.strokeColorTransform){
4976_169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString();
4977}
4978}
4979_169.lineWidth=this.options.strokeWidth;
4980var _176=function(obj){
4981if(obj.name==_174){
4982_168(_169,obj);
4983}
4984};
4985MochiKit.Iter.forEach(data,bind(_176,this));
4986_169.restore();
4987}
4988};
4989PlotKit.CanvasRenderer.prototype._renderBarChart=function(){
4990var bind=MochiKit.Base.bind;
4991var _178=function(_179,bar){
4992var x=this.area.w*bar.x+this.area.x;
4993var y=this.area.h*bar.y+this.area.y;
4994var w=this.area.w*bar.w;
4995var h=this.area.h*bar.h;
4996if((w<1)||(h<1)){
4997return;
4998}
4999if(this.options.shouldFill){
5000_179.fillRect(x,y,w,h);
5001}
5002if(this.options.shouldStroke){
5003_179.strokeRect(x,y,w,h);
5004}
5005};
5006this._renderBarChartWrap(this.layout.bars,bind(_178,this));
5007};
5008PlotKit.CanvasRenderer.prototype._renderLineChart=function(){
5009var _182=this.element.getContext("2d");
5010var _183=this.options.colorScheme.length;
5011var _184=this.options.colorScheme;
5012var _185=MochiKit.Base.keys(this.layout.datasets);
5013var _186=_185.length;
5014var bind=MochiKit.Base.bind;
5015var _187=MochiKit.Base.partial;
5016for(var i=0;i<_186;i++){
5017var _188=_185[i];
5018var _189=_184[i%_183];
5019var _190=this.options.strokeColorTransform;
5020_182.save();
5021_182.fillStyle=_189.toRGBString();
5022if(this.options.strokeColor){
5023_182.strokeStyle=this.options.strokeColor.toRGBString();
5024}else{
5025if(this.options.strokeColorTransform){
5026_182.strokeStyle=_189[_190]().toRGBString();
5027}
5028}
5029_182.lineWidth=this.options.strokeWidth;
5030var _191=function(ctx){
5031ctx.beginPath();
5032ctx.moveTo(this.area.x,this.area.y+this.area.h);
5033var _193=function(ctx_,_195){
5034if(_195.name==_188){
5035ctx_.lineTo(this.area.w*_195.x+this.area.x,this.area.h*_195.y+this.area.y);
5036}
5037};
5038MochiKit.Iter.forEach(this.layout.points,_187(_193,ctx),this);
5039ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y);
5040ctx.lineTo(this.area.x,this.area.y+this.area.h);
5041ctx.closePath();
5042};
5043if(this.options.shouldFill){
5044bind(_191,this)(_182);
5045_182.fill();
5046}
5047if(this.options.shouldStroke){
5048bind(_191,this)(_182);
5049_182.stroke();
5050}
5051_182.restore();
5052}
5053};
5054PlotKit.CanvasRenderer.prototype._renderPieChart=function(){
5055var _196=this.element.getContext("2d");
5056var _197=this.options.colorScheme.length;
5057var _198=this.layout.slices;
5058var _199=this.area.x+this.area.w*0.5;
5059var _200=this.area.y+this.area.h*0.5;
5060var _201=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
5061if(this.isIE){
5062_199=parseInt(_199);
5063_200=parseInt(_200);
5064_201=parseInt(_201);
5065}
5066for(var i=0;i<_198.length;i++){
5067var _202=this.options.colorScheme[i%_197];
5068_196.save();
5069_196.fillStyle=_202.toRGBString();
5070var _203=function(){
5071_196.beginPath();
5072_196.moveTo(_199,_200);
5073_196.arc(_199,_200,_201,_198[i].startAngle-Math.PI/2,_198[i].endAngle-Math.PI/2,false);
5074_196.lineTo(_199,_200);
5075_196.closePath();
5076};
5077if(Math.abs(_198[i].startAngle-_198[i].endAngle)>0.001){
5078if(this.options.shouldFill){
5079_203();
5080_196.fill();
5081}
5082if(this.options.shouldStroke){
5083_203();
5084_196.lineWidth=this.options.strokeWidth;
5085if(this.options.strokeColor){
5086_196.strokeStyle=this.options.strokeColor.toRGBString();
5087}else{
5088if(this.options.strokeColorTransform){
5089_196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString();
5090}
5091}
5092_196.stroke();
5093}
5094}
5095_196.restore();
5096}
5097};
5098PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){
5099this._renderAxis();
5100};
5101PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){
5102this._renderAxis();
5103};
5104PlotKit.CanvasRenderer.prototype._renderAxis=function(){
5105if(!this.options.drawXAxis&&!this.options.drawYAxis){
5106return;
5107}
5108var _204=this.element.getContext("2d");
5109var _205={"style":{"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}};
5110_204.save();
5111_204.strokeStyle=this.options.axisLineColor.toRGBString();
5112_204.lineWidth=this.options.axisLineWidth;
5113if(this.options.drawYAxis){
5114if(this.layout.yticks){
5115var _206=function(tick){
5116if(typeof (tick)=="function"){
5117return;
5118}
5119var x=this.area.x;
5120var y=this.area.y+tick[0]*this.area.h;
5121_204.beginPath();
5122_204.moveTo(x,y);
5123_204.lineTo(x-this.options.axisTickSize,y);
5124_204.closePath();
5125_204.stroke();
5126var _207=DIV(_205,tick[1]);
5127_207.style.top=(y-this.options.axisLabelFontSize)+"px";
5128_207.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px";
5129_207.style.textAlign="right";
5130_207.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px";
5131MochiKit.DOM.appendChildNodes(this.container,_207);
5132this.ylabels.push(_207);
5133};
5134MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this));
5135}
5136_204.beginPath();
5137_204.moveTo(this.area.x,this.area.y);
5138_204.lineTo(this.area.x,this.area.y+this.area.h);
5139_204.closePath();
5140_204.stroke();
5141}
5142if(this.options.drawXAxis){
5143if(this.layout.xticks){
5144var _206=function(tick){
5145if(typeof (dataset)=="function"){
5146return;
5147}
5148var x=this.area.x+tick[0]*this.area.w;
5149var y=this.area.y+this.area.h;
5150_204.beginPath();
5151_204.moveTo(x,y);
5152_204.lineTo(x,y+this.options.axisTickSize);
5153_204.closePath();
5154_204.stroke();
5155var _208=DIV(_205,tick[1]);
5156_208.style.top=(y+this.options.axisTickSize)+"px";
5157_208.style.left=(x-this.options.axisLabelWidth/2)+"px";
5158_208.style.textAlign="center";
5159_208.style.width=this.options.axisLabelWidth+"px";
5160MochiKit.DOM.appendChildNodes(this.container,_208);
5161this.xlabels.push(_208);
5162};
5163MochiKit.Iter.forEach(this.layout.xticks,bind(_206,this));
5164}
5165_204.beginPath();
5166_204.moveTo(this.area.x,this.area.y+this.area.h);
5167_204.lineTo(this.area.x+this.area.w,this.area.y+this.area.h);
5168_204.closePath();
5169_204.stroke();
5170}
5171_204.restore();
5172};
5173PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){
5174if(!this.options.drawXAxis){
5175return;
5176}
5177if(this.layout.xticks){
5178var _209=new Array();
5179for(var i=0;i<this.layout.slices.length;i++){
5180_209[this.layout.slices[i].xval]=this.layout.slices[i];
5181}
5182var _210=this.area.x+this.area.w*0.5;
5183var _211=this.area.y+this.area.h*0.5;
5184var _212=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
5185var _213=this.options.axisLabelWidth;
5186for(var i=0;i<this.layout.xticks.length;i++){
5187var _214=_209[this.layout.xticks[i][0]];
5188if(MochiKit.Base.isUndefinedOrNull(_214)){
5189continue;
5190}
5191var _215=(_214.startAngle+_214.endAngle)/2;
5192var _216=_215;
5193if(_216>Math.PI*2){
5194_216=_216-Math.PI*2;
5195}else{
5196if(_216<0){
5197_216=_216+Math.PI*2;
5198}
5199}
5200var _217=_210+Math.sin(_216)*(_212+10);
5201var _218=_211-Math.cos(_216)*(_212+10);
5202var _219={"position":"absolute","zIndex":11,"width":_213+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()};
5203if(_216<=Math.PI*0.5){
5204_219["textAlign"]="left";
5205_219["verticalAlign"]="top";
5206_219["left"]=_217+"px";
5207_219["top"]=(_218-this.options.axisLabelFontSize)+"px";
5208}else{
5209if((_216>Math.PI*0.5)&&(_216<=Math.PI)){
5210_219["textAlign"]="left";
5211_219["verticalAlign"]="bottom";
5212_219["left"]=_217+"px";
5213_219["top"]=_218+"px";
5214}else{
5215if((_216>Math.PI)&&(_216<=Math.PI*1.5)){
5216_219["textAlign"]="right";
5217_219["verticalAlign"]="bottom";
5218_219["left"]=(_217-_213)+"px";
5219_219["top"]=_218+"px";
5220}else{
5221_219["textAlign"]="right";
5222_219["verticalAlign"]="bottom";
5223_219["left"]=(_217-_213)+"px";
5224_219["top"]=(_218-this.options.axisLabelFontSize)+"px";
5225}
5226}
5227}
5228var _220=DIV({"style":_219},this.layout.xticks[i][1]);
5229this.xlabels.push(_220);
5230MochiKit.DOM.appendChildNodes(this.container,_220);
5231}
5232}
5233};
5234PlotKit.CanvasRenderer.prototype._renderBackground=function(){
5235var _221=this.element.getContext("2d");
5236_221.save();
5237_221.fillStyle=this.options.backgroundColor.toRGBString();
5238_221.fillRect(0,0,this.width,this.height);
5239_221.restore();
5240};
5241PlotKit.CanvasRenderer.prototype.clear=function(){
5242if(this.isIE){
5243try{
5244if(this.clearDelay){
5245this.clearDelay.cancel();
5246this.clearDelay=null;
5247}
5248var _222=this.element.getContext("2d");
5249}
5250catch(e){
5251this.isFirstRender=false;
5252this.clearDelay=MochiKit.Async.wait(this.IEDelay);
5253this.clearDelay.addCallback(bind(this.clear,this));
5254return;
5255}
5256}
5257var _222=this.element.getContext("2d");
5258_222.clearRect(0,0,this.width,this.height);
5259MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement);
5260MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement);
5261this.xlabels=new Array();
5262this.ylabels=new Array();
5263};
5264PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){
5265var _223=MochiKit.Signal.connect;
5266var bind=MochiKit.Base.bind;
5267_223(this.element,"onclick",bind(this.onclick,this));
5268};
5269PlotKit.CanvasRenderer.prototype._resolveObject=function(e){
5270var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w;
5271var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h;
5272var _225=this.layout.hitTest(x,y);
5273if(_225){
5274return _225;
5275}
5276return null;
5277};
5278PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){
5279if(_226==null){
5280return null;
5281}
5282e.chart=_226;
5283return e;
5284};
5285PlotKit.CanvasRenderer.prototype.onclick=function(e){
5286var _227=this._resolveObject(e);
5287var _228=this._createEventObject(_227,e);
5288if(_228!=null){
5289MochiKit.Signal.signal(this,"onclick",_228);
5290}
5291};
5292PlotKit.CanvasRenderer.prototype.onmouseover=function(e){
5293var _229=this._resolveObject(e);
5294var _230=this._createEventObject(_229,e);
5295if(_230!=null){
5296signal(this,"onmouseover",_230);
5297}
5298};
5299PlotKit.CanvasRenderer.prototype.onmouseout=function(e){
5300var _231=this._resolveObject(e);
5301var _232=this._createEventObject(_231,e);
5302if(_232==null){
5303signal(this,"onmouseout",e);
5304}else{
5305signal(this,"onmouseout",_232);
5306}
5307};
5308PlotKit.CanvasRenderer.prototype.onmousemove=function(e){
5309var _233=this._resolveObject(e);
5310var _234=this._createEventObject(_233,e);
5311if((_233==null)&&(this.event_isinside==null)){
5312return;
5313}
5314if((_233!=null)&&(this.event_isinside==null)){
5315signal(this,"onmouseover",_234);
5316}
5317if((_233==null)&&(this.event_isinside!=null)){
5318signal(this,"onmouseout",_234);
5319}
5320if((_233!=null)&&(this.event_isinside!=null)){
5321signal(this,"onmousemove",_234);
5322}
5323this.event_isinside=_233;
5324};
5325PlotKit.CanvasRenderer.isSupported=function(_235){
5326var _236=null;
5327try{
5328if(MochiKit.Base.isUndefinedOrNull(_235)){
5329_236=MochiKit.DOM.CANVAS({});
5330}else{
5331_236=MochiKit.DOM.getElement(_235);
5332}
5333var _237=_236.getContext("2d");
5334}
5335catch(e){
5336var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);
5337var _239=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
5338if((!ie)||(ie[1]<6)||(_239)){
5339return false;
5340}
5341return true;
5342}
5343return true;
5344};
5345PlotKit.Canvas={};
5346PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer;
5347PlotKit.Canvas.EXPORT=["CanvasRenderer"];
5348PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"];
5349PlotKit.Canvas.__new__=function(){
5350var m=MochiKit.Base;
5351m.nameFunctions(this);
5352this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
5353};
5354PlotKit.Canvas.__new__();
5355MochiKit.Base._exportSymbols(this,PlotKit.Canvas);
5356
5357
5358// Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
5359// All Rights Reserved.
5360
5361/**
5362 * @fileoverview Subclasses various parts of PlotKit to meet the additional
5363 * needs of DateGraph: grid overlays and error bars
5364 */
5365
5366// Subclass PlotKit.Layout to add:
5367// 1. Sigma/errorBars properties
5368// 2. Copy error terms for PlotKit.CanvasRenderer._renderLineChart
5369
5370/**
5371 * Creates a new DateGraphLayout object. Options are the same as those allowed
5372 * by the PlotKit.Layout constructor.
5373 * @param {Object} options Options for PlotKit.Layout
5374 * @return {Object} The DateGraphLayout object
5375 */
5376DateGraphLayout = function(options) {
5377 PlotKit.Layout.call(this, "line", options);
5378};
5379DateGraphLayout.prototype = new PlotKit.Layout();
5380
5381/**
5382 * Behaves the same way as PlotKit.Layout, but also copies the errors
5383 * @private
5384 */
5385DateGraphLayout.prototype.evaluateWithError = function() {
5386 this.evaluate();
5387 if (!this.options.errorBars) return;
5388
5389 // Copy over the error terms
5390 var i = 0; // index in this.points
5391 for (var setName in this.datasets) {
5392 var j = 0;
5393 var dataset = this.datasets[setName];
5394 if (PlotKit.Base.isFuncLike(dataset)) continue;
5395 for (var j = 0; j < dataset.length; j++, i++) {
5396 var item = dataset[j];
5397 var xv = parseFloat(item[0]);
5398 var yv = parseFloat(item[1]);
5399
5400 if (xv == this.points[i].xval &&
5401 yv == this.points[i].yval) {
5402 this.points[i].errorMinus = parseFloat(item[2]);
5403 this.points[i].errorPlus = parseFloat(item[3]);
5404 }
5405 }
5406 }
5407};
5408
5409/**
5410 * Convenience function to remove all the data sets from a graph
5411 */
5412DateGraphLayout.prototype.removeAllDatasets = function() {
5413 delete this.datasets;
5414 this.datasets = new Array();
5415};
5416
5417/**
5418 * Change the values of various layout options
5419 * @param {Object} new_options an associative array of new properties
5420 */
5421DateGraphLayout.prototype.updateOptions = function(new_options) {
5422 MochiKit.Base.update(this.options, new_options ? new_options : {});
5423};
5424
5425// Subclass PlotKit.CanvasRenderer to add:
5426// 1. X/Y grid overlay
5427// 2. Ability to draw error bars (if required)
5428
5429/**
5430 * Sets some PlotKit.CanvasRenderer options
5431 * @param {Object} element The canvas to attach to
5432 * @param {Layout} layout The DateGraphLayout object for this graph.
5433 * @param {Object} options Options to pass on to CanvasRenderer
5434 */
5435DateGraphCanvasRenderer = function(element, layout, options) {
5436 PlotKit.CanvasRenderer.call(this, element, layout, options);
5437 this.options.shouldFill = false;
5438 this.options.shouldStroke = true;
5439 this.options.drawYGrid = true;
5440 this.options.drawXGrid = true;
5441 this.options.gridLineColor = MochiKit.Color.Color.grayColor();
5442 MochiKit.Base.update(this.options, options);
5443
5444 // TODO(danvk) This shouldn't be necessary: effects should be overlaid
5445 this.options.drawBackground = false;
5446};
5447DateGraphCanvasRenderer.prototype = new PlotKit.CanvasRenderer();
5448
5449/**
5450 * Draw an X/Y grid on top of the existing plot
5451 */
5452DateGraphCanvasRenderer.prototype.render = function() {
5453 // Do the ordinary rendering, as before
5454 // TODO(danvk) Call super.render()
5455 this._renderLineChart();
5456 this._renderLineAxis();
5457
5458 // Draw the new X/Y grid
5459 var ctx = this.element.getContext("2d");
5460 if (this.options.drawYGrid) {
5461 var ticks = this.layout.yticks;
5462 ctx.save();
5463 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
5464 ctx.lineWidth = this.options.axisLineWidth;
5465 for (var i = 0; i < ticks.length; i++) {
5466 var x = this.area.x;
5467 var y = this.area.y + ticks[i][0] * this.area.h;
5468 ctx.beginPath();
5469 ctx.moveTo(x, y);
5470 ctx.lineTo(x + this.area.w, y);
5471 ctx.closePath();
5472 ctx.stroke();
5473 }
5474 }
5475
5476 if (this.options.drawXGrid) {
5477 var ticks = this.layout.xticks;
5478 ctx.save();
5479 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
5480 ctx.lineWidth = this.options.axisLineWidth;
5481 for (var i=0; i<ticks.length; i++) {
5482 var x = this.area.x + ticks[i][0] * this.area.w;
5483 var y = this.area.y + this.area.h;
5484 ctx.beginPath();
5485 ctx.moveTo(x, y);
5486 ctx.lineTo(x, this.area.y);
5487 ctx.closePath();
5488 ctx.stroke();
5489 }
5490 }
5491};
5492
5493/**
5494 * Overrides the CanvasRenderer method to draw error bars
5495 */
5496DateGraphCanvasRenderer.prototype._renderLineChart = function() {
5497 var context = this.element.getContext("2d");
5498 var colorCount = this.options.colorScheme.length;
5499 var colorScheme = this.options.colorScheme;
5500 var setNames = MochiKit.Base.keys(this.layout.datasets);
5501 var errorBars = this.layout.options.errorBars;
5502 var setCount = setNames.length;
5503 var bind = MochiKit.Base.bind;
5504 var partial = MochiKit.Base.partial;
5505
5506 //Update Points
5507 var updatePoint = function(point) {
5508 point.canvasx = this.area.w * point.x + this.area.x;
5509 point.canvasy = this.area.h * point.y + this.area.y;
5510 }
5511 MochiKit.Iter.forEach(this.layout.points, updatePoint, this);
5512
5513 // create paths
5514 var makePath = function(ctx) {
5515 for (var i = 0; i < setCount; i++) {
5516 var setName = setNames[i];
5517 var color = colorScheme[i%colorCount];
5518 var strokeX = this.options.strokeColorTransform;
5519
5520 // setup graphics context
5521 context.save();
5522 context.strokeStyle = color.toRGBString();
5523 context.lineWidth = this.options.strokeWidth;
5524 ctx.beginPath();
5525 var point = this.layout.points[0];
5526 var first_point = true;
5527 var addPoint = function(ctx_, point) {
5528 if (point.name == setName) {
5529 if (first_point)
5530 ctx_.moveTo(point.canvasx, point.canvasy);
5531 else
5532 ctx_.lineTo(point.canvasx, point.canvasy);
5533 first_point = false;
5534 }
5535 };
5536 MochiKit.Iter.forEach(this.layout.points, partial(addPoint, ctx), this);
5537 ctx.stroke();
5538 }
5539 };
5540
5541 var makeErrorBars = function(ctx) {
5542 for (var i = 0; i < setCount; i++) {
5543 var setName = setNames[i];
5544 var color = colorScheme[i % colorCount];
5545 var strokeX = this.options.strokeColorTransform;
5546
5547 // setup graphics context
5548 context.save();
5549 context.strokeStyle = color.toRGBString();
5550 context.lineWidth = this.options.strokeWidth;
5551 var prevX = -1;
5552 var prevYs = [-1, -1];
5553 var count = 0;
5554 var yscale = this.layout.yscale;
5555 var errorTrapezoid = function(ctx_,point) {
5556 count++;
5557 if (point.name == setName) {
5558 var newYs = [ point.y - point.errorPlus * yscale,
5559 point.y + point.errorMinus * yscale ];
5560 newYs[0] = this.area.h * newYs[0] + this.area.y;
5561 newYs[1] = this.area.h * newYs[1] + this.area.y;
5562 if (prevX >= 0) {
5563 ctx_.moveTo(prevX, prevYs[0]);
5564 ctx_.lineTo(point.canvasx, newYs[0]);
5565 ctx_.lineTo(point.canvasx, newYs[1]);
5566 ctx_.lineTo(prevX, prevYs[1]);
5567 ctx_.closePath();
5568 }
5569 prevYs[0] = newYs[0];
5570 prevYs[1] = newYs[1];
5571 prevX = point.canvasx;
5572 }
5573 };
5574 // should be same color as the lines
5575 var err_color = color.colorWithAlpha(0.15);
5576 ctx.fillStyle = err_color.toRGBString();
5577 ctx.beginPath();
5578 MochiKit.Iter.forEach(this.layout.points, partial(errorTrapezoid, ctx), this);
5579 ctx.fill();
5580 }
5581 };
5582
5583 if (errorBars)
5584 bind(makeErrorBars, this)(context);
5585 bind(makePath, this)(context);
5586 context.restore();
5587};
5588// Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
5589// All Rights Reserved.
5590
5591/**
5592 * @fileoverview Creates an interactive, zoomable graph based on a CSV file or
5593 * string. DateGraph can handle multiple series with or without error bars. The
5594 * date/value ranges will be automatically set. DateGraph uses the
5595 * &lt;canvas&gt; tag, so it only works in FF1.5+.
5596 * @author danvdk@gmail.com (Dan Vanderkam)
5597
5598 Usage:
5599 <div id="graphdiv" style="width:800px; height:500px;"></div>
5600 <script type="text/javascript">
5601 new DateGraph(document.getElementById("graphdiv"),
5602 "datafile.csv",
5603 ["Series 1", "Series 2"],
5604 { }); // options
5605 </script>
5606
5607 The CSV file is of the form
5608
5609 YYYYMMDD,A1,B1,C1
5610 YYYYMMDD,A2,B2,C2
5611
5612 If null is passed as the third parameter (series names), then the first line
5613 of the CSV file is assumed to contain names for each series.
5614
5615 If the 'errorBars' option is set in the constructor, the input should be of
5616 the form
5617
5618 YYYYMMDD,A1,sigmaA1,B1,sigmaB1,...
5619 YYYYMMDD,A2,sigmaA2,B2,sigmaB2,...
5620
5621 If the 'fractions' option is set, the input should be of the form:
5622
5623 YYYYMMDD,A1/B1,A2/B2,...
5624 YYYYMMDD,A1/B1,A2/B2,...
5625
5626 And error bars will be calculated automatically using a binomial distribution.
5627
5628 For further documentation and examples, see http://www/~danvk/dg/
5629
5630 */
5631
5632/**
5633 * An interactive, zoomable graph
5634 * @param {String | Function} file A file containing CSV data or a function that
5635 * returns this data. The expected format for each line is
5636 * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set,
5637 * YYYYMMDD,val1,stddev1,val2,stddev2,...
5638 * @param {Array.<String>} labels Labels for the data series
5639 * @param {Object} attrs Various other attributes, e.g. errorBars determines
5640 * whether the input data contains error ranges.
5641 */
5642DateGraph = function(div, file, labels, attrs) {
5643 if (arguments.length > 0)
5644 this.__init__(div, file, labels, attrs);
5645};
5646
5647DateGraph.NAME = "DateGraph";
5648DateGraph.VERSION = "1.1";
5649DateGraph.__repr__ = function() {
5650 return "[" + this.NAME + " " + this.VERSION + "]";
5651};
5652DateGraph.toString = function() {
5653 return this.__repr__();
5654};
5655
5656// Various default values
5657DateGraph.DEFAULT_ROLL_PERIOD = 1;
5658DateGraph.DEFAULT_WIDTH = 480;
5659DateGraph.DEFAULT_HEIGHT = 320;
5660DateGraph.DEFAULT_STROKE_WIDTH = 1.0;
5661DateGraph.AXIS_LINE_WIDTH = 0.3;
5662
5663/**
5664 * Initializes the DateGraph. This creates a new DIV and constructs the PlotKit
5665 * and interaction &lt;canvas&gt; inside of it. See the constructor for details
5666 * on the parameters.
5667 * @param {String | Function} file Source data
5668 * @param {Array.<String>} labels Names of the data series
5669 * @param {Object} attrs Miscellaneous other options
5670 * @private
5671 */
5672DateGraph.prototype.__init__ = function(div, file, labels, attrs) {
5673 // Copy the important bits into the object
5674 this.maindiv_ = div;
5675 this.labels_ = labels;
5676 this.file_ = file;
5677 this.rollPeriod_ = attrs.rollPeriod || DateGraph.DEFAULT_ROLL_PERIOD;
5678 this.previousVerticalX_ = -1;
5679 this.width_ = parseInt(div.style.width, 10);
5680 this.height_ = parseInt(div.style.height, 10);
5681 this.errorBars_ = attrs.errorBars || false;
5682 this.fractions_ = attrs.fractions || false;
5683 this.strokeWidth_ = attrs.strokeWidth || DateGraph.DEFAULT_STROKE_WIDTH;
5684 this.dateWindow_ = attrs.dateWindow || null;
5685 this.valueRange_ = attrs.valueRange || null;
5686 this.labelsSeparateLines = attrs.labelsSeparateLines || false;
5687 this.labelsDiv_ = attrs.labelsDiv || null;
5688 this.labelsKMB_ = attrs.labelsKMB || false;
5689 this.minTickSize_ = attrs.minTickSize || 0;
5690 this.xValueParser_ = attrs.xValueParser || DateGraph.prototype.dateParser;
5691 this.xValueFormatter_ = attrs.xValueFormatter ||
5692 DateGraph.prototype.dateString_;
5693 this.xTicker_ = attrs.xTicker || DateGraph.prototype.dateTicker;
5694 this.sigma_ = attrs.sigma || 2.0;
5695 this.wilsonInterval_ = attrs.wilsonInterval || true;
5696 this.customBars_ = attrs.customBars || false;
5697 this.attrs_ = attrs;
5698
5699 // Make a note of whether labels will be pulled from the CSV file.
5700 this.labelsFromCSV_ = (this.labels_ == null);
5701 if (this.labels_ == null)
5702 this.labels_ = [];
5703
5704 // Prototype of the callback is "void clickCallback(event, date)"
5705 this.clickCallback_ = attrs.clickCallback || null;
5706
5707 // Prototype of zoom callback is "void dragCallback(minDate, maxDate)"
5708 this.zoomCallback_ = attrs.zoomCallback || null;
5709
5710 // Create the containing DIV and other interactive elements
5711 this.createInterface_();
5712
5713 // Create the PlotKit grapher
5714 this.layoutOptions_ = { 'errorBars': (this.errorBars_ || this.customBars_),
5715 'xOriginIsZero': false };
5716 MochiKit.Base.update(this.layoutOptions_, attrs);
5717 this.setColors_(attrs);
5718
5719 this.layout_ = new DateGraphLayout(this.layoutOptions_);
5720
5721 this.renderOptions_ = { colorScheme: this.colors_,
5722 strokeColor: null,
5723 strokeWidth: this.strokeWidth_,
5724 axisLabelFontSize: 14,
5725 axisLineWidth: DateGraph.AXIS_LINE_WIDTH };
5726 MochiKit.Base.update(this.renderOptions_, attrs);
5727 this.plotter_ = new DateGraphCanvasRenderer(this.hidden_, this.layout_,
5728 this.renderOptions_);
5729
5730 this.createStatusMessage_();
5731 this.createRollInterface_();
5732 this.createDragInterface_();
5733
5734 connect(window, 'onload', this, function(e) { this.start_(); });
5735};
5736
5737/**
5738 * Returns the current rolling period, as set by the user or an option.
5739 * @return {Number} The number of days in the rolling window
5740 */
5741DateGraph.prototype.rollPeriod = function() {
5742 return this.rollPeriod_;
5743}
5744
5745/**
5746 * Generates interface elements for the DateGraph: a containing div, a div to
5747 * display the current point, and a textbox to adjust the rolling average
5748 * period.
5749 * @private
5750 */
5751DateGraph.prototype.createInterface_ = function() {
5752 // Create the all-enclosing graph div
5753 var enclosing = this.maindiv_;
5754
5755 this.graphDiv = MochiKit.DOM.DIV( { style: { 'width': this.width_ + "px",
5756 'height': this.height_ + "px"
5757 }});
5758 appendChildNodes(enclosing, this.graphDiv);
5759
5760 // Create the canvas to store
5761 var canvas = MochiKit.DOM.CANVAS;
5762 this.canvas_ = canvas( { style: { 'position': 'absolute' },
5763 width: this.width_,
5764 height: this.height_});
5765 appendChildNodes(this.graphDiv, this.canvas_);
5766
5767 this.hidden_ = this.createPlotKitCanvas_(this.canvas_);
5768 connect(this.hidden_, 'onmousemove', this, function(e) { this.mouseMove_(e) });
5769 connect(this.hidden_, 'onmouseout', this, function(e) { this.mouseOut_(e) });
5770}
5771
5772/**
5773 * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on
5774 * this particular canvas. All DateGraph work is done on this.canvas_.
5775 * @param {Object} canvas The DateGraph canvas to over which to overlay the plot
5776 * @return {Object} The newly-created canvas
5777 * @private
5778 */
5779DateGraph.prototype.createPlotKitCanvas_ = function(canvas) {
5780 var h = document.createElement("canvas");
5781 h.style.position = "absolute";
5782 h.style.top = canvas.style.top;
5783 h.style.left = canvas.style.left;
5784 h.width = this.width_;
5785 h.height = this.height_;
5786 MochiKit.DOM.appendChildNodes(this.graphDiv, h);
5787 return h;
5788};
5789
5790/**
5791 * Generate a set of distinct colors for the data series. This is done with a
5792 * color wheel. Saturation/Value are customizable, and the hue is
5793 * equally-spaced around the color wheel. If a custom set of colors is
5794 * specified, that is used instead.
5795 * @param {Object} attrs Various attributes, e.g. saturation and value
5796 * @private
5797 */
5798DateGraph.prototype.setColors_ = function(attrs) {
5799 var num = this.labels_.length;
5800 this.colors_ = [];
5801 if (!attrs.colors) {
5802 var sat = attrs.colorSaturation || 1.0;
5803 var val = attrs.colorValue || 0.5;
5804 for (var i = 1; i <= num; i++) {
5805 var hue = (1.0*i/(1+num));
5806 this.colors_.push( MochiKit.Color.Color.fromHSV(hue, sat, val) );
5807 }
5808 } else {
5809 for (var i = 0; i < num; i++) {
5810 var colorStr = attrs.colors[i % attrs.colors.length];
5811 this.colors_.push( MochiKit.Color.Color.fromString(colorStr) );
5812 }
5813 }
5814}
5815
5816/**
5817 * Create the div that contains information on the selected point(s)
5818 * This goes in the top right of the canvas, unless an external div has already
5819 * been specified.
5820 * @private
5821 */
5822DateGraph.prototype.createStatusMessage_ = function(){
5823 if (!this.labelsDiv_) {
5824 var divWidth = 250;
5825 var messagestyle = { "style": {
5826 "position": "absolute",
5827 "fontSize": "14px",
5828 "zIndex": 10,
5829 "width": divWidth + "px",
5830 "top": "0px",
5831 "left": this.width_ - divWidth + "px",
5832 "background": "white",
5833 "textAlign": "left",
5834 "overflow": "hidden"}};
5835 this.labelsDiv_ = MochiKit.DOM.DIV(messagestyle);
5836 MochiKit.DOM.appendChildNodes(this.graphDiv, this.labelsDiv_);
5837 }
5838};
5839
5840/**
5841 * Create the text box to adjust the averaging period
5842 * @return {Object} The newly-created text box
5843 * @private
5844 */
5845DateGraph.prototype.createRollInterface_ = function() {
5846 var padding = this.plotter_.options.padding;
5847 var textAttr = { "type": "text",
5848 "size": "2",
5849 "value": this.rollPeriod_,
5850 "style": { "position": "absolute",
5851 "zIndex": 10,
5852 "top": (this.height_ - 25 - padding.bottom) + "px",
5853 "left": (padding.left+1) + "px" }
5854 };
5855 var roller = MochiKit.DOM.INPUT(textAttr);
5856 var pa = this.graphDiv;
5857 MochiKit.DOM.appendChildNodes(pa, roller);
5858 connect(roller, 'onchange', this,
5859 function() { this.adjustRoll(roller.value); });
5860 return roller;
5861}
5862
5863/**
5864 * Set up all the mouse handlers needed to capture dragging behavior for zoom
5865 * events. Uses MochiKit.Signal to attach all the event handlers.
5866 * @private
5867 */
5868DateGraph.prototype.createDragInterface_ = function() {
5869 var self = this;
5870
5871 // Tracks whether the mouse is down right now
5872 var mouseDown = false;
5873 var dragStartX = null;
5874 var dragStartY = null;
5875 var dragEndX = null;
5876 var dragEndY = null;
5877 var prevEndX = null;
5878
5879 // Utility function to convert page-wide coordinates to canvas coords
5880 var px = PlotKit.Base.findPosX(this.canvas_);
5881 var py = PlotKit.Base.findPosY(this.canvas_);
5882 var getX = function(e) { return e.mouse().page.x - px };
5883 var getY = function(e) { return e.mouse().page.y - py };
5884
5885 // Draw zoom rectangles when the mouse is down and the user moves around
5886 connect(this.hidden_, 'onmousemove', function(event) {
5887 if (mouseDown) {
5888 dragEndX = getX(event);
5889 dragEndY = getY(event);
5890
5891 self.drawZoomRect_(dragStartX, dragEndX, prevEndX);
5892 prevEndX = dragEndX;
5893 }
5894 });
5895
5896 // Track the beginning of drag events
5897 connect(this.hidden_, 'onmousedown', function(event) {
5898 mouseDown = true;
5899 dragStartX = getX(event);
5900 dragStartY = getY(event);
5901 });
5902
5903 // If the user releases the mouse button during a drag, but not over the
5904 // canvas, then it doesn't count as a zooming action.
5905 connect(document, 'onmouseup', this, function(event) {
5906 if (mouseDown) {
5907 mouseDown = false;
5908 dragStartX = null;
5909 dragStartY = null;
5910 }
5911 });
5912
5913 // Temporarily cancel the dragging event when the mouse leaves the graph
5914 connect(this.hidden_, 'onmouseout', this, function(event) {
5915 if (mouseDown) {
5916 dragEndX = null;
5917 dragEndY = null;
5918 }
5919 });
5920
5921 // If the mouse is released on the canvas during a drag event, then it's a
5922 // zoom. Only do the zoom if it's over a large enough area (>= 10 pixels)
5923 connect(this.hidden_, 'onmouseup', this, function(event) {
5924 if (mouseDown) {
5925 mouseDown = false;
5926 dragEndX = getX(event);
5927 dragEndY = getY(event);
5928 var regionWidth = Math.abs(dragEndX - dragStartX);
5929 var regionHeight = Math.abs(dragEndY - dragStartY);
5930
5931 if (regionWidth < 2 && regionHeight < 2 &&
5932 self.clickCallback_ != null &&
5933 self.lastx_ != undefined) {
5934 self.clickCallback_(event, new Date(self.lastx_));
5935 }
5936
5937 if (regionWidth >= 10) {
5938 self.doZoom_(Math.min(dragStartX, dragEndX),
5939 Math.max(dragStartX, dragEndX));
5940 } else {
5941 self.canvas_.getContext("2d").clearRect(0, 0,
5942 self.canvas_.width,
5943 self.canvas_.height);
5944 }
5945
5946 dragStartX = null;
5947 dragStartY = null;
5948 }
5949 });
5950
5951 // Double-clicking zooms back out
5952 connect(this.hidden_, 'ondblclick', this, function(event) {
5953 self.dateWindow_ = null;
5954 self.drawGraph_(self.rawData_);
5955 var minDate = self.rawData_[0][0];
5956 var maxDate = self.rawData_[self.rawData_.length - 1][0];
5957 self.zoomCallback_(minDate, maxDate);
5958 });
5959};
5960
5961/**
5962 * Draw a gray zoom rectangle over the desired area of the canvas. Also clears
5963 * up any previous zoom rectangles that were drawn. This could be optimized to
5964 * avoid extra redrawing, but it's tricky to avoid interactions with the status
5965 * dots.
5966 * @param {Number} startX The X position where the drag started, in canvas
5967 * coordinates.
5968 * @param {Number} endX The current X position of the drag, in canvas coords.
5969 * @param {Number} prevEndX The value of endX on the previous call to this
5970 * function. Used to avoid excess redrawing
5971 * @private
5972 */
5973DateGraph.prototype.drawZoomRect_ = function(startX, endX, prevEndX) {
5974 var ctx = this.canvas_.getContext("2d");
5975
5976 // Clean up from the previous rect if necessary
5977 if (prevEndX) {
5978 ctx.clearRect(Math.min(startX, prevEndX), 0,
5979 Math.abs(startX - prevEndX), this.height_);
5980 }
5981
5982 // Draw a light-grey rectangle to show the new viewing area
5983 if (endX && startX) {
5984 ctx.fillStyle = "rgba(128,128,128,0.33)";
5985 ctx.fillRect(Math.min(startX, endX), 0,
5986 Math.abs(endX - startX), this.height_);
5987 }
5988};
5989
5990/**
5991 * Zoom to something containing [lowX, highX]. These are pixel coordinates
5992 * in the canvas. The exact zoom window may be slightly larger if there are no
5993 * data points near lowX or highX. This function redraws the graph.
5994 * @param {Number} lowX The leftmost pixel value that should be visible.
5995 * @param {Number} highX The rightmost pixel value that should be visible.
5996 * @private
5997 */
5998DateGraph.prototype.doZoom_ = function(lowX, highX) {
5999 // Find the earliest and latest dates contained in this canvasx range.
6000 var points = this.layout_.points;
6001 var minDate = null;
6002 var maxDate = null;
6003 // Find the nearest [minDate, maxDate] that contains [lowX, highX]
6004 for (var i = 0; i < points.length; i++) {
6005 var cx = points[i].canvasx;
6006 var x = points[i].xval;
6007 if (cx < lowX && (minDate == null || x > minDate)) minDate = x;
6008 if (cx > highX && (maxDate == null || x < maxDate)) maxDate = x;
6009 }
6010 // Use the extremes if either is missing
6011 if (minDate == null) minDate = points[0].xval;
6012 if (maxDate == null) maxDate = points[points.length-1].xval;
6013
6014 this.dateWindow_ = [minDate, maxDate];
6015 this.drawGraph_(this.rawData_);
6016 this.zoomCallback_(minDate, maxDate);
6017};
6018
6019/**
6020 * When the mouse moves in the canvas, display information about a nearby data
6021 * point and draw dots over those points in the data series. This function
6022 * takes care of cleanup of previously-drawn dots.
6023 * @param {Object} event The mousemove event from the browser.
6024 * @private
6025 */
6026DateGraph.prototype.mouseMove_ = function(event) {
6027 var canvasx = event.mouse().page.x - PlotKit.Base.findPosX(this.hidden_);
6028 var points = this.layout_.points;
6029
6030 var lastx = -1;
6031 var lasty = -1;
6032
6033 // Loop through all the points and find the date nearest to our current
6034 // location.
6035 var minDist = 1e+100;
6036 var idx = -1;
6037 for (var i = 0; i < points.length; i++) {
6038 var dist = Math.abs(points[i].canvasx - canvasx);
6039 if (dist > minDist) break;
6040 minDist = dist;
6041 idx = i;
6042 }
6043 if (idx >= 0) lastx = points[idx].xval;
6044 // Check that you can really highlight the last day's data
6045 if (canvasx > points[points.length-1].canvasx)
6046 lastx = points[points.length-1].xval;
6047
6048 // Extract the points we've selected
6049 var selPoints = [];
6050 for (var i = 0; i < points.length; i++) {
6051 if (points[i].xval == lastx) {
6052 selPoints.push(points[i]);
6053 }
6054 }
6055
6056 // Clear the previously drawn vertical, if there is one
6057 var circleSize = 3;
6058 var ctx = this.canvas_.getContext("2d");
6059 if (this.previousVerticalX_ >= 0) {
6060 var px = this.previousVerticalX_;
6061 ctx.clearRect(px - circleSize - 1, 0, 2 * circleSize + 2, this.height_);
6062 }
6063
6064 if (selPoints.length > 0) {
6065 var canvasx = selPoints[0].canvasx;
6066
6067 // Set the status message to indicate the selected point(s)
6068 var replace = this.xValueFormatter_(lastx) + ":";
6069 var clen = this.colors_.length;
6070 for (var i = 0; i < selPoints.length; i++) {
6071 if (this.labelsSeparateLines) {
6072 replace += "<br/>";
6073 }
6074 var point = selPoints[i];
6075 replace += " <b><font color='" + this.colors_[i%clen].toHexString() + "'>"
6076 + point.name + "</font></b>:"
6077 + this.round_(point.yval, 2);
6078 }
6079 this.labelsDiv_.innerHTML = replace;
6080
6081 // Save last x position for callbacks.
6082 this.lastx_ = lastx;
6083
6084 // Draw colored circles over the center of each selected point
6085 ctx.save()
6086 for (var i = 0; i < selPoints.length; i++) {
6087 ctx.beginPath();
6088 ctx.fillStyle = this.colors_[i%clen].toRGBString();
6089 ctx.arc(canvasx, selPoints[i%clen].canvasy, circleSize, 0, 360, false);
6090 ctx.fill();
6091 }
6092 ctx.restore();
6093
6094 this.previousVerticalX_ = canvasx;
6095 }
6096};
6097
6098/**
6099 * The mouse has left the canvas. Clear out whatever artifacts remain
6100 * @param {Object} event the mouseout event from the browser.
6101 * @private
6102 */
6103DateGraph.prototype.mouseOut_ = function(event) {
6104 // Get rid of the overlay data
6105 var ctx = this.canvas_.getContext("2d");
6106 ctx.clearRect(0, 0, this.width_, this.height_);
6107 this.labelsDiv_.innerHTML = "";
6108};
6109
6110/**
6111 * Convert a JS date (millis since epoch) to YYYY/MM/DD
6112 * @param {Number} date The JavaScript date (ms since epoch)
6113 * @return {String} A date of the form "YYYY/MM/DD"
6114 * @private
6115 */
6116DateGraph.prototype.dateString_ = function(date) {
6117 var d = new Date(date);
6118
6119 // Get the year:
6120 var year = "" + d.getFullYear();
6121 // Get a 0 padded month string
6122 var month = "" + (d.getMonth() + 1); //months are 0-offset, sigh
6123 if (month.length < 2) month = "0" + month;
6124 // Get a 0 padded day string
6125 var day = "" + d.getDate();
6126 if (day.length < 2) day = "0" + day;
6127
6128 return year + "/" + month + "/" + day;
6129};
6130
6131/**
6132 * Round a number to the specified number of digits past the decimal point.
6133 * @param {Number} num The number to round
6134 * @param {Number} places The number of decimals to which to round
6135 * @return {Number} The rounded number
6136 * @private
6137 */
6138DateGraph.prototype.round_ = function(num, places) {
6139 var shift = Math.pow(10, places);
6140 return Math.round(num * shift)/shift;
6141};
6142
6143/**
6144 * Fires when there's data available to be graphed.
6145 * @param {String} data Raw CSV data to be plotted
6146 * @private
6147 */
6148DateGraph.prototype.loadedEvent_ = function(data) {
6149 this.rawData_ = this.parseCSV_(data);
6150 this.drawGraph_(this.rawData_);
6151};
6152
6153DateGraph.prototype.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
6154 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
6155DateGraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"];
6156
6157/**
6158 * Add ticks on the x-axis representing years, months, quarters, weeks, or days
6159 * @private
6160 */
6161DateGraph.prototype.addXTicks_ = function() {
6162 // Determine the correct ticks scale on the x-axis: quarterly, monthly, ...
6163 var startDate, endDate;
6164 if (this.dateWindow_) {
6165 startDate = this.dateWindow_[0];
6166 endDate = this.dateWindow_[1];
6167 } else {
6168 startDate = this.rawData_[0][0];
6169 endDate = this.rawData_[this.rawData_.length - 1][0];
6170 }
6171
6172 var xTicks = this.xTicker_(startDate, endDate);
6173 this.layout_.updateOptions({xTicks: xTicks});
6174}
6175
6176/**
6177 * Add ticks to the x-axis based on a date range.
6178 * @param {Number} startDate Start of the date window (millis since epoch)
6179 * @param {Number} endDate End of the date window (millis since epoch)
6180 * @return {Array.<Object>} Array of {label, value} tuples.
6181 * @public
6182 */
6183DateGraph.prototype.dateTicker = function(startDate, endDate) {
6184 var ONE_DAY = 24*60*60*1000;
6185 startDate = startDate / ONE_DAY;
6186 endDate = endDate / ONE_DAY;
6187 var dateSpan = endDate - startDate;
6188
6189 var scale = [];
6190 var isMonthly = false;
6191 var yearMod = 1;
6192 if (dateSpan > 30 * 366) { // decadal
6193 isMonthly = true;
6194 scale = ["Jan"];
6195 yearMod = 10;
6196 } else if (dateSpan > 4*366) { // annual
6197 scale = ["Jan"];
6198 isMonthly = true;
6199 } else if (dateSpan > 366) { // quarterly
6200 scale = this.quarters;
6201 isMonthly = true;
6202 } else if (dateSpan > 40) { // monthly
6203 scale = this.months;
6204 isMonthly = true;
6205 } else if (dateSpan > 10) { // weekly
6206 for (var week = startDate - 14; week < endDate + 14; week += 7) {
6207 scale.push(week * ONE_DAY);
6208 }
6209 } else { // daily
6210 for (var day = startDate - 14; day < endDate + 14; day += 1) {
6211 scale.push(day * ONE_DAY);
6212 }
6213 }
6214
6215 var xTicks = [];
6216
6217 if (isMonthly) {
6218 var startYear = 1900 + (new Date(startDate* ONE_DAY)).getYear();
6219 var endYear = 1900 + (new Date(endDate * ONE_DAY)).getYear();
6220 for (var i = startYear; i <= endYear; i++) {
6221 if (i % yearMod != 0) continue;
6222 for (var j = 0; j < scale.length; j++ ) {
6223 var date = Date.parse(scale[j] + " 1, " + i);
6224 xTicks.push( {label: scale[j] + "'" + ("" + i).substr(2,2), v: date } );
6225 }
6226 }
6227 } else {
6228 for (var i = 0; i < scale.length; i++) {
6229 var date = new Date(scale[i]);
6230 var year = date.getFullYear().toString();
6231 var label = this.months[date.getMonth()] + date.getDate();
6232 label += "'" + year.substr(year.length - 2, 2);
6233 xTicks.push( {label: label, v: date} );
6234 }
6235 }
6236 return xTicks;
6237};
6238
6239/**
6240 * Add ticks when the x axis has numbers on it (instead of dates)
6241 * @param {Number} startDate Start of the date window (millis since epoch)
6242 * @param {Number} endDate End of the date window (millis since epoch)
6243 * @return {Array.<Object>} Array of {label, value} tuples.
6244 * @public
6245 */
6246DateGraph.prototype.numericTicks = function(minV, maxV) {
6247 var scale;
6248 if (maxV <= 0.0) {
6249 scale = 1.0;
6250 } else {
6251 scale = Math.pow( 10, Math.floor(Math.log(maxV)/Math.log(10.0)) );
6252 }
6253
6254 // Add a smallish number of ticks at human-friendly points
6255 var nTicks = (maxV - minV) / scale;
6256 while (2 * nTicks < 20) {
6257 nTicks *= 2;
6258 }
6259 if ((maxV - minV) / nTicks < this.minTickSize_) {
6260 nTicks = this.round_((maxV - minV) / this.minTickSize_, 1);
6261 }
6262
6263 // Construct labels for the ticks
6264 var ticks = [];
6265 for (var i = 0; i <= nTicks; i++) {
6266 var tickV = minV + i * (maxV - minV) / nTicks;
6267 var label = this.round_(tickV, 2);
6268 if (this.labelsKMB_) {
6269 var k = 1000;
6270 if (tickV >= k*k*k) {
6271 label = this.round_(tickV/(k*k*k), 1) + "B";
6272 } else if (tickV >= k*k) {
6273 label = this.round_(tickV/(k*k), 1) + "M";
6274 } else if (tickV >= k) {
6275 label = this.round_(tickV/k, 1) + "K";
6276 }
6277 }
6278 ticks.push( {label: label, v: tickV} );
6279 }
6280 return ticks;
6281};
6282
6283/**
6284 * Adds appropriate ticks on the y-axis
6285 * @param {Number} minY The minimum Y value in the data set
6286 * @param {Number} maxY The maximum Y value in the data set
6287 * @private
6288 */
6289DateGraph.prototype.addYTicks_ = function(minY, maxY) {
6290 // Set the number of ticks so that the labels are human-friendly.
6291 var ticks = this.numericTicks(minY, maxY);
6292 this.layout_.updateOptions( { yAxis: [minY, maxY],
6293 yTicks: ticks } );
6294};
6295
6296/**
6297 * Update the graph with new data. Data is in the format
6298 * [ [date1, val1, val2, ...], [date2, val1, val2, ...] if errorBars=false
6299 * or, if errorBars=true,
6300 * [ [date1, [val1,stddev1], [val2,stddev2], ...], [date2, ...], ...]
6301 * @param {Array.<Object>} data The data (see above)
6302 * @private
6303 */
6304DateGraph.prototype.drawGraph_ = function(data) {
6305 var maxY = null;
6306 this.layout_.removeAllDatasets();
6307 // Loop over all fields in the dataset
6308 for (var i = 1; i < data[0].length; i++) {
6309 var series = [];
6310 for (var j = 0; j < data.length; j++) {
6311 var date = data[j][0];
6312 series[j] = [date, data[j][i]];
6313 }
6314 series = this.rollingAverage(series, this.rollPeriod_);
6315
6316 // Prune down to the desired range, if necessary (for zooming)
6317 var bars = this.errorBars_ || this.customBars_;
6318 if (this.dateWindow_) {
6319 var low = this.dateWindow_[0];
6320 var high= this.dateWindow_[1];
6321 var pruned = [];
6322 for (var k = 0; k < series.length; k++) {
6323 if (series[k][0] >= low && series[k][0] <= high) {
6324 pruned.push(series[k]);
6325 var y = bars ? series[k][1][0] : series[k][1];
6326 if (maxY == null || y > maxY) maxY = y;
6327 }
6328 }
6329 series = pruned;
6330 } else {
6331 for (var j = 0; j < series.length; j++) {
6332 var y = bars ? series[j][1][0] : series[j][1];
6333 if (maxY == null || y > maxY) {
6334 maxY = bars ? y + series[j][1][1] : y;
6335 }
6336 }
6337 }
6338
6339 if (bars) {
6340 var vals = [];
6341 for (var j=0; j<series.length; j++)
6342 vals[j] = [series[j][0],
6343 series[j][1][0], series[j][1][1], series[j][1][2]];
6344 this.layout_.addDataset(this.labels_[i - 1], vals);
6345 } else {
6346 this.layout_.addDataset(this.labels_[i - 1], series);
6347 }
6348 }
6349
6350 // Use some heuristics to come up with a good maxY value, unless it's been
6351 // set explicitly by the user.
6352 if (this.valueRange_ != null) {
6353 this.addYTicks_(this.valueRange_[0], this.valueRange_[1]);
6354 } else {
6355 // Add some padding and round up to an integer to be human-friendly.
6356 maxY *= 1.1;
6357 if (maxY <= 0.0) maxY = 1.0;
6358 else {
6359 var scale = Math.pow(10, Math.floor(Math.log(maxY) / Math.log(10.0)));
6360 maxY = scale * Math.ceil(maxY / scale);
6361 }
6362 this.addYTicks_(0, maxY);
6363 }
6364
6365 this.addXTicks_();
6366
6367 // Tell PlotKit to use this new data and render itself
6368 this.layout_.evaluateWithError();
6369 this.plotter_.clear();
6370 this.plotter_.render();
6371 this.canvas_.getContext('2d').clearRect(0, 0,
6372 this.canvas_.width, this.canvas_.height);
6373};
6374
6375/**
6376 * Calculates the rolling average of a data set.
6377 * If originalData is [label, val], rolls the average of those.
6378 * If originalData is [label, [, it's interpreted as [value, stddev]
6379 * and the roll is returned in the same form, with appropriately reduced
6380 * stddev for each value.
6381 * Note that this is where fractional input (i.e. '5/10') is converted into
6382 * decimal values.
6383 * @param {Array} originalData The data in the appropriate format (see above)
6384 * @param {Number} rollPeriod The number of days over which to average the data
6385 */
6386DateGraph.prototype.rollingAverage = function(originalData, rollPeriod) {
6387 if (originalData.length < 2)
6388 return originalData;
6389 var rollPeriod = Math.min(rollPeriod, originalData.length - 1);
6390 var rollingData = [];
6391 var sigma = this.sigma_;
6392
6393 if (this.fractions_) {
6394 var num = 0;
6395 var den = 0; // numerator/denominator
6396 var mult = 100.0;
6397 for (var i = 0; i < originalData.length; i++) {
6398 num += originalData[i][1][0];
6399 den += originalData[i][1][1];
6400 if (i - rollPeriod >= 0) {
6401 num -= originalData[i - rollPeriod][1][0];
6402 den -= originalData[i - rollPeriod][1][1];
6403 }
6404
6405 var date = originalData[i][0];
6406 var value = den ? num / den : 0.0;
6407 if (this.errorBars_) {
6408 if (this.wilsonInterval_) {
6409 // For more details on this confidence interval, see:
6410 // http://en.wikipedia.org/wiki/Binomial_confidence_interval
6411 if (den) {
6412 var p = value < 0 ? 0 : value, n = den;
6413 var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n));
6414 var denom = 1 + sigma * sigma / den;
6415 var low = (p + sigma * sigma / (2 * den) - pm) / denom;
6416 var high = (p + sigma * sigma / (2 * den) + pm) / denom;
6417 rollingData[i] = [date,
6418 [p * mult, (p - low) * mult, (high - p) * mult]];
6419 } else {
6420 rollingData[i] = [date, [0, 0, 0]];
6421 }
6422 } else {
6423 var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
6424 rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]];
6425 }
6426 } else {
6427 rollingData[i] = [date, mult * value];
6428 }
6429 }
6430 } else if (this.customBars_) {
6431 // just ignore the rolling for now.
6432 // TODO(danvk): do something reasonable.
6433 for (var i = 0; i < originalData.length; i++) {
6434 var data = originalData[i][1];
6435 var y = data[1];
6436 rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]];
6437 }
6438 } else {
6439 // Calculate the rolling average for the first rollPeriod - 1 points where
6440 // there is not enough data to roll over the full number of days
6441 var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2);
6442 if (!this.errorBars_){
6443 for (var i = 0; i < num_init_points; i++) {
6444 var sum = 0;
6445 for (var j = 0; j < i + 1; j++)
6446 sum += originalData[j][1];
6447 rollingData[i] = [originalData[i][0], sum / (i + 1)];
6448 }
6449 // Calculate the rolling average for the remaining points
6450 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
6451 i < originalData.length;
6452 i++) {
6453 var sum = 0;
6454 for (var j = i - rollPeriod + 1; j < i + 1; j++)
6455 sum += originalData[j][1];
6456 rollingData[i] = [originalData[i][0], sum / rollPeriod];
6457 }
6458 } else {
6459 for (var i = 0; i < num_init_points; i++) {
6460 var sum = 0;
6461 var variance = 0;
6462 for (var j = 0; j < i + 1; j++) {
6463 sum += originalData[j][1][0];
6464 variance += Math.pow(originalData[j][1][1], 2);
6465 }
6466 var stddev = Math.sqrt(variance)/(i+1);
6467 rollingData[i] = [originalData[i][0],
6468 [sum/(i+1), sigma * stddev, sigma * stddev]];
6469 }
6470 // Calculate the rolling average for the remaining points
6471 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
6472 i < originalData.length;
6473 i++) {
6474 var sum = 0;
6475 var variance = 0;
6476 for (var j = i - rollPeriod + 1; j < i + 1; j++) {
6477 sum += originalData[j][1][0];
6478 variance += Math.pow(originalData[j][1][1], 2);
6479 }
6480 var stddev = Math.sqrt(variance) / rollPeriod;
6481 rollingData[i] = [originalData[i][0],
6482 [sum / rollPeriod, sigma * stddev, sigma * stddev]];
6483 }
6484 }
6485 }
6486
6487 return rollingData;
6488};
6489
6490/**
6491 * Parses a date, returning the number of milliseconds since epoch. This can be
6492 * passed in as an xValueParser in the DateGraph constructor.
6493 * @param {String} A date in YYYYMMDD format.
6494 * @return {Number} Milliseconds since epoch.
6495 * @public
6496 */
6497DateGraph.prototype.dateParser = function(dateStr) {
6498 var dateStrSlashed;
6499 if (dateStr.search("-") != -1) {
6500 dateStrSlashed = dateStr.replace("-", "/", "g");
6501 } else if (dateStr.search("/") != -1) {
6502 return Date.parse(dateStr);
6503 } else {
6504 dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2)
6505 + "/" + dateStr.substr(6,2);
6506 }
6507 return Date.parse(dateStrSlashed);
6508};
6509
6510/**
6511 * Parses a string in a special csv format. We expect a csv file where each
6512 * line is a date point, and the first field in each line is the date string.
6513 * We also expect that all remaining fields represent series.
6514 * if this.errorBars_ is set, then interpret the fields as:
6515 * date, series1, stddev1, series2, stddev2, ...
6516 * @param {Array.<Object>} data See above.
6517 * @private
6518 */
6519DateGraph.prototype.parseCSV_ = function(data) {
6520 var ret = [];
6521 var lines = data.split("\n");
6522 var start = this.labelsFromCSV_ ? 1 : 0;
6523 if (this.labelsFromCSV_) {
6524 var labels = lines[0].split(",");
6525 labels.shift(); // a "date" parameter is assumed.
6526 this.labels_ = labels;
6527 // regenerate automatic colors.
6528 this.setColors_(this.attrs_);
6529 this.renderOptions_.colorScheme = this.colors_;
6530 MochiKit.Base.update(this.plotter_.options, this.renderOptions_);
6531 MochiKit.Base.update(this.layoutOptions_, this.attrs_);
6532 }
6533
6534 for (var i = start; i < lines.length; i++) {
6535 var line = lines[i];
6536 if (line.length == 0) continue; // skip blank lines
6537 var inFields = line.split(',');
6538 if (inFields.length < 2)
6539 continue;
6540
6541 var fields = [];
6542 fields[0] = this.xValueParser_(inFields[0]);
6543
6544 // If fractions are expected, parse the numbers as "A/B"
6545 if (this.fractions_) {
6546 for (var j = 1; j < inFields.length; j++) {
6547 // TODO(danvk): figure out an appropriate way to flag parse errors.
6548 var vals = inFields[j].split("/");
6549 fields[j] = [parseFloat(vals[0]), parseFloat(vals[1])];
6550 }
6551 } else if (this.errorBars_) {
6552 // If there are error bars, values are (value, stddev) pairs
6553 for (var j = 1; j < inFields.length; j += 2)
6554 fields[(j + 1) / 2] = [parseFloat(inFields[j]),
6555 parseFloat(inFields[j + 1])];
6556 } else if (this.customBars_) {
6557 // Bars are a low;center;high tuple
6558 for (var j = 1; j < inFields.length; j++) {
6559 var vals = inFields[j].split(";");
6560 fields[j] = [ parseFloat(vals[0]),
6561 parseFloat(vals[1]),
6562 parseFloat(vals[2]) ];
6563 }
6564 } else {
6565 // Values are just numbers
6566 for (var j = 1; j < inFields.length; j++)
6567 fields[j] = parseFloat(inFields[j]);
6568 }
6569 ret.push(fields);
6570 }
6571 return ret;
6572};
6573
6574/**
6575 * Get the CSV data. If it's in a function, call that function. If it's in a
6576 * file, do an XMLHttpRequest to get it.
6577 * @private
6578 */
6579DateGraph.prototype.start_ = function() {
6580 if (typeof this.file_ == 'function') {
6581 // Stubbed out to allow this to run off a filesystem
6582 this.loadedEvent_(this.file_());
6583 } else {
6584 var req = new XMLHttpRequest();
6585 var caller = this;
6586 req.onreadystatechange = function () {
6587 if (req.readyState == 4) {
6588 if (req.status == 200) {
6589 caller.loadedEvent_(req.responseText);
6590 }
6591 }
6592 };
6593
6594 req.open("GET", this.file_, true);
6595 req.send(null);
6596 }
6597};
6598
6599/**
6600 * Changes various properties of the graph. These can include:
6601 * <ul>
6602 * <li>file: changes the source data for the graph</li>
6603 * <li>errorBars: changes whether the data contains stddev</li>
6604 * </ul>
6605 * @param {Object} attrs The new properties and values
6606 */
6607DateGraph.prototype.updateOptions = function(attrs) {
6608 if (attrs.errorBars) {
6609 this.errorBars_ = attrs.errorBars;
6610 }
6611 if (attrs.customBars) {
6612 this.customBars_ = attrs.customBars;
6613 }
6614 if (attrs.strokeWidth) {
6615 this.strokeWidth_ = attrs.strokeWidth;
6616 }
6617 if (attrs.rollPeriod) {
6618 this.rollPeriod_ = attrs.rollPeriod;
6619 }
6620 if (attrs.dateWindow) {
6621 this.dateWindow_ = attrs.dateWindow;
6622 }
6623 if (attrs.valueRange) {
6624 this.valueRange_ = attrs.valueRange;
6625 }
6626 if (attrs.minTickSize) {
6627 this.minTickSize_ = attrs.minTickSize;
6628 }
6629 if (typeof(attrs.labels) != 'undefined') {
6630 this.labels_ = attrs.labels;
6631 this.labelsFromCSV_ = (attrs.labels == null);
6632 }
6633 this.layout_.updateOptions({ 'errorBars': this.errorBars_ });
6634 if (attrs['file'] && attrs['file'] != this.file_) {
6635 this.file_ = attrs['file'];
6636 this.start_();
6637 } else {
6638 this.drawGraph_(this.rawData_);
6639 }
6640};
6641
6642/**
6643 * Adjusts the number of days in the rolling average. Updates the graph to
6644 * reflect the new averaging period.
6645 * @param {Number} length Number of days over which to average the data.
6646 */
6647DateGraph.prototype.adjustRoll = function(length) {
6648 this.rollPeriod_ = length;
6649 this.drawGraph_(this.rawData_);
6650};