update combined files
[dygraphs.git] / dygraph-combined.js
CommitLineData
6a1aa64f
DV
1/***
2
3 MochiKit.MochiKit 1.4 : PACKED VERSION
4
5 THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please
6 diff against the source tree, not this file.
7
8 See <http://mochikit.com/> for documentation, downloads, license, etc.
9
10 (c) 2005 Bob Ippolito. All rights Reserved.
11
12***/
13
14if(typeof (dojo)!="undefined"){
15dojo.provide("MochiKit.Base");
16}
17if(typeof (MochiKit)=="undefined"){
18MochiKit={};
19}
20if(typeof (MochiKit.Base)=="undefined"){
21MochiKit.Base={};
22}
23if(typeof (MochiKit.__export__)=="undefined"){
24MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
25}
26MochiKit.Base.VERSION="1.4";
27MochiKit.Base.NAME="MochiKit.Base";
28MochiKit.Base.update=function(_1,_2){
29if(_1===null){
30_1={};
31}
32for(var i=1;i<arguments.length;i++){
33var o=arguments[i];
34if(typeof (o)!="undefined"&&o!==null){
35for(var k in o){
36_1[k]=o[k];
37}
38}
39}
40return _1;
41};
42MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
43return "["+this.NAME+" "+this.VERSION+"]";
44},toString:function(){
45return this.__repr__();
46},camelize:function(_6){
47var _7=_6.split("-");
48var cc=_7[0];
49for(var i=1;i<_7.length;i++){
50cc+=_7[i].charAt(0).toUpperCase()+_7[i].substring(1);
51}
52return cc;
53},counter:function(n){
54if(arguments.length===0){
55n=1;
56}
57return function(){
58return n++;
59};
60},clone:function(_b){
61var me=arguments.callee;
62if(arguments.length==1){
63me.prototype=_b;
64return new me();
65}
66},_flattenArray:function(_d,_e){
67for(var i=0;i<_e.length;i++){
68var o=_e[i];
69if(o instanceof Array){
70arguments.callee(_d,o);
71}else{
72_d.push(o);
73}
74}
75return _d;
76},flattenArray:function(lst){
77return MochiKit.Base._flattenArray([],lst);
78},flattenArguments:function(lst){
79var res=[];
80var m=MochiKit.Base;
81var _15=m.extend(null,arguments);
82while(_15.length){
83var o=_15.shift();
84if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
85for(var i=o.length-1;i>=0;i--){
86_15.unshift(o[i]);
87}
88}else{
89res.push(o);
90}
91}
92return res;
93},extend:function(_18,obj,_1a){
94if(!_1a){
95_1a=0;
96}
97if(obj){
98var l=obj.length;
99if(typeof (l)!="number"){
100if(typeof (MochiKit.Iter)!="undefined"){
101obj=MochiKit.Iter.list(obj);
102l=obj.length;
103}else{
104throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
105}
106}
107if(!_18){
108_18=[];
109}
110for(var i=_1a;i<l;i++){
111_18.push(obj[i]);
112}
113}
114return _18;
115},updatetree:function(_1d,obj){
116if(_1d===null){
117_1d={};
118}
119for(var i=1;i<arguments.length;i++){
120var o=arguments[i];
121if(typeof (o)!="undefined"&&o!==null){
122for(var k in o){
123var v=o[k];
124if(typeof (_1d[k])=="object"&&typeof (v)=="object"){
125arguments.callee(_1d[k],v);
126}else{
127_1d[k]=v;
128}
129}
130}
131}
132return _1d;
133},setdefault:function(_23,obj){
134if(_23===null){
135_23={};
136}
137for(var i=1;i<arguments.length;i++){
138var o=arguments[i];
139for(var k in o){
140if(!(k in _23)){
141_23[k]=o[k];
142}
143}
144}
145return _23;
146},keys:function(obj){
147var _29=[];
148for(var _2a in obj){
149_29.push(_2a);
150}
151return _29;
152},values:function(obj){
153var _2c=[];
154for(var _2d in obj){
155_2c.push(obj[_2d]);
156}
157return _2c;
158},items:function(obj){
159var _2f=[];
160var e;
161for(var _31 in obj){
162var v;
163try{
164v=obj[_31];
165}
166catch(e){
167continue;
168}
169_2f.push([_31,v]);
170}
171return _2f;
172},_newNamedError:function(_33,_34,_35){
173_35.prototype=new MochiKit.Base.NamedError(_33.NAME+"."+_34);
174_33[_34]=_35;
175},operator:{truth:function(a){
176return !!a;
177},lognot:function(a){
178return !a;
179},identity:function(a){
180return a;
181},not:function(a){
182return ~a;
183},neg:function(a){
184return -a;
185},add:function(a,b){
186return a+b;
187},sub:function(a,b){
188return a-b;
189},div:function(a,b){
190return a/b;
191},mod:function(a,b){
192return a%b;
193},mul:function(a,b){
194return a*b;
195},and:function(a,b){
196return a&b;
197},or:function(a,b){
198return a|b;
199},xor:function(a,b){
200return a^b;
201},lshift:function(a,b){
202return a<<b;
203},rshift:function(a,b){
204return a>>b;
205},zrshift:function(a,b){
206return a>>>b;
207},eq:function(a,b){
208return a==b;
209},ne:function(a,b){
210return a!=b;
211},gt:function(a,b){
212return a>b;
213},ge:function(a,b){
214return a>=b;
215},lt:function(a,b){
216return a<b;
217},le:function(a,b){
218return a<=b;
219},seq:function(a,b){
220return a===b;
221},sne:function(a,b){
222return a!==b;
223},ceq:function(a,b){
224return MochiKit.Base.compare(a,b)===0;
225},cne:function(a,b){
226return MochiKit.Base.compare(a,b)!==0;
227},cgt:function(a,b){
228return MochiKit.Base.compare(a,b)==1;
229},cge:function(a,b){
230return MochiKit.Base.compare(a,b)!=-1;
231},clt:function(a,b){
232return MochiKit.Base.compare(a,b)==-1;
233},cle:function(a,b){
234return MochiKit.Base.compare(a,b)!=1;
235},logand:function(a,b){
236return a&&b;
237},logor:function(a,b){
238return a||b;
239},contains:function(a,b){
240return b in a;
241}},forwardCall:function(_73){
242return function(){
243return this[_73].apply(this,arguments);
244};
245},itemgetter:function(_74){
246return function(arg){
247return arg[_74];
248};
249},typeMatcher:function(){
250var _76={};
251for(var i=0;i<arguments.length;i++){
252var typ=arguments[i];
253_76[typ]=typ;
254}
255return function(){
256for(var i=0;i<arguments.length;i++){
257if(!(typeof (arguments[i]) in _76)){
258return false;
259}
260}
261return true;
262};
263},isNull:function(){
264for(var i=0;i<arguments.length;i++){
265if(arguments[i]!==null){
266return false;
267}
268}
269return true;
270},isUndefinedOrNull:function(){
271for(var i=0;i<arguments.length;i++){
272var o=arguments[i];
273if(!(typeof (o)=="undefined"||o===null)){
274return false;
275}
276}
277return true;
278},isEmpty:function(obj){
279return !MochiKit.Base.isNotEmpty.apply(this,arguments);
280},isNotEmpty:function(obj){
281for(var i=0;i<arguments.length;i++){
282var o=arguments[i];
283if(!(o&&o.length)){
284return false;
285}
286}
287return true;
288},isArrayLike:function(){
289for(var i=0;i<arguments.length;i++){
290var o=arguments[i];
291var typ=typeof (o);
292if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
293return false;
294}
295}
296return true;
297},isDateLike:function(){
298for(var i=0;i<arguments.length;i++){
299var o=arguments[i];
300if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
301return false;
302}
303}
304return true;
305},xmap:function(fn){
306if(fn===null){
307return MochiKit.Base.extend(null,arguments,1);
308}
309var _87=[];
310for(var i=1;i<arguments.length;i++){
311_87.push(fn(arguments[i]));
312}
313return _87;
314},map:function(fn,lst){
315var m=MochiKit.Base;
316var itr=MochiKit.Iter;
317var _8d=m.isArrayLike;
318if(arguments.length<=2){
319if(!_8d(lst)){
320if(itr){
321lst=itr.list(lst);
322if(fn===null){
323return lst;
324}
325}else{
326throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
327}
328}
329if(fn===null){
330return m.extend(null,lst);
331}
332var _8e=[];
333for(var i=0;i<lst.length;i++){
334_8e.push(fn(lst[i]));
335}
336return _8e;
337}else{
338if(fn===null){
339fn=Array;
340}
341var _90=null;
342for(i=1;i<arguments.length;i++){
343if(!_8d(arguments[i])){
344if(itr){
345return itr.list(itr.imap.apply(null,arguments));
346}else{
347throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
348}
349}
350var l=arguments[i].length;
351if(_90===null||_90>l){
352_90=l;
353}
354}
355_8e=[];
356for(i=0;i<_90;i++){
357var _92=[];
358for(var j=1;j<arguments.length;j++){
359_92.push(arguments[j][i]);
360}
361_8e.push(fn.apply(this,_92));
362}
363return _8e;
364}
365},xfilter:function(fn){
366var _95=[];
367if(fn===null){
368fn=MochiKit.Base.operator.truth;
369}
370for(var i=1;i<arguments.length;i++){
371var o=arguments[i];
372if(fn(o)){
373_95.push(o);
374}
375}
376return _95;
377},filter:function(fn,lst,_9a){
378var _9b=[];
379var m=MochiKit.Base;
380if(!m.isArrayLike(lst)){
381if(MochiKit.Iter){
382lst=MochiKit.Iter.list(lst);
383}else{
384throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
385}
386}
387if(fn===null){
388fn=m.operator.truth;
389}
390if(typeof (Array.prototype.filter)=="function"){
391return Array.prototype.filter.call(lst,fn,_9a);
392}else{
393if(typeof (_9a)=="undefined"||_9a===null){
394for(var i=0;i<lst.length;i++){
395var o=lst[i];
396if(fn(o)){
397_9b.push(o);
398}
399}
400}else{
401for(i=0;i<lst.length;i++){
402o=lst[i];
403if(fn.call(_9a,o)){
404_9b.push(o);
405}
406}
407}
408}
409return _9b;
410},_wrapDumbFunction:function(_9f){
411return function(){
412switch(arguments.length){
413case 0:
414return _9f();
415case 1:
416return _9f(arguments[0]);
417case 2:
418return _9f(arguments[0],arguments[1]);
419case 3:
420return _9f(arguments[0],arguments[1],arguments[2]);
421}
422var _a0=[];
423for(var i=0;i<arguments.length;i++){
424_a0.push("arguments["+i+"]");
425}
426return eval("(func("+_a0.join(",")+"))");
427};
428},methodcaller:function(_a2){
429var _a3=MochiKit.Base.extend(null,arguments,1);
430if(typeof (_a2)=="function"){
431return function(obj){
432return _a2.apply(obj,_a3);
433};
434}else{
435return function(obj){
436return obj[_a2].apply(obj,_a3);
437};
438}
439},method:function(_a6,_a7){
440var m=MochiKit.Base;
441return m.bind.apply(this,m.extend([_a7,_a6],arguments,2));
442},compose:function(f1,f2){
443var _ab=[];
444var m=MochiKit.Base;
445if(arguments.length===0){
446throw new TypeError("compose() requires at least one argument");
447}
448for(var i=0;i<arguments.length;i++){
449var fn=arguments[i];
450if(typeof (fn)!="function"){
451throw new TypeError(m.repr(fn)+" is not a function");
452}
453_ab.push(fn);
454}
455return function(){
456var _af=arguments;
457for(var i=_ab.length-1;i>=0;i--){
458_af=[_ab[i].apply(this,_af)];
459}
460return _af[0];
461};
462},bind:function(_b1,_b2){
463if(typeof (_b1)=="string"){
464_b1=_b2[_b1];
465}
466var _b3=_b1.im_func;
467var _b4=_b1.im_preargs;
468var _b5=_b1.im_self;
469var m=MochiKit.Base;
470if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){
471_b1=m._wrapDumbFunction(_b1);
472}
473if(typeof (_b3)!="function"){
474_b3=_b1;
475}
476if(typeof (_b2)!="undefined"){
477_b5=_b2;
478}
479if(typeof (_b4)=="undefined"){
480_b4=[];
481}else{
482_b4=_b4.slice();
483}
484m.extend(_b4,arguments,2);
485var _b7=function(){
486var _b8=arguments;
487var me=arguments.callee;
488if(me.im_preargs.length>0){
489_b8=m.concat(me.im_preargs,_b8);
490}
491var _ba=me.im_self;
492if(!_ba){
493_ba=this;
494}
495return me.im_func.apply(_ba,_b8);
496};
497_b7.im_self=_b5;
498_b7.im_func=_b3;
499_b7.im_preargs=_b4;
500return _b7;
501},bindMethods:function(_bb){
502var _bc=MochiKit.Base.bind;
503for(var k in _bb){
504var _be=_bb[k];
505if(typeof (_be)=="function"){
506_bb[k]=_bc(_be,_bb);
507}
508}
509},registerComparator:function(_bf,_c0,_c1,_c2){
510MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2);
511},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
512if(a==b){
513return 0;
514}
515var _c5=(typeof (a)=="undefined"||a===null);
516var _c6=(typeof (b)=="undefined"||b===null);
517if(_c5&&_c6){
518return 0;
519}else{
520if(_c5){
521return -1;
522}else{
523if(_c6){
524return 1;
525}
526}
527}
528var m=MochiKit.Base;
529var _c8=m._primitives;
530if(!(typeof (a) in _c8&&typeof (b) in _c8)){
531try{
532return m.comparatorRegistry.match(a,b);
533}
534catch(e){
535if(e!=m.NotFound){
536throw e;
537}
538}
539}
540if(a<b){
541return -1;
542}else{
543if(a>b){
544return 1;
545}
546}
547var _c9=m.repr;
548throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared");
549},compareDateLike:function(a,b){
550return MochiKit.Base.compare(a.getTime(),b.getTime());
551},compareArrayLike:function(a,b){
552var _ce=MochiKit.Base.compare;
553var _cf=a.length;
554var _d0=0;
555if(_cf>b.length){
556_d0=1;
557_cf=b.length;
558}else{
559if(_cf<b.length){
560_d0=-1;
561}
562}
563for(var i=0;i<_cf;i++){
564var cmp=_ce(a[i],b[i]);
565if(cmp){
566return cmp;
567}
568}
569return _d0;
570},registerRepr:function(_d3,_d4,_d5,_d6){
571MochiKit.Base.reprRegistry.register(_d3,_d4,_d5,_d6);
572},repr:function(o){
573if(typeof (o)=="undefined"){
574return "undefined";
575}else{
576if(o===null){
577return "null";
578}
579}
580try{
581if(typeof (o.__repr__)=="function"){
582return o.__repr__();
583}else{
584if(typeof (o.repr)=="function"&&o.repr!=arguments.callee){
585return o.repr();
586}
587}
588return MochiKit.Base.reprRegistry.match(o);
589}
590catch(e){
591if(typeof (o.NAME)=="string"&&(o.toString==Function.prototype.toString||o.toString==Object.prototype.toString)){
592return o.NAME;
593}
594}
595try{
596var _d8=(o+"");
597}
598catch(e){
599return "["+typeof (o)+"]";
600}
601if(typeof (o)=="function"){
602o=_d8.replace(/^\s+/,"");
603var idx=o.indexOf("{");
604if(idx!=-1){
605o=o.substr(0,idx)+"{...}";
606}
607}
608return _d8;
609},reprArrayLike:function(o){
610var m=MochiKit.Base;
611return "["+m.map(m.repr,o).join(", ")+"]";
612},reprString:function(o){
613return ("\""+o.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");
614},reprNumber:function(o){
615return o+"";
616},registerJSON:function(_de,_df,_e0,_e1){
617MochiKit.Base.jsonRegistry.register(_de,_df,_e0,_e1);
618},evalJSON:function(){
619return eval("("+arguments[0]+")");
620},serializeJSON:function(o){
621var _e3=typeof (o);
622if(_e3=="number"||_e3=="boolean"){
623return o+"";
624}else{
625if(o===null){
626return "null";
627}
628}
629var m=MochiKit.Base;
630var _e5=m.reprString;
631if(_e3=="string"){
632return _e5(o);
633}
634var me=arguments.callee;
635var _e7;
636if(typeof (o.__json__)=="function"){
637_e7=o.__json__();
638if(o!==_e7){
639return me(_e7);
640}
641}
642if(typeof (o.json)=="function"){
643_e7=o.json();
644if(o!==_e7){
645return me(_e7);
646}
647}
648if(_e3!="function"&&typeof (o.length)=="number"){
649var res=[];
650for(var i=0;i<o.length;i++){
651var val=me(o[i]);
652if(typeof (val)!="string"){
653val="undefined";
654}
655res.push(val);
656}
657return "["+res.join(", ")+"]";
658}
659try{
660_e7=m.jsonRegistry.match(o);
661if(o!==_e7){
662return me(_e7);
663}
664}
665catch(e){
666if(e!=m.NotFound){
667throw e;
668}
669}
670if(_e3=="undefined"){
671throw new TypeError("undefined can not be serialized as JSON");
672}
673if(_e3=="function"){
674return null;
675}
676res=[];
677for(var k in o){
678var _ec;
679if(typeof (k)=="number"){
680_ec="\""+k+"\"";
681}else{
682if(typeof (k)=="string"){
683_ec=_e5(k);
684}else{
685continue;
686}
687}
688val=me(o[k]);
689if(typeof (val)!="string"){
690continue;
691}
692res.push(_ec+":"+val);
693}
694return "{"+res.join(", ")+"}";
695},objEqual:function(a,b){
696return (MochiKit.Base.compare(a,b)===0);
697},arrayEqual:function(_ef,arr){
698if(_ef.length!=arr.length){
699return false;
700}
701return (MochiKit.Base.compare(_ef,arr)===0);
702},concat:function(){
703var _f1=[];
704var _f2=MochiKit.Base.extend;
705for(var i=0;i<arguments.length;i++){
706_f2(_f1,arguments[i]);
707}
708return _f1;
709},keyComparator:function(key){
710var m=MochiKit.Base;
711var _f6=m.compare;
712if(arguments.length==1){
713return function(a,b){
714return _f6(a[key],b[key]);
715};
716}
717var _f9=m.extend(null,arguments);
718return function(a,b){
719var _fc=0;
720for(var i=0;(_fc===0)&&(i<_f9.length);i++){
721var key=_f9[i];
722_fc=_f6(a[key],b[key]);
723}
724return _fc;
725};
726},reverseKeyComparator:function(key){
727var _100=MochiKit.Base.keyComparator.apply(this,arguments);
728return function(a,b){
729return _100(b,a);
730};
731},partial:function(func){
732var m=MochiKit.Base;
733return m.bind.apply(this,m.extend([func,undefined],arguments,1));
734},listMinMax:function(_105,lst){
735if(lst.length===0){
736return null;
737}
738var cur=lst[0];
739var _108=MochiKit.Base.compare;
740for(var i=1;i<lst.length;i++){
741var o=lst[i];
742if(_108(o,cur)==_105){
743cur=o;
744}
745}
746return cur;
747},objMax:function(){
748return MochiKit.Base.listMinMax(1,arguments);
749},objMin:function(){
750return MochiKit.Base.listMinMax(-1,arguments);
751},findIdentical:function(lst,_10c,_10d,end){
752if(typeof (end)=="undefined"||end===null){
753end=lst.length;
754}
755if(typeof (_10d)=="undefined"||_10d===null){
756_10d=0;
757}
758for(var i=_10d;i<end;i++){
759if(lst[i]===_10c){
760return i;
761}
762}
763return -1;
764},mean:function(){
765var sum=0;
766var m=MochiKit.Base;
767var args=m.extend(null,arguments);
768var _113=args.length;
769while(args.length){
770var o=args.shift();
771if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
772_113+=o.length-1;
773for(var i=o.length-1;i>=0;i--){
774sum+=o[i];
775}
776}else{
777sum+=o;
778}
779}
780if(_113<=0){
781throw new TypeError("mean() requires at least one argument");
782}
783return sum/_113;
784},median:function(){
785var data=MochiKit.Base.flattenArguments(arguments);
786if(data.length===0){
787throw new TypeError("median() requires at least one argument");
788}
789data.sort(compare);
790if(data.length%2==0){
791var _117=data.length/2;
792return (data[_117]+data[_117-1])/2;
793}else{
794return data[(data.length-1)/2];
795}
796},findValue:function(lst,_119,_11a,end){
797if(typeof (end)=="undefined"||end===null){
798end=lst.length;
799}
800if(typeof (_11a)=="undefined"||_11a===null){
801_11a=0;
802}
803var cmp=MochiKit.Base.compare;
804for(var i=_11a;i<end;i++){
805if(cmp(lst[i],_119)===0){
806return i;
807}
808}
809return -1;
810},nodeWalk:function(node,_11f){
811var _120=[node];
812var _121=MochiKit.Base.extend;
813while(_120.length){
814var res=_11f(_120.shift());
815if(res){
816_121(_120,res);
817}
818}
819},nameFunctions:function(_123){
820var base=_123.NAME;
821if(typeof (base)=="undefined"){
822base="";
823}else{
824base=base+".";
825}
826for(var name in _123){
827var o=_123[name];
828if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
829try{
830o.NAME=base+name;
831}
832catch(e){
833}
834}
835}
836},queryString:function(_127,_128){
837if(typeof (MochiKit.DOM)!="undefined"&&arguments.length==1&&(typeof (_127)=="string"||(typeof (_127.nodeType)!="undefined"&&_127.nodeType>0))){
838var kv=MochiKit.DOM.formContents(_127);
839_127=kv[0];
840_128=kv[1];
841}else{
842if(arguments.length==1){
843if(typeof (_127.length)=="number"&&_127.length==2){
844return arguments.callee(_127[0],_127[1]);
845}
846var o=_127;
847_127=[];
848_128=[];
849for(var k in o){
850var v=o[k];
851if(typeof (v)=="function"){
852continue;
853}else{
854if(typeof (v)!="string"&&typeof (v.length)=="number"){
855for(var i=0;i<v.length;i++){
856_127.push(k);
857_128.push(v[i]);
858}
859}else{
860_127.push(k);
861_128.push(v);
862}
863}
864}
865}
866}
867var rval=[];
868var len=Math.min(_127.length,_128.length);
869var _130=MochiKit.Base.urlEncode;
870for(var i=0;i<len;i++){
871v=_128[i];
872if(typeof (v)!="undefined"&&v!==null){
873rval.push(_130(_127[i])+"="+_130(v));
874}
875}
876return rval.join("&");
877},parseQueryString:function(_131,_132){
878var qstr=(_131.charAt(0)=="?")?_131.substring(1):_131;
879var _134=qstr.replace(/\+/g,"%20").split(/(\&amp\;|\&\#38\;|\&#x26;|\&)/);
880var o={};
881var _136;
882if(typeof (decodeURIComponent)!="undefined"){
883_136=decodeURIComponent;
884}else{
885_136=unescape;
886}
887if(_132){
888for(var i=0;i<_134.length;i++){
889var pair=_134[i].split("=");
890var name=_136(pair.shift());
891if(!name){
892continue;
893}
894var arr=o[name];
895if(!(arr instanceof Array)){
896arr=[];
897o[name]=arr;
898}
899arr.push(_136(pair.join("=")));
900}
901}else{
902for(i=0;i<_134.length;i++){
903pair=_134[i].split("=");
904var name=pair.shift();
905if(!name){
906continue;
907}
908o[_136(name)]=_136(pair.join("="));
909}
910}
911return o;
912}});
913MochiKit.Base.AdapterRegistry=function(){
914this.pairs=[];
915};
916MochiKit.Base.AdapterRegistry.prototype={register:function(name,_13c,wrap,_13e){
917if(_13e){
918this.pairs.unshift([name,_13c,wrap]);
919}else{
920this.pairs.push([name,_13c,wrap]);
921}
922},match:function(){
923for(var i=0;i<this.pairs.length;i++){
924var pair=this.pairs[i];
925if(pair[1].apply(this,arguments)){
926return pair[2].apply(this,arguments);
927}
928}
929throw MochiKit.Base.NotFound;
930},unregister:function(name){
931for(var i=0;i<this.pairs.length;i++){
932var pair=this.pairs[i];
933if(pair[0]==name){
934this.pairs.splice(i,1);
935return true;
936}
937}
938return false;
939}};
940MochiKit.Base.EXPORT=["flattenArray","noop","camelize","counter","clone","extend","update","updatetree","setdefault","keys","values","items","NamedError","operator","forwardCall","itemgetter","typeMatcher","isCallable","isUndefined","isUndefinedOrNull","isNull","isEmpty","isNotEmpty","isArrayLike","isDateLike","xmap","map","xfilter","filter","methodcaller","compose","bind","bindMethods","NotFound","AdapterRegistry","registerComparator","compare","registerRepr","repr","objEqual","arrayEqual","concat","keyComparator","reverseKeyComparator","partial","merge","listMinMax","listMax","listMin","objMax","objMin","nodeWalk","zip","urlEncode","queryString","serializeJSON","registerJSON","evalJSON","parseQueryString","findValue","findIdentical","flattenArguments","method","average","mean","median"];
941MochiKit.Base.EXPORT_OK=["nameFunctions","comparatorRegistry","reprRegistry","jsonRegistry","compareDateLike","compareArrayLike","reprArrayLike","reprString","reprNumber"];
942MochiKit.Base._exportSymbols=function(_144,_145){
943if(!MochiKit.__export__){
944return;
945}
946var all=_145.EXPORT_TAGS[":all"];
947for(var i=0;i<all.length;i++){
948_144[all[i]]=_145[all[i]];
949}
950};
951MochiKit.Base.__new__=function(){
952var m=this;
953m.noop=m.operator.identity;
954m.forward=m.forwardCall;
955m.find=m.findValue;
956if(typeof (encodeURIComponent)!="undefined"){
957m.urlEncode=function(_149){
958return encodeURIComponent(_149).replace(/\'/g,"%27");
959};
960}else{
961m.urlEncode=function(_14a){
962return escape(_14a).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
963};
964}
965m.NamedError=function(name){
966this.message=name;
967this.name=name;
968};
969m.NamedError.prototype=new Error();
970m.update(m.NamedError.prototype,{repr:function(){
971if(this.message&&this.message!=this.name){
972return this.name+"("+m.repr(this.message)+")";
973}else{
974return this.name+"()";
975}
976},toString:m.forwardCall("repr")});
977m.NotFound=new m.NamedError("MochiKit.Base.NotFound");
978m.listMax=m.partial(m.listMinMax,1);
979m.listMin=m.partial(m.listMinMax,-1);
980m.isCallable=m.typeMatcher("function");
981m.isUndefined=m.typeMatcher("undefined");
982m.merge=m.partial(m.update,null);
983m.zip=m.partial(m.map,null);
984m.average=m.mean;
985m.comparatorRegistry=new m.AdapterRegistry();
986m.registerComparator("dateLike",m.isDateLike,m.compareDateLike);
987m.registerComparator("arrayLike",m.isArrayLike,m.compareArrayLike);
988m.reprRegistry=new m.AdapterRegistry();
989m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
990m.registerRepr("string",m.typeMatcher("string"),m.reprString);
991m.registerRepr("numbers",m.typeMatcher("number","boolean"),m.reprNumber);
992m.jsonRegistry=new m.AdapterRegistry();
993var all=m.concat(m.EXPORT,m.EXPORT_OK);
994m.EXPORT_TAGS={":common":m.concat(m.EXPORT_OK),":all":all};
995m.nameFunctions(this);
996};
997MochiKit.Base.__new__();
998if(MochiKit.__export__){
999compare=MochiKit.Base.compare;
1000compose=MochiKit.Base.compose;
1001serializeJSON=MochiKit.Base.serializeJSON;
1002}
1003MochiKit.Base._exportSymbols(this,MochiKit.Base);
1004if(typeof (dojo)!="undefined"){
165759fa
DV
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"){
79f17b42 1617dojo.provide("MochiKit.Format");
6a1aa64f 1618}
79f17b42
DV
1619if(typeof (MochiKit)=="undefined"){
1620MochiKit={};
6a1aa64f 1621}
79f17b42
DV
1622if(typeof (MochiKit.Format)=="undefined"){
1623MochiKit.Format={};
6a1aa64f 1624}
79f17b42
DV
1625MochiKit.Format.NAME="MochiKit.Format";
1626MochiKit.Format.VERSION="1.4";
1627MochiKit.Format.__repr__=function(){
6a1aa64f 1628return "["+this.NAME+" "+this.VERSION+"]";
79f17b42
DV
1629};
1630MochiKit.Format.toString=function(){
6a1aa64f 1631return this.__repr__();
79f17b42 1632};
165759fa 1633MochiKit.Format._numberFormatter=function(_1e5,_1e6,_1e7,_1e8,_1e9,_1ea,_1eb,_1ec,_1ed){
79f17b42
DV
1634return function(num){
1635num=parseFloat(num);
1636if(typeof (num)=="undefined"||num===null||isNaN(num)){
165759fa 1637return _1e5;
6a1aa64f 1638}
165759fa
DV
1639var _1ef=_1e6;
1640var _1f0=_1e7;
79f17b42
DV
1641if(num<0){
1642num=-num;
6a1aa64f 1643}else{
165759fa 1644_1ef=_1ef.replace(/-/,"");
6a1aa64f 1645}
79f17b42 1646var me=arguments.callee;
165759fa
DV
1647var fmt=MochiKit.Format.formatLocale(_1e8);
1648if(_1e9){
79f17b42 1649num=num*100;
165759fa 1650_1f0=fmt.percent+_1f0;
6a1aa64f 1651}
165759fa
DV
1652num=MochiKit.Format.roundToFixed(num,_1ea);
1653var _1f3=num.split(/\./);
1654var _1f4=_1f3[0];
1655var frac=(_1f3.length==1)?"":_1f3[1];
79f17b42 1656var res="";
165759fa
DV
1657while(_1f4.length<_1eb){
1658_1f4="0"+_1f4;
6a1aa64f 1659}
165759fa
DV
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);
6a1aa64f 1665}
6a1aa64f 1666}
165759fa
DV
1667res=_1f4+res;
1668if(_1ea>0){
1669while(frac.length<_1ed){
79f17b42 1670frac=frac+"0";
6a1aa64f 1671}
79f17b42 1672res=res+fmt.decimal+frac;
6a1aa64f 1673}
165759fa 1674return _1ef+res+_1f0;
6a1aa64f 1675};
6a1aa64f 1676};
165759fa
DV
1677MochiKit.Format.numberFormatter=function(_1f8,_1f9,_1fa){
1678if(typeof (_1f9)=="undefined"){
1679_1f9="";
6a1aa64f 1680}
165759fa
DV
1681var _1fb=_1f8.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
1682if(!_1fb){
79f17b42 1683throw TypeError("Invalid pattern");
6a1aa64f 1684}
165759fa
DV
1685var _1fc=_1f8.substr(0,_1fb.index);
1686var _1fd=_1f8.substr(_1fb.index+_1fb[0].length);
1687if(_1fc.search(/-/)==-1){
1688_1fc=_1fc+"-";
6a1aa64f 1689}
165759fa
DV
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";
6a1aa64f 1697}
79f17b42 1698if(tmp.length==1){
165759fa 1699_202=null;
79f17b42 1700}else{
165759fa 1701_202=tmp[1].length;
6a1aa64f 1702}
165759fa
DV
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);
6a1aa64f 1707var m=MochiKit.Base;
79f17b42
DV
1708if(m){
1709var fn=arguments.callee;
1710var args=m.concat(arguments);
1711rval.repr=function(){
1712return [self.NAME,"(",map(m.repr,args).join(", "),")"].join("");
1713};
6a1aa64f 1714}
6a1aa64f 1715return rval;
79f17b42 1716};
165759fa
DV
1717MochiKit.Format.formatLocale=function(_20a){
1718if(typeof (_20a)=="undefined"||_20a===null){
1719_20a="default";
6a1aa64f 1720}
165759fa
DV
1721if(typeof (_20a)=="string"){
1722var rval=MochiKit.Format.LOCALE[_20a];
79f17b42
DV
1723if(typeof (rval)=="string"){
1724rval=arguments.callee(rval);
165759fa 1725MochiKit.Format.LOCALE[_20a]=rval;
6a1aa64f 1726}
6a1aa64f 1727return rval;
79f17b42 1728}else{
165759fa 1729return _20a;
6a1aa64f 1730}
79f17b42 1731};
165759fa
DV
1732MochiKit.Format.twoDigitAverage=function(_20c,_20d){
1733if(_20d){
1734var res=_20c/_20d;
79f17b42 1735if(!isNaN(res)){
165759fa 1736return MochiKit.Format.twoDigitFloat(_20c/_20d);
6a1aa64f 1737}
6a1aa64f 1738}
79f17b42 1739return "0";
6a1aa64f 1740};
165759fa
DV
1741MochiKit.Format.twoDigitFloat=function(_20f){
1742var sign=(_20f<0?"-":"");
1743var s=Math.floor(Math.abs(_20f)*100).toString();
79f17b42
DV
1744if(s=="0"){
1745return s;
6a1aa64f 1746}
79f17b42
DV
1747if(s.length<3){
1748while(s.charAt(s.length-1)=="0"){
1749s=s.substring(0,s.length-1);
6a1aa64f 1750}
79f17b42 1751return sign+"0."+s;
6a1aa64f 1752}
79f17b42
DV
1753var head=sign+s.substring(0,s.length-2);
1754var tail=s.substring(s.length-2,s.length);
1755if(tail=="00"){
1756return head;
6a1aa64f 1757}else{
79f17b42
DV
1758if(tail.charAt(1)=="0"){
1759return head+"."+tail.charAt(0);
1760}else{
1761return head+"."+tail;
6a1aa64f 1762}
6a1aa64f 1763}
79f17b42 1764};
165759fa 1765MochiKit.Format.lstrip=function(str,_215){
79f17b42
DV
1766str=str+"";
1767if(typeof (str)!="string"){
1768return null;
6a1aa64f 1769}
165759fa 1770if(!_215){
79f17b42
DV
1771return str.replace(/^\s+/,"");
1772}else{
165759fa 1773return str.replace(new RegExp("^["+_215+"]+"),"");
6a1aa64f 1774}
79f17b42 1775};
165759fa 1776MochiKit.Format.rstrip=function(str,_217){
79f17b42
DV
1777str=str+"";
1778if(typeof (str)!="string"){
1779return null;
6a1aa64f 1780}
165759fa 1781if(!_217){
79f17b42
DV
1782return str.replace(/\s+$/,"");
1783}else{
165759fa 1784return str.replace(new RegExp("["+_217+"]+$"),"");
6a1aa64f 1785}
79f17b42 1786};
165759fa 1787MochiKit.Format.strip=function(str,_219){
79f17b42 1788var self=MochiKit.Format;
165759fa 1789return self.rstrip(self.lstrip(str,_219),_219);
79f17b42 1790};
165759fa
DV
1791MochiKit.Format.truncToFixed=function(_21b,_21c){
1792_21b=Math.floor(_21b*Math.pow(10,_21c));
1793var res=(_21b*Math.pow(10,-_21c)).toFixed(_21c);
79f17b42
DV
1794if(res.charAt(0)=="."){
1795res="0"+res;
6a1aa64f 1796}
79f17b42
DV
1797return res;
1798};
165759fa
DV
1799MochiKit.Format.roundToFixed=function(_21e,_21f){
1800return MochiKit.Format.truncToFixed(_21e+0.5*Math.pow(10,-_21f),_21f);
79f17b42 1801};
165759fa
DV
1802MochiKit.Format.percentFormat=function(_220){
1803return MochiKit.Format.twoDigitFloat(100*_220)+"%";
79f17b42
DV
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;
6a1aa64f 1819}
6a1aa64f 1820}
79f17b42
DV
1821for(k in this){
1822o=this[k];
1823if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
6a1aa64f 1824try{
79f17b42 1825o.NAME=base+k;
6a1aa64f
DV
1826}
1827catch(e){
6a1aa64f 1828}
6a1aa64f
DV
1829}
1830}
79f17b42
DV
1831};
1832MochiKit.Format.__new__();
1833if(typeof (MochiKit.Base)!="undefined"){
1834MochiKit.Base._exportSymbols(this,MochiKit.Format);
6a1aa64f 1835}else{
165759fa 1836(function(_225,_226){
79f17b42 1837if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){
165759fa 1838var all=_226.EXPORT_TAGS[":all"];
79f17b42 1839for(var i=0;i<all.length;i++){
165759fa 1840_225[all[i]]=_226[all[i]];
6a1aa64f
DV
1841}
1842}
79f17b42 1843})(this,MochiKit.Format);
6a1aa64f 1844}
79f17b42
DV
1845if(typeof (dojo)!="undefined"){
1846dojo.provide("MochiKit.DOM");
1847dojo.require("MochiKit.Base");
6a1aa64f 1848}
79f17b42
DV
1849if(typeof (JSAN)!="undefined"){
1850JSAN.use("MochiKit.Base",[]);
6a1aa64f 1851}
6a1aa64f 1852try{
79f17b42
DV
1853if(typeof (MochiKit.Base)=="undefined"){
1854throw "";
6a1aa64f
DV
1855}
1856}
1857catch(e){
79f17b42 1858throw "MochiKit.DOM depends on MochiKit.Base!";
6a1aa64f 1859}
79f17b42
DV
1860if(typeof (MochiKit.DOM)=="undefined"){
1861MochiKit.DOM={};
6a1aa64f 1862}
79f17b42
DV
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;
165759fa
DV
1881var _22c=self._document;
1882var _22d=self._window;
79f17b42 1883var rval;
6a1aa64f 1884try{
79f17b42
DV
1885self._window=win;
1886self._document=win.document;
1887rval=func();
6a1aa64f
DV
1888}
1889catch(e){
165759fa
DV
1890self._window=_22d;
1891self._document=_22c;
6a1aa64f
DV
1892throw e;
1893}
165759fa
DV
1894self._window=_22d;
1895self._document=_22c;
79f17b42
DV
1896return rval;
1897},formContents:function(elem){
165759fa
DV
1898var _230=[];
1899var _231=[];
6a1aa64f 1900var m=MochiKit.Base;
79f17b42
DV
1901var self=MochiKit.DOM;
1902if(typeof (elem)=="undefined"||elem===null){
1903elem=self._document.body;
1904}else{
1905elem=self.getElement(elem);
6a1aa64f 1906}
79f17b42
DV
1907m.nodeWalk(elem,function(elem){
1908var name=elem.name;
1909if(m.isNotEmpty(name)){
165759fa
DV
1910var _236=elem.tagName.toUpperCase();
1911if(_236==="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
79f17b42 1912return null;
6a1aa64f 1913}
165759fa 1914if(_236==="SELECT"){
79f17b42
DV
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;
6a1aa64f 1923}
6a1aa64f 1924}
165759fa
DV
1925_230.push(name);
1926_231.push(v);
79f17b42 1927return null;
6a1aa64f 1928}
165759fa
DV
1929_230.push(name);
1930_231.push("");
79f17b42 1931return null;
6a1aa64f 1932}else{
79f17b42
DV
1933var opts=elem.options;
1934if(!opts.length){
165759fa
DV
1935_230.push(name);
1936_231.push("");
79f17b42 1937return null;
6a1aa64f 1938}
79f17b42
DV
1939for(var i=0;i<opts.length;i++){
1940var opt=opts[i];
1941if(!opt.selected){
1942continue;
6a1aa64f 1943}
79f17b42
DV
1944var v=opt.value;
1945if(!v){
1946var h=opt.outerHTML;
1947if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
1948v=opt.text;
6a1aa64f 1949}
6a1aa64f 1950}
165759fa
DV
1951_230.push(name);
1952_231.push(v);
6a1aa64f 1953}
79f17b42 1954return null;
6a1aa64f 1955}
6a1aa64f 1956}
165759fa 1957if(_236==="FORM"||_236==="P"||_236==="SPAN"||_236==="DIV"){
79f17b42 1958return elem.childNodes;
6a1aa64f 1959}
165759fa
DV
1960_230.push(name);
1961_231.push(elem.value||"");
79f17b42 1962return null;
6a1aa64f 1963}
79f17b42
DV
1964return elem.childNodes;
1965});
165759fa 1966return [_230,_231];
79f17b42
DV
1967},withDocument:function(doc,func){
1968var self=MochiKit.DOM;
165759fa 1969var _23f=self._document;
79f17b42 1970var rval;
6a1aa64f 1971try{
79f17b42
DV
1972self._document=doc;
1973rval=func();
6a1aa64f
DV
1974}
1975catch(e){
165759fa 1976self._document=_23f;
6a1aa64f
DV
1977throw e;
1978}
165759fa 1979self._document=_23f;
79f17b42 1980return rval;
165759fa
DV
1981},registerDOMConverter:function(name,_242,wrap,_244){
1982MochiKit.DOM.domConverters.register(name,_242,wrap,_244);
79f17b42
DV
1983},coerceToDOM:function(node,ctx){
1984var m=MochiKit.Base;
1985var im=MochiKit.Iter;
1986var self=MochiKit.DOM;
1987if(im){
1988var iter=im.iter;
165759fa 1989var _24b=im.repeat;
79f17b42
DV
1990var map=m.map;
1991}
165759fa
DV
1992var _24d=self.domConverters;
1993var _24e=arguments.callee;
1994var _24f=m.NotFound;
79f17b42
DV
1995while(true){
1996if(typeof (node)=="undefined"||node===null){
1997return null;
6a1aa64f 1998}
79f17b42
DV
1999if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
2000node=im.list(node);
6a1aa64f 2001}
79f17b42
DV
2002if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
2003return node;
6a1aa64f 2004}
79f17b42
DV
2005if(typeof (node)=="number"||typeof (node)=="boolean"){
2006node=node.toString();
6a1aa64f 2007}
79f17b42
DV
2008if(typeof (node)=="string"){
2009return self._document.createTextNode(node);
6a1aa64f 2010}
79f17b42
DV
2011if(typeof (node.__dom__)=="function"){
2012node=node.__dom__(ctx);
2013continue;
6a1aa64f 2014}
79f17b42
DV
2015if(typeof (node.dom)=="function"){
2016node=node.dom(ctx);
2017continue;
6a1aa64f 2018}
79f17b42
DV
2019if(typeof (node)=="function"){
2020node=node.apply(ctx,[ctx]);
2021continue;
6a1aa64f 2022}
79f17b42 2023if(im){
165759fa 2024var _250=null;
6a1aa64f 2025try{
165759fa 2026_250=iter(node);
6a1aa64f
DV
2027}
2028catch(e){
6a1aa64f 2029}
165759fa
DV
2030if(_250){
2031return map(_24e,_250,_24b(ctx));
79f17b42
DV
2032}
2033}
2034try{
165759fa 2035node=_24d.match(node,ctx);
79f17b42
DV
2036continue;
2037}
2038catch(e){
165759fa 2039if(e!=_24f){
6a1aa64f
DV
2040throw e;
2041}
6a1aa64f 2042}
79f17b42 2043return self._document.createTextNode(node.toString());
6a1aa64f 2044}
79f17b42 2045return undefined;
165759fa 2046},isChildNode:function(node,_252){
79f17b42
DV
2047var self=MochiKit.DOM;
2048if(typeof (node)=="string"){
2049node=self.getElement(node);
6a1aa64f 2050}
165759fa
DV
2051if(typeof (_252)=="string"){
2052_252=self.getElement(_252);
6a1aa64f 2053}
165759fa 2054if(node===_252){
79f17b42 2055return true;
6a1aa64f 2056}
79f17b42
DV
2057while(node&&node.tagName.toUpperCase()!="BODY"){
2058node=node.parentNode;
165759fa 2059if(node===_252){
79f17b42 2060return true;
6a1aa64f 2061}
6a1aa64f 2062}
79f17b42 2063return false;
165759fa 2064},setNodeAttribute:function(node,attr,_256){
79f17b42 2065var o={};
165759fa 2066o[attr]=_256;
79f17b42
DV
2067try{
2068return MochiKit.DOM.updateNodeAttributes(node,o);
6a1aa64f 2069}
79f17b42
DV
2070catch(e){
2071}
2072return null;
2073},getNodeAttribute:function(node,attr){
2074var self=MochiKit.DOM;
165759fa 2075var _25b=self.attributeArray.renames[attr];
79f17b42 2076node=self.getElement(node);
6a1aa64f 2077try{
165759fa
DV
2078if(_25b){
2079return node[_25b];
6a1aa64f 2080}
79f17b42 2081return node.getAttribute(attr);
6a1aa64f
DV
2082}
2083catch(e){
6a1aa64f 2084}
79f17b42
DV
2085return null;
2086},removeNodeAttribute:function(node,attr){
2087var self=MochiKit.DOM;
165759fa 2088var _25f=self.attributeArray.renames[attr];
79f17b42
DV
2089node=self.getElement(node);
2090try{
165759fa
DV
2091if(_25f){
2092return node[_25f];
6a1aa64f 2093}
79f17b42 2094return node.removeAttribute(attr);
6a1aa64f 2095}
79f17b42 2096catch(e){
6a1aa64f 2097}
79f17b42 2098return null;
165759fa 2099},updateNodeAttributes:function(node,_261){
79f17b42
DV
2100var elem=node;
2101var self=MochiKit.DOM;
2102if(typeof (node)=="string"){
2103elem=self.getElement(node);
2104}
165759fa
DV
2105if(_261){
2106var _264=MochiKit.Base.updatetree;
79f17b42 2107if(self.attributeArray.compliant){
165759fa
DV
2108for(var k in _261){
2109var v=_261[k];
79f17b42
DV
2110if(typeof (v)=="object"&&typeof (elem[k])=="object"){
2111if(k=="style"&&MochiKit.Style){
2112MochiKit.Style.setStyle(elem,v);
6a1aa64f 2113}else{
165759fa 2114_264(elem[k],v);
79f17b42 2115}
6a1aa64f 2116}else{
79f17b42
DV
2117if(k.substring(0,2)=="on"){
2118if(typeof (v)=="string"){
2119v=new Function(v);
2120}
2121elem[k]=v;
6a1aa64f 2122}else{
79f17b42 2123elem.setAttribute(k,v);
6a1aa64f
DV
2124}
2125}
2126}
79f17b42 2127}else{
165759fa
DV
2128var _267=self.attributeArray.renames;
2129for(var k in _261){
2130v=_261[k];
2131var _268=_267[k];
79f17b42
DV
2132if(k=="style"&&typeof (v)=="string"){
2133elem.style.cssText=v;
2134}else{
165759fa
DV
2135if(typeof (_268)=="string"){
2136elem[_268]=v;
79f17b42
DV
2137}else{
2138if(typeof (elem[k])=="object"&&typeof (v)=="object"){
2139if(k=="style"&&MochiKit.Style){
2140MochiKit.Style.setStyle(elem,v);
2141}else{
165759fa 2142_264(elem[k],v);
6a1aa64f 2143}
79f17b42
DV
2144}else{
2145if(k.substring(0,2)=="on"){
2146if(typeof (v)=="string"){
2147v=new Function(v);
6a1aa64f 2148}
79f17b42
DV
2149elem[k]=v;
2150}else{
2151elem.setAttribute(k,v);
6a1aa64f 2152}
6a1aa64f 2153}
6a1aa64f 2154}
6a1aa64f 2155}
6a1aa64f 2156}
6a1aa64f 2157}
6a1aa64f 2158}
79f17b42
DV
2159return elem;
2160},appendChildNodes:function(node){
2161var elem=node;
2162var self=MochiKit.DOM;
2163if(typeof (node)=="string"){
2164elem=self.getElement(node);
6a1aa64f 2165}
165759fa
DV
2166var _26c=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2167var _26d=MochiKit.Base.concat;
2168while(_26c.length){
2169var n=_26c.shift();
79f17b42
DV
2170if(typeof (n)=="undefined"||n===null){
2171}else{
2172if(typeof (n.nodeType)=="number"){
2173elem.appendChild(n);
2174}else{
165759fa 2175_26c=_26d(n,_26c);
6a1aa64f 2176}
6a1aa64f 2177}
6a1aa64f 2178}
79f17b42
DV
2179return elem;
2180},insertSiblingNodesBefore:function(node){
2181var elem=node;
2182var self=MochiKit.DOM;
2183if(typeof (node)=="string"){
2184elem=self.getElement(node);
6a1aa64f 2185}
165759fa
DV
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();
79f17b42 2191if(typeof (n)=="undefined"||n===null){
6a1aa64f 2192}else{
79f17b42 2193if(typeof (n.nodeType)=="number"){
165759fa 2194_273.insertBefore(n,elem);
79f17b42 2195}else{
165759fa 2196_272=_274(n,_272);
6a1aa64f 2197}
6a1aa64f 2198}
6a1aa64f 2199}
165759fa 2200return _273;
79f17b42
DV
2201},insertSiblingNodesAfter:function(node){
2202var elem=node;
2203var self=MochiKit.DOM;
2204if(typeof (node)=="string"){
2205elem=self.getElement(node);
6a1aa64f 2206}
165759fa 2207var _279=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
79f17b42 2208if(elem.nextSibling){
165759fa 2209return self.insertSiblingNodesBefore(elem.nextSibling,_279);
6a1aa64f 2210}else{
165759fa 2211return self.appendChildNodes(elem.parentNode,_279);
6a1aa64f 2212}
79f17b42
DV
2213},replaceChildNodes:function(node){
2214var elem=node;
2215var self=MochiKit.DOM;
2216if(typeof (node)=="string"){
2217elem=self.getElement(node);
2218arguments[0]=elem;
6a1aa64f 2219}
165759fa
DV
2220var _27d;
2221while((_27d=elem.firstChild)){
2222elem.removeChild(_27d);
6a1aa64f 2223}
79f17b42
DV
2224if(arguments.length<2){
2225return elem;
2226}else{
2227return self.appendChildNodes.apply(this,arguments);
6a1aa64f 2228}
165759fa 2229},createDOM:function(name,_27f){
79f17b42
DV
2230var elem;
2231var self=MochiKit.DOM;
2232var m=MochiKit.Base;
165759fa 2233if(typeof (_27f)=="string"||typeof (_27f)=="number"){
79f17b42
DV
2234var args=m.extend([name,null],arguments,1);
2235return arguments.callee.apply(this,args);
6a1aa64f 2236}
79f17b42 2237if(typeof (name)=="string"){
165759fa
DV
2238var _284=self._xhtml;
2239if(_27f&&!self.attributeArray.compliant){
2240var _285="";
2241if("name" in _27f){
2242_285+=" name=\""+self.escapeHTML(_27f.name)+"\"";
6a1aa64f 2243}
165759fa
DV
2244if(name=="input"&&"type" in _27f){
2245_285+=" type=\""+self.escapeHTML(_27f.type)+"\"";
6a1aa64f 2246}
165759fa
DV
2247if(_285){
2248name="<"+name+_285+">";
2249_284=false;
6a1aa64f 2250}
6a1aa64f 2251}
79f17b42 2252var d=self._document;
165759fa 2253if(_284&&d===document){
79f17b42
DV
2254elem=d.createElementNS("http://www.w3.org/1999/xhtml",name);
2255}else{
2256elem=d.createElement(name);
6a1aa64f 2257}
79f17b42
DV
2258}else{
2259elem=name;
6a1aa64f 2260}
165759fa
DV
2261if(_27f){
2262self.updateNodeAttributes(elem,_27f);
6a1aa64f 2263}
79f17b42
DV
2264if(arguments.length<=2){
2265return elem;
6a1aa64f 2266}else{
79f17b42
DV
2267var args=m.extend([elem],arguments,2);
2268return self.appendChildNodes.apply(this,args);
6a1aa64f 2269}
79f17b42
DV
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);
165759fa 2280var _28d=dest.parentNode;
79f17b42
DV
2281if(src){
2282src=self.getElement(src);
165759fa 2283_28d.replaceChild(src,dest);
79f17b42 2284}else{
165759fa 2285_28d.removeChild(dest);
6a1aa64f 2286}
79f17b42
DV
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);
6a1aa64f 2294}
165759fa 2295},getElementsByTagAndClassName:function(_290,_291,_292){
79f17b42 2296var self=MochiKit.DOM;
165759fa
DV
2297if(typeof (_290)=="undefined"||_290===null){
2298_290="*";
6a1aa64f 2299}
165759fa
DV
2300if(typeof (_292)=="undefined"||_292===null){
2301_292=self._document;
6a1aa64f 2302}
165759fa
DV
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);
6a1aa64f 2307}
165759fa
DV
2308var _295=[];
2309for(var i=0;i<_294.length;i++){
2310var _297=_294[i];
2311var cls=_297.className;
79f17b42
DV
2312if(!cls){
2313continue;
6a1aa64f 2314}
165759fa
DV
2315var _299=cls.split(" ");
2316for(var j=0;j<_299.length;j++){
2317if(_299[j]==_291){
2318_295.push(_297);
79f17b42 2319break;
6a1aa64f 2320}
6a1aa64f 2321}
6a1aa64f 2322}
165759fa 2323return _295;
79f17b42
DV
2324},_newCallStack:function(path,once){
2325var rval=function(){
165759fa
DV
2326var _29e=arguments.callee.callStack;
2327for(var i=0;i<_29e.length;i++){
2328if(_29e[i].apply(this,arguments)===false){
79f17b42 2329break;
6a1aa64f
DV
2330}
2331}
79f17b42
DV
2332if(once){
2333try{
2334this[path]=null;
6a1aa64f 2335}
79f17b42 2336catch(e){
6a1aa64f 2337}
6a1aa64f 2338}
79f17b42
DV
2339};
2340rval.callStack=[];
2341return rval;
165759fa 2342},addToCallStack:function(_2a0,path,func,once){
79f17b42 2343var self=MochiKit.DOM;
165759fa
DV
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);
6a1aa64f 2350}
165759fa 2351_2a0[path]=_2a6;
6a1aa64f 2352}
165759fa 2353_2a6.callStack.push(func);
79f17b42
DV
2354},addLoadEvent:function(func){
2355var self=MochiKit.DOM;
2356self.addToCallStack(self._window,"onload",func,true);
165759fa 2357},focusOnLoad:function(_2a9){
79f17b42
DV
2358var self=MochiKit.DOM;
2359self.addLoadEvent(function(){
165759fa
DV
2360_2a9=self.getElement(_2a9);
2361if(_2a9){
2362_2a9.focus();
6a1aa64f 2363}
79f17b42 2364});
165759fa 2365},setElementClass:function(_2ab,_2ac){
79f17b42 2366var self=MochiKit.DOM;
165759fa 2367var obj=self.getElement(_2ab);
79f17b42 2368if(self.attributeArray.compliant){
165759fa 2369obj.setAttribute("class",_2ac);
6a1aa64f 2370}else{
165759fa 2371obj.setAttribute("className",_2ac);
6a1aa64f 2372}
165759fa 2373},toggleElementClass:function(_2af){
79f17b42
DV
2374var self=MochiKit.DOM;
2375for(var i=1;i<arguments.length;i++){
2376var obj=self.getElement(arguments[i]);
165759fa
DV
2377if(!self.addElementClass(obj,_2af)){
2378self.removeElementClass(obj,_2af);
6a1aa64f 2379}
6a1aa64f 2380}
165759fa 2381},addElementClass:function(_2b3,_2b4){
79f17b42 2382var self=MochiKit.DOM;
165759fa 2383var obj=self.getElement(_2b3);
79f17b42
DV
2384var cls=obj.className;
2385if(cls==undefined||cls.length===0){
165759fa 2386self.setElementClass(obj,_2b4);
79f17b42 2387return true;
6a1aa64f 2388}
165759fa 2389if(cls==_2b4){
79f17b42 2390return false;
6a1aa64f 2391}
165759fa
DV
2392var _2b8=cls.split(" ");
2393for(var i=0;i<_2b8.length;i++){
2394if(_2b8[i]==_2b4){
79f17b42 2395return false;
6a1aa64f 2396}
6a1aa64f 2397}
165759fa 2398self.setElementClass(obj,cls+" "+_2b4);
79f17b42 2399return true;
165759fa 2400},removeElementClass:function(_2ba,_2bb){
79f17b42 2401var self=MochiKit.DOM;
165759fa 2402var obj=self.getElement(_2ba);
79f17b42
DV
2403var cls=obj.className;
2404if(cls==undefined||cls.length===0){
2405return false;
6a1aa64f 2406}
165759fa 2407if(cls==_2bb){
79f17b42
DV
2408self.setElementClass(obj,"");
2409return true;
6a1aa64f 2410}
165759fa
DV
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(" "));
79f17b42 2416return true;
6a1aa64f
DV
2417}
2418}
79f17b42 2419return false;
165759fa
DV
2420},swapElementClass:function(_2c1,_2c2,_2c3){
2421var obj=MochiKit.DOM.getElement(_2c1);
2422var res=MochiKit.DOM.removeElementClass(obj,_2c2);
79f17b42 2423if(res){
165759fa 2424MochiKit.DOM.addElementClass(obj,_2c3);
6a1aa64f 2425}
79f17b42 2426return res;
165759fa
DV
2427},hasElementClass:function(_2c6,_2c7){
2428var obj=MochiKit.DOM.getElement(_2c6);
79f17b42
DV
2429var cls=obj.className;
2430if(!cls){
2431return false;
6a1aa64f 2432}
165759fa 2433var _2ca=cls.split(" ");
79f17b42
DV
2434for(var i=1;i<arguments.length;i++){
2435var good=false;
165759fa
DV
2436for(var j=0;j<_2ca.length;j++){
2437if(_2ca[j]==arguments[i]){
79f17b42
DV
2438good=true;
2439break;
6a1aa64f 2440}
6a1aa64f 2441}
79f17b42
DV
2442if(!good){
2443return false;
6a1aa64f 2444}
6a1aa64f 2445}
79f17b42
DV
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=[];
6a1aa64f 2454}
165759fa 2455var _2d2=[dom];
79f17b42 2456var self=MochiKit.DOM;
165759fa
DV
2457var _2d4=self.escapeHTML;
2458var _2d5=self.attributeArray;
2459while(_2d2.length){
2460dom=_2d2.pop();
79f17b42
DV
2461if(typeof (dom)=="string"){
2462lst.push(dom);
2463}else{
2464if(dom.nodeType==1){
2465lst.push("<"+dom.tagName.toLowerCase());
165759fa
DV
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),"\""]);
6a1aa64f 2471}
165759fa
DV
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]);
6a1aa64f
DV
2477}
2478}
79f17b42
DV
2479if(dom.hasChildNodes()){
2480lst.push(">");
165759fa
DV
2481_2d2.push("</"+dom.tagName.toLowerCase()+">");
2482var _2dc=dom.childNodes;
2483for(i=_2dc.length-1;i>=0;i--){
2484_2d2.push(_2dc[i]);
6a1aa64f 2485}
6a1aa64f 2486}else{
79f17b42 2487lst.push("/>");
6a1aa64f 2488}
79f17b42
DV
2489}else{
2490if(dom.nodeType==3){
165759fa 2491lst.push(_2d4(dom.nodeValue));
6a1aa64f 2492}
6a1aa64f 2493}
6a1aa64f 2494}
6a1aa64f 2495}
79f17b42 2496return lst;
165759fa 2497},scrapeText:function(node,_2de){
79f17b42
DV
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]);
6a1aa64f 2504}
6a1aa64f 2505}
165759fa
DV
2506var _2e3=node.nodeValue;
2507if(typeof (_2e3)=="string"){
2508rval.push(_2e3);
6a1aa64f 2509}
79f17b42 2510})(MochiKit.DOM.getElement(node));
165759fa 2511if(_2de){
79f17b42 2512return rval;
6a1aa64f 2513}else{
79f17b42 2514return rval.join("");
6a1aa64f 2515}
165759fa
DV
2516},removeEmptyTextNodes:function(_2e4){
2517_2e4=MochiKit.DOM.getElement(_2e4);
2518for(var i=0;i<_2e4.childNodes.length;i++){
2519var node=_2e4.childNodes[i];
79f17b42
DV
2520if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
2521node.parentNode.removeChild(node);
6a1aa64f 2522}
6a1aa64f 2523}
165759fa
DV
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";
6a1aa64f 2529}
165759fa
DV
2530return _2e8;
2531},undoClipping:function(_2e9,_2ea){
2532_2e9=MochiKit.DOM.getElement(_2e9);
2533if(!_2ea){
79f17b42 2534return;
6a1aa64f 2535}
165759fa
DV
2536_2e9.style.overflow=_2ea;
2537},makePositioned:function(_2eb){
2538_2eb=MochiKit.DOM.getElement(_2eb);
2539var pos=MochiKit.Style.getStyle(_2eb,"position");
79f17b42 2540if(pos=="static"||!pos){
165759fa 2541_2eb.style.position="relative";
79f17b42 2542if(/Opera/.test(navigator.userAgent)){
165759fa
DV
2543_2eb.style.top=0;
2544_2eb.style.left=0;
6a1aa64f 2545}
6a1aa64f 2546}
165759fa
DV
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="";
6a1aa64f 2551}
165759fa 2552},getFirstElementByTagAndClassName:function(_2ee,_2ef,_2f0){
79f17b42 2553var self=MochiKit.DOM;
165759fa
DV
2554if(typeof (_2ee)=="undefined"||_2ee===null){
2555_2ee="*";
6a1aa64f 2556}
165759fa
DV
2557if(typeof (_2f0)=="undefined"||_2f0===null){
2558_2f0=self._document;
6a1aa64f 2559}
165759fa
DV
2560_2f0=self.getElement(_2f0);
2561var _2f2=(_2f0.getElementsByTagName(_2ee)||self._document.all);
2562if(typeof (_2ef)=="undefined"||_2ef===null){
2563return _2f2[0];
6a1aa64f 2564}
165759fa
DV
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;
6a1aa64f 2571}
6a1aa64f 2572}
6a1aa64f 2573}
165759fa 2574},getFirstParentByTagAndClassName:function(elem,_2f8,_2f9){
79f17b42
DV
2575var self=MochiKit.DOM;
2576elem=self.getElement(elem);
165759fa
DV
2577if(typeof (_2f8)=="undefined"||_2f8===null){
2578_2f8="*";
79f17b42 2579}else{
165759fa 2580_2f8=_2f8.toUpperCase();
6a1aa64f 2581}
165759fa
DV
2582if(typeof (_2f9)=="undefined"||_2f9===null){
2583_2f9=null;
6a1aa64f 2584}
165759fa
DV
2585var _2fb="";
2586var _2fc="";
79f17b42
DV
2587while(elem&&elem.tagName){
2588elem=elem.parentNode;
165759fa 2589if(_2f8=="*"&&_2f9===null){
79f17b42 2590return elem;
6a1aa64f 2591}
165759fa
DV
2592_2fb=elem.className.split(" ");
2593_2fc=elem.tagName.toUpperCase();
2594if(_2f9===null&&_2f8==_2fc){
79f17b42
DV
2595return elem;
2596}else{
165759fa
DV
2597if(_2f9!==null){
2598for(var i=0;i<_2fb.length;i++){
2599if(_2f8=="*"&&_2fb[i]==_2f9){
79f17b42
DV
2600return elem;
2601}else{
165759fa 2602if(_2f8==_2fc&&_2fb[i]==_2f9){
79f17b42 2603return elem;
6a1aa64f 2604}
6a1aa64f
DV
2605}
2606}
6a1aa64f 2607}
6a1aa64f 2608}
6a1aa64f 2609}
79f17b42 2610return elem;
165759fa
DV
2611},isParent:function(_2fe,_2ff){
2612if(!_2fe.parentNode||_2fe==_2ff){
79f17b42 2613return false;
6a1aa64f 2614}
165759fa 2615if(_2fe.parentNode==_2ff){
79f17b42 2616return true;
6a1aa64f 2617}
165759fa 2618return MochiKit.DOM.isParent(_2fe.parentNode,_2ff);
79f17b42 2619},__new__:function(win){
6a1aa64f 2620var m=MochiKit.Base;
79f17b42
DV
2621if(typeof (document)!="undefined"){
2622this._document=document;
165759fa
DV
2623var _302="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
2624this._xhtml=(document.documentElement&&document.createElementNS&&document.documentElement.namespaceURI===_302);
79f17b42
DV
2625}else{
2626if(MochiKit.MockDOM){
2627this._document=MochiKit.MockDOM.document;
2628}
2629}
2630this._window=win;
2631this.domConverters=new m.AdapterRegistry();
165759fa
DV
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){
79f17b42
DV
2653return node.attributes;
2654};
165759fa
DV
2655_304.compliant=true;
2656_304.renames={};
79f17b42 2657}
165759fa
DV
2658this.attributeArray=_304;
2659var _30d=function(_30e,arr){
2660var _310=arr[1].split(".");
79f17b42
DV
2661var str="";
2662var obj={};
165759fa 2663str+="if (!MochiKit."+_310[1]+") { throw new Error(\"";
79f17b42 2664str+="This function has been deprecated and depends on MochiKit.";
165759fa
DV
2665str+=_310[1]+".\");}";
2666str+="return MochiKit."+_310[1]+"."+arr[0];
79f17b42 2667str+=".apply(this, arguments);";
165759fa
DV
2668obj[_310[2]]=new Function(str);
2669MochiKit.Base.update(MochiKit[_30e],obj);
79f17b42
DV
2670};
2671for(var i;i<MochiKit.DOM.DEPRECATED.length;i++){
165759fa
DV
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");
79f17b42
DV
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}
6a1aa64f 2728try{
79f17b42
DV
2729if(typeof (MochiKit.Base)=="undefined"){
2730throw "";
2731}
6a1aa64f
DV
2732}
2733catch(e){
79f17b42
DV
2734throw "MochiKit.Style depends on MochiKit.Base!";
2735}
6a1aa64f 2736try{
79f17b42
DV
2737if(typeof (MochiKit.DOM)=="undefined"){
2738throw "";
2739}
6a1aa64f
DV
2740}
2741catch(e){
79f17b42 2742throw "MochiKit.Style depends on MochiKit.DOM!";
6a1aa64f 2743}
79f17b42
DV
2744if(typeof (MochiKit.Style)=="undefined"){
2745MochiKit.Style={};
6a1aa64f 2746}
79f17b42
DV
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};
165759fa 2779MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_31b){
79f17b42
DV
2780var dom=MochiKit.DOM;
2781var d=dom._document;
2782elem=dom.getElement(elem);
165759fa 2783_31b=MochiKit.Base.camelize(_31b);
79f17b42
DV
2784if(!elem||elem==d){
2785return undefined;
6a1aa64f 2786}
165759fa
DV
2787if(_31b=="opacity"&&elem.filters){
2788var _31e=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/);
2789if(_31e&&_31e[1]){
2790return parseFloat(_31e[1])/100;
6a1aa64f 2791}
79f17b42 2792return 1;
6a1aa64f 2793}
165759fa
DV
2794var _31f=elem.style?elem.style[_31b]:null;
2795if(!_31f){
79f17b42
DV
2796if(d.defaultView&&d.defaultView.getComputedStyle){
2797var css=d.defaultView.getComputedStyle(elem,null);
165759fa
DV
2798_31b=_31b.replace(/([A-Z])/g,"-$1").toLowerCase();
2799_31f=css?css.getPropertyValue(_31b):null;
6a1aa64f 2800}else{
79f17b42 2801if(elem.currentStyle){
165759fa 2802_31f=elem.currentStyle[_31b];
6a1aa64f
DV
2803}
2804}
6a1aa64f 2805}
165759fa
DV
2806if(_31b=="opacity"){
2807_31f=parseFloat(_31f);
6a1aa64f 2808}
165759fa 2809if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_31b)!=-1)){
79f17b42 2810if(MochiKit.Style.getStyle(elem,"position")=="static"){
165759fa 2811_31f="auto";
6a1aa64f
DV
2812}
2813}
165759fa
DV
2814return _31f=="auto"?null:_31f;
2815},setStyle:function(elem,_322){
79f17b42 2816elem=MochiKit.DOM.getElement(elem);
165759fa 2817for(var name in _322){
79f17b42 2818if(name=="opacity"){
165759fa 2819MochiKit.Style.setOpacity(elem,_322[name]);
79f17b42 2820}else{
165759fa 2821elem.style[MochiKit.Base.camelize(name)]=_322[name];
6a1aa64f 2822}
6a1aa64f 2823}
79f17b42
DV
2824},setOpacity:function(elem,o){
2825elem=MochiKit.DOM.getElement(elem);
2826var self=MochiKit.Style;
2827if(o==1){
165759fa
DV
2828var _327=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
2829elem.style["opacity"]=_327?0.999999:1;
79f17b42
DV
2830if(/MSIE/.test(navigator.userAgent)){
2831elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"");
6a1aa64f 2832}
79f17b42
DV
2833}else{
2834if(o<0.00001){
2835o=0;
6a1aa64f 2836}
79f17b42
DV
2837elem.style["opacity"]=o;
2838if(/MSIE/.test(navigator.userAgent)){
2839elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")";
6a1aa64f 2840}
6a1aa64f 2841}
165759fa 2842},getElementPosition:function(elem,_329){
79f17b42
DV
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;
6a1aa64f 2848}
79f17b42
DV
2849var c=new self.Coordinates(0,0);
2850var box=null;
165759fa 2851var _32e=null;
79f17b42
DV
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);
6a1aa64f 2863}else{
79f17b42
DV
2864if(elem.offsetParent){
2865c.x+=elem.offsetLeft;
2866c.y+=elem.offsetTop;
165759fa
DV
2867_32e=elem.offsetParent;
2868if(_32e!=elem){
2869while(_32e){
2870c.x+=_32e.offsetLeft;
2871c.y+=_32e.offsetTop;
2872_32e=_32e.offsetParent;
6a1aa64f 2873}
6a1aa64f 2874}
79f17b42
DV
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;
6a1aa64f 2879}
6a1aa64f
DV
2880}
2881}
6a1aa64f 2882}
165759fa
DV
2883if(typeof (_329)!="undefined"){
2884_329=arguments.callee(_329);
2885if(_329){
2886c.x-=(_329.x||0);
2887c.y-=(_329.y||0);
6a1aa64f 2888}
6a1aa64f 2889}
79f17b42 2890if(elem.parentNode){
165759fa 2891_32e=elem.parentNode;
6a1aa64f 2892}else{
165759fa 2893_32e=null;
6a1aa64f 2894}
165759fa
DV
2895while(_32e){
2896var _333=_32e.tagName.toUpperCase();
2897if(_333==="BODY"||_333==="HTML"){
79f17b42 2898break;
6a1aa64f 2899}
165759fa 2900var disp=self.getStyle(_32e,"display");
79f17b42 2901if(disp!="inline"&&disp!="table-row"){
165759fa
DV
2902c.x-=_32e.scrollLeft;
2903c.y-=_32e.scrollTop;
6a1aa64f 2904}
165759fa
DV
2905if(_32e.parentNode){
2906_32e=_32e.parentNode;
79f17b42 2907}else{
165759fa 2908_32e=null;
6a1aa64f
DV
2909}
2910}
79f17b42 2911return c;
165759fa 2912},setElementPosition:function(elem,_336,_337){
79f17b42 2913elem=MochiKit.DOM.getElement(elem);
165759fa
DV
2914if(typeof (_337)=="undefined"){
2915_337="px";
6a1aa64f 2916}
165759fa
DV
2917var _338={};
2918var _339=MochiKit.Base.isUndefinedOrNull;
2919if(!_339(_336.x)){
2920_338["left"]=_336.x+_337;
6a1aa64f 2921}
165759fa
DV
2922if(!_339(_336.y)){
2923_338["top"]=_336.y+_337;
6a1aa64f 2924}
165759fa 2925MochiKit.DOM.updateNodeAttributes(elem,{"style":_338});
79f17b42
DV
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);
6a1aa64f 2931}
79f17b42
DV
2932elem=dom.getElement(elem);
2933if(!elem){
2934return undefined;
6a1aa64f 2935}
79f17b42
DV
2936var disp=self.getStyle(elem,"display");
2937if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){
2938return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
6a1aa64f 2939}
79f17b42 2940var s=elem.style;
165759fa
DV
2941var _33f=s.visibility;
2942var _340=s.position;
79f17b42
DV
2943s.visibility="hidden";
2944s.position="absolute";
2945s.display="";
165759fa
DV
2946var _341=elem.offsetWidth;
2947var _342=elem.offsetHeight;
79f17b42 2948s.display="none";
165759fa
DV
2949s.position=_340;
2950s.visibility=_33f;
2951return new self.Dimensions(_341,_342);
2952},setElementDimensions:function(elem,_344,_345){
79f17b42 2953elem=MochiKit.DOM.getElement(elem);
165759fa
DV
2954if(typeof (_345)=="undefined"){
2955_345="px";
6a1aa64f 2956}
165759fa
DV
2957var _346={};
2958var _347=MochiKit.Base.isUndefinedOrNull;
2959if(!_347(_344.w)){
2960_346["width"]=_344.w+_345;
6a1aa64f 2961}
165759fa
DV
2962if(!_347(_344.h)){
2963_346["height"]=_344.h+_345;
6a1aa64f 2964}
165759fa
DV
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;
6a1aa64f 2973}
6a1aa64f 2974}
79f17b42
DV
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;
6a1aa64f 2990}
6a1aa64f 2991}
6a1aa64f 2992}
79f17b42
DV
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;
6a1aa64f 3002}else{
79f17b42
DV
3003if(db){
3004c.x=db.scrollLeft;
3005c.y=db.scrollTop;
6a1aa64f
DV
3006}
3007}
79f17b42
DV
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");
6a1aa64f 3015this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
79f17b42 3016m.nameFunctions(this);
6a1aa64f 3017}});
79f17b42
DV
3018MochiKit.Style.__new__();
3019MochiKit.Base._exportSymbols(this,MochiKit.Style);
6a1aa64f 3020if(typeof (dojo)!="undefined"){
79f17b42 3021dojo.provide("MochiKit.Color");
6a1aa64f
DV
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){
79f17b42 3037throw "MochiKit.Color depends on MochiKit.Base";
6a1aa64f
DV
3038}
3039try{
3040if(typeof (MochiKit.DOM)=="undefined"){
3041throw "";
3042}
3043}
3044catch(e){
79f17b42 3045throw "MochiKit.Color depends on MochiKit.DOM";
6a1aa64f
DV
3046}
3047try{
3048if(typeof (MochiKit.Style)=="undefined"){
3049throw "";
3050}
3051}
3052catch(e){
79f17b42 3053throw "MochiKit.Color depends on MochiKit.Style";
6a1aa64f 3054}
79f17b42
DV
3055if(typeof (MochiKit.Color)=="undefined"){
3056MochiKit.Color={};
6a1aa64f 3057}
79f17b42
DV
3058MochiKit.Color.NAME="MochiKit.Color";
3059MochiKit.Color.VERSION="1.4";
3060MochiKit.Color.__repr__=function(){
3061return "["+this.NAME+" "+this.VERSION+"]";
6a1aa64f 3062};
79f17b42 3063MochiKit.Color.toString=function(){
6a1aa64f 3064return this.__repr__();
79f17b42 3065};
165759fa
DV
3066MochiKit.Color.Color=function(red,_356,blue,_358){
3067if(typeof (_358)=="undefined"||_358===null){
3068_358=1;
6a1aa64f 3069}
165759fa 3070this.rgb={r:red,g:_356,b:blue,a:_358};
79f17b42 3071};
165759fa 3072MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_359){
79f17b42
DV
3073var rgb=this.rgb;
3074var m=MochiKit.Color;
165759fa 3075return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_359);
79f17b42
DV
3076},colorWithHue:function(hue){
3077var hsl=this.asHSL();
3078hsl.h=hue;
3079var m=MochiKit.Color;
3080return m.Color.fromHSL(hsl);
165759fa 3081},colorWithSaturation:function(_35f){
79f17b42 3082var hsl=this.asHSL();
165759fa 3083hsl.s=_35f;
79f17b42
DV
3084var m=MochiKit.Color;
3085return m.Color.fromHSL(hsl);
165759fa 3086},colorWithLightness:function(_362){
79f17b42 3087var hsl=this.asHSL();
165759fa 3088hsl.l=_362;
79f17b42
DV
3089var m=MochiKit.Color;
3090return m.Color.fromHSL(hsl);
165759fa 3091},darkerColorWithLevel:function(_365){
79f17b42 3092var hsl=this.asHSL();
165759fa 3093hsl.l=Math.max(hsl.l-_365,0);
79f17b42
DV
3094var m=MochiKit.Color;
3095return m.Color.fromHSL(hsl);
165759fa 3096},lighterColorWithLevel:function(_368){
79f17b42 3097var hsl=this.asHSL();
165759fa 3098hsl.l=Math.min(hsl.l+_368,1);
79f17b42
DV
3099var m=MochiKit.Color;
3100return m.Color.fromHSL(hsl);
165759fa
DV
3101},blendedColor:function(_36b,_36c){
3102if(typeof (_36c)=="undefined"||_36c===null){
3103_36c=0.5;
6a1aa64f 3104}
165759fa 3105var sf=1-_36c;
79f17b42 3106var s=this.rgb;
165759fa
DV
3107var d=_36b.rgb;
3108var df=_36c;
79f17b42 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));
165759fa 3110},compareRGB:function(_371){
79f17b42 3111var a=this.asRGB();
165759fa 3112var b=_371.asRGB();
79f17b42
DV
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+")";
6a1aa64f 3128}else{
79f17b42
DV
3129if(a<=0){
3130a=0;
6a1aa64f 3131}
79f17b42 3132rval="hsla("+mid+","+a+")";
6a1aa64f 3133}
79f17b42 3134this._hslString=rval;
6a1aa64f 3135}
79f17b42
DV
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+")";
6a1aa64f 3145}else{
79f17b42 3146rval="rgb("+mid+")";
6a1aa64f 3147}
79f17b42 3148this._rgbString=rval;
6a1aa64f 3149}
79f17b42
DV
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;
6a1aa64f 3161}
79f17b42
DV
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;
6a1aa64f 3169}
79f17b42
DV
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;
6a1aa64f 3177}
79f17b42 3178return MochiKit.Base.clone(hsl);
6a1aa64f 3179},toString:function(){
79f17b42
DV
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}};
165759fa
DV
3186MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_388,blue,_38a){
3187var _38b=MochiKit.Color.Color;
79f17b42
DV
3188if(arguments.length==1){
3189var rgb=red;
3190red=rgb.r;
165759fa 3191_388=rgb.g;
79f17b42
DV
3192blue=rgb.b;
3193if(typeof (rgb.a)=="undefined"){
165759fa 3194_38a=undefined;
79f17b42 3195}else{
165759fa 3196_38a=rgb.a;
6a1aa64f
DV
3197}
3198}
165759fa
DV
3199return new _38b(red,_388,blue,_38a);
3200},fromHSL:function(hue,_38e,_38f,_390){
79f17b42
DV
3201var m=MochiKit.Color;
3202return m.Color.fromRGB(m.hslToRGB.apply(m,arguments));
165759fa 3203},fromHSV:function(hue,_393,_394,_395){
79f17b42
DV
3204var m=MochiKit.Color;
3205return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments));
3206},fromName:function(name){
165759fa 3207var _398=MochiKit.Color.Color;
79f17b42
DV
3208if(name.charAt(0)=="\""){
3209name=name.substr(1,name.length-2);
6a1aa64f 3210}
165759fa
DV
3211var _399=_398._namedColors[name.toLowerCase()];
3212if(typeof (_399)=="string"){
3213return _398.fromHexString(_399);
6a1aa64f 3214}else{
79f17b42 3215if(name=="transparent"){
165759fa 3216return _398.transparentColor();
6a1aa64f 3217}
79f17b42
DV
3218}
3219return null;
165759fa 3220},fromString:function(_39a){
79f17b42 3221var self=MochiKit.Color.Color;
165759fa
DV
3222var _39c=_39a.substr(0,3);
3223if(_39c=="rgb"){
3224return self.fromRGBString(_39a);
6a1aa64f 3225}else{
165759fa
DV
3226if(_39c=="hsl"){
3227return self.fromHSLString(_39a);
6a1aa64f 3228}else{
165759fa
DV
3229if(_39a.charAt(0)=="#"){
3230return self.fromHexString(_39a);
6a1aa64f
DV
3231}
3232}
6a1aa64f 3233}
165759fa
DV
3234return self.fromName(_39a);
3235},fromHexString:function(_39d){
3236if(_39d.charAt(0)=="#"){
3237_39d=_39d.substring(1);
6a1aa64f 3238}
165759fa 3239var _39e=[];
79f17b42 3240var i,hex;
165759fa 3241if(_39d.length==3){
79f17b42 3242for(i=0;i<3;i++){
165759fa
DV
3243hex=_39d.substr(i,1);
3244_39e.push(parseInt(hex+hex,16)/255);
6a1aa64f 3245}
6a1aa64f 3246}else{
79f17b42 3247for(i=0;i<6;i+=2){
165759fa
DV
3248hex=_39d.substr(i,2);
3249_39e.push(parseInt(hex,16)/255);
6a1aa64f 3250}
6a1aa64f 3251}
165759fa
DV
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);
6a1aa64f 3257}
165759fa
DV
3258var _3a6=_3a5.split(/\s*,\s*/);
3259var _3a7=[];
3260for(var i=0;i<_3a6.length;i++){
3261var c=_3a6[i];
79f17b42 3262var val;
165759fa 3263var _3ab=c.substring(c.length-3);
79f17b42
DV
3264if(c.charAt(c.length-1)=="%"){
3265val=0.01*parseFloat(c.substring(0,c.length-1));
6a1aa64f 3266}else{
165759fa 3267if(_3ab=="deg"){
79f17b42 3268val=parseFloat(c)/360;
6a1aa64f 3269}else{
165759fa 3270if(_3ab=="rad"){
79f17b42 3271val=parseFloat(c)/(Math.PI*2);
6a1aa64f 3272}else{
165759fa 3273val=_3a4[i]*parseFloat(c);
6a1aa64f 3274}
6a1aa64f 3275}
6a1aa64f 3276}
165759fa 3277_3a7.push(val);
6a1aa64f 3278}
165759fa
DV
3279return this[_3a3].apply(this,_3a7);
3280},fromComputedStyle:function(elem,_3ad){
79f17b42
DV
3281var d=MochiKit.DOM;
3282var cls=MochiKit.Color.Color;
3283for(elem=d.getElement(elem);elem;elem=elem.parentNode){
165759fa
DV
3284var _3b0=MochiKit.Style.getStyle.apply(d,arguments);
3285if(!_3b0){
79f17b42 3286continue;
6a1aa64f 3287}
165759fa
DV
3288var _3b1=cls.fromString(_3b0);
3289if(!_3b1){
79f17b42 3290break;
6a1aa64f 3291}
165759fa
DV
3292if(_3b1.asRGB().a>0){
3293return _3b1;
6a1aa64f 3294}
79f17b42
DV
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}});
165759fa
DV
3306MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_3b7){
3307v*=_3b7;
79f17b42
DV
3308if(v<0){
3309return 0;
6a1aa64f 3310}else{
165759fa
DV
3311if(v>_3b7){
3312return _3b7;
6a1aa64f 3313}else{
79f17b42 3314return v;
6a1aa64f
DV
3315}
3316}
79f17b42
DV
3317},_hslValue:function(n1,n2,hue){
3318if(hue>6){
3319hue-=6;
6a1aa64f 3320}else{
79f17b42
DV
3321if(hue<0){
3322hue+=6;
6a1aa64f
DV
3323}
3324}
79f17b42
DV
3325var val;
3326if(hue<1){
3327val=n1+(n2-n1)*hue;
6a1aa64f 3328}else{
79f17b42
DV
3329if(hue<3){
3330val=n2;
6a1aa64f 3331}else{
79f17b42
DV
3332if(hue<4){
3333val=n1+(n2-n1)*(4-hue);
3334}else{
3335val=n1;
6a1aa64f 3336}
6a1aa64f
DV
3337}
3338}
79f17b42 3339return val;
165759fa 3340},hsvToRGB:function(hue,_3bd,_3be,_3bf){
79f17b42
DV
3341if(arguments.length==1){
3342var hsv=hue;
3343hue=hsv.h;
165759fa
DV
3344_3bd=hsv.s;
3345_3be=hsv.v;
3346_3bf=hsv.a;
6a1aa64f 3347}
79f17b42 3348var red;
165759fa 3349var _3c2;
79f17b42 3350var blue;
165759fa
DV
3351if(_3bd===0){
3352red=_3be;
3353_3c2=_3be;
3354blue=_3be;
6a1aa64f 3355}else{
79f17b42
DV
3356var i=Math.floor(hue*6);
3357var f=(hue*6)-i;
165759fa
DV
3358var p=_3be*(1-_3bd);
3359var q=_3be*(1-(_3bd*f));
3360var t=_3be*(1-(_3bd*(1-f)));
79f17b42
DV
3361switch(i){
3362case 1:
3363red=q;
165759fa 3364_3c2=_3be;
79f17b42
DV
3365blue=p;
3366break;
3367case 2:
3368red=p;
165759fa 3369_3c2=_3be;
79f17b42
DV
3370blue=t;
3371break;
3372case 3:
3373red=p;
165759fa
DV
3374_3c2=q;
3375blue=_3be;
79f17b42
DV
3376break;
3377case 4:
3378red=t;
165759fa
DV
3379_3c2=p;
3380blue=_3be;
79f17b42
DV
3381break;
3382case 5:
165759fa
DV
3383red=_3be;
3384_3c2=p;
79f17b42
DV
3385blue=q;
3386break;
3387case 6:
3388case 0:
165759fa
DV
3389red=_3be;
3390_3c2=t;
79f17b42
DV
3391blue=p;
3392break;
6a1aa64f
DV
3393}
3394}
165759fa
DV
3395return {r:red,g:_3c2,b:blue,a:_3bf};
3396},hslToRGB:function(hue,_3ca,_3cb,_3cc){
79f17b42
DV
3397if(arguments.length==1){
3398var hsl=hue;
3399hue=hsl.h;
165759fa
DV
3400_3ca=hsl.s;
3401_3cb=hsl.l;
3402_3cc=hsl.a;
6a1aa64f 3403}
79f17b42 3404var red;
165759fa 3405var _3cf;
79f17b42 3406var blue;
165759fa
DV
3407if(_3ca===0){
3408red=_3cb;
3409_3cf=_3cb;
3410blue=_3cb;
79f17b42
DV
3411}else{
3412var m2;
165759fa
DV
3413if(_3cb<=0.5){
3414m2=_3cb*(1+_3ca);
6a1aa64f 3415}else{
165759fa 3416m2=_3cb+_3ca-(_3cb*_3ca);
6a1aa64f 3417}
165759fa 3418var m1=(2*_3cb)-m2;
79f17b42
DV
3419var f=MochiKit.Color._hslValue;
3420var h6=hue*6;
3421red=f(m1,m2,h6+2);
165759fa 3422_3cf=f(m1,m2,h6);
79f17b42 3423blue=f(m1,m2,h6-2);
6a1aa64f 3424}
165759fa
DV
3425return {r:red,g:_3cf,b:blue,a:_3cc};
3426},rgbToHSV:function(red,_3d6,blue,_3d8){
79f17b42
DV
3427if(arguments.length==1){
3428var rgb=red;
3429red=rgb.r;
165759fa 3430_3d6=rgb.g;
79f17b42 3431blue=rgb.b;
165759fa 3432_3d8=rgb.a;
6a1aa64f 3433}
165759fa
DV
3434var max=Math.max(Math.max(red,_3d6),blue);
3435var min=Math.min(Math.min(red,_3d6),blue);
79f17b42 3436var hue;
165759fa
DV
3437var _3dd;
3438var _3de=max;
79f17b42
DV
3439if(min==max){
3440hue=0;
165759fa 3441_3dd=0;
6a1aa64f 3442}else{
165759fa
DV
3443var _3df=(max-min);
3444_3dd=_3df/max;
79f17b42 3445if(red==max){
165759fa 3446hue=(_3d6-blue)/_3df;
79f17b42 3447}else{
165759fa
DV
3448if(_3d6==max){
3449hue=2+((blue-red)/_3df);
6a1aa64f 3450}else{
165759fa 3451hue=4+((red-_3d6)/_3df);
6a1aa64f
DV
3452}
3453}
79f17b42
DV
3454hue/=6;
3455if(hue<0){
3456hue+=1;
6a1aa64f 3457}
79f17b42
DV
3458if(hue>1){
3459hue-=1;
6a1aa64f 3460}
6a1aa64f 3461}
165759fa
DV
3462return {h:hue,s:_3dd,v:_3de,a:_3d8};
3463},rgbToHSL:function(red,_3e1,blue,_3e3){
79f17b42
DV
3464if(arguments.length==1){
3465var rgb=red;
3466red=rgb.r;
165759fa 3467_3e1=rgb.g;
79f17b42 3468blue=rgb.b;
165759fa 3469_3e3=rgb.a;
6a1aa64f 3470}
165759fa
DV
3471var max=Math.max(red,Math.max(_3e1,blue));
3472var min=Math.min(red,Math.min(_3e1,blue));
79f17b42 3473var hue;
165759fa
DV
3474var _3e8;
3475var _3e9=(max+min)/2;
3476var _3ea=max-min;
3477if(_3ea===0){
79f17b42 3478hue=0;
165759fa 3479_3e8=0;
79f17b42 3480}else{
165759fa
DV
3481if(_3e9<=0.5){
3482_3e8=_3ea/(max+min);
79f17b42 3483}else{
165759fa 3484_3e8=_3ea/(2-max-min);
6a1aa64f 3485}
79f17b42 3486if(red==max){
165759fa 3487hue=(_3e1-blue)/_3ea;
79f17b42 3488}else{
165759fa
DV
3489if(_3e1==max){
3490hue=2+((blue-red)/_3ea);
79f17b42 3491}else{
165759fa 3492hue=4+((red-_3e1)/_3ea);
6a1aa64f 3493}
6a1aa64f 3494}
79f17b42
DV
3495hue/=6;
3496if(hue<0){
3497hue+=1;
6a1aa64f 3498}
79f17b42
DV
3499if(hue>1){
3500hue-=1;
6a1aa64f 3501}
6a1aa64f 3502}
165759fa 3503return {h:hue,s:_3e8,l:_3e9,a:_3e3};
79f17b42
DV
3504},toColorPart:function(num){
3505num=Math.round(num);
165759fa 3506var _3ec=num.toString(16);
79f17b42 3507if(num<16){
165759fa 3508return "0"+_3ec;
6a1aa64f 3509}
165759fa 3510return _3ec;
79f17b42 3511},__new__:function(){
6a1aa64f 3512var m=MochiKit.Base;
79f17b42
DV
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]);
165759fa
DV
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){
79f17b42
DV
3518var rval=this.fromRGB(r,g,b,a);
3519this[name]=function(){
3520return rval;
3521};
3522return rval;
3523};
165759fa 3524for(var k in _3ef){
79f17b42 3525var name=k+"Color";
165759fa
DV
3526var _3f9=m.concat([_3f0,this.Color,name],_3ef[k]);
3527this.Color[name]=m.bind.apply(null,_3f9);
6a1aa64f 3528}
165759fa 3529var _3fa=function(){
79f17b42
DV
3530for(var i=0;i<arguments.length;i++){
3531if(!(arguments[i] instanceof Color)){
3532return false;
6a1aa64f 3533}
6a1aa64f 3534}
79f17b42
DV
3535return true;
3536};
165759fa 3537var _3fc=function(a,b){
79f17b42
DV
3538return a.compareRGB(b);
3539};
3540m.nameFunctions(this);
165759fa 3541m.registerComparator(this.Color.NAME,_3fa,_3fc);
79f17b42
DV
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"};
6a1aa64f 3549if(typeof (dojo)!="undefined"){
79f17b42 3550dojo.provide("MochiKit.Signal");
6a1aa64f
DV
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{
79f17b42 3561if(typeof (MochiKit.Base)=="undefined"){
6a1aa64f
DV
3562throw "";
3563}
3564}
3565catch(e){
79f17b42 3566throw "MochiKit.Signal depends on MochiKit.Base!";
6a1aa64f 3567}
79f17b42
DV
3568try{
3569if(typeof (MochiKit.DOM)=="undefined"){
3570throw "";
6a1aa64f 3571}
6a1aa64f 3572}
79f17b42
DV
3573catch(e){
3574throw "MochiKit.Signal depends on MochiKit.DOM!";
6a1aa64f 3575}
79f17b42
DV
3576try{
3577if(typeof (MochiKit.Style)=="undefined"){
3578throw "";
6a1aa64f
DV
3579}
3580}
79f17b42
DV
3581catch(e){
3582throw "MochiKit.Signal depends on MochiKit.Style!";
6a1aa64f 3583}
79f17b42
DV
3584if(typeof (MochiKit.Signal)=="undefined"){
3585MochiKit.Signal={};
6a1aa64f 3586}
79f17b42
DV
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;
6a1aa64f 3593};
79f17b42
DV
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)+"}";
6a1aa64f 3599}
79f17b42
DV
3600if(this.type()&&this.type().indexOf("key")===0){
3601str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
6a1aa64f 3602}
79f17b42
DV
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+="}";
6a1aa64f 3609}
6a1aa64f 3610}
79f17b42
DV
3611if(this.type()=="mouseover"||this.type()=="mouseout"){
3612str+=", relatedTarget(): "+repr(this.relatedTarget());
6a1aa64f 3613}
79f17b42
DV
3614str+="}";
3615return str;
3616},toString:function(){
6a1aa64f 3617return this.__repr__();
79f17b42
DV
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;
6a1aa64f 3629}
79f17b42
DV
3630var elem=null;
3631if(this.type()=="mouseover"){
3632elem=(this._event.relatedTarget||this._event.fromElement);
6a1aa64f 3633}else{
79f17b42
DV
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;
6a1aa64f 3646}
79f17b42
DV
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;
6a1aa64f 3658}
79f17b42
DV
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);
6a1aa64f 3673}else{
79f17b42
DV
3674if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
3675k.code=this._event.keyCode;
3676k.string=String.fromCharCode(k.code);
6a1aa64f
DV
3677}
3678}
79f17b42
DV
3679this._key=k;
3680return k;
6a1aa64f 3681}
6a1aa64f
DV
3682}
3683}
79f17b42
DV
3684return undefined;
3685},_mouse:null,mouse:function(){
3686if(this._mouse!==null){
3687return this._mouse;
6a1aa64f 3688}
79f17b42
DV
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;
6a1aa64f 3701}else{
79f17b42
DV
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);
6a1aa64f 3716}else{
79f17b42
DV
3717m.button.left=!!(e.button&1);
3718m.button.right=!!(e.button&2);
3719m.button.middle=!!(e.button&4);
6a1aa64f
DV
3720}
3721}
79f17b42
DV
3722this._mouse=m;
3723return m;
6a1aa64f 3724}
79f17b42
DV
3725return undefined;
3726},stop:function(){
3727this.stopPropagation();
3728this.preventDefault();
3729},stopPropagation:function(){
3730if(this._event.stopPropagation){
3731this._event.stopPropagation();
6a1aa64f 3732}else{
79f17b42
DV
3733this._event.cancelBubble=true;
3734}
3735},preventDefault:function(){
3736if(this._event.preventDefault){
3737this._event.preventDefault();
6a1aa64f 3738}else{
79f17b42
DV
3739if(this._confirmUnload===null){
3740this._event.returnValue=false;
3741}
6a1aa64f 3742}
79f17b42
DV
3743},_confirmUnload:null,confirmUnload:function(msg){
3744if(this.type()=="beforeunload"){
3745this._confirmUnload=msg;
3746this._event.returnValue=msg;
6a1aa64f 3747}
79f17b42
DV
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(){
165759fa 3751var _40b=MochiKit.Signal._specialMacKeys;
79f17b42 3752for(i=63236;i<=63242;i++){
165759fa 3753_40b[i]="KEY_F"+(i-63236+1);
6a1aa64f 3754}
79f17b42
DV
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(){
165759fa 3758var _40c=MochiKit.Signal._specialKeys;
79f17b42 3759for(var i=48;i<=57;i++){
165759fa 3760_40c[i]="KEY_"+(i-48);
6a1aa64f 3761}
79f17b42 3762for(i=65;i<=90;i++){
165759fa 3763_40c[i]="KEY_"+String.fromCharCode(i);
6a1aa64f 3764}
79f17b42 3765for(i=96;i<=105;i++){
165759fa 3766_40c[i]="KEY_NUM_PAD_"+(i-96);
6a1aa64f 3767}
79f17b42 3768for(i=112;i<=123;i++){
165759fa 3769_40c[i]="KEY_F"+(i-112+1);
6a1aa64f 3770}
79f17b42 3771})();
165759fa
DV
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;
6a1aa64f 3780};
79f17b42
DV
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;
165759fa
DV
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]);
6a1aa64f 3792}
6a1aa64f 3793}
165759fa 3794},_listener:function(src,sig,func,obj,_416){
79f17b42
DV
3795var self=MochiKit.Signal;
3796var E=self.Event;
165759fa 3797if(!_416){
79f17b42 3798return MochiKit.Base.bind(func,obj);
6a1aa64f 3799}
79f17b42
DV
3800obj=obj||src;
3801if(typeof (func)=="string"){
3802if(sig==="onload"||sig==="onunload"){
165759fa
DV
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);
6a1aa64f 3807};
79f17b42 3808}else{
165759fa
DV
3809return function(_41b){
3810obj[func].apply(obj,[new E(src,_41b)]);
6a1aa64f 3811};
6a1aa64f 3812}
79f17b42
DV
3813}else{
3814if(sig==="onload"||sig==="onunload"){
165759fa
DV
3815return function(_41c){
3816func.apply(obj,[new E(src,_41c)]);
79f17b42 3817MochiKit.Signal.disconnect(src,sig,func);
165759fa
DV
3818var _41d=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:func});
3819MochiKit.Signal._disconnect(_41d);
6a1aa64f 3820};
79f17b42 3821}else{
165759fa
DV
3822return function(_41e){
3823func.apply(obj,[new E(src,_41e)]);
6a1aa64f 3824};
6a1aa64f 3825}
6a1aa64f 3826}
79f17b42
DV
3827},_browserAlreadyHasMouseEnterAndLeave:function(){
3828return /MSIE/.test(navigator.userAgent);
3829},_mouseEnterListener:function(src,sig,func,obj){
3830var E=MochiKit.Signal.Event;
165759fa
DV
3831return function(_424){
3832var e=new E(src,_424);
79f17b42
DV
3833try{
3834e.relatedTarget().nodeName;
6a1aa64f 3835}
79f17b42
DV
3836catch(err){
3837return;
6a1aa64f 3838}
79f17b42
DV
3839e.stop();
3840if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
3841return;
6a1aa64f 3842}
79f17b42
DV
3843e.type=function(){
3844return sig;
6a1aa64f 3845};
79f17b42
DV
3846if(typeof (func)=="string"){
3847return obj[func].apply(obj,[e]);
3848}else{
3849return func.apply(obj,[e]);
6a1aa64f 3850}
6a1aa64f 3851};
165759fa 3852},_getDestPair:function(_426,_427){
79f17b42
DV
3853var obj=null;
3854var func=null;
165759fa
DV
3855if(typeof (_427)!="undefined"){
3856obj=_426;
3857func=_427;
3858if(typeof (_427)=="string"){
3859if(typeof (_426[_427])!="function"){
79f17b42 3860throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
6a1aa64f 3861}
79f17b42 3862}else{
165759fa 3863if(typeof (_427)!="function"){
79f17b42 3864throw new Error("'funcOrStr' must be a function or string");
6a1aa64f 3865}
6a1aa64f 3866}
79f17b42 3867}else{
165759fa 3868if(typeof (_426)!="function"){
79f17b42
DV
3869throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
3870}else{
165759fa 3871func=_426;
6a1aa64f 3872}
6a1aa64f 3873}
79f17b42 3874return [obj,func];
165759fa 3875},connect:function(src,sig,_42c,_42d){
79f17b42
DV
3876src=MochiKit.DOM.getElement(src);
3877var self=MochiKit.Signal;
3878if(typeof (sig)!="string"){
3879throw new Error("'sig' must be a string");
6a1aa64f 3880}
165759fa
DV
3881var _42f=self._getDestPair(_42c,_42d);
3882var obj=_42f[0];
3883var func=_42f[1];
79f17b42
DV
3884if(typeof (obj)=="undefined"||obj===null){
3885obj=src;
6a1aa64f 3886}
165759fa
DV
3887var _432=!!(src.addEventListener||src.attachEvent);
3888if(_432&&(sig==="onmouseenter"||sig==="onmouseleave")&&!self._browserAlreadyHasMouseEnterAndLeave()){
3889var _433=self._mouseEnterListener(src,sig.substr(2),func,obj);
79f17b42
DV
3890if(sig==="onmouseenter"){
3891sig="onmouseover";
3892}else{
3893sig="onmouseout";
6a1aa64f
DV
3894}
3895}else{
165759fa 3896var _433=self._listener(src,sig,func,obj,_432);
6a1aa64f 3897}
79f17b42 3898if(src.addEventListener){
165759fa 3899src.addEventListener(sig.substr(2),_433,false);
79f17b42
DV
3900}else{
3901if(src.attachEvent){
165759fa 3902src.attachEvent(sig,_433);
6a1aa64f
DV
3903}
3904}
165759fa
DV
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);
79f17b42 3909src.__connect__.apply(src,args);
6a1aa64f 3910}
165759fa
DV
3911return _434;
3912},_disconnect:function(_436){
3913if(!_436.connected){
79f17b42 3914return;
6a1aa64f 3915}
165759fa
DV
3916_436.connected=false;
3917if(!_436.isDOM){
6a1aa64f
DV
3918return;
3919}
165759fa
DV
3920var src=_436.source;
3921var sig=_436.signal;
3922var _439=_436.listener;
79f17b42 3923if(src.removeEventListener){
165759fa 3924src.removeEventListener(sig.substr(2),_439,false);
79f17b42
DV
3925}else{
3926if(src.detachEvent){
165759fa 3927src.detachEvent(sig,_439);
79f17b42
DV
3928}else{
3929throw new Error("'src' must be a DOM element");
6a1aa64f 3930}
6a1aa64f 3931}
165759fa 3932},disconnect:function(_43a){
79f17b42 3933var self=MochiKit.Signal;
165759fa 3934var _43c=self._observers;
79f17b42
DV
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];
165759fa
DV
3941for(var i=_43c.length-1;i>=0;i--){
3942var o=_43c[i];
79f17b42
DV
3943if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){
3944self._disconnect(o);
3945if(!self._lock){
165759fa 3946_43c.splice(i,1);
79f17b42
DV
3947}else{
3948self._dirty=true;
6a1aa64f 3949}
79f17b42 3950return true;
6a1aa64f 3951}
6a1aa64f 3952}
6a1aa64f 3953}else{
165759fa 3954var idx=m.findIdentical(_43c,_43a);
79f17b42 3955if(idx>=0){
165759fa 3956self._disconnect(_43a);
79f17b42 3957if(!self._lock){
165759fa 3958_43c.splice(idx,1);
79f17b42
DV
3959}else{
3960self._dirty=true;
6a1aa64f 3961}
79f17b42 3962return true;
6a1aa64f 3963}
6a1aa64f 3964}
79f17b42 3965return false;
165759fa 3966},disconnectAllTo:function(_445,_446){
79f17b42 3967var self=MochiKit.Signal;
165759fa
DV
3968var _448=self._observers;
3969var _449=self._disconnect;
3970var _44a=self._lock;
3971var _44b=self._dirty;
3972if(typeof (_446)==="undefined"){
3973_446=null;
79f17b42 3974}
165759fa
DV
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;
79f17b42 3981}else{
165759fa 3982_448.splice(i,1);
79f17b42
DV
3983}
3984}
3985}
165759fa 3986self._dirty=_44b;
79f17b42
DV
3987},disconnectAll:function(src,sig){
3988src=MochiKit.DOM.getElement(src);
6a1aa64f 3989var m=MochiKit.Base;
165759fa 3990var _451=m.flattenArguments(m.extend(null,arguments,1));
79f17b42 3991var self=MochiKit.Signal;
165759fa
DV
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);
79f17b42 4004}else{
165759fa 4005_458=true;
6a1aa64f 4006}
6a1aa64f 4007}
6a1aa64f 4008}
79f17b42
DV
4009}else{
4010var sigs={};
165759fa
DV
4011for(i=0;i<_451.length;i++){
4012sigs[_451[i]]=true;
6a1aa64f 4013}
165759fa
DV
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);
79f17b42 4020}else{
165759fa 4021_458=true;
6a1aa64f 4022}
6a1aa64f 4023}
6a1aa64f 4024}
6a1aa64f 4025}
165759fa 4026self._dirty=_458;
79f17b42
DV
4027},signal:function(src,sig){
4028var self=MochiKit.Signal;
165759fa 4029var _45d=self._observers;
79f17b42
DV
4030src=MochiKit.DOM.getElement(src);
4031var args=MochiKit.Base.extend(null,arguments,2);
165759fa 4032var _45f=[];
79f17b42 4033self._lock=true;
165759fa
DV
4034for(var i=0;i<_45d.length;i++){
4035var _461=_45d[i];
4036if(_461.source===src&&_461.signal===sig){
79f17b42 4037try{
165759fa 4038_461.listener.apply(src,args);
6a1aa64f 4039}
79f17b42 4040catch(e){
165759fa 4041_45f.push(e);
6a1aa64f 4042}
6a1aa64f 4043}
6a1aa64f 4044}
79f17b42
DV
4045self._lock=false;
4046if(self._dirty){
4047self._dirty=false;
165759fa
DV
4048for(var i=_45d.length-1;i>=0;i--){
4049if(!_45d[i].connected){
4050_45d.splice(i,1);
79f17b42 4051}
6a1aa64f 4052}
79f17b42 4053}
165759fa
DV
4054if(_45f.length==1){
4055throw _45f[0];
6a1aa64f 4056}else{
165759fa 4057if(_45f.length>1){
79f17b42 4058var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
165759fa 4059e.errors=_45f;
79f17b42 4060throw e;
6a1aa64f
DV
4061}
4062}
79f17b42
DV
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;
6a1aa64f 4086}
79f17b42 4087MochiKit.Base._exportSymbols(this,MochiKit.Signal);
6a1aa64f
DV
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);
6a1aa64f
DV
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
0949d3e5 5734 connect(window, 'onload', this, function(e) { this.start_(); });
6a1aa64f
DV
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};