Use a subset of PlotKit_Packed.js -> 30k savings
[dygraphs.git] / dygraph-combined.js
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
14 if(typeof (dojo)!="undefined"){
15 dojo.provide("MochiKit.Base");
16 }
17 if(typeof (MochiKit)=="undefined"){
18 MochiKit={};
19 }
20 if(typeof (MochiKit.Base)=="undefined"){
21 MochiKit.Base={};
22 }
23 if(typeof (MochiKit.__export__)=="undefined"){
24 MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
25 }
26 MochiKit.Base.VERSION="1.4";
27 MochiKit.Base.NAME="MochiKit.Base";
28 MochiKit.Base.update=function(_1,_2){
29 if(_1===null){
30 _1={};
31 }
32 for(var i=1;i<arguments.length;i++){
33 var o=arguments[i];
34 if(typeof (o)!="undefined"&&o!==null){
35 for(var k in o){
36 _1[k]=o[k];
37 }
38 }
39 }
40 return _1;
41 };
42 MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
43 return "["+this.NAME+" "+this.VERSION+"]";
44 },toString:function(){
45 return this.__repr__();
46 },camelize:function(_6){
47 var _7=_6.split("-");
48 var cc=_7[0];
49 for(var i=1;i<_7.length;i++){
50 cc+=_7[i].charAt(0).toUpperCase()+_7[i].substring(1);
51 }
52 return cc;
53 },counter:function(n){
54 if(arguments.length===0){
55 n=1;
56 }
57 return function(){
58 return n++;
59 };
60 },clone:function(_b){
61 var me=arguments.callee;
62 if(arguments.length==1){
63 me.prototype=_b;
64 return new me();
65 }
66 },_flattenArray:function(_d,_e){
67 for(var i=0;i<_e.length;i++){
68 var o=_e[i];
69 if(o instanceof Array){
70 arguments.callee(_d,o);
71 }else{
72 _d.push(o);
73 }
74 }
75 return _d;
76 },flattenArray:function(lst){
77 return MochiKit.Base._flattenArray([],lst);
78 },flattenArguments:function(lst){
79 var res=[];
80 var m=MochiKit.Base;
81 var _15=m.extend(null,arguments);
82 while(_15.length){
83 var o=_15.shift();
84 if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
85 for(var i=o.length-1;i>=0;i--){
86 _15.unshift(o[i]);
87 }
88 }else{
89 res.push(o);
90 }
91 }
92 return res;
93 },extend:function(_18,obj,_1a){
94 if(!_1a){
95 _1a=0;
96 }
97 if(obj){
98 var l=obj.length;
99 if(typeof (l)!="number"){
100 if(typeof (MochiKit.Iter)!="undefined"){
101 obj=MochiKit.Iter.list(obj);
102 l=obj.length;
103 }else{
104 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
105 }
106 }
107 if(!_18){
108 _18=[];
109 }
110 for(var i=_1a;i<l;i++){
111 _18.push(obj[i]);
112 }
113 }
114 return _18;
115 },updatetree:function(_1d,obj){
116 if(_1d===null){
117 _1d={};
118 }
119 for(var i=1;i<arguments.length;i++){
120 var o=arguments[i];
121 if(typeof (o)!="undefined"&&o!==null){
122 for(var k in o){
123 var v=o[k];
124 if(typeof (_1d[k])=="object"&&typeof (v)=="object"){
125 arguments.callee(_1d[k],v);
126 }else{
127 _1d[k]=v;
128 }
129 }
130 }
131 }
132 return _1d;
133 },setdefault:function(_23,obj){
134 if(_23===null){
135 _23={};
136 }
137 for(var i=1;i<arguments.length;i++){
138 var o=arguments[i];
139 for(var k in o){
140 if(!(k in _23)){
141 _23[k]=o[k];
142 }
143 }
144 }
145 return _23;
146 },keys:function(obj){
147 var _29=[];
148 for(var _2a in obj){
149 _29.push(_2a);
150 }
151 return _29;
152 },values:function(obj){
153 var _2c=[];
154 for(var _2d in obj){
155 _2c.push(obj[_2d]);
156 }
157 return _2c;
158 },items:function(obj){
159 var _2f=[];
160 var e;
161 for(var _31 in obj){
162 var v;
163 try{
164 v=obj[_31];
165 }
166 catch(e){
167 continue;
168 }
169 _2f.push([_31,v]);
170 }
171 return _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){
176 return !!a;
177 },lognot:function(a){
178 return !a;
179 },identity:function(a){
180 return a;
181 },not:function(a){
182 return ~a;
183 },neg:function(a){
184 return -a;
185 },add:function(a,b){
186 return a+b;
187 },sub:function(a,b){
188 return a-b;
189 },div:function(a,b){
190 return a/b;
191 },mod:function(a,b){
192 return a%b;
193 },mul:function(a,b){
194 return a*b;
195 },and:function(a,b){
196 return a&b;
197 },or:function(a,b){
198 return a|b;
199 },xor:function(a,b){
200 return a^b;
201 },lshift:function(a,b){
202 return a<<b;
203 },rshift:function(a,b){
204 return a>>b;
205 },zrshift:function(a,b){
206 return a>>>b;
207 },eq:function(a,b){
208 return a==b;
209 },ne:function(a,b){
210 return a!=b;
211 },gt:function(a,b){
212 return a>b;
213 },ge:function(a,b){
214 return a>=b;
215 },lt:function(a,b){
216 return a<b;
217 },le:function(a,b){
218 return a<=b;
219 },seq:function(a,b){
220 return a===b;
221 },sne:function(a,b){
222 return a!==b;
223 },ceq:function(a,b){
224 return MochiKit.Base.compare(a,b)===0;
225 },cne:function(a,b){
226 return MochiKit.Base.compare(a,b)!==0;
227 },cgt:function(a,b){
228 return MochiKit.Base.compare(a,b)==1;
229 },cge:function(a,b){
230 return MochiKit.Base.compare(a,b)!=-1;
231 },clt:function(a,b){
232 return MochiKit.Base.compare(a,b)==-1;
233 },cle:function(a,b){
234 return MochiKit.Base.compare(a,b)!=1;
235 },logand:function(a,b){
236 return a&&b;
237 },logor:function(a,b){
238 return a||b;
239 },contains:function(a,b){
240 return b in a;
241 }},forwardCall:function(_73){
242 return function(){
243 return this[_73].apply(this,arguments);
244 };
245 },itemgetter:function(_74){
246 return function(arg){
247 return arg[_74];
248 };
249 },typeMatcher:function(){
250 var _76={};
251 for(var i=0;i<arguments.length;i++){
252 var typ=arguments[i];
253 _76[typ]=typ;
254 }
255 return function(){
256 for(var i=0;i<arguments.length;i++){
257 if(!(typeof (arguments[i]) in _76)){
258 return false;
259 }
260 }
261 return true;
262 };
263 },isNull:function(){
264 for(var i=0;i<arguments.length;i++){
265 if(arguments[i]!==null){
266 return false;
267 }
268 }
269 return true;
270 },isUndefinedOrNull:function(){
271 for(var i=0;i<arguments.length;i++){
272 var o=arguments[i];
273 if(!(typeof (o)=="undefined"||o===null)){
274 return false;
275 }
276 }
277 return true;
278 },isEmpty:function(obj){
279 return !MochiKit.Base.isNotEmpty.apply(this,arguments);
280 },isNotEmpty:function(obj){
281 for(var i=0;i<arguments.length;i++){
282 var o=arguments[i];
283 if(!(o&&o.length)){
284 return false;
285 }
286 }
287 return true;
288 },isArrayLike:function(){
289 for(var i=0;i<arguments.length;i++){
290 var o=arguments[i];
291 var typ=typeof (o);
292 if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
293 return false;
294 }
295 }
296 return true;
297 },isDateLike:function(){
298 for(var i=0;i<arguments.length;i++){
299 var o=arguments[i];
300 if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
301 return false;
302 }
303 }
304 return true;
305 },xmap:function(fn){
306 if(fn===null){
307 return MochiKit.Base.extend(null,arguments,1);
308 }
309 var _87=[];
310 for(var i=1;i<arguments.length;i++){
311 _87.push(fn(arguments[i]));
312 }
313 return _87;
314 },map:function(fn,lst){
315 var m=MochiKit.Base;
316 var itr=MochiKit.Iter;
317 var _8d=m.isArrayLike;
318 if(arguments.length<=2){
319 if(!_8d(lst)){
320 if(itr){
321 lst=itr.list(lst);
322 if(fn===null){
323 return lst;
324 }
325 }else{
326 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
327 }
328 }
329 if(fn===null){
330 return m.extend(null,lst);
331 }
332 var _8e=[];
333 for(var i=0;i<lst.length;i++){
334 _8e.push(fn(lst[i]));
335 }
336 return _8e;
337 }else{
338 if(fn===null){
339 fn=Array;
340 }
341 var _90=null;
342 for(i=1;i<arguments.length;i++){
343 if(!_8d(arguments[i])){
344 if(itr){
345 return itr.list(itr.imap.apply(null,arguments));
346 }else{
347 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
348 }
349 }
350 var l=arguments[i].length;
351 if(_90===null||_90>l){
352 _90=l;
353 }
354 }
355 _8e=[];
356 for(i=0;i<_90;i++){
357 var _92=[];
358 for(var j=1;j<arguments.length;j++){
359 _92.push(arguments[j][i]);
360 }
361 _8e.push(fn.apply(this,_92));
362 }
363 return _8e;
364 }
365 },xfilter:function(fn){
366 var _95=[];
367 if(fn===null){
368 fn=MochiKit.Base.operator.truth;
369 }
370 for(var i=1;i<arguments.length;i++){
371 var o=arguments[i];
372 if(fn(o)){
373 _95.push(o);
374 }
375 }
376 return _95;
377 },filter:function(fn,lst,_9a){
378 var _9b=[];
379 var m=MochiKit.Base;
380 if(!m.isArrayLike(lst)){
381 if(MochiKit.Iter){
382 lst=MochiKit.Iter.list(lst);
383 }else{
384 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
385 }
386 }
387 if(fn===null){
388 fn=m.operator.truth;
389 }
390 if(typeof (Array.prototype.filter)=="function"){
391 return Array.prototype.filter.call(lst,fn,_9a);
392 }else{
393 if(typeof (_9a)=="undefined"||_9a===null){
394 for(var i=0;i<lst.length;i++){
395 var o=lst[i];
396 if(fn(o)){
397 _9b.push(o);
398 }
399 }
400 }else{
401 for(i=0;i<lst.length;i++){
402 o=lst[i];
403 if(fn.call(_9a,o)){
404 _9b.push(o);
405 }
406 }
407 }
408 }
409 return _9b;
410 },_wrapDumbFunction:function(_9f){
411 return function(){
412 switch(arguments.length){
413 case 0:
414 return _9f();
415 case 1:
416 return _9f(arguments[0]);
417 case 2:
418 return _9f(arguments[0],arguments[1]);
419 case 3:
420 return _9f(arguments[0],arguments[1],arguments[2]);
421 }
422 var _a0=[];
423 for(var i=0;i<arguments.length;i++){
424 _a0.push("arguments["+i+"]");
425 }
426 return eval("(func("+_a0.join(",")+"))");
427 };
428 },methodcaller:function(_a2){
429 var _a3=MochiKit.Base.extend(null,arguments,1);
430 if(typeof (_a2)=="function"){
431 return function(obj){
432 return _a2.apply(obj,_a3);
433 };
434 }else{
435 return function(obj){
436 return obj[_a2].apply(obj,_a3);
437 };
438 }
439 },method:function(_a6,_a7){
440 var m=MochiKit.Base;
441 return m.bind.apply(this,m.extend([_a7,_a6],arguments,2));
442 },compose:function(f1,f2){
443 var _ab=[];
444 var m=MochiKit.Base;
445 if(arguments.length===0){
446 throw new TypeError("compose() requires at least one argument");
447 }
448 for(var i=0;i<arguments.length;i++){
449 var fn=arguments[i];
450 if(typeof (fn)!="function"){
451 throw new TypeError(m.repr(fn)+" is not a function");
452 }
453 _ab.push(fn);
454 }
455 return function(){
456 var _af=arguments;
457 for(var i=_ab.length-1;i>=0;i--){
458 _af=[_ab[i].apply(this,_af)];
459 }
460 return _af[0];
461 };
462 },bind:function(_b1,_b2){
463 if(typeof (_b1)=="string"){
464 _b1=_b2[_b1];
465 }
466 var _b3=_b1.im_func;
467 var _b4=_b1.im_preargs;
468 var _b5=_b1.im_self;
469 var m=MochiKit.Base;
470 if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){
471 _b1=m._wrapDumbFunction(_b1);
472 }
473 if(typeof (_b3)!="function"){
474 _b3=_b1;
475 }
476 if(typeof (_b2)!="undefined"){
477 _b5=_b2;
478 }
479 if(typeof (_b4)=="undefined"){
480 _b4=[];
481 }else{
482 _b4=_b4.slice();
483 }
484 m.extend(_b4,arguments,2);
485 var _b7=function(){
486 var _b8=arguments;
487 var me=arguments.callee;
488 if(me.im_preargs.length>0){
489 _b8=m.concat(me.im_preargs,_b8);
490 }
491 var _ba=me.im_self;
492 if(!_ba){
493 _ba=this;
494 }
495 return me.im_func.apply(_ba,_b8);
496 };
497 _b7.im_self=_b5;
498 _b7.im_func=_b3;
499 _b7.im_preargs=_b4;
500 return _b7;
501 },bindMethods:function(_bb){
502 var _bc=MochiKit.Base.bind;
503 for(var k in _bb){
504 var _be=_bb[k];
505 if(typeof (_be)=="function"){
506 _bb[k]=_bc(_be,_bb);
507 }
508 }
509 },registerComparator:function(_bf,_c0,_c1,_c2){
510 MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2);
511 },_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
512 if(a==b){
513 return 0;
514 }
515 var _c5=(typeof (a)=="undefined"||a===null);
516 var _c6=(typeof (b)=="undefined"||b===null);
517 if(_c5&&_c6){
518 return 0;
519 }else{
520 if(_c5){
521 return -1;
522 }else{
523 if(_c6){
524 return 1;
525 }
526 }
527 }
528 var m=MochiKit.Base;
529 var _c8=m._primitives;
530 if(!(typeof (a) in _c8&&typeof (b) in _c8)){
531 try{
532 return m.comparatorRegistry.match(a,b);
533 }
534 catch(e){
535 if(e!=m.NotFound){
536 throw e;
537 }
538 }
539 }
540 if(a<b){
541 return -1;
542 }else{
543 if(a>b){
544 return 1;
545 }
546 }
547 var _c9=m.repr;
548 throw new TypeError(_c9(a)+" and "+_c9(b)+" can not be compared");
549 },compareDateLike:function(a,b){
550 return MochiKit.Base.compare(a.getTime(),b.getTime());
551 },compareArrayLike:function(a,b){
552 var _ce=MochiKit.Base.compare;
553 var _cf=a.length;
554 var _d0=0;
555 if(_cf>b.length){
556 _d0=1;
557 _cf=b.length;
558 }else{
559 if(_cf<b.length){
560 _d0=-1;
561 }
562 }
563 for(var i=0;i<_cf;i++){
564 var cmp=_ce(a[i],b[i]);
565 if(cmp){
566 return cmp;
567 }
568 }
569 return _d0;
570 },registerRepr:function(_d3,_d4,_d5,_d6){
571 MochiKit.Base.reprRegistry.register(_d3,_d4,_d5,_d6);
572 },repr:function(o){
573 if(typeof (o)=="undefined"){
574 return "undefined";
575 }else{
576 if(o===null){
577 return "null";
578 }
579 }
580 try{
581 if(typeof (o.__repr__)=="function"){
582 return o.__repr__();
583 }else{
584 if(typeof (o.repr)=="function"&&o.repr!=arguments.callee){
585 return o.repr();
586 }
587 }
588 return MochiKit.Base.reprRegistry.match(o);
589 }
590 catch(e){
591 if(typeof (o.NAME)=="string"&&(o.toString==Function.prototype.toString||o.toString==Object.prototype.toString)){
592 return o.NAME;
593 }
594 }
595 try{
596 var _d8=(o+"");
597 }
598 catch(e){
599 return "["+typeof (o)+"]";
600 }
601 if(typeof (o)=="function"){
602 o=_d8.replace(/^\s+/,"");
603 var idx=o.indexOf("{");
604 if(idx!=-1){
605 o=o.substr(0,idx)+"{...}";
606 }
607 }
608 return _d8;
609 },reprArrayLike:function(o){
610 var m=MochiKit.Base;
611 return "["+m.map(m.repr,o).join(", ")+"]";
612 },reprString:function(o){
613 return ("\""+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){
615 return o+"";
616 },registerJSON:function(_de,_df,_e0,_e1){
617 MochiKit.Base.jsonRegistry.register(_de,_df,_e0,_e1);
618 },evalJSON:function(){
619 return eval("("+arguments[0]+")");
620 },serializeJSON:function(o){
621 var _e3=typeof (o);
622 if(_e3=="number"||_e3=="boolean"){
623 return o+"";
624 }else{
625 if(o===null){
626 return "null";
627 }
628 }
629 var m=MochiKit.Base;
630 var _e5=m.reprString;
631 if(_e3=="string"){
632 return _e5(o);
633 }
634 var me=arguments.callee;
635 var _e7;
636 if(typeof (o.__json__)=="function"){
637 _e7=o.__json__();
638 if(o!==_e7){
639 return me(_e7);
640 }
641 }
642 if(typeof (o.json)=="function"){
643 _e7=o.json();
644 if(o!==_e7){
645 return me(_e7);
646 }
647 }
648 if(_e3!="function"&&typeof (o.length)=="number"){
649 var res=[];
650 for(var i=0;i<o.length;i++){
651 var val=me(o[i]);
652 if(typeof (val)!="string"){
653 val="undefined";
654 }
655 res.push(val);
656 }
657 return "["+res.join(", ")+"]";
658 }
659 try{
660 _e7=m.jsonRegistry.match(o);
661 if(o!==_e7){
662 return me(_e7);
663 }
664 }
665 catch(e){
666 if(e!=m.NotFound){
667 throw e;
668 }
669 }
670 if(_e3=="undefined"){
671 throw new TypeError("undefined can not be serialized as JSON");
672 }
673 if(_e3=="function"){
674 return null;
675 }
676 res=[];
677 for(var k in o){
678 var _ec;
679 if(typeof (k)=="number"){
680 _ec="\""+k+"\"";
681 }else{
682 if(typeof (k)=="string"){
683 _ec=_e5(k);
684 }else{
685 continue;
686 }
687 }
688 val=me(o[k]);
689 if(typeof (val)!="string"){
690 continue;
691 }
692 res.push(_ec+":"+val);
693 }
694 return "{"+res.join(", ")+"}";
695 },objEqual:function(a,b){
696 return (MochiKit.Base.compare(a,b)===0);
697 },arrayEqual:function(_ef,arr){
698 if(_ef.length!=arr.length){
699 return false;
700 }
701 return (MochiKit.Base.compare(_ef,arr)===0);
702 },concat:function(){
703 var _f1=[];
704 var _f2=MochiKit.Base.extend;
705 for(var i=0;i<arguments.length;i++){
706 _f2(_f1,arguments[i]);
707 }
708 return _f1;
709 },keyComparator:function(key){
710 var m=MochiKit.Base;
711 var _f6=m.compare;
712 if(arguments.length==1){
713 return function(a,b){
714 return _f6(a[key],b[key]);
715 };
716 }
717 var _f9=m.extend(null,arguments);
718 return function(a,b){
719 var _fc=0;
720 for(var i=0;(_fc===0)&&(i<_f9.length);i++){
721 var key=_f9[i];
722 _fc=_f6(a[key],b[key]);
723 }
724 return _fc;
725 };
726 },reverseKeyComparator:function(key){
727 var _100=MochiKit.Base.keyComparator.apply(this,arguments);
728 return function(a,b){
729 return _100(b,a);
730 };
731 },partial:function(func){
732 var m=MochiKit.Base;
733 return m.bind.apply(this,m.extend([func,undefined],arguments,1));
734 },listMinMax:function(_105,lst){
735 if(lst.length===0){
736 return null;
737 }
738 var cur=lst[0];
739 var _108=MochiKit.Base.compare;
740 for(var i=1;i<lst.length;i++){
741 var o=lst[i];
742 if(_108(o,cur)==_105){
743 cur=o;
744 }
745 }
746 return cur;
747 },objMax:function(){
748 return MochiKit.Base.listMinMax(1,arguments);
749 },objMin:function(){
750 return MochiKit.Base.listMinMax(-1,arguments);
751 },findIdentical:function(lst,_10c,_10d,end){
752 if(typeof (end)=="undefined"||end===null){
753 end=lst.length;
754 }
755 if(typeof (_10d)=="undefined"||_10d===null){
756 _10d=0;
757 }
758 for(var i=_10d;i<end;i++){
759 if(lst[i]===_10c){
760 return i;
761 }
762 }
763 return -1;
764 },mean:function(){
765 var sum=0;
766 var m=MochiKit.Base;
767 var args=m.extend(null,arguments);
768 var _113=args.length;
769 while(args.length){
770 var o=args.shift();
771 if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
772 _113+=o.length-1;
773 for(var i=o.length-1;i>=0;i--){
774 sum+=o[i];
775 }
776 }else{
777 sum+=o;
778 }
779 }
780 if(_113<=0){
781 throw new TypeError("mean() requires at least one argument");
782 }
783 return sum/_113;
784 },median:function(){
785 var data=MochiKit.Base.flattenArguments(arguments);
786 if(data.length===0){
787 throw new TypeError("median() requires at least one argument");
788 }
789 data.sort(compare);
790 if(data.length%2==0){
791 var _117=data.length/2;
792 return (data[_117]+data[_117-1])/2;
793 }else{
794 return data[(data.length-1)/2];
795 }
796 },findValue:function(lst,_119,_11a,end){
797 if(typeof (end)=="undefined"||end===null){
798 end=lst.length;
799 }
800 if(typeof (_11a)=="undefined"||_11a===null){
801 _11a=0;
802 }
803 var cmp=MochiKit.Base.compare;
804 for(var i=_11a;i<end;i++){
805 if(cmp(lst[i],_119)===0){
806 return i;
807 }
808 }
809 return -1;
810 },nodeWalk:function(node,_11f){
811 var _120=[node];
812 var _121=MochiKit.Base.extend;
813 while(_120.length){
814 var res=_11f(_120.shift());
815 if(res){
816 _121(_120,res);
817 }
818 }
819 },nameFunctions:function(_123){
820 var base=_123.NAME;
821 if(typeof (base)=="undefined"){
822 base="";
823 }else{
824 base=base+".";
825 }
826 for(var name in _123){
827 var o=_123[name];
828 if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
829 try{
830 o.NAME=base+name;
831 }
832 catch(e){
833 }
834 }
835 }
836 },queryString:function(_127,_128){
837 if(typeof (MochiKit.DOM)!="undefined"&&arguments.length==1&&(typeof (_127)=="string"||(typeof (_127.nodeType)!="undefined"&&_127.nodeType>0))){
838 var kv=MochiKit.DOM.formContents(_127);
839 _127=kv[0];
840 _128=kv[1];
841 }else{
842 if(arguments.length==1){
843 if(typeof (_127.length)=="number"&&_127.length==2){
844 return arguments.callee(_127[0],_127[1]);
845 }
846 var o=_127;
847 _127=[];
848 _128=[];
849 for(var k in o){
850 var v=o[k];
851 if(typeof (v)=="function"){
852 continue;
853 }else{
854 if(typeof (v)!="string"&&typeof (v.length)=="number"){
855 for(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 }
867 var rval=[];
868 var len=Math.min(_127.length,_128.length);
869 var _130=MochiKit.Base.urlEncode;
870 for(var i=0;i<len;i++){
871 v=_128[i];
872 if(typeof (v)!="undefined"&&v!==null){
873 rval.push(_130(_127[i])+"="+_130(v));
874 }
875 }
876 return rval.join("&");
877 },parseQueryString:function(_131,_132){
878 var qstr=(_131.charAt(0)=="?")?_131.substring(1):_131;
879 var _134=qstr.replace(/\+/g,"%20").split(/(\&amp\;|\&\#38\;|\&#x26;|\&)/);
880 var o={};
881 var _136;
882 if(typeof (decodeURIComponent)!="undefined"){
883 _136=decodeURIComponent;
884 }else{
885 _136=unescape;
886 }
887 if(_132){
888 for(var i=0;i<_134.length;i++){
889 var pair=_134[i].split("=");
890 var name=_136(pair.shift());
891 if(!name){
892 continue;
893 }
894 var arr=o[name];
895 if(!(arr instanceof Array)){
896 arr=[];
897 o[name]=arr;
898 }
899 arr.push(_136(pair.join("=")));
900 }
901 }else{
902 for(i=0;i<_134.length;i++){
903 pair=_134[i].split("=");
904 var name=pair.shift();
905 if(!name){
906 continue;
907 }
908 o[_136(name)]=_136(pair.join("="));
909 }
910 }
911 return o;
912 }});
913 MochiKit.Base.AdapterRegistry=function(){
914 this.pairs=[];
915 };
916 MochiKit.Base.AdapterRegistry.prototype={register:function(name,_13c,wrap,_13e){
917 if(_13e){
918 this.pairs.unshift([name,_13c,wrap]);
919 }else{
920 this.pairs.push([name,_13c,wrap]);
921 }
922 },match:function(){
923 for(var i=0;i<this.pairs.length;i++){
924 var pair=this.pairs[i];
925 if(pair[1].apply(this,arguments)){
926 return pair[2].apply(this,arguments);
927 }
928 }
929 throw MochiKit.Base.NotFound;
930 },unregister:function(name){
931 for(var i=0;i<this.pairs.length;i++){
932 var pair=this.pairs[i];
933 if(pair[0]==name){
934 this.pairs.splice(i,1);
935 return true;
936 }
937 }
938 return false;
939 }};
940 MochiKit.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"];
941 MochiKit.Base.EXPORT_OK=["nameFunctions","comparatorRegistry","reprRegistry","jsonRegistry","compareDateLike","compareArrayLike","reprArrayLike","reprString","reprNumber"];
942 MochiKit.Base._exportSymbols=function(_144,_145){
943 if(!MochiKit.__export__){
944 return;
945 }
946 var all=_145.EXPORT_TAGS[":all"];
947 for(var i=0;i<all.length;i++){
948 _144[all[i]]=_145[all[i]];
949 }
950 };
951 MochiKit.Base.__new__=function(){
952 var m=this;
953 m.noop=m.operator.identity;
954 m.forward=m.forwardCall;
955 m.find=m.findValue;
956 if(typeof (encodeURIComponent)!="undefined"){
957 m.urlEncode=function(_149){
958 return encodeURIComponent(_149).replace(/\'/g,"%27");
959 };
960 }else{
961 m.urlEncode=function(_14a){
962 return escape(_14a).replace(/\+/g,"%2B").replace(/\"/g,"%22").rval.replace(/\'/g,"%27");
963 };
964 }
965 m.NamedError=function(name){
966 this.message=name;
967 this.name=name;
968 };
969 m.NamedError.prototype=new Error();
970 m.update(m.NamedError.prototype,{repr:function(){
971 if(this.message&&this.message!=this.name){
972 return this.name+"("+m.repr(this.message)+")";
973 }else{
974 return this.name+"()";
975 }
976 },toString:m.forwardCall("repr")});
977 m.NotFound=new m.NamedError("MochiKit.Base.NotFound");
978 m.listMax=m.partial(m.listMinMax,1);
979 m.listMin=m.partial(m.listMinMax,-1);
980 m.isCallable=m.typeMatcher("function");
981 m.isUndefined=m.typeMatcher("undefined");
982 m.merge=m.partial(m.update,null);
983 m.zip=m.partial(m.map,null);
984 m.average=m.mean;
985 m.comparatorRegistry=new m.AdapterRegistry();
986 m.registerComparator("dateLike",m.isDateLike,m.compareDateLike);
987 m.registerComparator("arrayLike",m.isArrayLike,m.compareArrayLike);
988 m.reprRegistry=new m.AdapterRegistry();
989 m.registerRepr("arrayLike",m.isArrayLike,m.reprArrayLike);
990 m.registerRepr("string",m.typeMatcher("string"),m.reprString);
991 m.registerRepr("numbers",m.typeMatcher("number","boolean"),m.reprNumber);
992 m.jsonRegistry=new m.AdapterRegistry();
993 var all=m.concat(m.EXPORT,m.EXPORT_OK);
994 m.EXPORT_TAGS={":common":m.concat(m.EXPORT_OK),":all":all};
995 m.nameFunctions(this);
996 };
997 MochiKit.Base.__new__();
998 if(MochiKit.__export__){
999 compare=MochiKit.Base.compare;
1000 compose=MochiKit.Base.compose;
1001 serializeJSON=MochiKit.Base.serializeJSON;
1002 }
1003 MochiKit.Base._exportSymbols(this,MochiKit.Base);
1004 if(typeof (dojo)!="undefined"){
1005 dojo.provide("MochiKit.Iter");
1006 dojo.require("MochiKit.Base");
1007 }
1008 if(typeof (JSAN)!="undefined"){
1009 JSAN.use("MochiKit.Base",[]);
1010 }
1011 try{
1012 if(typeof (MochiKit.Base)=="undefined"){
1013 throw "";
1014 }
1015 }
1016 catch(e){
1017 throw "MochiKit.Iter depends on MochiKit.Base!";
1018 }
1019 if(typeof (MochiKit.Iter)=="undefined"){
1020 MochiKit.Iter={};
1021 }
1022 MochiKit.Iter.NAME="MochiKit.Iter";
1023 MochiKit.Iter.VERSION="1.4";
1024 MochiKit.Base.update(MochiKit.Iter,{__repr__:function(){
1025 return "["+this.NAME+" "+this.VERSION+"]";
1026 },toString:function(){
1027 return this.__repr__();
1028 },registerIteratorFactory:function(name,_14e,_14f,_150){
1029 MochiKit.Iter.iteratorRegistry.register(name,_14e,_14f,_150);
1030 },iter:function(_151,_152){
1031 var self=MochiKit.Iter;
1032 if(arguments.length==2){
1033 return self.takewhile(function(a){
1034 return a!=_152;
1035 },_151);
1036 }
1037 if(typeof (_151.next)=="function"){
1038 return _151;
1039 }else{
1040 if(typeof (_151.iter)=="function"){
1041 return _151.iter();
1042 }
1043 }
1044 try{
1045 return self.iteratorRegistry.match(_151);
1046 }
1047 catch(e){
1048 var m=MochiKit.Base;
1049 if(e==m.NotFound){
1050 e=new TypeError(typeof (_151)+": "+m.repr(_151)+" is not iterable");
1051 }
1052 throw e;
1053 }
1054 },count:function(n){
1055 if(!n){
1056 n=0;
1057 }
1058 var m=MochiKit.Base;
1059 return {repr:function(){
1060 return "count("+n+")";
1061 },toString:m.forwardCall("repr"),next:m.counter(n)};
1062 },cycle:function(p){
1063 var self=MochiKit.Iter;
1064 var m=MochiKit.Base;
1065 var lst=[];
1066 var _15c=self.iter(p);
1067 return {repr:function(){
1068 return "cycle(...)";
1069 },toString:m.forwardCall("repr"),next:function(){
1070 try{
1071 var rval=_15c.next();
1072 lst.push(rval);
1073 return rval;
1074 }
1075 catch(e){
1076 if(e!=self.StopIteration){
1077 throw e;
1078 }
1079 if(lst.length===0){
1080 this.next=function(){
1081 throw self.StopIteration;
1082 };
1083 }else{
1084 var i=-1;
1085 this.next=function(){
1086 i=(i+1)%lst.length;
1087 return lst[i];
1088 };
1089 }
1090 return this.next();
1091 }
1092 }};
1093 },repeat:function(elem,n){
1094 var m=MochiKit.Base;
1095 if(typeof (n)=="undefined"){
1096 return {repr:function(){
1097 return "repeat("+m.repr(elem)+")";
1098 },toString:m.forwardCall("repr"),next:function(){
1099 return elem;
1100 }};
1101 }
1102 return {repr:function(){
1103 return "repeat("+m.repr(elem)+", "+n+")";
1104 },toString:m.forwardCall("repr"),next:function(){
1105 if(n<=0){
1106 throw MochiKit.Iter.StopIteration;
1107 }
1108 n-=1;
1109 return elem;
1110 }};
1111 },next:function(_162){
1112 return _162.next();
1113 },izip:function(p,q){
1114 var m=MochiKit.Base;
1115 var self=MochiKit.Iter;
1116 var next=self.next;
1117 var _168=m.map(self.iter,arguments);
1118 return {repr:function(){
1119 return "izip(...)";
1120 },toString:m.forwardCall("repr"),next:function(){
1121 return m.map(next,_168);
1122 }};
1123 },ifilter:function(pred,seq){
1124 var m=MochiKit.Base;
1125 seq=MochiKit.Iter.iter(seq);
1126 if(pred===null){
1127 pred=m.operator.truth;
1128 }
1129 return {repr:function(){
1130 return "ifilter(...)";
1131 },toString:m.forwardCall("repr"),next:function(){
1132 while(true){
1133 var rval=seq.next();
1134 if(pred(rval)){
1135 return rval;
1136 }
1137 }
1138 return undefined;
1139 }};
1140 },ifilterfalse:function(pred,seq){
1141 var m=MochiKit.Base;
1142 seq=MochiKit.Iter.iter(seq);
1143 if(pred===null){
1144 pred=m.operator.truth;
1145 }
1146 return {repr:function(){
1147 return "ifilterfalse(...)";
1148 },toString:m.forwardCall("repr"),next:function(){
1149 while(true){
1150 var rval=seq.next();
1151 if(!pred(rval)){
1152 return rval;
1153 }
1154 }
1155 return undefined;
1156 }};
1157 },islice:function(seq){
1158 var self=MochiKit.Iter;
1159 var m=MochiKit.Base;
1160 seq=self.iter(seq);
1161 var _174=0;
1162 var stop=0;
1163 var step=1;
1164 var i=-1;
1165 if(arguments.length==2){
1166 stop=arguments[1];
1167 }else{
1168 if(arguments.length==3){
1169 _174=arguments[1];
1170 stop=arguments[2];
1171 }else{
1172 _174=arguments[1];
1173 stop=arguments[2];
1174 step=arguments[3];
1175 }
1176 }
1177 return {repr:function(){
1178 return "islice("+["...",_174,stop,step].join(", ")+")";
1179 },toString:m.forwardCall("repr"),next:function(){
1180 var rval;
1181 while(i<_174){
1182 rval=seq.next();
1183 i++;
1184 }
1185 if(_174>=stop){
1186 throw self.StopIteration;
1187 }
1188 _174+=step;
1189 return rval;
1190 }};
1191 },imap:function(fun,p,q){
1192 var m=MochiKit.Base;
1193 var self=MochiKit.Iter;
1194 var _17e=m.map(self.iter,m.extend(null,arguments,1));
1195 var map=m.map;
1196 var next=self.next;
1197 return {repr:function(){
1198 return "imap(...)";
1199 },toString:m.forwardCall("repr"),next:function(){
1200 return fun.apply(this,map(next,_17e));
1201 }};
1202 },applymap:function(fun,seq,self){
1203 seq=MochiKit.Iter.iter(seq);
1204 var m=MochiKit.Base;
1205 return {repr:function(){
1206 return "applymap(...)";
1207 },toString:m.forwardCall("repr"),next:function(){
1208 return fun.apply(self,seq.next());
1209 }};
1210 },chain:function(p,q){
1211 var self=MochiKit.Iter;
1212 var m=MochiKit.Base;
1213 if(arguments.length==1){
1214 return self.iter(arguments[0]);
1215 }
1216 var _189=m.map(self.iter,arguments);
1217 return {repr:function(){
1218 return "chain(...)";
1219 },toString:m.forwardCall("repr"),next:function(){
1220 while(_189.length>1){
1221 try{
1222 return _189[0].next();
1223 }
1224 catch(e){
1225 if(e!=self.StopIteration){
1226 throw e;
1227 }
1228 _189.shift();
1229 }
1230 }
1231 if(_189.length==1){
1232 var arg=_189.shift();
1233 this.next=m.bind("next",arg);
1234 return this.next();
1235 }
1236 throw self.StopIteration;
1237 }};
1238 },takewhile:function(pred,seq){
1239 var self=MochiKit.Iter;
1240 seq=self.iter(seq);
1241 return {repr:function(){
1242 return "takewhile(...)";
1243 },toString:MochiKit.Base.forwardCall("repr"),next:function(){
1244 var rval=seq.next();
1245 if(!pred(rval)){
1246 this.next=function(){
1247 throw self.StopIteration;
1248 };
1249 this.next();
1250 }
1251 return rval;
1252 }};
1253 },dropwhile:function(pred,seq){
1254 seq=MochiKit.Iter.iter(seq);
1255 var m=MochiKit.Base;
1256 var bind=m.bind;
1257 return {"repr":function(){
1258 return "dropwhile(...)";
1259 },"toString":m.forwardCall("repr"),"next":function(){
1260 while(true){
1261 var rval=seq.next();
1262 if(!pred(rval)){
1263 break;
1264 }
1265 }
1266 this.next=bind("next",seq);
1267 return rval;
1268 }};
1269 },_tee:function(_194,sync,_196){
1270 sync.pos[_194]=-1;
1271 var m=MochiKit.Base;
1272 var _198=m.listMin;
1273 return {repr:function(){
1274 return "tee("+_194+", ...)";
1275 },toString:m.forwardCall("repr"),next:function(){
1276 var rval;
1277 var i=sync.pos[_194];
1278 if(i==sync.max){
1279 rval=_196.next();
1280 sync.deque.push(rval);
1281 sync.max+=1;
1282 sync.pos[_194]+=1;
1283 }else{
1284 rval=sync.deque[i-sync.min];
1285 sync.pos[_194]+=1;
1286 if(i==sync.min&&_198(sync.pos)!=sync.min){
1287 sync.min+=1;
1288 sync.deque.shift();
1289 }
1290 }
1291 return rval;
1292 }};
1293 },tee:function(_19b,n){
1294 var rval=[];
1295 var sync={"pos":[],"deque":[],"max":-1,"min":-1};
1296 if(arguments.length==1||typeof (n)=="undefined"||n===null){
1297 n=2;
1298 }
1299 var self=MochiKit.Iter;
1300 _19b=self.iter(_19b);
1301 var _tee=self._tee;
1302 for(var i=0;i<n;i++){
1303 rval.push(_tee(i,sync,_19b));
1304 }
1305 return rval;
1306 },list:function(_1a2){
1307 var rval;
1308 if(_1a2 instanceof Array){
1309 return _1a2.slice();
1310 }
1311 if(typeof (_1a2)=="function"&&!(_1a2 instanceof Function)&&typeof (_1a2.length)=="number"){
1312 rval=[];
1313 for(var i=0;i<_1a2.length;i++){
1314 rval.push(_1a2[i]);
1315 }
1316 return rval;
1317 }
1318 var self=MochiKit.Iter;
1319 _1a2=self.iter(_1a2);
1320 var rval=[];
1321 try{
1322 while(true){
1323 rval.push(_1a2.next());
1324 }
1325 }
1326 catch(e){
1327 if(e!=self.StopIteration){
1328 throw e;
1329 }
1330 return rval;
1331 }
1332 return undefined;
1333 },reduce:function(fn,_1a7,_1a8){
1334 var i=0;
1335 var x=_1a8;
1336 var self=MochiKit.Iter;
1337 _1a7=self.iter(_1a7);
1338 if(arguments.length<3){
1339 try{
1340 x=_1a7.next();
1341 }
1342 catch(e){
1343 if(e==self.StopIteration){
1344 e=new TypeError("reduce() of empty sequence with no initial value");
1345 }
1346 throw e;
1347 }
1348 i++;
1349 }
1350 try{
1351 while(true){
1352 x=fn(x,_1a7.next());
1353 }
1354 }
1355 catch(e){
1356 if(e!=self.StopIteration){
1357 throw e;
1358 }
1359 }
1360 return x;
1361 },range:function(){
1362 var _1ac=0;
1363 var stop=0;
1364 var step=1;
1365 if(arguments.length==1){
1366 stop=arguments[0];
1367 }else{
1368 if(arguments.length==2){
1369 _1ac=arguments[0];
1370 stop=arguments[1];
1371 }else{
1372 if(arguments.length==3){
1373 _1ac=arguments[0];
1374 stop=arguments[1];
1375 step=arguments[2];
1376 }else{
1377 throw new TypeError("range() takes 1, 2, or 3 arguments!");
1378 }
1379 }
1380 }
1381 if(step===0){
1382 throw new TypeError("range() step must not be 0");
1383 }
1384 return {next:function(){
1385 if((step>0&&_1ac>=stop)||(step<0&&_1ac<=stop)){
1386 throw MochiKit.Iter.StopIteration;
1387 }
1388 var rval=_1ac;
1389 _1ac+=step;
1390 return rval;
1391 },repr:function(){
1392 return "range("+[_1ac,stop,step].join(", ")+")";
1393 },toString:MochiKit.Base.forwardCall("repr")};
1394 },sum:function(_1b0,_1b1){
1395 if(typeof (_1b1)=="undefined"||_1b1===null){
1396 _1b1=0;
1397 }
1398 var x=_1b1;
1399 var self=MochiKit.Iter;
1400 _1b0=self.iter(_1b0);
1401 try{
1402 while(true){
1403 x+=_1b0.next();
1404 }
1405 }
1406 catch(e){
1407 if(e!=self.StopIteration){
1408 throw e;
1409 }
1410 }
1411 return x;
1412 },exhaust:function(_1b4){
1413 var self=MochiKit.Iter;
1414 _1b4=self.iter(_1b4);
1415 try{
1416 while(true){
1417 _1b4.next();
1418 }
1419 }
1420 catch(e){
1421 if(e!=self.StopIteration){
1422 throw e;
1423 }
1424 }
1425 },forEach:function(_1b6,func,self){
1426 var m=MochiKit.Base;
1427 if(arguments.length>2){
1428 func=m.bind(func,self);
1429 }
1430 if(m.isArrayLike(_1b6)){
1431 try{
1432 for(var i=0;i<_1b6.length;i++){
1433 func(_1b6[i]);
1434 }
1435 }
1436 catch(e){
1437 if(e!=MochiKit.Iter.StopIteration){
1438 throw e;
1439 }
1440 }
1441 }else{
1442 self=MochiKit.Iter;
1443 self.exhaust(self.imap(func,_1b6));
1444 }
1445 },every:function(_1bb,func){
1446 var self=MochiKit.Iter;
1447 try{
1448 self.ifilterfalse(func,_1bb).next();
1449 return false;
1450 }
1451 catch(e){
1452 if(e!=self.StopIteration){
1453 throw e;
1454 }
1455 return true;
1456 }
1457 },sorted:function(_1be,cmp){
1458 var rval=MochiKit.Iter.list(_1be);
1459 if(arguments.length==1){
1460 cmp=MochiKit.Base.compare;
1461 }
1462 rval.sort(cmp);
1463 return rval;
1464 },reversed:function(_1c1){
1465 var rval=MochiKit.Iter.list(_1c1);
1466 rval.reverse();
1467 return rval;
1468 },some:function(_1c3,func){
1469 var self=MochiKit.Iter;
1470 try{
1471 self.ifilter(func,_1c3).next();
1472 return true;
1473 }
1474 catch(e){
1475 if(e!=self.StopIteration){
1476 throw e;
1477 }
1478 return false;
1479 }
1480 },iextend:function(lst,_1c7){
1481 if(MochiKit.Base.isArrayLike(_1c7)){
1482 for(var i=0;i<_1c7.length;i++){
1483 lst.push(_1c7[i]);
1484 }
1485 }else{
1486 var self=MochiKit.Iter;
1487 _1c7=self.iter(_1c7);
1488 try{
1489 while(true){
1490 lst.push(_1c7.next());
1491 }
1492 }
1493 catch(e){
1494 if(e!=self.StopIteration){
1495 throw e;
1496 }
1497 }
1498 }
1499 return lst;
1500 },groupby:function(_1ca,_1cb){
1501 var m=MochiKit.Base;
1502 var self=MochiKit.Iter;
1503 if(arguments.length<2){
1504 _1cb=m.operator.identity;
1505 }
1506 _1ca=self.iter(_1ca);
1507 var pk=undefined;
1508 var k=undefined;
1509 var v;
1510 function fetch(){
1511 v=_1ca.next();
1512 k=_1cb(v);
1513 }
1514 function eat(){
1515 var ret=v;
1516 v=undefined;
1517 return ret;
1518 }
1519 var _1d2=true;
1520 var _1d3=m.compare;
1521 return {repr:function(){
1522 return "groupby(...)";
1523 },next:function(){
1524 while(_1d3(k,pk)===0){
1525 fetch();
1526 if(_1d2){
1527 _1d2=false;
1528 break;
1529 }
1530 }
1531 pk=k;
1532 return [k,{next:function(){
1533 if(v==undefined){
1534 fetch();
1535 }
1536 if(_1d3(k,pk)!==0){
1537 throw self.StopIteration;
1538 }
1539 return eat();
1540 }}];
1541 }};
1542 },groupby_as_array:function(_1d4,_1d5){
1543 var m=MochiKit.Base;
1544 var self=MochiKit.Iter;
1545 if(arguments.length<2){
1546 _1d5=m.operator.identity;
1547 }
1548 _1d4=self.iter(_1d4);
1549 var _1d8=[];
1550 var _1d9=true;
1551 var _1da;
1552 var _1db=m.compare;
1553 while(true){
1554 try{
1555 var _1dc=_1d4.next();
1556 var key=_1d5(_1dc);
1557 }
1558 catch(e){
1559 if(e==self.StopIteration){
1560 break;
1561 }
1562 throw e;
1563 }
1564 if(_1d9||_1db(key,_1da)!==0){
1565 var _1de=[];
1566 _1d8.push([key,_1de]);
1567 }
1568 _1de.push(_1dc);
1569 _1d9=false;
1570 _1da=key;
1571 }
1572 return _1d8;
1573 },arrayLikeIter:function(_1df){
1574 var i=0;
1575 return {repr:function(){
1576 return "arrayLikeIter(...)";
1577 },toString:MochiKit.Base.forwardCall("repr"),next:function(){
1578 if(i>=_1df.length){
1579 throw MochiKit.Iter.StopIteration;
1580 }
1581 return _1df[i++];
1582 }};
1583 },hasIterateNext:function(_1e1){
1584 return (_1e1&&typeof (_1e1.iterateNext)=="function");
1585 },iterateNextIter:function(_1e2){
1586 return {repr:function(){
1587 return "iterateNextIter(...)";
1588 },toString:MochiKit.Base.forwardCall("repr"),next:function(){
1589 var rval=_1e2.iterateNext();
1590 if(rval===null||rval===undefined){
1591 throw MochiKit.Iter.StopIteration;
1592 }
1593 return rval;
1594 }};
1595 }});
1596 MochiKit.Iter.EXPORT_OK=["iteratorRegistry","arrayLikeIter","hasIterateNext","iterateNextIter",];
1597 MochiKit.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"];
1598 MochiKit.Iter.__new__=function(){
1599 var m=MochiKit.Base;
1600 if(typeof (StopIteration)!="undefined"){
1601 this.StopIteration=StopIteration;
1602 }else{
1603 this.StopIteration=new m.NamedError("StopIteration");
1604 }
1605 this.iteratorRegistry=new m.AdapterRegistry();
1606 this.registerIteratorFactory("arrayLike",m.isArrayLike,this.arrayLikeIter);
1607 this.registerIteratorFactory("iterateNext",this.hasIterateNext,this.iterateNextIter);
1608 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
1609 m.nameFunctions(this);
1610 };
1611 MochiKit.Iter.__new__();
1612 if(MochiKit.__export__){
1613 reduce=MochiKit.Iter.reduce;
1614 }
1615 MochiKit.Base._exportSymbols(this,MochiKit.Iter);
1616 if(typeof (dojo)!="undefined"){
1617 dojo.provide("MochiKit.Logging");
1618 dojo.require("MochiKit.Base");
1619 }
1620 if(typeof (JSAN)!="undefined"){
1621 JSAN.use("MochiKit.Base",[]);
1622 }
1623 try{
1624 if(typeof (MochiKit.Base)=="undefined"){
1625 throw "";
1626 }
1627 }
1628 catch(e){
1629 throw "MochiKit.Logging depends on MochiKit.Base!";
1630 }
1631 if(typeof (MochiKit.Logging)=="undefined"){
1632 MochiKit.Logging={};
1633 }
1634 MochiKit.Logging.NAME="MochiKit.Logging";
1635 MochiKit.Logging.VERSION="1.4";
1636 MochiKit.Logging.__repr__=function(){
1637 return "["+this.NAME+" "+this.VERSION+"]";
1638 };
1639 MochiKit.Logging.toString=function(){
1640 return this.__repr__();
1641 };
1642 MochiKit.Logging.EXPORT=["LogLevel","LogMessage","Logger","alertListener","logger","log","logError","logDebug","logFatal","logWarning"];
1643 MochiKit.Logging.EXPORT_OK=["logLevelAtLeast","isLogMessage","compareLogMessage"];
1644 MochiKit.Logging.LogMessage=function(num,_1e6,info){
1645 this.num=num;
1646 this.level=_1e6;
1647 this.info=info;
1648 this.timestamp=new Date();
1649 };
1650 MochiKit.Logging.LogMessage.prototype={repr:function(){
1651 var m=MochiKit.Base;
1652 return "LogMessage("+m.map(m.repr,[this.num,this.level,this.info]).join(", ")+")";
1653 },toString:MochiKit.Base.forwardCall("repr")};
1654 MochiKit.Base.update(MochiKit.Logging,{logLevelAtLeast:function(_1e9){
1655 var self=MochiKit.Logging;
1656 if(typeof (_1e9)=="string"){
1657 _1e9=self.LogLevel[_1e9];
1658 }
1659 return function(msg){
1660 var _1ec=msg.level;
1661 if(typeof (_1ec)=="string"){
1662 _1ec=self.LogLevel[_1ec];
1663 }
1664 return _1ec>=_1e9;
1665 };
1666 },isLogMessage:function(){
1667 var _1ed=MochiKit.Logging.LogMessage;
1668 for(var i=0;i<arguments.length;i++){
1669 if(!(arguments[i] instanceof _1ed)){
1670 return false;
1671 }
1672 }
1673 return true;
1674 },compareLogMessage:function(a,b){
1675 return MochiKit.Base.compare([a.level,a.info],[b.level,b.info]);
1676 },alertListener:function(msg){
1677 alert("num: "+msg.num+"\nlevel: "+msg.level+"\ninfo: "+msg.info.join(" "));
1678 }});
1679 MochiKit.Logging.Logger=function(_1f2){
1680 this.counter=0;
1681 if(typeof (_1f2)=="undefined"||_1f2===null){
1682 _1f2=-1;
1683 }
1684 this.maxSize=_1f2;
1685 this._messages=[];
1686 this.listeners={};
1687 this.useNativeConsole=false;
1688 };
1689 MochiKit.Logging.Logger.prototype={clear:function(){
1690 this._messages.splice(0,this._messages.length);
1691 },logToConsole:function(msg){
1692 if(typeof (window)!="undefined"&&window.console&&window.console.log){
1693 window.console.log(msg.replace(/%/g,"\uff05"));
1694 }else{
1695 if(typeof (opera)!="undefined"&&opera.postError){
1696 opera.postError(msg);
1697 }else{
1698 if(typeof (printfire)=="function"){
1699 printfire(msg);
1700 }else{
1701 if(typeof (Debug)!="undefined"&&Debug.writeln){
1702 Debug.writeln(msg);
1703 }else{
1704 if(typeof (debug)!="undefined"&&debug.trace){
1705 debug.trace(msg);
1706 }
1707 }
1708 }
1709 }
1710 }
1711 },dispatchListeners:function(msg){
1712 for(var k in this.listeners){
1713 var pair=this.listeners[k];
1714 if(pair.ident!=k||(pair[0]&&!pair[0](msg))){
1715 continue;
1716 }
1717 pair[1](msg);
1718 }
1719 },addListener:function(_1f7,_1f8,_1f9){
1720 if(typeof (_1f8)=="string"){
1721 _1f8=MochiKit.Logging.logLevelAtLeast(_1f8);
1722 }
1723 var _1fa=[_1f8,_1f9];
1724 _1fa.ident=_1f7;
1725 this.listeners[_1f7]=_1fa;
1726 },removeListener:function(_1fb){
1727 delete this.listeners[_1fb];
1728 },baseLog:function(_1fc,_1fd){
1729 var msg=new MochiKit.Logging.LogMessage(this.counter,_1fc,MochiKit.Base.extend(null,arguments,1));
1730 this._messages.push(msg);
1731 this.dispatchListeners(msg);
1732 if(this.useNativeConsole){
1733 this.logToConsole(msg.level+": "+msg.info.join(" "));
1734 }
1735 this.counter+=1;
1736 while(this.maxSize>=0&&this._messages.length>this.maxSize){
1737 this._messages.shift();
1738 }
1739 },getMessages:function(_1ff){
1740 var _200=0;
1741 if(!(typeof (_1ff)=="undefined"||_1ff===null)){
1742 _200=Math.max(0,this._messages.length-_1ff);
1743 }
1744 return this._messages.slice(_200);
1745 },getMessageText:function(_201){
1746 if(typeof (_201)=="undefined"||_201===null){
1747 _201=30;
1748 }
1749 var _202=this.getMessages(_201);
1750 if(_202.length){
1751 var lst=map(function(m){
1752 return "\n ["+m.num+"] "+m.level+": "+m.info.join(" ");
1753 },_202);
1754 lst.unshift("LAST "+_202.length+" MESSAGES:");
1755 return lst.join("");
1756 }
1757 return "";
1758 },debuggingBookmarklet:function(_205){
1759 if(typeof (MochiKit.LoggingPane)=="undefined"){
1760 alert(this.getMessageText());
1761 }else{
1762 MochiKit.LoggingPane.createLoggingPane(_205||false);
1763 }
1764 }};
1765 MochiKit.Logging.__new__=function(){
1766 this.LogLevel={ERROR:40,FATAL:50,WARNING:30,INFO:20,DEBUG:10};
1767 var m=MochiKit.Base;
1768 m.registerComparator("LogMessage",this.isLogMessage,this.compareLogMessage);
1769 var _207=m.partial;
1770 var _208=this.Logger;
1771 var _209=_208.prototype.baseLog;
1772 m.update(this.Logger.prototype,{debug:_207(_209,"DEBUG"),log:_207(_209,"INFO"),error:_207(_209,"ERROR"),fatal:_207(_209,"FATAL"),warning:_207(_209,"WARNING")});
1773 var self=this;
1774 var _20b=function(name){
1775 return function(){
1776 self.logger[name].apply(self.logger,arguments);
1777 };
1778 };
1779 this.log=_20b("log");
1780 this.logError=_20b("error");
1781 this.logDebug=_20b("debug");
1782 this.logFatal=_20b("fatal");
1783 this.logWarning=_20b("warning");
1784 this.logger=new _208();
1785 this.logger.useNativeConsole=true;
1786 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
1787 m.nameFunctions(this);
1788 };
1789 if(typeof (printfire)=="undefined"&&typeof (document)!="undefined"&&document.createEvent&&typeof (dispatchEvent)!="undefined"){
1790 printfire=function(){
1791 printfire.args=arguments;
1792 var ev=document.createEvent("Events");
1793 ev.initEvent("printfire",false,true);
1794 dispatchEvent(ev);
1795 };
1796 }
1797 MochiKit.Logging.__new__();
1798 MochiKit.Base._exportSymbols(this,MochiKit.Logging);
1799 if(typeof (dojo)!="undefined"){
1800 dojo.provide("MochiKit.DateTime");
1801 }
1802 if(typeof (MochiKit)=="undefined"){
1803 MochiKit={};
1804 }
1805 if(typeof (MochiKit.DateTime)=="undefined"){
1806 MochiKit.DateTime={};
1807 }
1808 MochiKit.DateTime.NAME="MochiKit.DateTime";
1809 MochiKit.DateTime.VERSION="1.4";
1810 MochiKit.DateTime.__repr__=function(){
1811 return "["+this.NAME+" "+this.VERSION+"]";
1812 };
1813 MochiKit.DateTime.toString=function(){
1814 return this.__repr__();
1815 };
1816 MochiKit.DateTime.isoDate=function(str){
1817 str=str+"";
1818 if(typeof (str)!="string"||str.length===0){
1819 return null;
1820 }
1821 var iso=str.split("-");
1822 if(iso.length===0){
1823 return null;
1824 }
1825 return new Date(iso[0],iso[1]-1,iso[2]);
1826 };
1827 MochiKit.DateTime._isoRegexp=/(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/;
1828 MochiKit.DateTime.isoTimestamp=function(str){
1829 str=str+"";
1830 if(typeof (str)!="string"||str.length===0){
1831 return null;
1832 }
1833 var res=str.match(MochiKit.DateTime._isoRegexp);
1834 if(typeof (res)=="undefined"||res===null){
1835 return null;
1836 }
1837 var year,_213,day,hour,min,sec,msec;
1838 year=parseInt(res[1],10);
1839 if(typeof (res[2])=="undefined"||res[2]===""){
1840 return new Date(year);
1841 }
1842 _213=parseInt(res[2],10)-1;
1843 day=parseInt(res[3],10);
1844 if(typeof (res[4])=="undefined"||res[4]===""){
1845 return new Date(year,_213,day);
1846 }
1847 hour=parseInt(res[4],10);
1848 min=parseInt(res[5],10);
1849 sec=(typeof (res[6])!="undefined"&&res[6]!=="")?parseInt(res[6],10):0;
1850 if(typeof (res[7])!="undefined"&&res[7]!==""){
1851 msec=Math.round(1000*parseFloat("0."+res[7]));
1852 }else{
1853 msec=0;
1854 }
1855 if((typeof (res[8])=="undefined"||res[8]==="")&&(typeof (res[9])=="undefined"||res[9]==="")){
1856 return new Date(year,_213,day,hour,min,sec,msec);
1857 }
1858 var ofs;
1859 if(typeof (res[9])!="undefined"&&res[9]!==""){
1860 ofs=parseInt(res[10],10)*3600000;
1861 if(typeof (res[11])!="undefined"&&res[11]!==""){
1862 ofs+=parseInt(res[11],10)*60000;
1863 }
1864 if(res[9]=="-"){
1865 ofs=-ofs;
1866 }
1867 }else{
1868 ofs=0;
1869 }
1870 return new Date(Date.UTC(year,_213,day,hour,min,sec,msec)-ofs);
1871 };
1872 MochiKit.DateTime.toISOTime=function(date,_21b){
1873 if(typeof (date)=="undefined"||date===null){
1874 return null;
1875 }
1876 var hh=date.getHours();
1877 var mm=date.getMinutes();
1878 var ss=date.getSeconds();
1879 var lst=[((_21b&&(hh<10))?"0"+hh:hh),((mm<10)?"0"+mm:mm),((ss<10)?"0"+ss:ss)];
1880 return lst.join(":");
1881 };
1882 MochiKit.DateTime.toISOTimestamp=function(date,_221){
1883 if(typeof (date)=="undefined"||date===null){
1884 return null;
1885 }
1886 var sep=_221?"T":" ";
1887 var foot=_221?"Z":"";
1888 if(_221){
1889 date=new Date(date.getTime()+(date.getTimezoneOffset()*60000));
1890 }
1891 return MochiKit.DateTime.toISODate(date)+sep+MochiKit.DateTime.toISOTime(date,_221)+foot;
1892 };
1893 MochiKit.DateTime.toISODate=function(date){
1894 if(typeof (date)=="undefined"||date===null){
1895 return null;
1896 }
1897 var _225=MochiKit.DateTime._padTwo;
1898 return [date.getFullYear(),_225(date.getMonth()+1),_225(date.getDate())].join("-");
1899 };
1900 MochiKit.DateTime.americanDate=function(d){
1901 d=d+"";
1902 if(typeof (d)!="string"||d.length===0){
1903 return null;
1904 }
1905 var a=d.split("/");
1906 return new Date(a[2],a[0]-1,a[1]);
1907 };
1908 MochiKit.DateTime._padTwo=function(n){
1909 return (n>9)?n:"0"+n;
1910 };
1911 MochiKit.DateTime.toPaddedAmericanDate=function(d){
1912 if(typeof (d)=="undefined"||d===null){
1913 return null;
1914 }
1915 var _22a=MochiKit.DateTime._padTwo;
1916 return [_22a(d.getMonth()+1),_22a(d.getDate()),d.getFullYear()].join("/");
1917 };
1918 MochiKit.DateTime.toAmericanDate=function(d){
1919 if(typeof (d)=="undefined"||d===null){
1920 return null;
1921 }
1922 return [d.getMonth()+1,d.getDate(),d.getFullYear()].join("/");
1923 };
1924 MochiKit.DateTime.EXPORT=["isoDate","isoTimestamp","toISOTime","toISOTimestamp","toISODate","americanDate","toPaddedAmericanDate","toAmericanDate"];
1925 MochiKit.DateTime.EXPORT_OK=[];
1926 MochiKit.DateTime.EXPORT_TAGS={":common":MochiKit.DateTime.EXPORT,":all":MochiKit.DateTime.EXPORT};
1927 MochiKit.DateTime.__new__=function(){
1928 var base=this.NAME+".";
1929 for(var k in this){
1930 var o=this[k];
1931 if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
1932 try{
1933 o.NAME=base+k;
1934 }
1935 catch(e){
1936 }
1937 }
1938 }
1939 };
1940 MochiKit.DateTime.__new__();
1941 if(typeof (MochiKit.Base)!="undefined"){
1942 MochiKit.Base._exportSymbols(this,MochiKit.DateTime);
1943 }else{
1944 (function(_22f,_230){
1945 if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){
1946 var all=_230.EXPORT_TAGS[":all"];
1947 for(var i=0;i<all.length;i++){
1948 _22f[all[i]]=_230[all[i]];
1949 }
1950 }
1951 })(this,MochiKit.DateTime);
1952 }
1953 if(typeof (dojo)!="undefined"){
1954 dojo.provide("MochiKit.Format");
1955 }
1956 if(typeof (MochiKit)=="undefined"){
1957 MochiKit={};
1958 }
1959 if(typeof (MochiKit.Format)=="undefined"){
1960 MochiKit.Format={};
1961 }
1962 MochiKit.Format.NAME="MochiKit.Format";
1963 MochiKit.Format.VERSION="1.4";
1964 MochiKit.Format.__repr__=function(){
1965 return "["+this.NAME+" "+this.VERSION+"]";
1966 };
1967 MochiKit.Format.toString=function(){
1968 return this.__repr__();
1969 };
1970 MochiKit.Format._numberFormatter=function(_233,_234,_235,_236,_237,_238,_239,_23a,_23b){
1971 return function(num){
1972 num=parseFloat(num);
1973 if(typeof (num)=="undefined"||num===null||isNaN(num)){
1974 return _233;
1975 }
1976 var _23d=_234;
1977 var _23e=_235;
1978 if(num<0){
1979 num=-num;
1980 }else{
1981 _23d=_23d.replace(/-/,"");
1982 }
1983 var me=arguments.callee;
1984 var fmt=MochiKit.Format.formatLocale(_236);
1985 if(_237){
1986 num=num*100;
1987 _23e=fmt.percent+_23e;
1988 }
1989 num=MochiKit.Format.roundToFixed(num,_238);
1990 var _241=num.split(/\./);
1991 var _242=_241[0];
1992 var frac=(_241.length==1)?"":_241[1];
1993 var res="";
1994 while(_242.length<_239){
1995 _242="0"+_242;
1996 }
1997 if(_23a){
1998 while(_242.length>_23a){
1999 var i=_242.length-_23a;
2000 res=fmt.separator+_242.substring(i,_242.length)+res;
2001 _242=_242.substring(0,i);
2002 }
2003 }
2004 res=_242+res;
2005 if(_238>0){
2006 while(frac.length<_23b){
2007 frac=frac+"0";
2008 }
2009 res=res+fmt.decimal+frac;
2010 }
2011 return _23d+res+_23e;
2012 };
2013 };
2014 MochiKit.Format.numberFormatter=function(_246,_247,_248){
2015 if(typeof (_247)=="undefined"){
2016 _247="";
2017 }
2018 var _249=_246.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
2019 if(!_249){
2020 throw TypeError("Invalid pattern");
2021 }
2022 var _24a=_246.substr(0,_249.index);
2023 var _24b=_246.substr(_249.index+_249[0].length);
2024 if(_24a.search(/-/)==-1){
2025 _24a=_24a+"-";
2026 }
2027 var _24c=_249[1];
2028 var frac=(typeof (_249[2])=="string"&&_249[2]!="")?_249[2]:"";
2029 var _24e=(typeof (_249[3])=="string"&&_249[3]!="");
2030 var tmp=_24c.split(/,/);
2031 var _250;
2032 if(typeof (_248)=="undefined"){
2033 _248="default";
2034 }
2035 if(tmp.length==1){
2036 _250=null;
2037 }else{
2038 _250=tmp[1].length;
2039 }
2040 var _251=_24c.length-_24c.replace(/0/g,"").length;
2041 var _252=frac.length-frac.replace(/0/g,"").length;
2042 var _253=frac.length;
2043 var rval=MochiKit.Format._numberFormatter(_247,_24a,_24b,_248,_24e,_253,_251,_250,_252);
2044 var m=MochiKit.Base;
2045 if(m){
2046 var fn=arguments.callee;
2047 var args=m.concat(arguments);
2048 rval.repr=function(){
2049 return [self.NAME,"(",map(m.repr,args).join(", "),")"].join("");
2050 };
2051 }
2052 return rval;
2053 };
2054 MochiKit.Format.formatLocale=function(_258){
2055 if(typeof (_258)=="undefined"||_258===null){
2056 _258="default";
2057 }
2058 if(typeof (_258)=="string"){
2059 var rval=MochiKit.Format.LOCALE[_258];
2060 if(typeof (rval)=="string"){
2061 rval=arguments.callee(rval);
2062 MochiKit.Format.LOCALE[_258]=rval;
2063 }
2064 return rval;
2065 }else{
2066 return _258;
2067 }
2068 };
2069 MochiKit.Format.twoDigitAverage=function(_25a,_25b){
2070 if(_25b){
2071 var res=_25a/_25b;
2072 if(!isNaN(res)){
2073 return MochiKit.Format.twoDigitFloat(_25a/_25b);
2074 }
2075 }
2076 return "0";
2077 };
2078 MochiKit.Format.twoDigitFloat=function(_25d){
2079 var sign=(_25d<0?"-":"");
2080 var s=Math.floor(Math.abs(_25d)*100).toString();
2081 if(s=="0"){
2082 return s;
2083 }
2084 if(s.length<3){
2085 while(s.charAt(s.length-1)=="0"){
2086 s=s.substring(0,s.length-1);
2087 }
2088 return sign+"0."+s;
2089 }
2090 var head=sign+s.substring(0,s.length-2);
2091 var tail=s.substring(s.length-2,s.length);
2092 if(tail=="00"){
2093 return head;
2094 }else{
2095 if(tail.charAt(1)=="0"){
2096 return head+"."+tail.charAt(0);
2097 }else{
2098 return head+"."+tail;
2099 }
2100 }
2101 };
2102 MochiKit.Format.lstrip=function(str,_263){
2103 str=str+"";
2104 if(typeof (str)!="string"){
2105 return null;
2106 }
2107 if(!_263){
2108 return str.replace(/^\s+/,"");
2109 }else{
2110 return str.replace(new RegExp("^["+_263+"]+"),"");
2111 }
2112 };
2113 MochiKit.Format.rstrip=function(str,_265){
2114 str=str+"";
2115 if(typeof (str)!="string"){
2116 return null;
2117 }
2118 if(!_265){
2119 return str.replace(/\s+$/,"");
2120 }else{
2121 return str.replace(new RegExp("["+_265+"]+$"),"");
2122 }
2123 };
2124 MochiKit.Format.strip=function(str,_267){
2125 var self=MochiKit.Format;
2126 return self.rstrip(self.lstrip(str,_267),_267);
2127 };
2128 MochiKit.Format.truncToFixed=function(_269,_26a){
2129 _269=Math.floor(_269*Math.pow(10,_26a));
2130 var res=(_269*Math.pow(10,-_26a)).toFixed(_26a);
2131 if(res.charAt(0)=="."){
2132 res="0"+res;
2133 }
2134 return res;
2135 };
2136 MochiKit.Format.roundToFixed=function(_26c,_26d){
2137 return MochiKit.Format.truncToFixed(_26c+0.5*Math.pow(10,-_26d),_26d);
2138 };
2139 MochiKit.Format.percentFormat=function(_26e){
2140 return MochiKit.Format.twoDigitFloat(100*_26e)+"%";
2141 };
2142 MochiKit.Format.EXPORT=["truncToFixed","roundToFixed","numberFormatter","formatLocale","twoDigitAverage","twoDigitFloat","percentFormat","lstrip","rstrip","strip"];
2143 MochiKit.Format.LOCALE={en_US:{separator:",",decimal:".",percent:"%"},de_DE:{separator:".",decimal:",",percent:"%"},fr_FR:{separator:" ",decimal:",",percent:"%"},"default":"en_US"};
2144 MochiKit.Format.EXPORT_OK=[];
2145 MochiKit.Format.EXPORT_TAGS={":all":MochiKit.Format.EXPORT,":common":MochiKit.Format.EXPORT};
2146 MochiKit.Format.__new__=function(){
2147 var base=this.NAME+".";
2148 var k,v,o;
2149 for(k in this.LOCALE){
2150 o=this.LOCALE[k];
2151 if(typeof (o)=="object"){
2152 o.repr=function(){
2153 return this.NAME;
2154 };
2155 o.NAME=base+"LOCALE."+k;
2156 }
2157 }
2158 for(k in this){
2159 o=this[k];
2160 if(typeof (o)=="function"&&typeof (o.NAME)=="undefined"){
2161 try{
2162 o.NAME=base+k;
2163 }
2164 catch(e){
2165 }
2166 }
2167 }
2168 };
2169 MochiKit.Format.__new__();
2170 if(typeof (MochiKit.Base)!="undefined"){
2171 MochiKit.Base._exportSymbols(this,MochiKit.Format);
2172 }else{
2173 (function(_273,_274){
2174 if((typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined")||(MochiKit.__export__===false)){
2175 var all=_274.EXPORT_TAGS[":all"];
2176 for(var i=0;i<all.length;i++){
2177 _273[all[i]]=_274[all[i]];
2178 }
2179 }
2180 })(this,MochiKit.Format);
2181 }
2182 if(typeof (dojo)!="undefined"){
2183 dojo.provide("MochiKit.Async");
2184 dojo.require("MochiKit.Base");
2185 }
2186 if(typeof (JSAN)!="undefined"){
2187 JSAN.use("MochiKit.Base",[]);
2188 }
2189 try{
2190 if(typeof (MochiKit.Base)=="undefined"){
2191 throw "";
2192 }
2193 }
2194 catch(e){
2195 throw "MochiKit.Async depends on MochiKit.Base!";
2196 }
2197 if(typeof (MochiKit.Async)=="undefined"){
2198 MochiKit.Async={};
2199 }
2200 MochiKit.Async.NAME="MochiKit.Async";
2201 MochiKit.Async.VERSION="1.4";
2202 MochiKit.Async.__repr__=function(){
2203 return "["+this.NAME+" "+this.VERSION+"]";
2204 };
2205 MochiKit.Async.toString=function(){
2206 return this.__repr__();
2207 };
2208 MochiKit.Async.Deferred=function(_277){
2209 this.chain=[];
2210 this.id=this._nextId();
2211 this.fired=-1;
2212 this.paused=0;
2213 this.results=[null,null];
2214 this.canceller=_277;
2215 this.silentlyCancelled=false;
2216 this.chained=false;
2217 };
2218 MochiKit.Async.Deferred.prototype={repr:function(){
2219 var _278;
2220 if(this.fired==-1){
2221 _278="unfired";
2222 }else{
2223 if(this.fired===0){
2224 _278="success";
2225 }else{
2226 _278="error";
2227 }
2228 }
2229 return "Deferred("+this.id+", "+_278+")";
2230 },toString:MochiKit.Base.forwardCall("repr"),_nextId:MochiKit.Base.counter(),cancel:function(){
2231 var self=MochiKit.Async;
2232 if(this.fired==-1){
2233 if(this.canceller){
2234 this.canceller(this);
2235 }else{
2236 this.silentlyCancelled=true;
2237 }
2238 if(this.fired==-1){
2239 this.errback(new self.CancelledError(this));
2240 }
2241 }else{
2242 if((this.fired===0)&&(this.results[0] instanceof self.Deferred)){
2243 this.results[0].cancel();
2244 }
2245 }
2246 },_resback:function(res){
2247 this.fired=((res instanceof Error)?1:0);
2248 this.results[this.fired]=res;
2249 this._fire();
2250 },_check:function(){
2251 if(this.fired!=-1){
2252 if(!this.silentlyCancelled){
2253 throw new MochiKit.Async.AlreadyCalledError(this);
2254 }
2255 this.silentlyCancelled=false;
2256 return;
2257 }
2258 },callback:function(res){
2259 this._check();
2260 if(res instanceof MochiKit.Async.Deferred){
2261 throw new Error("Deferred instances can only be chained if they are the result of a callback");
2262 }
2263 this._resback(res);
2264 },errback:function(res){
2265 this._check();
2266 var self=MochiKit.Async;
2267 if(res instanceof self.Deferred){
2268 throw new Error("Deferred instances can only be chained if they are the result of a callback");
2269 }
2270 if(!(res instanceof Error)){
2271 res=new self.GenericError(res);
2272 }
2273 this._resback(res);
2274 },addBoth:function(fn){
2275 if(arguments.length>1){
2276 fn=MochiKit.Base.partial.apply(null,arguments);
2277 }
2278 return this.addCallbacks(fn,fn);
2279 },addCallback:function(fn){
2280 if(arguments.length>1){
2281 fn=MochiKit.Base.partial.apply(null,arguments);
2282 }
2283 return this.addCallbacks(fn,null);
2284 },addErrback:function(fn){
2285 if(arguments.length>1){
2286 fn=MochiKit.Base.partial.apply(null,arguments);
2287 }
2288 return this.addCallbacks(null,fn);
2289 },addCallbacks:function(cb,eb){
2290 if(this.chained){
2291 throw new Error("Chained Deferreds can not be re-used");
2292 }
2293 this.chain.push([cb,eb]);
2294 if(this.fired>=0){
2295 this._fire();
2296 }
2297 return this;
2298 },_fire:function(){
2299 var _283=this.chain;
2300 var _284=this.fired;
2301 var res=this.results[_284];
2302 var self=this;
2303 var cb=null;
2304 while(_283.length>0&&this.paused===0){
2305 var pair=_283.shift();
2306 var f=pair[_284];
2307 if(f===null){
2308 continue;
2309 }
2310 try{
2311 res=f(res);
2312 _284=((res instanceof Error)?1:0);
2313 if(res instanceof MochiKit.Async.Deferred){
2314 cb=function(res){
2315 self._resback(res);
2316 self.paused--;
2317 if((self.paused===0)&&(self.fired>=0)){
2318 self._fire();
2319 }
2320 };
2321 this.paused++;
2322 }
2323 }
2324 catch(err){
2325 _284=1;
2326 if(!(err instanceof Error)){
2327 err=new MochiKit.Async.GenericError(err);
2328 }
2329 res=err;
2330 }
2331 }
2332 this.fired=_284;
2333 this.results[_284]=res;
2334 if(cb&&this.paused){
2335 res.addBoth(cb);
2336 res.chained=true;
2337 }
2338 }};
2339 MochiKit.Base.update(MochiKit.Async,{evalJSONRequest:function(){
2340 return eval("("+arguments[0].responseText+")");
2341 },succeed:function(_28b){
2342 var d=new MochiKit.Async.Deferred();
2343 d.callback.apply(d,arguments);
2344 return d;
2345 },fail:function(_28d){
2346 var d=new MochiKit.Async.Deferred();
2347 d.errback.apply(d,arguments);
2348 return d;
2349 },getXMLHttpRequest:function(){
2350 var self=arguments.callee;
2351 if(!self.XMLHttpRequest){
2352 var _290=[function(){
2353 return new XMLHttpRequest();
2354 },function(){
2355 return new ActiveXObject("Msxml2.XMLHTTP");
2356 },function(){
2357 return new ActiveXObject("Microsoft.XMLHTTP");
2358 },function(){
2359 return new ActiveXObject("Msxml2.XMLHTTP.4.0");
2360 },function(){
2361 throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
2362 }];
2363 for(var i=0;i<_290.length;i++){
2364 var func=_290[i];
2365 try{
2366 self.XMLHttpRequest=func;
2367 return func();
2368 }
2369 catch(e){
2370 }
2371 }
2372 }
2373 return self.XMLHttpRequest();
2374 },_xhr_onreadystatechange:function(d){
2375 var m=MochiKit.Base;
2376 if(this.readyState==4){
2377 try{
2378 this.onreadystatechange=null;
2379 }
2380 catch(e){
2381 try{
2382 this.onreadystatechange=m.noop;
2383 }
2384 catch(e){
2385 }
2386 }
2387 var _295=null;
2388 try{
2389 _295=this.status;
2390 if(!_295&&m.isNotEmpty(this.responseText)){
2391 _295=304;
2392 }
2393 }
2394 catch(e){
2395 }
2396 if(_295==200||_295==201||_295==204||_295==304||_295==1223){
2397 d.callback(this);
2398 }else{
2399 var err=new MochiKit.Async.XMLHttpRequestError(this,"Request failed");
2400 if(err.number){
2401 d.errback(err);
2402 }else{
2403 d.errback(err);
2404 }
2405 }
2406 }
2407 },_xhr_canceller:function(req){
2408 try{
2409 req.onreadystatechange=null;
2410 }
2411 catch(e){
2412 try{
2413 req.onreadystatechange=MochiKit.Base.noop;
2414 }
2415 catch(e){
2416 }
2417 }
2418 req.abort();
2419 },sendXMLHttpRequest:function(req,_299){
2420 if(typeof (_299)=="undefined"||_299===null){
2421 _299="";
2422 }
2423 var m=MochiKit.Base;
2424 var self=MochiKit.Async;
2425 var d=new self.Deferred(m.partial(self._xhr_canceller,req));
2426 try{
2427 req.onreadystatechange=m.bind(self._xhr_onreadystatechange,req,d);
2428 req.send(_299);
2429 }
2430 catch(e){
2431 try{
2432 req.onreadystatechange=null;
2433 }
2434 catch(ignore){
2435 }
2436 d.errback(e);
2437 }
2438 return d;
2439 },doXHR:function(url,opts){
2440 var self=MochiKit.Async;
2441 return self.callLater(0,self._doXHR,url,opts);
2442 },_doXHR:function(url,opts){
2443 var m=MochiKit.Base;
2444 opts=m.update({method:"GET",sendContent:""},opts);
2445 var self=MochiKit.Async;
2446 var req=self.getXMLHttpRequest();
2447 if(opts.queryString){
2448 var qs=m.queryString(opts.queryString);
2449 if(qs){
2450 url+="?"+qs;
2451 }
2452 }
2453 if("username" in opts){
2454 req.open(opts.method,url,true,opts.username,opts.password);
2455 }else{
2456 req.open(opts.method,url,true);
2457 }
2458 if(req.overrideMimeType&&opts.mimeType){
2459 req.overrideMimeType(opts.mimeType);
2460 }
2461 if(opts.headers){
2462 var _2a6=opts.headers;
2463 if(!m.isArrayLike(_2a6)){
2464 _2a6=m.items(_2a6);
2465 }
2466 for(var i=0;i<_2a6.length;i++){
2467 var _2a8=_2a6[i];
2468 var name=_2a8[0];
2469 var _2aa=_2a8[1];
2470 req.setRequestHeader(name,_2aa);
2471 }
2472 }
2473 return self.sendXMLHttpRequest(req,opts.sendContent);
2474 },_buildURL:function(url){
2475 if(arguments.length>1){
2476 var m=MochiKit.Base;
2477 var qs=m.queryString.apply(null,m.extend(null,arguments,1));
2478 if(qs){
2479 return url+"?"+qs;
2480 }
2481 }
2482 return url;
2483 },doSimpleXMLHttpRequest:function(url){
2484 var self=MochiKit.Async;
2485 url=self._buildURL.apply(self,arguments);
2486 return self.doXHR(url);
2487 },loadJSONDoc:function(url){
2488 var self=MochiKit.Async;
2489 url=self._buildURL.apply(self,arguments);
2490 var d=self.doXHR(url,{"mimeType":"text/plain","headers":[["Accept","application/json"]]});
2491 d=d.addCallback(self.evalJSONRequest);
2492 return d;
2493 },wait:function(_2b3,_2b4){
2494 var d=new MochiKit.Async.Deferred();
2495 var m=MochiKit.Base;
2496 if(typeof (_2b4)!="undefined"){
2497 d.addCallback(function(){
2498 return _2b4;
2499 });
2500 }
2501 var _2b7=setTimeout(m.bind("callback",d),Math.floor(_2b3*1000));
2502 d.canceller=function(){
2503 try{
2504 clearTimeout(_2b7);
2505 }
2506 catch(e){
2507 }
2508 };
2509 return d;
2510 },callLater:function(_2b8,func){
2511 var m=MochiKit.Base;
2512 var _2bb=m.partial.apply(m,m.extend(null,arguments,1));
2513 return MochiKit.Async.wait(_2b8).addCallback(function(res){
2514 return _2bb();
2515 });
2516 }});
2517 MochiKit.Async.DeferredLock=function(){
2518 this.waiting=[];
2519 this.locked=false;
2520 this.id=this._nextId();
2521 };
2522 MochiKit.Async.DeferredLock.prototype={__class__:MochiKit.Async.DeferredLock,acquire:function(){
2523 var d=new MochiKit.Async.Deferred();
2524 if(this.locked){
2525 this.waiting.push(d);
2526 }else{
2527 this.locked=true;
2528 d.callback(this);
2529 }
2530 return d;
2531 },release:function(){
2532 if(!this.locked){
2533 throw TypeError("Tried to release an unlocked DeferredLock");
2534 }
2535 this.locked=false;
2536 if(this.waiting.length>0){
2537 this.locked=true;
2538 this.waiting.shift().callback(this);
2539 }
2540 },_nextId:MochiKit.Base.counter(),repr:function(){
2541 var _2be;
2542 if(this.locked){
2543 _2be="locked, "+this.waiting.length+" waiting";
2544 }else{
2545 _2be="unlocked";
2546 }
2547 return "DeferredLock("+this.id+", "+_2be+")";
2548 },toString:MochiKit.Base.forwardCall("repr")};
2549 MochiKit.Async.DeferredList=function(list,_2c0,_2c1,_2c2,_2c3){
2550 MochiKit.Async.Deferred.apply(this,[_2c3]);
2551 this.list=list;
2552 var _2c4=[];
2553 this.resultList=_2c4;
2554 this.finishedCount=0;
2555 this.fireOnOneCallback=_2c0;
2556 this.fireOnOneErrback=_2c1;
2557 this.consumeErrors=_2c2;
2558 var cb=MochiKit.Base.bind(this._cbDeferred,this);
2559 for(var i=0;i<list.length;i++){
2560 var d=list[i];
2561 _2c4.push(undefined);
2562 d.addCallback(cb,i,true);
2563 d.addErrback(cb,i,false);
2564 }
2565 if(list.length===0&&!_2c0){
2566 this.callback(this.resultList);
2567 }
2568 };
2569 MochiKit.Async.DeferredList.prototype=new MochiKit.Async.Deferred();
2570 MochiKit.Async.DeferredList.prototype._cbDeferred=function(_2c8,_2c9,_2ca){
2571 this.resultList[_2c8]=[_2c9,_2ca];
2572 this.finishedCount+=1;
2573 if(this.fired==-1){
2574 if(_2c9&&this.fireOnOneCallback){
2575 this.callback([_2c8,_2ca]);
2576 }else{
2577 if(!_2c9&&this.fireOnOneErrback){
2578 this.errback(_2ca);
2579 }else{
2580 if(this.finishedCount==this.list.length){
2581 this.callback(this.resultList);
2582 }
2583 }
2584 }
2585 }
2586 if(!_2c9&&this.consumeErrors){
2587 _2ca=null;
2588 }
2589 return _2ca;
2590 };
2591 MochiKit.Async.gatherResults=function(_2cb){
2592 var d=new MochiKit.Async.DeferredList(_2cb,false,true,false);
2593 d.addCallback(function(_2cd){
2594 var ret=[];
2595 for(var i=0;i<_2cd.length;i++){
2596 ret.push(_2cd[i][1]);
2597 }
2598 return ret;
2599 });
2600 return d;
2601 };
2602 MochiKit.Async.maybeDeferred=function(func){
2603 var self=MochiKit.Async;
2604 var _2d2;
2605 try{
2606 var r=func.apply(null,MochiKit.Base.extend([],arguments,1));
2607 if(r instanceof self.Deferred){
2608 _2d2=r;
2609 }else{
2610 if(r instanceof Error){
2611 _2d2=self.fail(r);
2612 }else{
2613 _2d2=self.succeed(r);
2614 }
2615 }
2616 }
2617 catch(e){
2618 _2d2=self.fail(e);
2619 }
2620 return _2d2;
2621 };
2622 MochiKit.Async.EXPORT=["AlreadyCalledError","CancelledError","BrowserComplianceError","GenericError","XMLHttpRequestError","Deferred","succeed","fail","getXMLHttpRequest","doSimpleXMLHttpRequest","loadJSONDoc","wait","callLater","sendXMLHttpRequest","DeferredLock","DeferredList","gatherResults","maybeDeferred","doXHR"];
2623 MochiKit.Async.EXPORT_OK=["evalJSONRequest"];
2624 MochiKit.Async.__new__=function(){
2625 var m=MochiKit.Base;
2626 var ne=m.partial(m._newNamedError,this);
2627 ne("AlreadyCalledError",function(_2d6){
2628 this.deferred=_2d6;
2629 });
2630 ne("CancelledError",function(_2d7){
2631 this.deferred=_2d7;
2632 });
2633 ne("BrowserComplianceError",function(msg){
2634 this.message=msg;
2635 });
2636 ne("GenericError",function(msg){
2637 this.message=msg;
2638 });
2639 ne("XMLHttpRequestError",function(req,msg){
2640 this.req=req;
2641 this.message=msg;
2642 try{
2643 this.number=req.status;
2644 }
2645 catch(e){
2646 }
2647 });
2648 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
2649 m.nameFunctions(this);
2650 };
2651 MochiKit.Async.__new__();
2652 MochiKit.Base._exportSymbols(this,MochiKit.Async);
2653 if(typeof (dojo)!="undefined"){
2654 dojo.provide("MochiKit.DOM");
2655 dojo.require("MochiKit.Base");
2656 }
2657 if(typeof (JSAN)!="undefined"){
2658 JSAN.use("MochiKit.Base",[]);
2659 }
2660 try{
2661 if(typeof (MochiKit.Base)=="undefined"){
2662 throw "";
2663 }
2664 }
2665 catch(e){
2666 throw "MochiKit.DOM depends on MochiKit.Base!";
2667 }
2668 if(typeof (MochiKit.DOM)=="undefined"){
2669 MochiKit.DOM={};
2670 }
2671 MochiKit.DOM.NAME="MochiKit.DOM";
2672 MochiKit.DOM.VERSION="1.4";
2673 MochiKit.DOM.__repr__=function(){
2674 return "["+this.NAME+" "+this.VERSION+"]";
2675 };
2676 MochiKit.DOM.toString=function(){
2677 return this.__repr__();
2678 };
2679 MochiKit.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"];
2680 MochiKit.DOM.EXPORT_OK=["domConverters"];
2681 MochiKit.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"]];
2682 MochiKit.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);");
2683 MochiKit.Base.update(MochiKit.DOM,{currentWindow:function(){
2684 return MochiKit.DOM._window;
2685 },currentDocument:function(){
2686 return MochiKit.DOM._document;
2687 },withWindow:function(win,func){
2688 var self=MochiKit.DOM;
2689 var _2df=self._document;
2690 var _2e0=self._window;
2691 var rval;
2692 try{
2693 self._window=win;
2694 self._document=win.document;
2695 rval=func();
2696 }
2697 catch(e){
2698 self._window=_2e0;
2699 self._document=_2df;
2700 throw e;
2701 }
2702 self._window=_2e0;
2703 self._document=_2df;
2704 return rval;
2705 },formContents:function(elem){
2706 var _2e3=[];
2707 var _2e4=[];
2708 var m=MochiKit.Base;
2709 var self=MochiKit.DOM;
2710 if(typeof (elem)=="undefined"||elem===null){
2711 elem=self._document.body;
2712 }else{
2713 elem=self.getElement(elem);
2714 }
2715 m.nodeWalk(elem,function(elem){
2716 var name=elem.name;
2717 if(m.isNotEmpty(name)){
2718 var _2e9=elem.tagName.toUpperCase();
2719 if(_2e9==="INPUT"&&(elem.type=="radio"||elem.type=="checkbox")&&!elem.checked){
2720 return null;
2721 }
2722 if(_2e9==="SELECT"){
2723 if(elem.type=="select-one"){
2724 if(elem.selectedIndex>=0){
2725 var opt=elem.options[elem.selectedIndex];
2726 var v=opt.value;
2727 if(!v){
2728 var h=opt.outerHTML;
2729 if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
2730 v=opt.text;
2731 }
2732 }
2733 _2e3.push(name);
2734 _2e4.push(v);
2735 return null;
2736 }
2737 _2e3.push(name);
2738 _2e4.push("");
2739 return null;
2740 }else{
2741 var opts=elem.options;
2742 if(!opts.length){
2743 _2e3.push(name);
2744 _2e4.push("");
2745 return null;
2746 }
2747 for(var i=0;i<opts.length;i++){
2748 var opt=opts[i];
2749 if(!opt.selected){
2750 continue;
2751 }
2752 var v=opt.value;
2753 if(!v){
2754 var h=opt.outerHTML;
2755 if(h&&!h.match(/^[^>]+\svalue\s*=/i)){
2756 v=opt.text;
2757 }
2758 }
2759 _2e3.push(name);
2760 _2e4.push(v);
2761 }
2762 return null;
2763 }
2764 }
2765 if(_2e9==="FORM"||_2e9==="P"||_2e9==="SPAN"||_2e9==="DIV"){
2766 return elem.childNodes;
2767 }
2768 _2e3.push(name);
2769 _2e4.push(elem.value||"");
2770 return null;
2771 }
2772 return elem.childNodes;
2773 });
2774 return [_2e3,_2e4];
2775 },withDocument:function(doc,func){
2776 var self=MochiKit.DOM;
2777 var _2f2=self._document;
2778 var rval;
2779 try{
2780 self._document=doc;
2781 rval=func();
2782 }
2783 catch(e){
2784 self._document=_2f2;
2785 throw e;
2786 }
2787 self._document=_2f2;
2788 return rval;
2789 },registerDOMConverter:function(name,_2f5,wrap,_2f7){
2790 MochiKit.DOM.domConverters.register(name,_2f5,wrap,_2f7);
2791 },coerceToDOM:function(node,ctx){
2792 var m=MochiKit.Base;
2793 var im=MochiKit.Iter;
2794 var self=MochiKit.DOM;
2795 if(im){
2796 var iter=im.iter;
2797 var _2fe=im.repeat;
2798 var map=m.map;
2799 }
2800 var _300=self.domConverters;
2801 var _301=arguments.callee;
2802 var _302=m.NotFound;
2803 while(true){
2804 if(typeof (node)=="undefined"||node===null){
2805 return null;
2806 }
2807 if(typeof (node)=="function"&&typeof (node.length)=="number"&&!(node instanceof Function)){
2808 node=im.list(node);
2809 }
2810 if(typeof (node.nodeType)!="undefined"&&node.nodeType>0){
2811 return node;
2812 }
2813 if(typeof (node)=="number"||typeof (node)=="boolean"){
2814 node=node.toString();
2815 }
2816 if(typeof (node)=="string"){
2817 return self._document.createTextNode(node);
2818 }
2819 if(typeof (node.__dom__)=="function"){
2820 node=node.__dom__(ctx);
2821 continue;
2822 }
2823 if(typeof (node.dom)=="function"){
2824 node=node.dom(ctx);
2825 continue;
2826 }
2827 if(typeof (node)=="function"){
2828 node=node.apply(ctx,[ctx]);
2829 continue;
2830 }
2831 if(im){
2832 var _303=null;
2833 try{
2834 _303=iter(node);
2835 }
2836 catch(e){
2837 }
2838 if(_303){
2839 return map(_301,_303,_2fe(ctx));
2840 }
2841 }
2842 try{
2843 node=_300.match(node,ctx);
2844 continue;
2845 }
2846 catch(e){
2847 if(e!=_302){
2848 throw e;
2849 }
2850 }
2851 return self._document.createTextNode(node.toString());
2852 }
2853 return undefined;
2854 },isChildNode:function(node,_305){
2855 var self=MochiKit.DOM;
2856 if(typeof (node)=="string"){
2857 node=self.getElement(node);
2858 }
2859 if(typeof (_305)=="string"){
2860 _305=self.getElement(_305);
2861 }
2862 if(node===_305){
2863 return true;
2864 }
2865 while(node&&node.tagName.toUpperCase()!="BODY"){
2866 node=node.parentNode;
2867 if(node===_305){
2868 return true;
2869 }
2870 }
2871 return false;
2872 },setNodeAttribute:function(node,attr,_309){
2873 var o={};
2874 o[attr]=_309;
2875 try{
2876 return MochiKit.DOM.updateNodeAttributes(node,o);
2877 }
2878 catch(e){
2879 }
2880 return null;
2881 },getNodeAttribute:function(node,attr){
2882 var self=MochiKit.DOM;
2883 var _30e=self.attributeArray.renames[attr];
2884 node=self.getElement(node);
2885 try{
2886 if(_30e){
2887 return node[_30e];
2888 }
2889 return node.getAttribute(attr);
2890 }
2891 catch(e){
2892 }
2893 return null;
2894 },removeNodeAttribute:function(node,attr){
2895 var self=MochiKit.DOM;
2896 var _312=self.attributeArray.renames[attr];
2897 node=self.getElement(node);
2898 try{
2899 if(_312){
2900 return node[_312];
2901 }
2902 return node.removeAttribute(attr);
2903 }
2904 catch(e){
2905 }
2906 return null;
2907 },updateNodeAttributes:function(node,_314){
2908 var elem=node;
2909 var self=MochiKit.DOM;
2910 if(typeof (node)=="string"){
2911 elem=self.getElement(node);
2912 }
2913 if(_314){
2914 var _317=MochiKit.Base.updatetree;
2915 if(self.attributeArray.compliant){
2916 for(var k in _314){
2917 var v=_314[k];
2918 if(typeof (v)=="object"&&typeof (elem[k])=="object"){
2919 if(k=="style"&&MochiKit.Style){
2920 MochiKit.Style.setStyle(elem,v);
2921 }else{
2922 _317(elem[k],v);
2923 }
2924 }else{
2925 if(k.substring(0,2)=="on"){
2926 if(typeof (v)=="string"){
2927 v=new Function(v);
2928 }
2929 elem[k]=v;
2930 }else{
2931 elem.setAttribute(k,v);
2932 }
2933 }
2934 }
2935 }else{
2936 var _31a=self.attributeArray.renames;
2937 for(var k in _314){
2938 v=_314[k];
2939 var _31b=_31a[k];
2940 if(k=="style"&&typeof (v)=="string"){
2941 elem.style.cssText=v;
2942 }else{
2943 if(typeof (_31b)=="string"){
2944 elem[_31b]=v;
2945 }else{
2946 if(typeof (elem[k])=="object"&&typeof (v)=="object"){
2947 if(k=="style"&&MochiKit.Style){
2948 MochiKit.Style.setStyle(elem,v);
2949 }else{
2950 _317(elem[k],v);
2951 }
2952 }else{
2953 if(k.substring(0,2)=="on"){
2954 if(typeof (v)=="string"){
2955 v=new Function(v);
2956 }
2957 elem[k]=v;
2958 }else{
2959 elem.setAttribute(k,v);
2960 }
2961 }
2962 }
2963 }
2964 }
2965 }
2966 }
2967 return elem;
2968 },appendChildNodes:function(node){
2969 var elem=node;
2970 var self=MochiKit.DOM;
2971 if(typeof (node)=="string"){
2972 elem=self.getElement(node);
2973 }
2974 var _31f=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2975 var _320=MochiKit.Base.concat;
2976 while(_31f.length){
2977 var n=_31f.shift();
2978 if(typeof (n)=="undefined"||n===null){
2979 }else{
2980 if(typeof (n.nodeType)=="number"){
2981 elem.appendChild(n);
2982 }else{
2983 _31f=_320(n,_31f);
2984 }
2985 }
2986 }
2987 return elem;
2988 },insertSiblingNodesBefore:function(node){
2989 var elem=node;
2990 var self=MochiKit.DOM;
2991 if(typeof (node)=="string"){
2992 elem=self.getElement(node);
2993 }
2994 var _325=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
2995 var _326=elem.parentNode;
2996 var _327=MochiKit.Base.concat;
2997 while(_325.length){
2998 var n=_325.shift();
2999 if(typeof (n)=="undefined"||n===null){
3000 }else{
3001 if(typeof (n.nodeType)=="number"){
3002 _326.insertBefore(n,elem);
3003 }else{
3004 _325=_327(n,_325);
3005 }
3006 }
3007 }
3008 return _326;
3009 },insertSiblingNodesAfter:function(node){
3010 var elem=node;
3011 var self=MochiKit.DOM;
3012 if(typeof (node)=="string"){
3013 elem=self.getElement(node);
3014 }
3015 var _32c=[self.coerceToDOM(MochiKit.Base.extend(null,arguments,1),elem)];
3016 if(elem.nextSibling){
3017 return self.insertSiblingNodesBefore(elem.nextSibling,_32c);
3018 }else{
3019 return self.appendChildNodes(elem.parentNode,_32c);
3020 }
3021 },replaceChildNodes:function(node){
3022 var elem=node;
3023 var self=MochiKit.DOM;
3024 if(typeof (node)=="string"){
3025 elem=self.getElement(node);
3026 arguments[0]=elem;
3027 }
3028 var _330;
3029 while((_330=elem.firstChild)){
3030 elem.removeChild(_330);
3031 }
3032 if(arguments.length<2){
3033 return elem;
3034 }else{
3035 return self.appendChildNodes.apply(this,arguments);
3036 }
3037 },createDOM:function(name,_332){
3038 var elem;
3039 var self=MochiKit.DOM;
3040 var m=MochiKit.Base;
3041 if(typeof (_332)=="string"||typeof (_332)=="number"){
3042 var args=m.extend([name,null],arguments,1);
3043 return arguments.callee.apply(this,args);
3044 }
3045 if(typeof (name)=="string"){
3046 var _337=self._xhtml;
3047 if(_332&&!self.attributeArray.compliant){
3048 var _338="";
3049 if("name" in _332){
3050 _338+=" name=\""+self.escapeHTML(_332.name)+"\"";
3051 }
3052 if(name=="input"&&"type" in _332){
3053 _338+=" type=\""+self.escapeHTML(_332.type)+"\"";
3054 }
3055 if(_338){
3056 name="<"+name+_338+">";
3057 _337=false;
3058 }
3059 }
3060 var d=self._document;
3061 if(_337&&d===document){
3062 elem=d.createElementNS("http://www.w3.org/1999/xhtml",name);
3063 }else{
3064 elem=d.createElement(name);
3065 }
3066 }else{
3067 elem=name;
3068 }
3069 if(_332){
3070 self.updateNodeAttributes(elem,_332);
3071 }
3072 if(arguments.length<=2){
3073 return elem;
3074 }else{
3075 var args=m.extend([elem],arguments,2);
3076 return self.appendChildNodes.apply(this,args);
3077 }
3078 },createDOMFunc:function(){
3079 var m=MochiKit.Base;
3080 return m.partial.apply(this,m.extend([MochiKit.DOM.createDOM],arguments));
3081 },removeElement:function(elem){
3082 var e=MochiKit.DOM.getElement(elem);
3083 e.parentNode.removeChild(e);
3084 return e;
3085 },swapDOM:function(dest,src){
3086 var self=MochiKit.DOM;
3087 dest=self.getElement(dest);
3088 var _340=dest.parentNode;
3089 if(src){
3090 src=self.getElement(src);
3091 _340.replaceChild(src,dest);
3092 }else{
3093 _340.removeChild(dest);
3094 }
3095 return src;
3096 },getElement:function(id){
3097 var self=MochiKit.DOM;
3098 if(arguments.length==1){
3099 return ((typeof (id)=="string")?self._document.getElementById(id):id);
3100 }else{
3101 return MochiKit.Base.map(self.getElement,arguments);
3102 }
3103 },getElementsByTagAndClassName:function(_343,_344,_345){
3104 var self=MochiKit.DOM;
3105 if(typeof (_343)=="undefined"||_343===null){
3106 _343="*";
3107 }
3108 if(typeof (_345)=="undefined"||_345===null){
3109 _345=self._document;
3110 }
3111 _345=self.getElement(_345);
3112 var _347=(_345.getElementsByTagName(_343)||self._document.all);
3113 if(typeof (_344)=="undefined"||_344===null){
3114 return MochiKit.Base.extend(null,_347);
3115 }
3116 var _348=[];
3117 for(var i=0;i<_347.length;i++){
3118 var _34a=_347[i];
3119 var cls=_34a.className;
3120 if(!cls){
3121 continue;
3122 }
3123 var _34c=cls.split(" ");
3124 for(var j=0;j<_34c.length;j++){
3125 if(_34c[j]==_344){
3126 _348.push(_34a);
3127 break;
3128 }
3129 }
3130 }
3131 return _348;
3132 },_newCallStack:function(path,once){
3133 var rval=function(){
3134 var _351=arguments.callee.callStack;
3135 for(var i=0;i<_351.length;i++){
3136 if(_351[i].apply(this,arguments)===false){
3137 break;
3138 }
3139 }
3140 if(once){
3141 try{
3142 this[path]=null;
3143 }
3144 catch(e){
3145 }
3146 }
3147 };
3148 rval.callStack=[];
3149 return rval;
3150 },addToCallStack:function(_353,path,func,once){
3151 var self=MochiKit.DOM;
3152 var _358=_353[path];
3153 var _359=_358;
3154 if(!(typeof (_358)=="function"&&typeof (_358.callStack)=="object"&&_358.callStack!==null)){
3155 _359=self._newCallStack(path,once);
3156 if(typeof (_358)=="function"){
3157 _359.callStack.push(_358);
3158 }
3159 _353[path]=_359;
3160 }
3161 _359.callStack.push(func);
3162 },addLoadEvent:function(func){
3163 var self=MochiKit.DOM;
3164 self.addToCallStack(self._window,"onload",func,true);
3165 },focusOnLoad:function(_35c){
3166 var self=MochiKit.DOM;
3167 self.addLoadEvent(function(){
3168 _35c=self.getElement(_35c);
3169 if(_35c){
3170 _35c.focus();
3171 }
3172 });
3173 },setElementClass:function(_35e,_35f){
3174 var self=MochiKit.DOM;
3175 var obj=self.getElement(_35e);
3176 if(self.attributeArray.compliant){
3177 obj.setAttribute("class",_35f);
3178 }else{
3179 obj.setAttribute("className",_35f);
3180 }
3181 },toggleElementClass:function(_362){
3182 var self=MochiKit.DOM;
3183 for(var i=1;i<arguments.length;i++){
3184 var obj=self.getElement(arguments[i]);
3185 if(!self.addElementClass(obj,_362)){
3186 self.removeElementClass(obj,_362);
3187 }
3188 }
3189 },addElementClass:function(_366,_367){
3190 var self=MochiKit.DOM;
3191 var obj=self.getElement(_366);
3192 var cls=obj.className;
3193 if(cls==undefined||cls.length===0){
3194 self.setElementClass(obj,_367);
3195 return true;
3196 }
3197 if(cls==_367){
3198 return false;
3199 }
3200 var _36b=cls.split(" ");
3201 for(var i=0;i<_36b.length;i++){
3202 if(_36b[i]==_367){
3203 return false;
3204 }
3205 }
3206 self.setElementClass(obj,cls+" "+_367);
3207 return true;
3208 },removeElementClass:function(_36d,_36e){
3209 var self=MochiKit.DOM;
3210 var obj=self.getElement(_36d);
3211 var cls=obj.className;
3212 if(cls==undefined||cls.length===0){
3213 return false;
3214 }
3215 if(cls==_36e){
3216 self.setElementClass(obj,"");
3217 return true;
3218 }
3219 var _372=cls.split(" ");
3220 for(var i=0;i<_372.length;i++){
3221 if(_372[i]==_36e){
3222 _372.splice(i,1);
3223 self.setElementClass(obj,_372.join(" "));
3224 return true;
3225 }
3226 }
3227 return false;
3228 },swapElementClass:function(_374,_375,_376){
3229 var obj=MochiKit.DOM.getElement(_374);
3230 var res=MochiKit.DOM.removeElementClass(obj,_375);
3231 if(res){
3232 MochiKit.DOM.addElementClass(obj,_376);
3233 }
3234 return res;
3235 },hasElementClass:function(_379,_37a){
3236 var obj=MochiKit.DOM.getElement(_379);
3237 var cls=obj.className;
3238 if(!cls){
3239 return false;
3240 }
3241 var _37d=cls.split(" ");
3242 for(var i=1;i<arguments.length;i++){
3243 var good=false;
3244 for(var j=0;j<_37d.length;j++){
3245 if(_37d[j]==arguments[i]){
3246 good=true;
3247 break;
3248 }
3249 }
3250 if(!good){
3251 return false;
3252 }
3253 }
3254 return true;
3255 },escapeHTML:function(s){
3256 return s.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
3257 },toHTML:function(dom){
3258 return MochiKit.DOM.emitHTML(dom).join("");
3259 },emitHTML:function(dom,lst){
3260 if(typeof (lst)=="undefined"||lst===null){
3261 lst=[];
3262 }
3263 var _385=[dom];
3264 var self=MochiKit.DOM;
3265 var _387=self.escapeHTML;
3266 var _388=self.attributeArray;
3267 while(_385.length){
3268 dom=_385.pop();
3269 if(typeof (dom)=="string"){
3270 lst.push(dom);
3271 }else{
3272 if(dom.nodeType==1){
3273 lst.push("<"+dom.tagName.toLowerCase());
3274 var _389=[];
3275 var _38a=_388(dom);
3276 for(var i=0;i<_38a.length;i++){
3277 var a=_38a[i];
3278 _389.push([" ",a.name,"=\"",_387(a.value),"\""]);
3279 }
3280 _389.sort();
3281 for(i=0;i<_389.length;i++){
3282 var _38d=_389[i];
3283 for(var j=0;j<_38d.length;j++){
3284 lst.push(_38d[j]);
3285 }
3286 }
3287 if(dom.hasChildNodes()){
3288 lst.push(">");
3289 _385.push("</"+dom.tagName.toLowerCase()+">");
3290 var _38f=dom.childNodes;
3291 for(i=_38f.length-1;i>=0;i--){
3292 _385.push(_38f[i]);
3293 }
3294 }else{
3295 lst.push("/>");
3296 }
3297 }else{
3298 if(dom.nodeType==3){
3299 lst.push(_387(dom.nodeValue));
3300 }
3301 }
3302 }
3303 }
3304 return lst;
3305 },scrapeText:function(node,_391){
3306 var rval=[];
3307 (function(node){
3308 var cn=node.childNodes;
3309 if(cn){
3310 for(var i=0;i<cn.length;i++){
3311 arguments.callee.call(this,cn[i]);
3312 }
3313 }
3314 var _396=node.nodeValue;
3315 if(typeof (_396)=="string"){
3316 rval.push(_396);
3317 }
3318 })(MochiKit.DOM.getElement(node));
3319 if(_391){
3320 return rval;
3321 }else{
3322 return rval.join("");
3323 }
3324 },removeEmptyTextNodes:function(_397){
3325 _397=MochiKit.DOM.getElement(_397);
3326 for(var i=0;i<_397.childNodes.length;i++){
3327 var node=_397.childNodes[i];
3328 if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
3329 node.parentNode.removeChild(node);
3330 }
3331 }
3332 },makeClipping:function(_39a){
3333 _39a=MochiKit.DOM.getElement(_39a);
3334 var _39b=_39a.style.overflow;
3335 if((MochiKit.Style.getStyle(_39a,"overflow")||"visible")!="hidden"){
3336 _39a.style.overflow="hidden";
3337 }
3338 return _39b;
3339 },undoClipping:function(_39c,_39d){
3340 _39c=MochiKit.DOM.getElement(_39c);
3341 if(!_39d){
3342 return;
3343 }
3344 _39c.style.overflow=_39d;
3345 },makePositioned:function(_39e){
3346 _39e=MochiKit.DOM.getElement(_39e);
3347 var pos=MochiKit.Style.getStyle(_39e,"position");
3348 if(pos=="static"||!pos){
3349 _39e.style.position="relative";
3350 if(/Opera/.test(navigator.userAgent)){
3351 _39e.style.top=0;
3352 _39e.style.left=0;
3353 }
3354 }
3355 },undoPositioned:function(_3a0){
3356 _3a0=MochiKit.DOM.getElement(_3a0);
3357 if(_3a0.style.position=="relative"){
3358 _3a0.style.position=_3a0.style.top=_3a0.style.left=_3a0.style.bottom=_3a0.style.right="";
3359 }
3360 },getFirstElementByTagAndClassName:function(_3a1,_3a2,_3a3){
3361 var self=MochiKit.DOM;
3362 if(typeof (_3a1)=="undefined"||_3a1===null){
3363 _3a1="*";
3364 }
3365 if(typeof (_3a3)=="undefined"||_3a3===null){
3366 _3a3=self._document;
3367 }
3368 _3a3=self.getElement(_3a3);
3369 var _3a5=(_3a3.getElementsByTagName(_3a1)||self._document.all);
3370 if(typeof (_3a2)=="undefined"||_3a2===null){
3371 return _3a5[0];
3372 }
3373 for(var i=0;i<_3a5.length;i++){
3374 var _3a7=_3a5[i];
3375 var _3a8=_3a7.className.split(" ");
3376 for(var j=0;j<_3a8.length;j++){
3377 if(_3a8[j]==_3a2){
3378 return _3a7;
3379 }
3380 }
3381 }
3382 },getFirstParentByTagAndClassName:function(elem,_3ab,_3ac){
3383 var self=MochiKit.DOM;
3384 elem=self.getElement(elem);
3385 if(typeof (_3ab)=="undefined"||_3ab===null){
3386 _3ab="*";
3387 }else{
3388 _3ab=_3ab.toUpperCase();
3389 }
3390 if(typeof (_3ac)=="undefined"||_3ac===null){
3391 _3ac=null;
3392 }
3393 var _3ae="";
3394 var _3af="";
3395 while(elem&&elem.tagName){
3396 elem=elem.parentNode;
3397 if(_3ab=="*"&&_3ac===null){
3398 return elem;
3399 }
3400 _3ae=elem.className.split(" ");
3401 _3af=elem.tagName.toUpperCase();
3402 if(_3ac===null&&_3ab==_3af){
3403 return elem;
3404 }else{
3405 if(_3ac!==null){
3406 for(var i=0;i<_3ae.length;i++){
3407 if(_3ab=="*"&&_3ae[i]==_3ac){
3408 return elem;
3409 }else{
3410 if(_3ab==_3af&&_3ae[i]==_3ac){
3411 return elem;
3412 }
3413 }
3414 }
3415 }
3416 }
3417 }
3418 return elem;
3419 },isParent:function(_3b1,_3b2){
3420 if(!_3b1.parentNode||_3b1==_3b2){
3421 return false;
3422 }
3423 if(_3b1.parentNode==_3b2){
3424 return true;
3425 }
3426 return MochiKit.DOM.isParent(_3b1.parentNode,_3b2);
3427 },__new__:function(win){
3428 var m=MochiKit.Base;
3429 if(typeof (document)!="undefined"){
3430 this._document=document;
3431 var _3b5="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
3432 this._xhtml=(document.documentElement&&document.createElementNS&&document.documentElement.namespaceURI===_3b5);
3433 }else{
3434 if(MochiKit.MockDOM){
3435 this._document=MochiKit.MockDOM.document;
3436 }
3437 }
3438 this._window=win;
3439 this.domConverters=new m.AdapterRegistry();
3440 var _3b6=this._document.createElement("span");
3441 var _3b7;
3442 if(_3b6&&_3b6.attributes&&_3b6.attributes.length>0){
3443 var _3b8=m.filter;
3444 _3b7=function(node){
3445 return _3b8(_3b7.ignoreAttrFilter,node.attributes);
3446 };
3447 _3b7.ignoreAttr={};
3448 var _3ba=_3b6.attributes;
3449 var _3bb=_3b7.ignoreAttr;
3450 for(var i=0;i<_3ba.length;i++){
3451 var a=_3ba[i];
3452 _3bb[a.name]=a.value;
3453 }
3454 _3b7.ignoreAttrFilter=function(a){
3455 return (_3b7.ignoreAttr[a.name]!=a.value);
3456 };
3457 _3b7.compliant=false;
3458 _3b7.renames={"class":"className","checked":"defaultChecked","usemap":"useMap","for":"htmlFor","readonly":"readOnly","colspan":"colSpan","bgcolor":"bgColor","cellspacing":"cellSpacing","cellpadding":"cellPadding"};
3459 }else{
3460 _3b7=function(node){
3461 return node.attributes;
3462 };
3463 _3b7.compliant=true;
3464 _3b7.renames={};
3465 }
3466 this.attributeArray=_3b7;
3467 var _3c0=function(_3c1,arr){
3468 var _3c3=arr[1].split(".");
3469 var str="";
3470 var obj={};
3471 str+="if (!MochiKit."+_3c3[1]+") { throw new Error(\"";
3472 str+="This function has been deprecated and depends on MochiKit.";
3473 str+=_3c3[1]+".\");}";
3474 str+="return MochiKit."+_3c3[1]+"."+arr[0];
3475 str+=".apply(this, arguments);";
3476 obj[_3c3[2]]=new Function(str);
3477 MochiKit.Base.update(MochiKit[_3c1],obj);
3478 };
3479 for(var i;i<MochiKit.DOM.DEPRECATED.length;i++){
3480 _3c0("DOM",MochiKit.DOM.DEPRECATED[i]);
3481 }
3482 var _3c6=this.createDOMFunc;
3483 this.UL=_3c6("ul");
3484 this.OL=_3c6("ol");
3485 this.LI=_3c6("li");
3486 this.TD=_3c6("td");
3487 this.TR=_3c6("tr");
3488 this.TBODY=_3c6("tbody");
3489 this.THEAD=_3c6("thead");
3490 this.TFOOT=_3c6("tfoot");
3491 this.TABLE=_3c6("table");
3492 this.TH=_3c6("th");
3493 this.INPUT=_3c6("input");
3494 this.SPAN=_3c6("span");
3495 this.A=_3c6("a");
3496 this.DIV=_3c6("div");
3497 this.IMG=_3c6("img");
3498 this.BUTTON=_3c6("button");
3499 this.TT=_3c6("tt");
3500 this.PRE=_3c6("pre");
3501 this.H1=_3c6("h1");
3502 this.H2=_3c6("h2");
3503 this.H3=_3c6("h3");
3504 this.BR=_3c6("br");
3505 this.HR=_3c6("hr");
3506 this.LABEL=_3c6("label");
3507 this.TEXTAREA=_3c6("textarea");
3508 this.FORM=_3c6("form");
3509 this.P=_3c6("p");
3510 this.SELECT=_3c6("select");
3511 this.OPTION=_3c6("option");
3512 this.OPTGROUP=_3c6("optgroup");
3513 this.LEGEND=_3c6("legend");
3514 this.FIELDSET=_3c6("fieldset");
3515 this.STRONG=_3c6("strong");
3516 this.CANVAS=_3c6("canvas");
3517 this.$=this.getElement;
3518 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3519 m.nameFunctions(this);
3520 }});
3521 MochiKit.DOM.__new__(((typeof (window)=="undefined")?this:window));
3522 if(MochiKit.__export__){
3523 withWindow=MochiKit.DOM.withWindow;
3524 withDocument=MochiKit.DOM.withDocument;
3525 }
3526 MochiKit.Base._exportSymbols(this,MochiKit.DOM);
3527 if(typeof (dojo)!="undefined"){
3528 dojo.provide("MochiKit.Selector");
3529 dojo.require("MochiKit.Base");
3530 dojo.require("MochiKit.DOM");
3531 dojo.require("MochiKit.Iter");
3532 }
3533 if(typeof (JSAN)!="undefined"){
3534 JSAN.use("MochiKit.Base",[]);
3535 JSAN.use("MochiKit.DOM",[]);
3536 JSAN.use("MochiKit.Iter",[]);
3537 }
3538 try{
3539 if(typeof (MochiKit.Base)==="undefined"||typeof (MochiKit.DOM)==="undefined"||typeof (MochiKit.Iter)==="undefined"){
3540 throw "";
3541 }
3542 }
3543 catch(e){
3544 throw "MochiKit.Selector depends on MochiKit.Base, MochiKit.DOM and MochiKit.Iter!";
3545 }
3546 if(typeof (MochiKit.Selector)=="undefined"){
3547 MochiKit.Selector={};
3548 }
3549 MochiKit.Selector.NAME="MochiKit.Selector";
3550 MochiKit.Selector.VERSION="1.4";
3551 MochiKit.Selector.__repr__=function(){
3552 return "["+this.NAME+" "+this.VERSION+"]";
3553 };
3554 MochiKit.Selector.toString=function(){
3555 return this.__repr__();
3556 };
3557 MochiKit.Selector.EXPORT=["Selector","findChildElements","findDocElements","$$"];
3558 MochiKit.Selector.EXPORT_OK=[];
3559 MochiKit.Selector.Selector=function(_3c7){
3560 this.params={classNames:[],pseudoClassNames:[]};
3561 this.expression=_3c7.toString().replace(/(^\s+|\s+$)/g,"");
3562 this.parseExpression();
3563 this.compileMatcher();
3564 };
3565 MochiKit.Selector.Selector.prototype={__class__:MochiKit.Selector.Selector,parseExpression:function(){
3566 function abort(_3c8){
3567 throw "Parse error in selector: "+_3c8;
3568 }
3569 if(this.expression==""){
3570 abort("empty expression");
3571 }
3572 var repr=MochiKit.Base.repr;
3573 var _3ca=this.params;
3574 var expr=this.expression;
3575 var _3cc,_3cd,_3ce,rest;
3576 while(_3cc=expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)){
3577 _3ca.attributes=_3ca.attributes||[];
3578 _3ca.attributes.push({name:_3cc[2],operator:_3cc[3],value:_3cc[4]||_3cc[5]||""});
3579 expr=_3cc[1];
3580 }
3581 if(expr=="*"){
3582 return this.params.wildcard=true;
3583 }
3584 while(_3cc=expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)){
3585 _3cd=_3cc[1];
3586 _3ce=_3cc[2];
3587 rest=_3cc[3];
3588 switch(_3cd){
3589 case "#":
3590 _3ca.id=_3ce;
3591 break;
3592 case ".":
3593 _3ca.classNames.push(_3ce);
3594 break;
3595 case ":":
3596 _3ca.pseudoClassNames.push(_3ce);
3597 break;
3598 case "":
3599 case undefined:
3600 _3ca.tagName=_3ce.toUpperCase();
3601 break;
3602 default:
3603 abort(repr(expr));
3604 }
3605 expr=rest;
3606 }
3607 if(expr.length>0){
3608 abort(repr(expr));
3609 }
3610 },buildMatchExpression:function(){
3611 var repr=MochiKit.Base.repr;
3612 var _3d1=this.params;
3613 var _3d2=[];
3614 var _3d3,i;
3615 function childElements(_3d5){
3616 return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, "+_3d5+".childNodes)";
3617 }
3618 if(_3d1.wildcard){
3619 _3d2.push("true");
3620 }
3621 if(_3d3=_3d1.id){
3622 _3d2.push("element.id == "+repr(_3d3));
3623 }
3624 if(_3d3=_3d1.tagName){
3625 _3d2.push("element.tagName.toUpperCase() == "+repr(_3d3));
3626 }
3627 if((_3d3=_3d1.classNames).length>0){
3628 for(i=0;i<_3d3.length;i++){
3629 _3d2.push("MochiKit.DOM.hasElementClass(element, "+repr(_3d3[i])+")");
3630 }
3631 }
3632 if((_3d3=_3d1.pseudoClassNames).length>0){
3633 for(i=0;i<_3d3.length;i++){
3634 var _3d6=_3d3[i].match(/^([^(]+)(?:\((.*)\))?$/);
3635 var _3d7=_3d6[1];
3636 var _3d8=_3d6[2];
3637 switch(_3d7){
3638 case "root":
3639 _3d2.push("element.nodeType == 9 || element === element.ownerDocument.documentElement");
3640 break;
3641 case "nth-child":
3642 case "nth-last-child":
3643 case "nth-of-type":
3644 case "nth-last-of-type":
3645 _3d6=_3d8.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/);
3646 if(!_3d6){
3647 throw "Invalid argument to pseudo element nth-child: "+_3d8;
3648 }
3649 var a,b;
3650 if(_3d6[0]=="odd"){
3651 a=2;
3652 b=1;
3653 }else{
3654 if(_3d6[0]=="even"){
3655 a=2;
3656 b=0;
3657 }else{
3658 a=_3d6[2]&&parseInt(_3d6)||null;
3659 b=parseInt(_3d6[3]);
3660 }
3661 }
3662 _3d2.push("this.nthChild(element,"+a+","+b+","+!!_3d7.match("^nth-last")+","+!!_3d7.match("of-type$")+")");
3663 break;
3664 case "first-child":
3665 _3d2.push("this.nthChild(element, null, 1)");
3666 break;
3667 case "last-child":
3668 _3d2.push("this.nthChild(element, null, 1, true)");
3669 break;
3670 case "first-of-type":
3671 _3d2.push("this.nthChild(element, null, 1, false, true)");
3672 break;
3673 case "last-of-type":
3674 _3d2.push("this.nthChild(element, null, 1, true, true)");
3675 break;
3676 case "only-child":
3677 _3d2.push(childElements("element.parentNode")+".length == 1");
3678 break;
3679 case "only-of-type":
3680 _3d2.push("MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, "+childElements("element.parentNode")+").length == 1");
3681 break;
3682 case "empty":
3683 _3d2.push("element.childNodes.length == 0");
3684 break;
3685 case "enabled":
3686 _3d2.push("(this.isUIElement(element) && element.disabled === false)");
3687 break;
3688 case "disabled":
3689 _3d2.push("(this.isUIElement(element) && element.disabled === true)");
3690 break;
3691 case "checked":
3692 _3d2.push("(this.isUIElement(element) && element.checked === true)");
3693 break;
3694 case "not":
3695 var _3db=new MochiKit.Selector.Selector(_3d8);
3696 _3d2.push("!( "+_3db.buildMatchExpression()+")");
3697 break;
3698 }
3699 }
3700 }
3701 if(_3d3=_3d1.attributes){
3702 MochiKit.Base.map(function(_3dc){
3703 var _3dd="MochiKit.DOM.getNodeAttribute(element, "+repr(_3dc.name)+")";
3704 var _3de=function(_3df){
3705 return _3dd+".split("+repr(_3df)+")";
3706 };
3707 switch(_3dc.operator){
3708 case "=":
3709 _3d2.push(_3dd+" == "+repr(_3dc.value));
3710 break;
3711 case "~=":
3712 _3d2.push(_3dd+" && MochiKit.Base.findValue("+_3de(" ")+", "+repr(_3dc.value)+") > -1");
3713 break;
3714 case "^=":
3715 _3d2.push(_3dd+".substring(0, "+_3dc.value.length+") == "+repr(_3dc.value));
3716 break;
3717 case "$=":
3718 _3d2.push(_3dd+".substring("+_3dd+".length - "+_3dc.value.length+") == "+repr(_3dc.value));
3719 break;
3720 case "*=":
3721 _3d2.push(_3dd+".match("+repr(_3dc.value)+")");
3722 break;
3723 case "|=":
3724 _3d2.push(_3dd+" && "+_3de("-")+"[0].toUpperCase() == "+repr(_3dc.value.toUpperCase()));
3725 break;
3726 case "!=":
3727 _3d2.push(_3dd+" != "+repr(_3dc.value));
3728 break;
3729 case "":
3730 case undefined:
3731 _3d2.push(_3dd+" != null");
3732 break;
3733 default:
3734 throw "Unknown operator "+_3dc.operator+" in selector";
3735 }
3736 },_3d3);
3737 }
3738 return _3d2.join(" && ");
3739 },compileMatcher:function(){
3740 this.match=new Function("element","if (!element.tagName) return false; return "+this.buildMatchExpression());
3741 },nthChild:function(_3e0,a,b,_3e3,_3e4){
3742 var _3e5=MochiKit.Base.filter(function(node){
3743 return node.nodeType==1;
3744 },_3e0.parentNode.childNodes);
3745 if(_3e4){
3746 _3e5=MochiKit.Base.filter(function(node){
3747 return node.tagName==_3e0.tagName;
3748 },_3e5);
3749 }
3750 if(_3e3){
3751 _3e5=MochiKit.Iter.reversed(_3e5);
3752 }
3753 if(a){
3754 var _3e8=MochiKit.Base.findIdentical(_3e5,_3e0);
3755 return ((_3e8+1-b)/a)%1==0;
3756 }else{
3757 return b==MochiKit.Base.findIdentical(_3e5,_3e0)+1;
3758 }
3759 },isUIElement:function(_3e9){
3760 return MochiKit.Base.findValue(["input","button","select","option","textarea","object"],_3e9.tagName.toLowerCase())>-1;
3761 },findElements:function(_3ea,axis){
3762 var _3ec;
3763 if(axis==undefined){
3764 axis="";
3765 }
3766 function inScope(_3ed,_3ee){
3767 if(axis==""){
3768 return MochiKit.DOM.isChildNode(_3ed,_3ee);
3769 }else{
3770 if(axis==">"){
3771 return _3ed.parentNode==_3ee;
3772 }else{
3773 if(axis=="+"){
3774 return _3ed==nextSiblingElement(_3ee);
3775 }else{
3776 if(axis=="~"){
3777 var _3ef=_3ee;
3778 while(_3ef=nextSiblingElement(_3ef)){
3779 if(_3ed==_3ef){
3780 return true;
3781 }
3782 }
3783 return false;
3784 }else{
3785 throw "Invalid axis: "+axis;
3786 }
3787 }
3788 }
3789 }
3790 }
3791 if(_3ec=MochiKit.DOM.getElement(this.params.id)){
3792 if(this.match(_3ec)){
3793 if(!_3ea||inScope(_3ec,_3ea)){
3794 return [_3ec];
3795 }
3796 }
3797 }
3798 function nextSiblingElement(node){
3799 node=node.nextSibling;
3800 while(node&&node.nodeType!=1){
3801 node=node.nextSibling;
3802 }
3803 return node;
3804 }
3805 if(axis==""){
3806 _3ea=(_3ea||MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName||"*");
3807 }else{
3808 if(axis==">"){
3809 if(!_3ea){
3810 throw "> combinator not allowed without preceeding expression";
3811 }
3812 _3ea=MochiKit.Base.filter(function(node){
3813 return node.nodeType==1;
3814 },_3ea.childNodes);
3815 }else{
3816 if(axis=="+"){
3817 if(!_3ea){
3818 throw "+ combinator not allowed without preceeding expression";
3819 }
3820 _3ea=nextSiblingElement(_3ea)&&[nextSiblingElement(_3ea)];
3821 }else{
3822 if(axis=="~"){
3823 if(!_3ea){
3824 throw "~ combinator not allowed without preceeding expression";
3825 }
3826 var _3f2=[];
3827 while(nextSiblingElement(_3ea)){
3828 _3ea=nextSiblingElement(_3ea);
3829 _3f2.push(_3ea);
3830 }
3831 _3ea=_3f2;
3832 }
3833 }
3834 }
3835 }
3836 if(!_3ea){
3837 return [];
3838 }
3839 var _3f3=MochiKit.Base.filter(MochiKit.Base.bind(function(_3f4){
3840 return this.match(_3f4);
3841 },this),_3ea);
3842 return _3f3;
3843 },repr:function(){
3844 return "Selector("+this.expression+")";
3845 },toString:MochiKit.Base.forwardCall("repr")};
3846 MochiKit.Base.update(MochiKit.Selector,{findChildElements:function(_3f5,_3f6){
3847 return MochiKit.Base.flattenArray(MochiKit.Base.map(function(_3f7){
3848 var _3f8="";
3849 return MochiKit.Iter.reduce(function(_3f9,expr){
3850 if(match=expr.match(/^[>+~]$/)){
3851 _3f8=match[0];
3852 return _3f9;
3853 }else{
3854 var _3fb=new MochiKit.Selector.Selector(expr);
3855 var _3fc=MochiKit.Iter.reduce(function(_3fd,_3fe){
3856 return MochiKit.Base.extend(_3fd,_3fb.findElements(_3fe||_3f5,_3f8));
3857 },_3f9,[]);
3858 _3f8="";
3859 return _3fc;
3860 }
3861 },_3f7.replace(/(^\s+|\s+$)/g,"").split(/\s+/),[null]);
3862 },_3f6));
3863 },findDocElements:function(){
3864 return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(),arguments);
3865 },__new__:function(){
3866 var m=MochiKit.Base;
3867 this.$$=this.findDocElements;
3868 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
3869 m.nameFunctions(this);
3870 }});
3871 MochiKit.Selector.__new__();
3872 MochiKit.Base._exportSymbols(this,MochiKit.Selector);
3873 if(typeof (dojo)!="undefined"){
3874 dojo.provide("MochiKit.Style");
3875 dojo.require("MochiKit.Base");
3876 dojo.require("MochiKit.DOM");
3877 }
3878 if(typeof (JSAN)!="undefined"){
3879 JSAN.use("MochiKit.Base",[]);
3880 JSAN.use("MochiKit.DOM",[]);
3881 }
3882 try{
3883 if(typeof (MochiKit.Base)=="undefined"){
3884 throw "";
3885 }
3886 }
3887 catch(e){
3888 throw "MochiKit.Style depends on MochiKit.Base!";
3889 }
3890 try{
3891 if(typeof (MochiKit.DOM)=="undefined"){
3892 throw "";
3893 }
3894 }
3895 catch(e){
3896 throw "MochiKit.Style depends on MochiKit.DOM!";
3897 }
3898 if(typeof (MochiKit.Style)=="undefined"){
3899 MochiKit.Style={};
3900 }
3901 MochiKit.Style.NAME="MochiKit.Style";
3902 MochiKit.Style.VERSION="1.4";
3903 MochiKit.Style.__repr__=function(){
3904 return "["+this.NAME+" "+this.VERSION+"]";
3905 };
3906 MochiKit.Style.toString=function(){
3907 return this.__repr__();
3908 };
3909 MochiKit.Style.EXPORT_OK=[];
3910 MochiKit.Style.EXPORT=["setStyle","setOpacity","getStyle","getElementDimensions","elementDimensions","setElementDimensions","getElementPosition","elementPosition","setElementPosition","setDisplayForElement","hideElement","showElement","getViewportDimensions","getViewportPosition","Dimensions","Coordinates"];
3911 MochiKit.Style.Dimensions=function(w,h){
3912 this.w=w;
3913 this.h=h;
3914 };
3915 MochiKit.Style.Dimensions.prototype.__repr__=function(){
3916 var repr=MochiKit.Base.repr;
3917 return "{w: "+repr(this.w)+", h: "+repr(this.h)+"}";
3918 };
3919 MochiKit.Style.Dimensions.prototype.toString=function(){
3920 return this.__repr__();
3921 };
3922 MochiKit.Style.Coordinates=function(x,y){
3923 this.x=x;
3924 this.y=y;
3925 };
3926 MochiKit.Style.Coordinates.prototype.__repr__=function(){
3927 var repr=MochiKit.Base.repr;
3928 return "{x: "+repr(this.x)+", y: "+repr(this.y)+"}";
3929 };
3930 MochiKit.Style.Coordinates.prototype.toString=function(){
3931 return this.__repr__();
3932 };
3933 MochiKit.Base.update(MochiKit.Style,{getStyle:function(elem,_407){
3934 var dom=MochiKit.DOM;
3935 var d=dom._document;
3936 elem=dom.getElement(elem);
3937 _407=MochiKit.Base.camelize(_407);
3938 if(!elem||elem==d){
3939 return undefined;
3940 }
3941 if(_407=="opacity"&&elem.filters){
3942 var _40a=(MochiKit.Style.getStyle(elem,"filter")||"").match(/alpha\(opacity=(.*)\)/);
3943 if(_40a&&_40a[1]){
3944 return parseFloat(_40a[1])/100;
3945 }
3946 return 1;
3947 }
3948 var _40b=elem.style?elem.style[_407]:null;
3949 if(!_40b){
3950 if(d.defaultView&&d.defaultView.getComputedStyle){
3951 var css=d.defaultView.getComputedStyle(elem,null);
3952 _407=_407.replace(/([A-Z])/g,"-$1").toLowerCase();
3953 _40b=css?css.getPropertyValue(_407):null;
3954 }else{
3955 if(elem.currentStyle){
3956 _40b=elem.currentStyle[_407];
3957 }
3958 }
3959 }
3960 if(_407=="opacity"){
3961 _40b=parseFloat(_40b);
3962 }
3963 if(/Opera/.test(navigator.userAgent)&&(MochiKit.Base.find(["left","top","right","bottom"],_407)!=-1)){
3964 if(MochiKit.Style.getStyle(elem,"position")=="static"){
3965 _40b="auto";
3966 }
3967 }
3968 return _40b=="auto"?null:_40b;
3969 },setStyle:function(elem,_40e){
3970 elem=MochiKit.DOM.getElement(elem);
3971 for(var name in _40e){
3972 if(name=="opacity"){
3973 MochiKit.Style.setOpacity(elem,_40e[name]);
3974 }else{
3975 elem.style[MochiKit.Base.camelize(name)]=_40e[name];
3976 }
3977 }
3978 },setOpacity:function(elem,o){
3979 elem=MochiKit.DOM.getElement(elem);
3980 var self=MochiKit.Style;
3981 if(o==1){
3982 var _413=/Gecko/.test(navigator.userAgent)&&!(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
3983 elem.style["opacity"]=_413?0.999999:1;
3984 if(/MSIE/.test(navigator.userAgent)){
3985 elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"");
3986 }
3987 }else{
3988 if(o<0.00001){
3989 o=0;
3990 }
3991 elem.style["opacity"]=o;
3992 if(/MSIE/.test(navigator.userAgent)){
3993 elem.style["filter"]=self.getStyle(elem,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+o*100+")";
3994 }
3995 }
3996 },getElementPosition:function(elem,_415){
3997 var self=MochiKit.Style;
3998 var dom=MochiKit.DOM;
3999 elem=dom.getElement(elem);
4000 if(!elem||(!(elem.x&&elem.y)&&(!elem.parentNode===null||self.getStyle(elem,"display")=="none"))){
4001 return undefined;
4002 }
4003 var c=new self.Coordinates(0,0);
4004 var box=null;
4005 var _41a=null;
4006 var d=MochiKit.DOM._document;
4007 var de=d.documentElement;
4008 var b=d.body;
4009 if(!elem.parentNode&&elem.x&&elem.y){
4010 c.x+=elem.x||0;
4011 c.y+=elem.y||0;
4012 }else{
4013 if(elem.getBoundingClientRect){
4014 box=elem.getBoundingClientRect();
4015 c.x+=box.left+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
4016 c.y+=box.top+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
4017 }else{
4018 if(elem.offsetParent){
4019 c.x+=elem.offsetLeft;
4020 c.y+=elem.offsetTop;
4021 _41a=elem.offsetParent;
4022 if(_41a!=elem){
4023 while(_41a){
4024 c.x+=_41a.offsetLeft;
4025 c.y+=_41a.offsetTop;
4026 _41a=_41a.offsetParent;
4027 }
4028 }
4029 var ua=navigator.userAgent.toLowerCase();
4030 if((typeof (opera)!="undefined"&&parseFloat(opera.version())<9)||(ua.indexOf("AppleWebKit")!=-1&&self.getStyle(elem,"position")=="absolute")){
4031 c.x-=b.offsetLeft;
4032 c.y-=b.offsetTop;
4033 }
4034 }
4035 }
4036 }
4037 if(typeof (_415)!="undefined"){
4038 _415=arguments.callee(_415);
4039 if(_415){
4040 c.x-=(_415.x||0);
4041 c.y-=(_415.y||0);
4042 }
4043 }
4044 if(elem.parentNode){
4045 _41a=elem.parentNode;
4046 }else{
4047 _41a=null;
4048 }
4049 while(_41a){
4050 var _41f=_41a.tagName.toUpperCase();
4051 if(_41f==="BODY"||_41f==="HTML"){
4052 break;
4053 }
4054 var disp=self.getStyle(_41a,"display");
4055 if(disp!="inline"&&disp!="table-row"){
4056 c.x-=_41a.scrollLeft;
4057 c.y-=_41a.scrollTop;
4058 }
4059 if(_41a.parentNode){
4060 _41a=_41a.parentNode;
4061 }else{
4062 _41a=null;
4063 }
4064 }
4065 return c;
4066 },setElementPosition:function(elem,_422,_423){
4067 elem=MochiKit.DOM.getElement(elem);
4068 if(typeof (_423)=="undefined"){
4069 _423="px";
4070 }
4071 var _424={};
4072 var _425=MochiKit.Base.isUndefinedOrNull;
4073 if(!_425(_422.x)){
4074 _424["left"]=_422.x+_423;
4075 }
4076 if(!_425(_422.y)){
4077 _424["top"]=_422.y+_423;
4078 }
4079 MochiKit.DOM.updateNodeAttributes(elem,{"style":_424});
4080 },getElementDimensions:function(elem){
4081 var self=MochiKit.Style;
4082 var dom=MochiKit.DOM;
4083 if(typeof (elem.w)=="number"||typeof (elem.h)=="number"){
4084 return new self.Dimensions(elem.w||0,elem.h||0);
4085 }
4086 elem=dom.getElement(elem);
4087 if(!elem){
4088 return undefined;
4089 }
4090 var disp=self.getStyle(elem,"display");
4091 if(disp!="none"&&disp!==""&&typeof (disp)!="undefined"){
4092 return new self.Dimensions(elem.offsetWidth||0,elem.offsetHeight||0);
4093 }
4094 var s=elem.style;
4095 var _42b=s.visibility;
4096 var _42c=s.position;
4097 s.visibility="hidden";
4098 s.position="absolute";
4099 s.display="";
4100 var _42d=elem.offsetWidth;
4101 var _42e=elem.offsetHeight;
4102 s.display="none";
4103 s.position=_42c;
4104 s.visibility=_42b;
4105 return new self.Dimensions(_42d,_42e);
4106 },setElementDimensions:function(elem,_430,_431){
4107 elem=MochiKit.DOM.getElement(elem);
4108 if(typeof (_431)=="undefined"){
4109 _431="px";
4110 }
4111 var _432={};
4112 var _433=MochiKit.Base.isUndefinedOrNull;
4113 if(!_433(_430.w)){
4114 _432["width"]=_430.w+_431;
4115 }
4116 if(!_433(_430.h)){
4117 _432["height"]=_430.h+_431;
4118 }
4119 MochiKit.DOM.updateNodeAttributes(elem,{"style":_432});
4120 },setDisplayForElement:function(_434,_435){
4121 var _436=MochiKit.Base.extend(null,arguments,1);
4122 var _437=MochiKit.DOM.getElement;
4123 for(var i=0;i<_436.length;i++){
4124 _435=_437(_436[i]);
4125 if(_435){
4126 _435.style.display=_434;
4127 }
4128 }
4129 },getViewportDimensions:function(){
4130 var d=new MochiKit.Style.Dimensions();
4131 var w=MochiKit.DOM._window;
4132 var b=MochiKit.DOM._document.body;
4133 if(w.innerWidth){
4134 d.w=w.innerWidth;
4135 d.h=w.innerHeight;
4136 }else{
4137 if(b.parentElement.clientWidth){
4138 d.w=b.parentElement.clientWidth;
4139 d.h=b.parentElement.clientHeight;
4140 }else{
4141 if(b&&b.clientWidth){
4142 d.w=b.clientWidth;
4143 d.h=b.clientHeight;
4144 }
4145 }
4146 }
4147 return d;
4148 },getViewportPosition:function(){
4149 var c=new MochiKit.Style.Coordinates(0,0);
4150 var d=MochiKit.DOM._document;
4151 var de=d.documentElement;
4152 var db=d.body;
4153 if(de&&(de.scrollTop||de.scrollLeft)){
4154 c.x=de.scrollLeft;
4155 c.y=de.scrollTop;
4156 }else{
4157 if(db){
4158 c.x=db.scrollLeft;
4159 c.y=db.scrollTop;
4160 }
4161 }
4162 return c;
4163 },__new__:function(){
4164 var m=MochiKit.Base;
4165 this.elementPosition=this.getElementPosition;
4166 this.elementDimensions=this.getElementDimensions;
4167 this.hideElement=m.partial(this.setDisplayForElement,"none");
4168 this.showElement=m.partial(this.setDisplayForElement,"block");
4169 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4170 m.nameFunctions(this);
4171 }});
4172 MochiKit.Style.__new__();
4173 MochiKit.Base._exportSymbols(this,MochiKit.Style);
4174 if(typeof (dojo)!="undefined"){
4175 dojo.provide("MochiKit.LoggingPane");
4176 dojo.require("MochiKit.Logging");
4177 dojo.require("MochiKit.Base");
4178 }
4179 if(typeof (JSAN)!="undefined"){
4180 JSAN.use("MochiKit.Logging",[]);
4181 JSAN.use("MochiKit.Base",[]);
4182 }
4183 try{
4184 if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Logging)=="undefined"){
4185 throw "";
4186 }
4187 }
4188 catch(e){
4189 throw "MochiKit.LoggingPane depends on MochiKit.Base and MochiKit.Logging!";
4190 }
4191 if(typeof (MochiKit.LoggingPane)=="undefined"){
4192 MochiKit.LoggingPane={};
4193 }
4194 MochiKit.LoggingPane.NAME="MochiKit.LoggingPane";
4195 MochiKit.LoggingPane.VERSION="1.4";
4196 MochiKit.LoggingPane.__repr__=function(){
4197 return "["+this.NAME+" "+this.VERSION+"]";
4198 };
4199 MochiKit.LoggingPane.toString=function(){
4200 return this.__repr__();
4201 };
4202 MochiKit.LoggingPane.createLoggingPane=function(_441){
4203 var m=MochiKit.LoggingPane;
4204 _441=!(!_441);
4205 if(m._loggingPane&&m._loggingPane.inline!=_441){
4206 m._loggingPane.closePane();
4207 m._loggingPane=null;
4208 }
4209 if(!m._loggingPane||m._loggingPane.closed){
4210 m._loggingPane=new m.LoggingPane(_441,MochiKit.Logging.logger);
4211 }
4212 return m._loggingPane;
4213 };
4214 MochiKit.LoggingPane.LoggingPane=function(_443,_444){
4215 if(typeof (_444)=="undefined"||_444===null){
4216 _444=MochiKit.Logging.logger;
4217 }
4218 this.logger=_444;
4219 var _445=MochiKit.Base.update;
4220 var _446=MochiKit.Base.updatetree;
4221 var bind=MochiKit.Base.bind;
4222 var _448=MochiKit.Base.clone;
4223 var win=window;
4224 var uid="_MochiKit_LoggingPane";
4225 if(typeof (MochiKit.DOM)!="undefined"){
4226 win=MochiKit.DOM.currentWindow();
4227 }
4228 if(!_443){
4229 var url=win.location.href.split("?")[0].replace(/[#:\/.><&-]/g,"_");
4230 var name=uid+"_"+url;
4231 var nwin=win.open("",name,"dependent,resizable,height=200");
4232 if(!nwin){
4233 alert("Not able to open debugging window due to pop-up blocking.");
4234 return undefined;
4235 }
4236 nwin.document.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" "+"\"http://www.w3.org/TR/html4/loose.dtd\">"+"<html><head><title>[MochiKit.LoggingPane]</title></head>"+"<body></body></html>");
4237 nwin.document.close();
4238 nwin.document.title+=" "+win.document.title;
4239 win=nwin;
4240 }
4241 var doc=win.document;
4242 this.doc=doc;
4243 var _44f=doc.getElementById(uid);
4244 var _450=!!_44f;
4245 if(_44f&&typeof (_44f.loggingPane)!="undefined"){
4246 _44f.loggingPane.logger=this.logger;
4247 _44f.loggingPane.buildAndApplyFilter();
4248 return _44f.loggingPane;
4249 }
4250 if(_450){
4251 var _451;
4252 while((_451=_44f.firstChild)){
4253 _44f.removeChild(_451);
4254 }
4255 }else{
4256 _44f=doc.createElement("div");
4257 _44f.id=uid;
4258 }
4259 _44f.loggingPane=this;
4260 var _452=doc.createElement("input");
4261 var _453=doc.createElement("input");
4262 var _454=doc.createElement("button");
4263 var _455=doc.createElement("button");
4264 var _456=doc.createElement("button");
4265 var _457=doc.createElement("button");
4266 var _458=doc.createElement("div");
4267 var _459=doc.createElement("div");
4268 var _45a=uid+"_Listener";
4269 this.colorTable=_448(this.colorTable);
4270 var _45b=[];
4271 var _45c=null;
4272 var _45d=function(msg){
4273 var _45f=msg.level;
4274 if(typeof (_45f)=="number"){
4275 _45f=MochiKit.Logging.LogLevel[_45f];
4276 }
4277 return _45f;
4278 };
4279 var _460=function(msg){
4280 return msg.info.join(" ");
4281 };
4282 var _462=bind(function(msg){
4283 var _464=_45d(msg);
4284 var text=_460(msg);
4285 var c=this.colorTable[_464];
4286 var p=doc.createElement("span");
4287 p.className="MochiKit-LogMessage MochiKit-LogLevel-"+_464;
4288 p.style.cssText="margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: "+c;
4289 p.appendChild(doc.createTextNode(_464+": "+text));
4290 _459.appendChild(p);
4291 _459.appendChild(doc.createElement("br"));
4292 if(_458.offsetHeight>_458.scrollHeight){
4293 _458.scrollTop=0;
4294 }else{
4295 _458.scrollTop=_458.scrollHeight;
4296 }
4297 },this);
4298 var _468=function(msg){
4299 _45b[_45b.length]=msg;
4300 _462(msg);
4301 };
4302 var _46a=function(){
4303 var _46b,_46c;
4304 try{
4305 _46b=new RegExp(_452.value);
4306 _46c=new RegExp(_453.value);
4307 }
4308 catch(e){
4309 logDebug("Error in filter regex: "+e.message);
4310 return null;
4311 }
4312 return function(msg){
4313 return (_46b.test(_45d(msg))&&_46c.test(_460(msg)));
4314 };
4315 };
4316 var _46e=function(){
4317 while(_459.firstChild){
4318 _459.removeChild(_459.firstChild);
4319 }
4320 };
4321 var _46f=function(){
4322 _45b=[];
4323 _46e();
4324 };
4325 var _470=bind(function(){
4326 if(this.closed){
4327 return;
4328 }
4329 this.closed=true;
4330 if(MochiKit.LoggingPane._loggingPane==this){
4331 MochiKit.LoggingPane._loggingPane=null;
4332 }
4333 this.logger.removeListener(_45a);
4334 try{
4335 try{
4336 _44f.loggingPane=null;
4337 }
4338 catch(e){
4339 logFatal("Bookmarklet was closed incorrectly.");
4340 }
4341 if(_443){
4342 _44f.parentNode.removeChild(_44f);
4343 }else{
4344 this.win.close();
4345 }
4346 }
4347 catch(e){
4348 }
4349 },this);
4350 var _471=function(){
4351 _46e();
4352 for(var i=0;i<_45b.length;i++){
4353 var msg=_45b[i];
4354 if(_45c===null||_45c(msg)){
4355 _462(msg);
4356 }
4357 }
4358 };
4359 this.buildAndApplyFilter=function(){
4360 _45c=_46a();
4361 _471();
4362 this.logger.removeListener(_45a);
4363 this.logger.addListener(_45a,_45c,_468);
4364 };
4365 var _474=bind(function(){
4366 _45b=this.logger.getMessages();
4367 _471();
4368 },this);
4369 var _475=bind(function(_476){
4370 _476=_476||window.event;
4371 key=_476.which||_476.keyCode;
4372 if(key==13){
4373 this.buildAndApplyFilter();
4374 }
4375 },this);
4376 var _477="display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: "+this.logFont;
4377 if(_443){
4378 _477+="; height: 10em; border-top: 2px solid black";
4379 }else{
4380 _477+="; height: 100%;";
4381 }
4382 _44f.style.cssText=_477;
4383 if(!_450){
4384 doc.body.appendChild(_44f);
4385 }
4386 _477={"cssText":"width: 33%; display: inline; font: "+this.logFont};
4387 _446(_452,{"value":"FATAL|ERROR|WARNING|INFO|DEBUG","onkeypress":_475,"style":_477});
4388 _44f.appendChild(_452);
4389 _446(_453,{"value":".*","onkeypress":_475,"style":_477});
4390 _44f.appendChild(_453);
4391 _477="width: 8%; display:inline; font: "+this.logFont;
4392 _454.appendChild(doc.createTextNode("Filter"));
4393 _454.onclick=bind("buildAndApplyFilter",this);
4394 _454.style.cssText=_477;
4395 _44f.appendChild(_454);
4396 _455.appendChild(doc.createTextNode("Load"));
4397 _455.onclick=_474;
4398 _455.style.cssText=_477;
4399 _44f.appendChild(_455);
4400 _456.appendChild(doc.createTextNode("Clear"));
4401 _456.onclick=_46f;
4402 _456.style.cssText=_477;
4403 _44f.appendChild(_456);
4404 _457.appendChild(doc.createTextNode("Close"));
4405 _457.onclick=_470;
4406 _457.style.cssText=_477;
4407 _44f.appendChild(_457);
4408 _458.style.cssText="overflow: auto; width: 100%";
4409 _459.style.cssText="width: 100%; height: "+(_443?"8em":"100%");
4410 _458.appendChild(_459);
4411 _44f.appendChild(_458);
4412 this.buildAndApplyFilter();
4413 _474();
4414 if(_443){
4415 this.win=undefined;
4416 }else{
4417 this.win=win;
4418 }
4419 this.inline=_443;
4420 this.closePane=_470;
4421 this.closed=false;
4422 return this;
4423 };
4424 MochiKit.LoggingPane.LoggingPane.prototype={"logFont":"8pt Verdana,sans-serif","colorTable":{"ERROR":"red","FATAL":"darkred","WARNING":"blue","INFO":"black","DEBUG":"green"}};
4425 MochiKit.LoggingPane.EXPORT_OK=["LoggingPane"];
4426 MochiKit.LoggingPane.EXPORT=["createLoggingPane"];
4427 MochiKit.LoggingPane.__new__=function(){
4428 this.EXPORT_TAGS={":common":this.EXPORT,":all":MochiKit.Base.concat(this.EXPORT,this.EXPORT_OK)};
4429 MochiKit.Base.nameFunctions(this);
4430 MochiKit.LoggingPane._loggingPane=null;
4431 };
4432 MochiKit.LoggingPane.__new__();
4433 MochiKit.Base._exportSymbols(this,MochiKit.LoggingPane);
4434 if(typeof (dojo)!="undefined"){
4435 dojo.provide("MochiKit.Color");
4436 dojo.require("MochiKit.Base");
4437 dojo.require("MochiKit.DOM");
4438 dojo.require("MochiKit.Style");
4439 }
4440 if(typeof (JSAN)!="undefined"){
4441 JSAN.use("MochiKit.Base",[]);
4442 JSAN.use("MochiKit.DOM",[]);
4443 JSAN.use("MochiKit.Style",[]);
4444 }
4445 try{
4446 if(typeof (MochiKit.Base)=="undefined"){
4447 throw "";
4448 }
4449 }
4450 catch(e){
4451 throw "MochiKit.Color depends on MochiKit.Base";
4452 }
4453 try{
4454 if(typeof (MochiKit.DOM)=="undefined"){
4455 throw "";
4456 }
4457 }
4458 catch(e){
4459 throw "MochiKit.Color depends on MochiKit.DOM";
4460 }
4461 try{
4462 if(typeof (MochiKit.Style)=="undefined"){
4463 throw "";
4464 }
4465 }
4466 catch(e){
4467 throw "MochiKit.Color depends on MochiKit.Style";
4468 }
4469 if(typeof (MochiKit.Color)=="undefined"){
4470 MochiKit.Color={};
4471 }
4472 MochiKit.Color.NAME="MochiKit.Color";
4473 MochiKit.Color.VERSION="1.4";
4474 MochiKit.Color.__repr__=function(){
4475 return "["+this.NAME+" "+this.VERSION+"]";
4476 };
4477 MochiKit.Color.toString=function(){
4478 return this.__repr__();
4479 };
4480 MochiKit.Color.Color=function(red,_479,blue,_47b){
4481 if(typeof (_47b)=="undefined"||_47b===null){
4482 _47b=1;
4483 }
4484 this.rgb={r:red,g:_479,b:blue,a:_47b};
4485 };
4486 MochiKit.Color.Color.prototype={__class__:MochiKit.Color.Color,colorWithAlpha:function(_47c){
4487 var rgb=this.rgb;
4488 var m=MochiKit.Color;
4489 return m.Color.fromRGB(rgb.r,rgb.g,rgb.b,_47c);
4490 },colorWithHue:function(hue){
4491 var hsl=this.asHSL();
4492 hsl.h=hue;
4493 var m=MochiKit.Color;
4494 return m.Color.fromHSL(hsl);
4495 },colorWithSaturation:function(_482){
4496 var hsl=this.asHSL();
4497 hsl.s=_482;
4498 var m=MochiKit.Color;
4499 return m.Color.fromHSL(hsl);
4500 },colorWithLightness:function(_485){
4501 var hsl=this.asHSL();
4502 hsl.l=_485;
4503 var m=MochiKit.Color;
4504 return m.Color.fromHSL(hsl);
4505 },darkerColorWithLevel:function(_488){
4506 var hsl=this.asHSL();
4507 hsl.l=Math.max(hsl.l-_488,0);
4508 var m=MochiKit.Color;
4509 return m.Color.fromHSL(hsl);
4510 },lighterColorWithLevel:function(_48b){
4511 var hsl=this.asHSL();
4512 hsl.l=Math.min(hsl.l+_48b,1);
4513 var m=MochiKit.Color;
4514 return m.Color.fromHSL(hsl);
4515 },blendedColor:function(_48e,_48f){
4516 if(typeof (_48f)=="undefined"||_48f===null){
4517 _48f=0.5;
4518 }
4519 var sf=1-_48f;
4520 var s=this.rgb;
4521 var d=_48e.rgb;
4522 var df=_48f;
4523 return 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));
4524 },compareRGB:function(_494){
4525 var a=this.asRGB();
4526 var b=_494.asRGB();
4527 return MochiKit.Base.compare([a.r,a.g,a.b,a.a],[b.r,b.g,b.b,b.a]);
4528 },isLight:function(){
4529 return this.asHSL().b>0.5;
4530 },isDark:function(){
4531 return (!this.isLight());
4532 },toHSLString:function(){
4533 var c=this.asHSL();
4534 var ccc=MochiKit.Color.clampColorComponent;
4535 var rval=this._hslString;
4536 if(!rval){
4537 var mid=(ccc(c.h,360).toFixed(0)+","+ccc(c.s,100).toPrecision(4)+"%"+","+ccc(c.l,100).toPrecision(4)+"%");
4538 var a=c.a;
4539 if(a>=1){
4540 a=1;
4541 rval="hsl("+mid+")";
4542 }else{
4543 if(a<=0){
4544 a=0;
4545 }
4546 rval="hsla("+mid+","+a+")";
4547 }
4548 this._hslString=rval;
4549 }
4550 return rval;
4551 },toRGBString:function(){
4552 var c=this.rgb;
4553 var ccc=MochiKit.Color.clampColorComponent;
4554 var rval=this._rgbString;
4555 if(!rval){
4556 var mid=(ccc(c.r,255).toFixed(0)+","+ccc(c.g,255).toFixed(0)+","+ccc(c.b,255).toFixed(0));
4557 if(c.a!=1){
4558 rval="rgba("+mid+","+c.a+")";
4559 }else{
4560 rval="rgb("+mid+")";
4561 }
4562 this._rgbString=rval;
4563 }
4564 return rval;
4565 },asRGB:function(){
4566 return MochiKit.Base.clone(this.rgb);
4567 },toHexString:function(){
4568 var m=MochiKit.Color;
4569 var c=this.rgb;
4570 var ccc=MochiKit.Color.clampColorComponent;
4571 var rval=this._hexString;
4572 if(!rval){
4573 rval=("#"+m.toColorPart(ccc(c.r,255))+m.toColorPart(ccc(c.g,255))+m.toColorPart(ccc(c.b,255)));
4574 this._hexString=rval;
4575 }
4576 return rval;
4577 },asHSV:function(){
4578 var hsv=this.hsv;
4579 var c=this.rgb;
4580 if(typeof (hsv)=="undefined"||hsv===null){
4581 hsv=MochiKit.Color.rgbToHSV(this.rgb);
4582 this.hsv=hsv;
4583 }
4584 return MochiKit.Base.clone(hsv);
4585 },asHSL:function(){
4586 var hsl=this.hsl;
4587 var c=this.rgb;
4588 if(typeof (hsl)=="undefined"||hsl===null){
4589 hsl=MochiKit.Color.rgbToHSL(this.rgb);
4590 this.hsl=hsl;
4591 }
4592 return MochiKit.Base.clone(hsl);
4593 },toString:function(){
4594 return this.toRGBString();
4595 },repr:function(){
4596 var c=this.rgb;
4597 var col=[c.r,c.g,c.b,c.a];
4598 return this.__class__.NAME+"("+col.join(", ")+")";
4599 }};
4600 MochiKit.Base.update(MochiKit.Color.Color,{fromRGB:function(red,_4ab,blue,_4ad){
4601 var _4ae=MochiKit.Color.Color;
4602 if(arguments.length==1){
4603 var rgb=red;
4604 red=rgb.r;
4605 _4ab=rgb.g;
4606 blue=rgb.b;
4607 if(typeof (rgb.a)=="undefined"){
4608 _4ad=undefined;
4609 }else{
4610 _4ad=rgb.a;
4611 }
4612 }
4613 return new _4ae(red,_4ab,blue,_4ad);
4614 },fromHSL:function(hue,_4b1,_4b2,_4b3){
4615 var m=MochiKit.Color;
4616 return m.Color.fromRGB(m.hslToRGB.apply(m,arguments));
4617 },fromHSV:function(hue,_4b6,_4b7,_4b8){
4618 var m=MochiKit.Color;
4619 return m.Color.fromRGB(m.hsvToRGB.apply(m,arguments));
4620 },fromName:function(name){
4621 var _4bb=MochiKit.Color.Color;
4622 if(name.charAt(0)=="\""){
4623 name=name.substr(1,name.length-2);
4624 }
4625 var _4bc=_4bb._namedColors[name.toLowerCase()];
4626 if(typeof (_4bc)=="string"){
4627 return _4bb.fromHexString(_4bc);
4628 }else{
4629 if(name=="transparent"){
4630 return _4bb.transparentColor();
4631 }
4632 }
4633 return null;
4634 },fromString:function(_4bd){
4635 var self=MochiKit.Color.Color;
4636 var _4bf=_4bd.substr(0,3);
4637 if(_4bf=="rgb"){
4638 return self.fromRGBString(_4bd);
4639 }else{
4640 if(_4bf=="hsl"){
4641 return self.fromHSLString(_4bd);
4642 }else{
4643 if(_4bd.charAt(0)=="#"){
4644 return self.fromHexString(_4bd);
4645 }
4646 }
4647 }
4648 return self.fromName(_4bd);
4649 },fromHexString:function(_4c0){
4650 if(_4c0.charAt(0)=="#"){
4651 _4c0=_4c0.substring(1);
4652 }
4653 var _4c1=[];
4654 var i,hex;
4655 if(_4c0.length==3){
4656 for(i=0;i<3;i++){
4657 hex=_4c0.substr(i,1);
4658 _4c1.push(parseInt(hex+hex,16)/255);
4659 }
4660 }else{
4661 for(i=0;i<6;i+=2){
4662 hex=_4c0.substr(i,2);
4663 _4c1.push(parseInt(hex,16)/255);
4664 }
4665 }
4666 var _4c4=MochiKit.Color.Color;
4667 return _4c4.fromRGB.apply(_4c4,_4c1);
4668 },_fromColorString:function(pre,_4c6,_4c7,_4c8){
4669 if(_4c8.indexOf(pre)===0){
4670 _4c8=_4c8.substring(_4c8.indexOf("(",3)+1,_4c8.length-1);
4671 }
4672 var _4c9=_4c8.split(/\s*,\s*/);
4673 var _4ca=[];
4674 for(var i=0;i<_4c9.length;i++){
4675 var c=_4c9[i];
4676 var val;
4677 var _4ce=c.substring(c.length-3);
4678 if(c.charAt(c.length-1)=="%"){
4679 val=0.01*parseFloat(c.substring(0,c.length-1));
4680 }else{
4681 if(_4ce=="deg"){
4682 val=parseFloat(c)/360;
4683 }else{
4684 if(_4ce=="rad"){
4685 val=parseFloat(c)/(Math.PI*2);
4686 }else{
4687 val=_4c7[i]*parseFloat(c);
4688 }
4689 }
4690 }
4691 _4ca.push(val);
4692 }
4693 return this[_4c6].apply(this,_4ca);
4694 },fromComputedStyle:function(elem,_4d0){
4695 var d=MochiKit.DOM;
4696 var cls=MochiKit.Color.Color;
4697 for(elem=d.getElement(elem);elem;elem=elem.parentNode){
4698 var _4d3=MochiKit.Style.getStyle.apply(d,arguments);
4699 if(!_4d3){
4700 continue;
4701 }
4702 var _4d4=cls.fromString(_4d3);
4703 if(!_4d4){
4704 break;
4705 }
4706 if(_4d4.asRGB().a>0){
4707 return _4d4;
4708 }
4709 }
4710 return null;
4711 },fromBackground:function(elem){
4712 var cls=MochiKit.Color.Color;
4713 return cls.fromComputedStyle(elem,"backgroundColor","background-color")||cls.whiteColor();
4714 },fromText:function(elem){
4715 var cls=MochiKit.Color.Color;
4716 return cls.fromComputedStyle(elem,"color","color")||cls.blackColor();
4717 },namedColors:function(){
4718 return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
4719 }});
4720 MochiKit.Base.update(MochiKit.Color,{clampColorComponent:function(v,_4da){
4721 v*=_4da;
4722 if(v<0){
4723 return 0;
4724 }else{
4725 if(v>_4da){
4726 return _4da;
4727 }else{
4728 return v;
4729 }
4730 }
4731 },_hslValue:function(n1,n2,hue){
4732 if(hue>6){
4733 hue-=6;
4734 }else{
4735 if(hue<0){
4736 hue+=6;
4737 }
4738 }
4739 var val;
4740 if(hue<1){
4741 val=n1+(n2-n1)*hue;
4742 }else{
4743 if(hue<3){
4744 val=n2;
4745 }else{
4746 if(hue<4){
4747 val=n1+(n2-n1)*(4-hue);
4748 }else{
4749 val=n1;
4750 }
4751 }
4752 }
4753 return val;
4754 },hsvToRGB:function(hue,_4e0,_4e1,_4e2){
4755 if(arguments.length==1){
4756 var hsv=hue;
4757 hue=hsv.h;
4758 _4e0=hsv.s;
4759 _4e1=hsv.v;
4760 _4e2=hsv.a;
4761 }
4762 var red;
4763 var _4e5;
4764 var blue;
4765 if(_4e0===0){
4766 red=_4e1;
4767 _4e5=_4e1;
4768 blue=_4e1;
4769 }else{
4770 var i=Math.floor(hue*6);
4771 var f=(hue*6)-i;
4772 var p=_4e1*(1-_4e0);
4773 var q=_4e1*(1-(_4e0*f));
4774 var t=_4e1*(1-(_4e0*(1-f)));
4775 switch(i){
4776 case 1:
4777 red=q;
4778 _4e5=_4e1;
4779 blue=p;
4780 break;
4781 case 2:
4782 red=p;
4783 _4e5=_4e1;
4784 blue=t;
4785 break;
4786 case 3:
4787 red=p;
4788 _4e5=q;
4789 blue=_4e1;
4790 break;
4791 case 4:
4792 red=t;
4793 _4e5=p;
4794 blue=_4e1;
4795 break;
4796 case 5:
4797 red=_4e1;
4798 _4e5=p;
4799 blue=q;
4800 break;
4801 case 6:
4802 case 0:
4803 red=_4e1;
4804 _4e5=t;
4805 blue=p;
4806 break;
4807 }
4808 }
4809 return {r:red,g:_4e5,b:blue,a:_4e2};
4810 },hslToRGB:function(hue,_4ed,_4ee,_4ef){
4811 if(arguments.length==1){
4812 var hsl=hue;
4813 hue=hsl.h;
4814 _4ed=hsl.s;
4815 _4ee=hsl.l;
4816 _4ef=hsl.a;
4817 }
4818 var red;
4819 var _4f2;
4820 var blue;
4821 if(_4ed===0){
4822 red=_4ee;
4823 _4f2=_4ee;
4824 blue=_4ee;
4825 }else{
4826 var m2;
4827 if(_4ee<=0.5){
4828 m2=_4ee*(1+_4ed);
4829 }else{
4830 m2=_4ee+_4ed-(_4ee*_4ed);
4831 }
4832 var m1=(2*_4ee)-m2;
4833 var f=MochiKit.Color._hslValue;
4834 var h6=hue*6;
4835 red=f(m1,m2,h6+2);
4836 _4f2=f(m1,m2,h6);
4837 blue=f(m1,m2,h6-2);
4838 }
4839 return {r:red,g:_4f2,b:blue,a:_4ef};
4840 },rgbToHSV:function(red,_4f9,blue,_4fb){
4841 if(arguments.length==1){
4842 var rgb=red;
4843 red=rgb.r;
4844 _4f9=rgb.g;
4845 blue=rgb.b;
4846 _4fb=rgb.a;
4847 }
4848 var max=Math.max(Math.max(red,_4f9),blue);
4849 var min=Math.min(Math.min(red,_4f9),blue);
4850 var hue;
4851 var _500;
4852 var _501=max;
4853 if(min==max){
4854 hue=0;
4855 _500=0;
4856 }else{
4857 var _502=(max-min);
4858 _500=_502/max;
4859 if(red==max){
4860 hue=(_4f9-blue)/_502;
4861 }else{
4862 if(_4f9==max){
4863 hue=2+((blue-red)/_502);
4864 }else{
4865 hue=4+((red-_4f9)/_502);
4866 }
4867 }
4868 hue/=6;
4869 if(hue<0){
4870 hue+=1;
4871 }
4872 if(hue>1){
4873 hue-=1;
4874 }
4875 }
4876 return {h:hue,s:_500,v:_501,a:_4fb};
4877 },rgbToHSL:function(red,_504,blue,_506){
4878 if(arguments.length==1){
4879 var rgb=red;
4880 red=rgb.r;
4881 _504=rgb.g;
4882 blue=rgb.b;
4883 _506=rgb.a;
4884 }
4885 var max=Math.max(red,Math.max(_504,blue));
4886 var min=Math.min(red,Math.min(_504,blue));
4887 var hue;
4888 var _50b;
4889 var _50c=(max+min)/2;
4890 var _50d=max-min;
4891 if(_50d===0){
4892 hue=0;
4893 _50b=0;
4894 }else{
4895 if(_50c<=0.5){
4896 _50b=_50d/(max+min);
4897 }else{
4898 _50b=_50d/(2-max-min);
4899 }
4900 if(red==max){
4901 hue=(_504-blue)/_50d;
4902 }else{
4903 if(_504==max){
4904 hue=2+((blue-red)/_50d);
4905 }else{
4906 hue=4+((red-_504)/_50d);
4907 }
4908 }
4909 hue/=6;
4910 if(hue<0){
4911 hue+=1;
4912 }
4913 if(hue>1){
4914 hue-=1;
4915 }
4916 }
4917 return {h:hue,s:_50b,l:_50c,a:_506};
4918 },toColorPart:function(num){
4919 num=Math.round(num);
4920 var _50f=num.toString(16);
4921 if(num<16){
4922 return "0"+_50f;
4923 }
4924 return _50f;
4925 },__new__:function(){
4926 var m=MochiKit.Base;
4927 this.Color.fromRGBString=m.bind(this.Color._fromColorString,this.Color,"rgb","fromRGB",[1/255,1/255,1/255,1]);
4928 this.Color.fromHSLString=m.bind(this.Color._fromColorString,this.Color,"hsl","fromHSL",[1/360,0.01,0.01,1]);
4929 var _511=1/3;
4930 var _512={black:[0,0,0],blue:[0,0,1],brown:[0.6,0.4,0.2],cyan:[0,1,1],darkGray:[_511,_511,_511],gray:[0.5,0.5,0.5],green:[0,1,0],lightGray:[2*_511,2*_511,2*_511],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]};
4931 var _513=function(name,r,g,b,a){
4932 var rval=this.fromRGB(r,g,b,a);
4933 this[name]=function(){
4934 return rval;
4935 };
4936 return rval;
4937 };
4938 for(var k in _512){
4939 var name=k+"Color";
4940 var _51c=m.concat([_513,this.Color,name],_512[k]);
4941 this.Color[name]=m.bind.apply(null,_51c);
4942 }
4943 var _51d=function(){
4944 for(var i=0;i<arguments.length;i++){
4945 if(!(arguments[i] instanceof Color)){
4946 return false;
4947 }
4948 }
4949 return true;
4950 };
4951 var _51f=function(a,b){
4952 return a.compareRGB(b);
4953 };
4954 m.nameFunctions(this);
4955 m.registerComparator(this.Color.NAME,_51d,_51f);
4956 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
4957 }});
4958 MochiKit.Color.EXPORT=["Color"];
4959 MochiKit.Color.EXPORT_OK=["clampColorComponent","rgbToHSL","hslToRGB","rgbToHSV","hsvToRGB","toColorPart"];
4960 MochiKit.Color.__new__();
4961 MochiKit.Base._exportSymbols(this,MochiKit.Color);
4962 MochiKit.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"};
4963 if(typeof (dojo)!="undefined"){
4964 dojo.provide("MochiKit.Signal");
4965 dojo.require("MochiKit.Base");
4966 dojo.require("MochiKit.DOM");
4967 dojo.require("MochiKit.Style");
4968 }
4969 if(typeof (JSAN)!="undefined"){
4970 JSAN.use("MochiKit.Base",[]);
4971 JSAN.use("MochiKit.DOM",[]);
4972 JSAN.use("MochiKit.Style",[]);
4973 }
4974 try{
4975 if(typeof (MochiKit.Base)=="undefined"){
4976 throw "";
4977 }
4978 }
4979 catch(e){
4980 throw "MochiKit.Signal depends on MochiKit.Base!";
4981 }
4982 try{
4983 if(typeof (MochiKit.DOM)=="undefined"){
4984 throw "";
4985 }
4986 }
4987 catch(e){
4988 throw "MochiKit.Signal depends on MochiKit.DOM!";
4989 }
4990 try{
4991 if(typeof (MochiKit.Style)=="undefined"){
4992 throw "";
4993 }
4994 }
4995 catch(e){
4996 throw "MochiKit.Signal depends on MochiKit.Style!";
4997 }
4998 if(typeof (MochiKit.Signal)=="undefined"){
4999 MochiKit.Signal={};
5000 }
5001 MochiKit.Signal.NAME="MochiKit.Signal";
5002 MochiKit.Signal.VERSION="1.4";
5003 MochiKit.Signal._observers=[];
5004 MochiKit.Signal.Event=function(src,e){
5005 this._event=e||window.event;
5006 this._src=src;
5007 };
5008 MochiKit.Base.update(MochiKit.Signal.Event.prototype,{__repr__:function(){
5009 var repr=MochiKit.Base.repr;
5010 var str="{event(): "+repr(this.event())+", src(): "+repr(this.src())+", type(): "+repr(this.type())+", target(): "+repr(this.target());
5011 if(this.type()&&this.type().indexOf("key")===0||this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu"){
5012 str+=", 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)+"}";
5013 }
5014 if(this.type()&&this.type().indexOf("key")===0){
5015 str+=", key(): {code: "+repr(this.key().code)+", string: "+repr(this.key().string)+"}";
5016 }
5017 if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
5018 str+=", mouse(): {page: "+repr(this.mouse().page)+", client: "+repr(this.mouse().client);
5019 if(this.type()!="mousemove"){
5020 str+=", button: {left: "+repr(this.mouse().button.left)+", middle: "+repr(this.mouse().button.middle)+", right: "+repr(this.mouse().button.right)+"}}";
5021 }else{
5022 str+="}";
5023 }
5024 }
5025 if(this.type()=="mouseover"||this.type()=="mouseout"){
5026 str+=", relatedTarget(): "+repr(this.relatedTarget());
5027 }
5028 str+="}";
5029 return str;
5030 },toString:function(){
5031 return this.__repr__();
5032 },src:function(){
5033 return this._src;
5034 },event:function(){
5035 return this._event;
5036 },type:function(){
5037 return this._event.type||undefined;
5038 },target:function(){
5039 return this._event.target||this._event.srcElement;
5040 },_relatedTarget:null,relatedTarget:function(){
5041 if(this._relatedTarget!==null){
5042 return this._relatedTarget;
5043 }
5044 var elem=null;
5045 if(this.type()=="mouseover"){
5046 elem=(this._event.relatedTarget||this._event.fromElement);
5047 }else{
5048 if(this.type()=="mouseout"){
5049 elem=(this._event.relatedTarget||this._event.toElement);
5050 }
5051 }
5052 if(elem!==null){
5053 this._relatedTarget=elem;
5054 return elem;
5055 }
5056 return undefined;
5057 },_modifier:null,modifier:function(){
5058 if(this._modifier!==null){
5059 return this._modifier;
5060 }
5061 var m={};
5062 m.alt=this._event.altKey;
5063 m.ctrl=this._event.ctrlKey;
5064 m.meta=this._event.metaKey||false;
5065 m.shift=this._event.shiftKey;
5066 m.any=m.alt||m.ctrl||m.shift||m.meta;
5067 this._modifier=m;
5068 return m;
5069 },_key:null,key:function(){
5070 if(this._key!==null){
5071 return this._key;
5072 }
5073 var k={};
5074 if(this.type()&&this.type().indexOf("key")===0){
5075 if(this.type()=="keydown"||this.type()=="keyup"){
5076 k.code=this._event.keyCode;
5077 k.string=(MochiKit.Signal._specialKeys[k.code]||"KEY_UNKNOWN");
5078 this._key=k;
5079 return k;
5080 }else{
5081 if(this.type()=="keypress"){
5082 k.code=0;
5083 k.string="";
5084 if(typeof (this._event.charCode)!="undefined"&&this._event.charCode!==0&&!MochiKit.Signal._specialMacKeys[this._event.charCode]){
5085 k.code=this._event.charCode;
5086 k.string=String.fromCharCode(k.code);
5087 }else{
5088 if(this._event.keyCode&&typeof (this._event.charCode)=="undefined"){
5089 k.code=this._event.keyCode;
5090 k.string=String.fromCharCode(k.code);
5091 }
5092 }
5093 this._key=k;
5094 return k;
5095 }
5096 }
5097 }
5098 return undefined;
5099 },_mouse:null,mouse:function(){
5100 if(this._mouse!==null){
5101 return this._mouse;
5102 }
5103 var m={};
5104 var e=this._event;
5105 if(this.type()&&(this.type().indexOf("mouse")===0||this.type().indexOf("click")!=-1||this.type()=="contextmenu")){
5106 m.client=new MochiKit.Style.Coordinates(0,0);
5107 if(e.clientX||e.clientY){
5108 m.client.x=(!e.clientX||e.clientX<0)?0:e.clientX;
5109 m.client.y=(!e.clientY||e.clientY<0)?0:e.clientY;
5110 }
5111 m.page=new MochiKit.Style.Coordinates(0,0);
5112 if(e.pageX||e.pageY){
5113 m.page.x=(!e.pageX||e.pageX<0)?0:e.pageX;
5114 m.page.y=(!e.pageY||e.pageY<0)?0:e.pageY;
5115 }else{
5116 var de=MochiKit.DOM._document.documentElement;
5117 var b=MochiKit.DOM._document.body;
5118 m.page.x=e.clientX+(de.scrollLeft||b.scrollLeft)-(de.clientLeft||0);
5119 m.page.y=e.clientY+(de.scrollTop||b.scrollTop)-(de.clientTop||0);
5120 }
5121 if(this.type()!="mousemove"){
5122 m.button={};
5123 m.button.left=false;
5124 m.button.right=false;
5125 m.button.middle=false;
5126 if(e.which){
5127 m.button.left=(e.which==1);
5128 m.button.middle=(e.which==2);
5129 m.button.right=(e.which==3);
5130 }else{
5131 m.button.left=!!(e.button&1);
5132 m.button.right=!!(e.button&2);
5133 m.button.middle=!!(e.button&4);
5134 }
5135 }
5136 this._mouse=m;
5137 return m;
5138 }
5139 return undefined;
5140 },stop:function(){
5141 this.stopPropagation();
5142 this.preventDefault();
5143 },stopPropagation:function(){
5144 if(this._event.stopPropagation){
5145 this._event.stopPropagation();
5146 }else{
5147 this._event.cancelBubble=true;
5148 }
5149 },preventDefault:function(){
5150 if(this._event.preventDefault){
5151 this._event.preventDefault();
5152 }else{
5153 if(this._confirmUnload===null){
5154 this._event.returnValue=false;
5155 }
5156 }
5157 },_confirmUnload:null,confirmUnload:function(msg){
5158 if(this.type()=="beforeunload"){
5159 this._confirmUnload=msg;
5160 this._event.returnValue=msg;
5161 }
5162 }});
5163 MochiKit.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"};
5164 (function(){
5165 var _52e=MochiKit.Signal._specialMacKeys;
5166 for(i=63236;i<=63242;i++){
5167 _52e[i]="KEY_F"+(i-63236+1);
5168 }
5169 })();
5170 MochiKit.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"};
5171 (function(){
5172 var _52f=MochiKit.Signal._specialKeys;
5173 for(var i=48;i<=57;i++){
5174 _52f[i]="KEY_"+(i-48);
5175 }
5176 for(i=65;i<=90;i++){
5177 _52f[i]="KEY_"+String.fromCharCode(i);
5178 }
5179 for(i=96;i<=105;i++){
5180 _52f[i]="KEY_NUM_PAD_"+(i-96);
5181 }
5182 for(i=112;i<=123;i++){
5183 _52f[i]="KEY_F"+(i-112+1);
5184 }
5185 })();
5186 MochiKit.Signal.Ident=function(_531){
5187 this.source=_531.source;
5188 this.signal=_531.signal;
5189 this.listener=_531.listener;
5190 this.isDOM=_531.isDOM;
5191 this.objOrFunc=_531.objOrFunc;
5192 this.funcOrStr=_531.funcOrStr;
5193 this.connected=_531.connected;
5194 };
5195 MochiKit.Signal.Ident.prototype={};
5196 MochiKit.Base.update(MochiKit.Signal,{__repr__:function(){
5197 return "["+this.NAME+" "+this.VERSION+"]";
5198 },toString:function(){
5199 return this.__repr__();
5200 },_unloadCache:function(){
5201 var self=MochiKit.Signal;
5202 var _533=self._observers;
5203 for(var i=0;i<_533.length;i++){
5204 if(_533[i].signal!=="onload"&&_533[i].signal!=="onunload"){
5205 self._disconnect(_533[i]);
5206 }
5207 }
5208 },_listener:function(src,sig,func,obj,_539){
5209 var self=MochiKit.Signal;
5210 var E=self.Event;
5211 if(!_539){
5212 return MochiKit.Base.bind(func,obj);
5213 }
5214 obj=obj||src;
5215 if(typeof (func)=="string"){
5216 if(sig==="onload"||sig==="onunload"){
5217 return function(_53c){
5218 obj[func].apply(obj,[new E(src,_53c)]);
5219 var _53d=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:obj,funcOrStr:func});
5220 MochiKit.Signal._disconnect(_53d);
5221 };
5222 }else{
5223 return function(_53e){
5224 obj[func].apply(obj,[new E(src,_53e)]);
5225 };
5226 }
5227 }else{
5228 if(sig==="onload"||sig==="onunload"){
5229 return function(_53f){
5230 func.apply(obj,[new E(src,_53f)]);
5231 MochiKit.Signal.disconnect(src,sig,func);
5232 var _540=new MochiKit.Signal.Ident({source:src,signal:sig,objOrFunc:func});
5233 MochiKit.Signal._disconnect(_540);
5234 };
5235 }else{
5236 return function(_541){
5237 func.apply(obj,[new E(src,_541)]);
5238 };
5239 }
5240 }
5241 },_browserAlreadyHasMouseEnterAndLeave:function(){
5242 return /MSIE/.test(navigator.userAgent);
5243 },_mouseEnterListener:function(src,sig,func,obj){
5244 var E=MochiKit.Signal.Event;
5245 return function(_547){
5246 var e=new E(src,_547);
5247 try{
5248 e.relatedTarget().nodeName;
5249 }
5250 catch(err){
5251 return;
5252 }
5253 e.stop();
5254 if(MochiKit.DOM.isChildNode(e.relatedTarget(),src)){
5255 return;
5256 }
5257 e.type=function(){
5258 return sig;
5259 };
5260 if(typeof (func)=="string"){
5261 return obj[func].apply(obj,[e]);
5262 }else{
5263 return func.apply(obj,[e]);
5264 }
5265 };
5266 },_getDestPair:function(_549,_54a){
5267 var obj=null;
5268 var func=null;
5269 if(typeof (_54a)!="undefined"){
5270 obj=_549;
5271 func=_54a;
5272 if(typeof (_54a)=="string"){
5273 if(typeof (_549[_54a])!="function"){
5274 throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
5275 }
5276 }else{
5277 if(typeof (_54a)!="function"){
5278 throw new Error("'funcOrStr' must be a function or string");
5279 }
5280 }
5281 }else{
5282 if(typeof (_549)!="function"){
5283 throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
5284 }else{
5285 func=_549;
5286 }
5287 }
5288 return [obj,func];
5289 },connect:function(src,sig,_54f,_550){
5290 src=MochiKit.DOM.getElement(src);
5291 var self=MochiKit.Signal;
5292 if(typeof (sig)!="string"){
5293 throw new Error("'sig' must be a string");
5294 }
5295 var _552=self._getDestPair(_54f,_550);
5296 var obj=_552[0];
5297 var func=_552[1];
5298 if(typeof (obj)=="undefined"||obj===null){
5299 obj=src;
5300 }
5301 var _555=!!(src.addEventListener||src.attachEvent);
5302 if(_555&&(sig==="onmouseenter"||sig==="onmouseleave")&&!self._browserAlreadyHasMouseEnterAndLeave()){
5303 var _556=self._mouseEnterListener(src,sig.substr(2),func,obj);
5304 if(sig==="onmouseenter"){
5305 sig="onmouseover";
5306 }else{
5307 sig="onmouseout";
5308 }
5309 }else{
5310 var _556=self._listener(src,sig,func,obj,_555);
5311 }
5312 if(src.addEventListener){
5313 src.addEventListener(sig.substr(2),_556,false);
5314 }else{
5315 if(src.attachEvent){
5316 src.attachEvent(sig,_556);
5317 }
5318 }
5319 var _557=new MochiKit.Signal.Ident({source:src,signal:sig,listener:_556,isDOM:_555,objOrFunc:_54f,funcOrStr:_550,connected:true});
5320 self._observers.push(_557);
5321 if(!_555&&typeof (src.__connect__)=="function"){
5322 var args=MochiKit.Base.extend([_557],arguments,1);
5323 src.__connect__.apply(src,args);
5324 }
5325 return _557;
5326 },_disconnect:function(_559){
5327 if(!_559.connected){
5328 return;
5329 }
5330 _559.connected=false;
5331 if(!_559.isDOM){
5332 return;
5333 }
5334 var src=_559.source;
5335 var sig=_559.signal;
5336 var _55c=_559.listener;
5337 if(src.removeEventListener){
5338 src.removeEventListener(sig.substr(2),_55c,false);
5339 }else{
5340 if(src.detachEvent){
5341 src.detachEvent(sig,_55c);
5342 }else{
5343 throw new Error("'src' must be a DOM element");
5344 }
5345 }
5346 },disconnect:function(_55d){
5347 var self=MochiKit.Signal;
5348 var _55f=self._observers;
5349 var m=MochiKit.Base;
5350 if(arguments.length>1){
5351 var src=MochiKit.DOM.getElement(arguments[0]);
5352 var sig=arguments[1];
5353 var obj=arguments[2];
5354 var func=arguments[3];
5355 for(var i=_55f.length-1;i>=0;i--){
5356 var o=_55f[i];
5357 if(o.source===src&&o.signal===sig&&o.objOrFunc===obj&&o.funcOrStr===func){
5358 self._disconnect(o);
5359 if(!self._lock){
5360 _55f.splice(i,1);
5361 }else{
5362 self._dirty=true;
5363 }
5364 return true;
5365 }
5366 }
5367 }else{
5368 var idx=m.findIdentical(_55f,_55d);
5369 if(idx>=0){
5370 self._disconnect(_55d);
5371 if(!self._lock){
5372 _55f.splice(idx,1);
5373 }else{
5374 self._dirty=true;
5375 }
5376 return true;
5377 }
5378 }
5379 return false;
5380 },disconnectAllTo:function(_568,_569){
5381 var self=MochiKit.Signal;
5382 var _56b=self._observers;
5383 var _56c=self._disconnect;
5384 var _56d=self._lock;
5385 var _56e=self._dirty;
5386 if(typeof (_569)==="undefined"){
5387 _569=null;
5388 }
5389 for(var i=_56b.length-1;i>=0;i--){
5390 var _570=_56b[i];
5391 if(_570.objOrFunc===_568&&(_569===null||_570.funcOrStr===_569)){
5392 _56c(_570);
5393 if(_56d){
5394 _56e=true;
5395 }else{
5396 _56b.splice(i,1);
5397 }
5398 }
5399 }
5400 self._dirty=_56e;
5401 },disconnectAll:function(src,sig){
5402 src=MochiKit.DOM.getElement(src);
5403 var m=MochiKit.Base;
5404 var _574=m.flattenArguments(m.extend(null,arguments,1));
5405 var self=MochiKit.Signal;
5406 var _576=self._disconnect;
5407 var _577=self._observers;
5408 var i,_579;
5409 var _57a=self._lock;
5410 var _57b=self._dirty;
5411 if(_574.length===0){
5412 for(i=_577.length-1;i>=0;i--){
5413 _579=_577[i];
5414 if(_579.source===src){
5415 _576(_579);
5416 if(!_57a){
5417 _577.splice(i,1);
5418 }else{
5419 _57b=true;
5420 }
5421 }
5422 }
5423 }else{
5424 var sigs={};
5425 for(i=0;i<_574.length;i++){
5426 sigs[_574[i]]=true;
5427 }
5428 for(i=_577.length-1;i>=0;i--){
5429 _579=_577[i];
5430 if(_579.source===src&&_579.signal in sigs){
5431 _576(_579);
5432 if(!_57a){
5433 _577.splice(i,1);
5434 }else{
5435 _57b=true;
5436 }
5437 }
5438 }
5439 }
5440 self._dirty=_57b;
5441 },signal:function(src,sig){
5442 var self=MochiKit.Signal;
5443 var _580=self._observers;
5444 src=MochiKit.DOM.getElement(src);
5445 var args=MochiKit.Base.extend(null,arguments,2);
5446 var _582=[];
5447 self._lock=true;
5448 for(var i=0;i<_580.length;i++){
5449 var _584=_580[i];
5450 if(_584.source===src&&_584.signal===sig){
5451 try{
5452 _584.listener.apply(src,args);
5453 }
5454 catch(e){
5455 _582.push(e);
5456 }
5457 }
5458 }
5459 self._lock=false;
5460 if(self._dirty){
5461 self._dirty=false;
5462 for(var i=_580.length-1;i>=0;i--){
5463 if(!_580[i].connected){
5464 _580.splice(i,1);
5465 }
5466 }
5467 }
5468 if(_582.length==1){
5469 throw _582[0];
5470 }else{
5471 if(_582.length>1){
5472 var e=new Error("Multiple errors thrown in handling 'sig', see errors property");
5473 e.errors=_582;
5474 throw e;
5475 }
5476 }
5477 }});
5478 MochiKit.Signal.EXPORT_OK=[];
5479 MochiKit.Signal.EXPORT=["connect","disconnect","signal","disconnectAll","disconnectAllTo"];
5480 MochiKit.Signal.__new__=function(win){
5481 var m=MochiKit.Base;
5482 this._document=document;
5483 this._window=win;
5484 this._lock=false;
5485 this._dirty=false;
5486 try{
5487 this.connect(window,"onunload",this._unloadCache);
5488 }
5489 catch(e){
5490 }
5491 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
5492 m.nameFunctions(this);
5493 };
5494 MochiKit.Signal.__new__(this);
5495 if(MochiKit.__export__){
5496 connect=MochiKit.Signal.connect;
5497 disconnect=MochiKit.Signal.disconnect;
5498 disconnectAll=MochiKit.Signal.disconnectAll;
5499 signal=MochiKit.Signal.signal;
5500 }
5501 MochiKit.Base._exportSymbols(this,MochiKit.Signal);
5502 if(typeof (dojo)!="undefined"){
5503 dojo.provide("MochiKit.Position");
5504 dojo.require("MochiKit.Base");
5505 dojo.require("MochiKit.DOM");
5506 dojo.require("MochiKit.Style");
5507 }
5508 if(typeof (JSAN)!="undefined"){
5509 JSAN.use("MochiKit.Base",[]);
5510 JSAN.use("MochiKit.DOM",[]);
5511 JSAN.use("MochiKit.Style",[]);
5512 }
5513 try{
5514 if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.Style)=="undefined"||typeof (MochiKit.DOM)=="undefined"){
5515 throw "";
5516 }
5517 }
5518 catch(e){
5519 throw "MochiKit.Style depends on MochiKit.Base, MochiKit.DOM, and MochiKit.Style!";
5520 }
5521 if(typeof (MochiKit.Position)=="undefined"){
5522 MochiKit.Position={};
5523 }
5524 MochiKit.Position.NAME="MochiKit.Position";
5525 MochiKit.Position.VERSION="1.4";
5526 MochiKit.Position.__repr__=function(){
5527 return "["+this.NAME+" "+this.VERSION+"]";
5528 };
5529 MochiKit.Position.toString=function(){
5530 return this.__repr__();
5531 };
5532 MochiKit.Position.EXPORT_OK=[];
5533 MochiKit.Position.EXPORT=[];
5534 MochiKit.Base.update(MochiKit.Position,{includeScrollOffsets:false,prepare:function(){
5535 var _588=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;
5536 var _589=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;
5537 this.windowOffset=new MochiKit.Style.Coordinates(_588,_589);
5538 },cumulativeOffset:function(_58a){
5539 var _58b=0;
5540 var _58c=0;
5541 do{
5542 _58b+=_58a.offsetTop||0;
5543 _58c+=_58a.offsetLeft||0;
5544 _58a=_58a.offsetParent;
5545 }while(_58a);
5546 return new MochiKit.Style.Coordinates(_58c,_58b);
5547 },realOffset:function(_58d){
5548 var _58e=0;
5549 var _58f=0;
5550 do{
5551 _58e+=_58d.scrollTop||0;
5552 _58f+=_58d.scrollLeft||0;
5553 _58d=_58d.parentNode;
5554 }while(_58d);
5555 return new MochiKit.Style.Coordinates(_58f,_58e);
5556 },within:function(_590,x,y){
5557 if(this.includeScrollOffsets){
5558 return this.withinIncludingScrolloffsets(_590,x,y);
5559 }
5560 this.xcomp=x;
5561 this.ycomp=y;
5562 this.offset=this.cumulativeOffset(_590);
5563 if(_590.style.position=="fixed"){
5564 this.offset.x+=this.windowOffset.x;
5565 this.offset.y+=this.windowOffset.y;
5566 }
5567 return (y>=this.offset.y&&y<this.offset.y+_590.offsetHeight&&x>=this.offset.x&&x<this.offset.x+_590.offsetWidth);
5568 },withinIncludingScrolloffsets:function(_593,x,y){
5569 var _596=this.realOffset(_593);
5570 this.xcomp=x+_596.x-this.windowOffset.x;
5571 this.ycomp=y+_596.y-this.windowOffset.y;
5572 this.offset=this.cumulativeOffset(_593);
5573 return (this.ycomp>=this.offset.y&&this.ycomp<this.offset.y+_593.offsetHeight&&this.xcomp>=this.offset.x&&this.xcomp<this.offset.x+_593.offsetWidth);
5574 },overlap:function(mode,_598){
5575 if(!mode){
5576 return 0;
5577 }
5578 if(mode=="vertical"){
5579 return ((this.offset.y+_598.offsetHeight)-this.ycomp)/_598.offsetHeight;
5580 }
5581 if(mode=="horizontal"){
5582 return ((this.offset.x+_598.offsetWidth)-this.xcomp)/_598.offsetWidth;
5583 }
5584 },absolutize:function(_599){
5585 _599=MochiKit.DOM.getElement(_599);
5586 if(_599.style.position=="absolute"){
5587 return;
5588 }
5589 MochiKit.Position.prepare();
5590 var _59a=MochiKit.Position.positionedOffset(_599);
5591 var _59b=_599.clientWidth;
5592 var _59c=_599.clientHeight;
5593 var _59d={"position":_599.style.position,"left":_59a.x-parseFloat(_599.style.left||0),"top":_59a.y-parseFloat(_599.style.top||0),"width":_599.style.width,"height":_599.style.height};
5594 _599.style.position="absolute";
5595 _599.style.top=_59a.y+"px";
5596 _599.style.left=_59a.x+"px";
5597 _599.style.width=_59b+"px";
5598 _599.style.height=_59c+"px";
5599 return _59d;
5600 },positionedOffset:function(_59e){
5601 var _59f=0,_5a0=0;
5602 do{
5603 _59f+=_59e.offsetTop||0;
5604 _5a0+=_59e.offsetLeft||0;
5605 _59e=_59e.offsetParent;
5606 if(_59e){
5607 p=MochiKit.Style.getStyle(_59e,"position");
5608 if(p=="relative"||p=="absolute"){
5609 break;
5610 }
5611 }
5612 }while(_59e);
5613 return new MochiKit.Style.Coordinates(_5a0,_59f);
5614 },relativize:function(_5a1,_5a2){
5615 _5a1=MochiKit.DOM.getElement(_5a1);
5616 if(_5a1.style.position=="relative"){
5617 return;
5618 }
5619 MochiKit.Position.prepare();
5620 var top=parseFloat(_5a1.style.top||0)-(_5a2["top"]||0);
5621 var left=parseFloat(_5a1.style.left||0)-(_5a2["left"]||0);
5622 _5a1.style.position=_5a2["position"];
5623 _5a1.style.top=top+"px";
5624 _5a1.style.left=left+"px";
5625 _5a1.style.width=_5a2["width"];
5626 _5a1.style.height=_5a2["height"];
5627 },clone:function(_5a5,_5a6){
5628 _5a5=MochiKit.DOM.getElement(_5a5);
5629 _5a6=MochiKit.DOM.getElement(_5a6);
5630 _5a6.style.position="absolute";
5631 var _5a7=this.cumulativeOffset(_5a5);
5632 _5a6.style.top=_5a7.y+"px";
5633 _5a6.style.left=_5a7.x+"px";
5634 _5a6.style.width=_5a5.offsetWidth+"px";
5635 _5a6.style.height=_5a5.offsetHeight+"px";
5636 },page:function(_5a8){
5637 var _5a9=0;
5638 var _5aa=0;
5639 var _5ab=_5a8;
5640 do{
5641 _5a9+=_5ab.offsetTop||0;
5642 _5aa+=_5ab.offsetLeft||0;
5643 if(_5ab.offsetParent==document.body&&MochiKit.Style.getStyle(_5ab,"position")=="absolute"){
5644 break;
5645 }
5646 }while(_5ab=_5ab.offsetParent);
5647 _5ab=_5a8;
5648 do{
5649 _5a9-=_5ab.scrollTop||0;
5650 _5aa-=_5ab.scrollLeft||0;
5651 }while(_5ab=_5ab.parentNode);
5652 return new MochiKit.Style.Coordinates(_5aa,_5a9);
5653 }});
5654 MochiKit.Position.__new__=function(win){
5655 var m=MochiKit.Base;
5656 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
5657 m.nameFunctions(this);
5658 };
5659 MochiKit.Position.__new__(this);
5660 if(typeof (dojo)!="undefined"){
5661 dojo.provide("MochiKit.Visual");
5662 dojo.require("MochiKit.Base");
5663 dojo.require("MochiKit.DOM");
5664 dojo.require("MochiKit.Style");
5665 dojo.require("MochiKit.Color");
5666 dojo.require("MochiKit.Position");
5667 }
5668 if(typeof (JSAN)!="undefined"){
5669 JSAN.use("MochiKit.Base",[]);
5670 JSAN.use("MochiKit.DOM",[]);
5671 JSAN.use("MochiKit.Style",[]);
5672 JSAN.use("MochiKit.Color",[]);
5673 JSAN.use("MochiKit.Position",[]);
5674 }
5675 try{
5676 if(typeof (MochiKit.Base)==="undefined"||typeof (MochiKit.DOM)==="undefined"||typeof (MochiKit.Style)==="undefined"||typeof (MochiKit.Position)==="undefined"||typeof (MochiKit.Color)==="undefined"){
5677 throw "";
5678 }
5679 }
5680 catch(e){
5681 throw "MochiKit.Visual depends on MochiKit.Base, MochiKit.DOM, MochiKit.Style, MochiKit.Position and MochiKit.Color!";
5682 }
5683 if(typeof (MochiKit.Visual)=="undefined"){
5684 MochiKit.Visual={};
5685 }
5686 MochiKit.Visual.NAME="MochiKit.Visual";
5687 MochiKit.Visual.VERSION="1.4";
5688 MochiKit.Visual.__repr__=function(){
5689 return "["+this.NAME+" "+this.VERSION+"]";
5690 };
5691 MochiKit.Visual.toString=function(){
5692 return this.__repr__();
5693 };
5694 MochiKit.Visual._RoundCorners=function(e,_5af){
5695 e=MochiKit.DOM.getElement(e);
5696 this._setOptions(_5af);
5697 if(this.options.__unstable__wrapElement){
5698 e=this._doWrap(e);
5699 }
5700 var _5b0=this.options.color;
5701 var C=MochiKit.Color.Color;
5702 if(this.options.color==="fromElement"){
5703 _5b0=C.fromBackground(e);
5704 }else{
5705 if(!(_5b0 instanceof C)){
5706 _5b0=C.fromString(_5b0);
5707 }
5708 }
5709 this.isTransparent=(_5b0.asRGB().a<=0);
5710 var _5b2=this.options.bgColor;
5711 if(this.options.bgColor==="fromParent"){
5712 _5b2=C.fromBackground(e.offsetParent);
5713 }else{
5714 if(!(_5b2 instanceof C)){
5715 _5b2=C.fromString(_5b2);
5716 }
5717 }
5718 this._roundCornersImpl(e,_5b0,_5b2);
5719 };
5720 MochiKit.Visual._RoundCorners.prototype={_doWrap:function(e){
5721 var _5b4=e.parentNode;
5722 var doc=MochiKit.DOM.currentDocument();
5723 if(typeof (doc.defaultView)==="undefined"||doc.defaultView===null){
5724 return e;
5725 }
5726 var _5b6=doc.defaultView.getComputedStyle(e,null);
5727 if(typeof (_5b6)==="undefined"||_5b6===null){
5728 return e;
5729 }
5730 var _5b7=MochiKit.DOM.DIV({"style":{display:"block",marginTop:_5b6.getPropertyValue("padding-top"),marginRight:_5b6.getPropertyValue("padding-right"),marginBottom:_5b6.getPropertyValue("padding-bottom"),marginLeft:_5b6.getPropertyValue("padding-left"),padding:"0px"}});
5731 _5b7.innerHTML=e.innerHTML;
5732 e.innerHTML="";
5733 e.appendChild(_5b7);
5734 return e;
5735 },_roundCornersImpl:function(e,_5b9,_5ba){
5736 if(this.options.border){
5737 this._renderBorder(e,_5ba);
5738 }
5739 if(this._isTopRounded()){
5740 this._roundTopCorners(e,_5b9,_5ba);
5741 }
5742 if(this._isBottomRounded()){
5743 this._roundBottomCorners(e,_5b9,_5ba);
5744 }
5745 },_renderBorder:function(el,_5bc){
5746 var _5bd="1px solid "+this._borderColor(_5bc);
5747 var _5be="border-left: "+_5bd;
5748 var _5bf="border-right: "+_5bd;
5749 var _5c0="style='"+_5be+";"+_5bf+"'";
5750 el.innerHTML="<div "+_5c0+">"+el.innerHTML+"</div>";
5751 },_roundTopCorners:function(el,_5c2,_5c3){
5752 var _5c4=this._createCorner(_5c3);
5753 for(var i=0;i<this.options.numSlices;i++){
5754 _5c4.appendChild(this._createCornerSlice(_5c2,_5c3,i,"top"));
5755 }
5756 el.style.paddingTop=0;
5757 el.insertBefore(_5c4,el.firstChild);
5758 },_roundBottomCorners:function(el,_5c7,_5c8){
5759 var _5c9=this._createCorner(_5c8);
5760 for(var i=(this.options.numSlices-1);i>=0;i--){
5761 _5c9.appendChild(this._createCornerSlice(_5c7,_5c8,i,"bottom"));
5762 }
5763 el.style.paddingBottom=0;
5764 el.appendChild(_5c9);
5765 },_createCorner:function(_5cb){
5766 var dom=MochiKit.DOM;
5767 return dom.DIV({style:{backgroundColor:_5cb.toString()}});
5768 },_createCornerSlice:function(_5cd,_5ce,n,_5d0){
5769 var _5d1=MochiKit.DOM.SPAN();
5770 var _5d2=_5d1.style;
5771 _5d2.backgroundColor=_5cd.toString();
5772 _5d2.display="block";
5773 _5d2.height="1px";
5774 _5d2.overflow="hidden";
5775 _5d2.fontSize="1px";
5776 var _5d3=this._borderColor(_5cd,_5ce);
5777 if(this.options.border&&n===0){
5778 _5d2.borderTopStyle="solid";
5779 _5d2.borderTopWidth="1px";
5780 _5d2.borderLeftWidth="0px";
5781 _5d2.borderRightWidth="0px";
5782 _5d2.borderBottomWidth="0px";
5783 _5d2.height="0px";
5784 _5d2.borderColor=_5d3.toString();
5785 }else{
5786 if(_5d3){
5787 _5d2.borderColor=_5d3.toString();
5788 _5d2.borderStyle="solid";
5789 _5d2.borderWidth="0px 1px";
5790 }
5791 }
5792 if(!this.options.compact&&(n==(this.options.numSlices-1))){
5793 _5d2.height="2px";
5794 }
5795 this._setMargin(_5d1,n,_5d0);
5796 this._setBorder(_5d1,n,_5d0);
5797 return _5d1;
5798 },_setOptions:function(_5d4){
5799 this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false,__unstable__wrapElement:false};
5800 MochiKit.Base.update(this.options,_5d4);
5801 this.options.numSlices=(this.options.compact?2:4);
5802 },_whichSideTop:function(){
5803 var _5d5=this.options.corners;
5804 if(this._hasString(_5d5,"all","top")){
5805 return "";
5806 }
5807 var _5d6=(_5d5.indexOf("tl")!=-1);
5808 var _5d7=(_5d5.indexOf("tr")!=-1);
5809 if(_5d6&&_5d7){
5810 return "";
5811 }
5812 if(_5d6){
5813 return "left";
5814 }
5815 if(_5d7){
5816 return "right";
5817 }
5818 return "";
5819 },_whichSideBottom:function(){
5820 var _5d8=this.options.corners;
5821 if(this._hasString(_5d8,"all","bottom")){
5822 return "";
5823 }
5824 var _5d9=(_5d8.indexOf("bl")!=-1);
5825 var _5da=(_5d8.indexOf("br")!=-1);
5826 if(_5d9&&_5da){
5827 return "";
5828 }
5829 if(_5d9){
5830 return "left";
5831 }
5832 if(_5da){
5833 return "right";
5834 }
5835 return "";
5836 },_borderColor:function(_5db,_5dc){
5837 if(_5db=="transparent"){
5838 return _5dc;
5839 }else{
5840 if(this.options.border){
5841 return this.options.border;
5842 }else{
5843 if(this.options.blend){
5844 return _5dc.blendedColor(_5db);
5845 }
5846 }
5847 }
5848 return "";
5849 },_setMargin:function(el,n,_5df){
5850 var _5e0=this._marginSize(n)+"px";
5851 var _5e1=(_5df=="top"?this._whichSideTop():this._whichSideBottom());
5852 var _5e2=el.style;
5853 if(_5e1=="left"){
5854 _5e2.marginLeft=_5e0;
5855 _5e2.marginRight="0px";
5856 }else{
5857 if(_5e1=="right"){
5858 _5e2.marginRight=_5e0;
5859 _5e2.marginLeft="0px";
5860 }else{
5861 _5e2.marginLeft=_5e0;
5862 _5e2.marginRight=_5e0;
5863 }
5864 }
5865 },_setBorder:function(el,n,_5e5){
5866 var _5e6=this._borderSize(n)+"px";
5867 var _5e7=(_5e5=="top"?this._whichSideTop():this._whichSideBottom());
5868 var _5e8=el.style;
5869 if(_5e7=="left"){
5870 _5e8.borderLeftWidth=_5e6;
5871 _5e8.borderRightWidth="0px";
5872 }else{
5873 if(_5e7=="right"){
5874 _5e8.borderRightWidth=_5e6;
5875 _5e8.borderLeftWidth="0px";
5876 }else{
5877 _5e8.borderLeftWidth=_5e6;
5878 _5e8.borderRightWidth=_5e6;
5879 }
5880 }
5881 },_marginSize:function(n){
5882 if(this.isTransparent){
5883 return 0;
5884 }
5885 var o=this.options;
5886 if(o.compact&&o.blend){
5887 var _5eb=[1,0];
5888 return _5eb[n];
5889 }else{
5890 if(o.compact){
5891 var _5ec=[2,1];
5892 return _5ec[n];
5893 }else{
5894 if(o.blend){
5895 var _5ed=[3,2,1,0];
5896 return _5ed[n];
5897 }else{
5898 var _5ee=[5,3,2,1];
5899 return _5ee[n];
5900 }
5901 }
5902 }
5903 },_borderSize:function(n){
5904 var o=this.options;
5905 var _5f1;
5906 if(o.compact&&(o.blend||this.isTransparent)){
5907 return 1;
5908 }else{
5909 if(o.compact){
5910 _5f1=[1,0];
5911 }else{
5912 if(o.blend){
5913 _5f1=[2,1,1,1];
5914 }else{
5915 if(o.border){
5916 _5f1=[0,2,0,0];
5917 }else{
5918 if(this.isTransparent){
5919 _5f1=[5,3,2,1];
5920 }else{
5921 return 0;
5922 }
5923 }
5924 }
5925 }
5926 }
5927 return _5f1[n];
5928 },_hasString:function(str){
5929 for(var i=1;i<arguments.length;i++){
5930 if(str.indexOf(arguments[i])!=-1){
5931 return true;
5932 }
5933 }
5934 return false;
5935 },_isTopRounded:function(){
5936 return this._hasString(this.options.corners,"all","top","tl","tr");
5937 },_isBottomRounded:function(){
5938 return this._hasString(this.options.corners,"all","bottom","bl","br");
5939 },_hasSingleTextChild:function(el){
5940 return (el.childNodes.length==1&&el.childNodes[0].nodeType==3);
5941 }};
5942 MochiKit.Visual.roundElement=function(e,_5f6){
5943 new MochiKit.Visual._RoundCorners(e,_5f6);
5944 };
5945 MochiKit.Visual.roundClass=function(_5f7,_5f8,_5f9){
5946 var _5fa=MochiKit.DOM.getElementsByTagAndClassName(_5f7,_5f8);
5947 for(var i=0;i<_5fa.length;i++){
5948 MochiKit.Visual.roundElement(_5fa[i],_5f9);
5949 }
5950 };
5951 MochiKit.Visual.tagifyText=function(_5fc,_5fd){
5952 _5fd=_5fd||"position:relative";
5953 if(/MSIE/.test(navigator.userAgent)){
5954 _5fd+=";zoom:1";
5955 }
5956 _5fc=MochiKit.DOM.getElement(_5fc);
5957 var ma=MochiKit.Base.map;
5958 ma(function(_5ff){
5959 if(_5ff.nodeType==3){
5960 ma(function(_600){
5961 _5fc.insertBefore(MochiKit.DOM.SPAN({style:_5fd},_600==" "?String.fromCharCode(160):_600),_5ff);
5962 },_5ff.nodeValue.split(""));
5963 MochiKit.DOM.removeElement(_5ff);
5964 }
5965 },_5fc.childNodes);
5966 };
5967 MochiKit.Visual.forceRerendering=function(_601){
5968 try{
5969 _601=MochiKit.DOM.getElement(_601);
5970 var n=document.createTextNode(" ");
5971 _601.appendChild(n);
5972 _601.removeChild(n);
5973 }
5974 catch(e){
5975 }
5976 };
5977 MochiKit.Visual.multiple=function(_603,_604,_605){
5978 _605=MochiKit.Base.update({speed:0.1,delay:0},_605||{});
5979 var _606=_605.delay;
5980 var _607=0;
5981 MochiKit.Base.map(function(_608){
5982 _605.delay=_607*_605.speed+_606;
5983 new _604(_608,_605);
5984 _607+=1;
5985 },_603);
5986 };
5987 MochiKit.Visual.PAIRS={"slide":["slideDown","slideUp"],"blind":["blindDown","blindUp"],"appear":["appear","fade"],"size":["grow","shrink"]};
5988 MochiKit.Visual.toggle=function(_609,_60a,_60b){
5989 _609=MochiKit.DOM.getElement(_609);
5990 _60a=(_60a||"appear").toLowerCase();
5991 _60b=MochiKit.Base.update({queue:{position:"end",scope:(_609.id||"global"),limit:1}},_60b||{});
5992 var v=MochiKit.Visual;
5993 v[_609.style.display!="none"?v.PAIRS[_60a][1]:v.PAIRS[_60a][0]](_609,_60b);
5994 };
5995 MochiKit.Visual.Transitions={};
5996 MochiKit.Visual.Transitions.linear=function(pos){
5997 return pos;
5998 };
5999 MochiKit.Visual.Transitions.sinoidal=function(pos){
6000 return (-Math.cos(pos*Math.PI)/2)+0.5;
6001 };
6002 MochiKit.Visual.Transitions.reverse=function(pos){
6003 return 1-pos;
6004 };
6005 MochiKit.Visual.Transitions.flicker=function(pos){
6006 return ((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;
6007 };
6008 MochiKit.Visual.Transitions.wobble=function(pos){
6009 return (-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;
6010 };
6011 MochiKit.Visual.Transitions.pulse=function(pos,_613){
6012 if(!_613){
6013 return (Math.floor(pos*10)%2===0?(pos*10-Math.floor(pos*10)):1-(pos*10-Math.floor(pos*10)));
6014 }
6015 return (Math.round((pos%(1/_613))*_613)==0?((pos*_613*2)-Math.floor(pos*_613*2)):1-((pos*_613*2)-Math.floor(pos*_613*2)));
6016 };
6017 MochiKit.Visual.Transitions.none=function(pos){
6018 return 0;
6019 };
6020 MochiKit.Visual.Transitions.full=function(pos){
6021 return 1;
6022 };
6023 MochiKit.Visual.ScopedQueue=function(){
6024 var cls=arguments.callee;
6025 if(!(this instanceof cls)){
6026 return new cls();
6027 }
6028 this.__init__();
6029 };
6030 MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype,{__init__:function(){
6031 this.effects=[];
6032 this.interval=null;
6033 },add:function(_617){
6034 var _618=new Date().getTime();
6035 var _619=(typeof (_617.options.queue)=="string")?_617.options.queue:_617.options.queue.position;
6036 var ma=MochiKit.Base.map;
6037 switch(_619){
6038 case "front":
6039 ma(function(e){
6040 if(e.state=="idle"){
6041 e.startOn+=_617.finishOn;
6042 e.finishOn+=_617.finishOn;
6043 }
6044 },this.effects);
6045 break;
6046 case "end":
6047 var _61c;
6048 ma(function(e){
6049 var i=e.finishOn;
6050 if(i>=(_61c||i)){
6051 _61c=i;
6052 }
6053 },this.effects);
6054 _618=_61c||_618;
6055 break;
6056 case "break":
6057 ma(function(e){
6058 e.finalize();
6059 },this.effects);
6060 break;
6061 }
6062 _617.startOn+=_618;
6063 _617.finishOn+=_618;
6064 if(!_617.options.queue.limit||this.effects.length<_617.options.queue.limit){
6065 this.effects.push(_617);
6066 }
6067 if(!this.interval){
6068 this.interval=this.startLoop(MochiKit.Base.bind(this.loop,this),40);
6069 }
6070 },startLoop:function(func,_621){
6071 return setInterval(func,_621);
6072 },remove:function(_622){
6073 this.effects=MochiKit.Base.filter(function(e){
6074 return e!=_622;
6075 },this.effects);
6076 if(!this.effects.length){
6077 this.stopLoop(this.interval);
6078 this.interval=null;
6079 }
6080 },stopLoop:function(_624){
6081 clearInterval(_624);
6082 },loop:function(){
6083 var _625=new Date().getTime();
6084 MochiKit.Base.map(function(_626){
6085 _626.loop(_625);
6086 },this.effects);
6087 }});
6088 MochiKit.Visual.Queues={instances:{},get:function(_627){
6089 if(typeof (_627)!="string"){
6090 return _627;
6091 }
6092 if(!this.instances[_627]){
6093 this.instances[_627]=new MochiKit.Visual.ScopedQueue();
6094 }
6095 return this.instances[_627];
6096 }};
6097 MochiKit.Visual.Queue=MochiKit.Visual.Queues.get("global");
6098 MochiKit.Visual.DefaultOptions={transition:MochiKit.Visual.Transitions.sinoidal,duration:1,fps:25,sync:false,from:0,to:1,delay:0,queue:"parallel"};
6099 MochiKit.Visual.Base=function(){
6100 };
6101 MochiKit.Visual.Base.prototype={__class__:MochiKit.Visual.Base,start:function(_628){
6102 var v=MochiKit.Visual;
6103 this.options=MochiKit.Base.setdefault(_628||{},v.DefaultOptions);
6104 this.currentFrame=0;
6105 this.state="idle";
6106 this.startOn=this.options.delay*1000;
6107 this.finishOn=this.startOn+(this.options.duration*1000);
6108 this.event("beforeStart");
6109 if(!this.options.sync){
6110 v.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).add(this);
6111 }
6112 },loop:function(_62a){
6113 if(_62a>=this.startOn){
6114 if(_62a>=this.finishOn){
6115 return this.finalize();
6116 }
6117 var pos=(_62a-this.startOn)/(this.finishOn-this.startOn);
6118 var _62c=Math.round(pos*this.options.fps*this.options.duration);
6119 if(_62c>this.currentFrame){
6120 this.render(pos);
6121 this.currentFrame=_62c;
6122 }
6123 }
6124 },render:function(pos){
6125 if(this.state=="idle"){
6126 this.state="running";
6127 this.event("beforeSetup");
6128 this.setup();
6129 this.event("afterSetup");
6130 }
6131 if(this.state=="running"){
6132 if(this.options.transition){
6133 pos=this.options.transition(pos);
6134 }
6135 pos*=(this.options.to-this.options.from);
6136 pos+=this.options.from;
6137 this.event("beforeUpdate");
6138 this.update(pos);
6139 this.event("afterUpdate");
6140 }
6141 },cancel:function(){
6142 if(!this.options.sync){
6143 MochiKit.Visual.Queues.get(typeof (this.options.queue)=="string"?"global":this.options.queue.scope).remove(this);
6144 }
6145 this.state="finished";
6146 },finalize:function(){
6147 this.render(1);
6148 this.cancel();
6149 this.event("beforeFinish");
6150 this.finish();
6151 this.event("afterFinish");
6152 },setup:function(){
6153 },finish:function(){
6154 },update:function(_62e){
6155 },event:function(_62f){
6156 if(this.options[_62f+"Internal"]){
6157 this.options[_62f+"Internal"](this);
6158 }
6159 if(this.options[_62f]){
6160 this.options[_62f](this);
6161 }
6162 },repr:function(){
6163 return "["+this.__class__.NAME+", options:"+MochiKit.Base.repr(this.options)+"]";
6164 }};
6165 MochiKit.Visual.Parallel=function(_630,_631){
6166 var cls=arguments.callee;
6167 if(!(this instanceof cls)){
6168 return new cls(_630,_631);
6169 }
6170 this.__init__(_630,_631);
6171 };
6172 MochiKit.Visual.Parallel.prototype=new MochiKit.Visual.Base();
6173 MochiKit.Base.update(MochiKit.Visual.Parallel.prototype,{__class__:MochiKit.Visual.Parallel,__init__:function(_633,_634){
6174 this.effects=_633||[];
6175 this.start(_634);
6176 },update:function(_635){
6177 MochiKit.Base.map(function(_636){
6178 _636.render(_635);
6179 },this.effects);
6180 },finish:function(){
6181 MochiKit.Base.map(function(_637){
6182 _637.finalize();
6183 },this.effects);
6184 }});
6185 MochiKit.Visual.Opacity=function(_638,_639){
6186 var cls=arguments.callee;
6187 if(!(this instanceof cls)){
6188 return new cls(_638,_639);
6189 }
6190 this.__init__(_638,_639);
6191 };
6192 MochiKit.Visual.Opacity.prototype=new MochiKit.Visual.Base();
6193 MochiKit.Base.update(MochiKit.Visual.Opacity.prototype,{__class__:MochiKit.Visual.Opacity,__init__:function(_63b,_63c){
6194 var b=MochiKit.Base;
6195 var s=MochiKit.Style;
6196 this.element=MochiKit.DOM.getElement(_63b);
6197 if(this.element.currentStyle&&(!this.element.currentStyle.hasLayout)){
6198 s.setStyle(this.element,{zoom:1});
6199 }
6200 _63c=b.update({from:s.getStyle(this.element,"opacity")||0,to:1},_63c||{});
6201 this.start(_63c);
6202 },update:function(_63f){
6203 MochiKit.Style.setStyle(this.element,{"opacity":_63f});
6204 }});
6205 MochiKit.Visual.Move=function(_640,_641){
6206 var cls=arguments.callee;
6207 if(!(this instanceof cls)){
6208 return new cls(_640,_641);
6209 }
6210 this.__init__(_640,_641);
6211 };
6212 MochiKit.Visual.Move.prototype=new MochiKit.Visual.Base();
6213 MochiKit.Base.update(MochiKit.Visual.Move.prototype,{__class__:MochiKit.Visual.Move,__init__:function(_643,_644){
6214 this.element=MochiKit.DOM.getElement(_643);
6215 _644=MochiKit.Base.update({x:0,y:0,mode:"relative"},_644||{});
6216 this.start(_644);
6217 },setup:function(){
6218 MochiKit.DOM.makePositioned(this.element);
6219 var s=this.element.style;
6220 var _646=s.visibility;
6221 var _647=s.display;
6222 if(_647=="none"){
6223 s.visibility="hidden";
6224 s.display="";
6225 }
6226 this.originalLeft=parseFloat(MochiKit.Style.getStyle(this.element,"left")||"0");
6227 this.originalTop=parseFloat(MochiKit.Style.getStyle(this.element,"top")||"0");
6228 if(this.options.mode=="absolute"){
6229 this.options.x-=this.originalLeft;
6230 this.options.y-=this.originalTop;
6231 }
6232 if(_647=="none"){
6233 s.visibility=_646;
6234 s.display=_647;
6235 }
6236 },update:function(_648){
6237 MochiKit.Style.setStyle(this.element,{left:Math.round(this.options.x*_648+this.originalLeft)+"px",top:Math.round(this.options.y*_648+this.originalTop)+"px"});
6238 }});
6239 MochiKit.Visual.Scale=function(_649,_64a,_64b){
6240 var cls=arguments.callee;
6241 if(!(this instanceof cls)){
6242 return new cls(_649,_64a,_64b);
6243 }
6244 this.__init__(_649,_64a,_64b);
6245 };
6246 MochiKit.Visual.Scale.prototype=new MochiKit.Visual.Base();
6247 MochiKit.Base.update(MochiKit.Visual.Scale.prototype,{__class__:MochiKit.Visual.Scale,__init__:function(_64d,_64e,_64f){
6248 this.element=MochiKit.DOM.getElement(_64d);
6249 _64f=MochiKit.Base.update({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:_64e},_64f||{});
6250 this.start(_64f);
6251 },setup:function(){
6252 this.restoreAfterFinish=this.options.restoreAfterFinish||false;
6253 this.elementPositioning=MochiKit.Style.getStyle(this.element,"position");
6254 var ma=MochiKit.Base.map;
6255 var b=MochiKit.Base.bind;
6256 this.originalStyle={};
6257 ma(b(function(k){
6258 this.originalStyle[k]=this.element.style[k];
6259 },this),["top","left","width","height","fontSize"]);
6260 this.originalTop=this.element.offsetTop;
6261 this.originalLeft=this.element.offsetLeft;
6262 var _653=MochiKit.Style.getStyle(this.element,"font-size")||"100%";
6263 ma(b(function(_654){
6264 if(_653.indexOf(_654)>0){
6265 this.fontSize=parseFloat(_653);
6266 this.fontSizeType=_654;
6267 }
6268 },this),["em","px","%"]);
6269 this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;
6270 if(/^content/.test(this.options.scaleMode)){
6271 this.dims=[this.element.scrollHeight,this.element.scrollWidth];
6272 }else{
6273 if(this.options.scaleMode=="box"){
6274 this.dims=[this.element.offsetHeight,this.element.offsetWidth];
6275 }else{
6276 this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];
6277 }
6278 }
6279 },update:function(_655){
6280 var _656=(this.options.scaleFrom/100)+(this.factor*_655);
6281 if(this.options.scaleContent&&this.fontSize){
6282 MochiKit.Style.setStyle(this.element,{fontSize:this.fontSize*_656+this.fontSizeType});
6283 }
6284 this.setDimensions(this.dims[0]*_656,this.dims[1]*_656);
6285 },finish:function(){
6286 if(this.restoreAfterFinish){
6287 MochiKit.Style.setStyle(this.element,this.originalStyle);
6288 }
6289 },setDimensions:function(_657,_658){
6290 var d={};
6291 var r=Math.round;
6292 if(/MSIE/.test(navigator.userAgent)){
6293 r=Math.ceil;
6294 }
6295 if(this.options.scaleX){
6296 d.width=r(_658)+"px";
6297 }
6298 if(this.options.scaleY){
6299 d.height=r(_657)+"px";
6300 }
6301 if(this.options.scaleFromCenter){
6302 var topd=(_657-this.dims[0])/2;
6303 var _65c=(_658-this.dims[1])/2;
6304 if(this.elementPositioning=="absolute"){
6305 if(this.options.scaleY){
6306 d.top=this.originalTop-topd+"px";
6307 }
6308 if(this.options.scaleX){
6309 d.left=this.originalLeft-_65c+"px";
6310 }
6311 }else{
6312 if(this.options.scaleY){
6313 d.top=-topd+"px";
6314 }
6315 if(this.options.scaleX){
6316 d.left=-_65c+"px";
6317 }
6318 }
6319 }
6320 MochiKit.Style.setStyle(this.element,d);
6321 }});
6322 MochiKit.Visual.Highlight=function(_65d,_65e){
6323 var cls=arguments.callee;
6324 if(!(this instanceof cls)){
6325 return new cls(_65d,_65e);
6326 }
6327 this.__init__(_65d,_65e);
6328 };
6329 MochiKit.Visual.Highlight.prototype=new MochiKit.Visual.Base();
6330 MochiKit.Base.update(MochiKit.Visual.Highlight.prototype,{__class__:MochiKit.Visual.Highlight,__init__:function(_660,_661){
6331 this.element=MochiKit.DOM.getElement(_660);
6332 _661=MochiKit.Base.update({startcolor:"#ffff99"},_661||{});
6333 this.start(_661);
6334 },setup:function(){
6335 var b=MochiKit.Base;
6336 var s=MochiKit.Style;
6337 if(s.getStyle(this.element,"display")=="none"){
6338 this.cancel();
6339 return;
6340 }
6341 this.oldStyle={backgroundImage:s.getStyle(this.element,"background-image")};
6342 s.setStyle(this.element,{backgroundImage:"none"});
6343 if(!this.options.endcolor){
6344 this.options.endcolor=MochiKit.Color.Color.fromBackground(this.element).toHexString();
6345 }
6346 if(b.isUndefinedOrNull(this.options.restorecolor)){
6347 this.options.restorecolor=s.getStyle(this.element,"background-color");
6348 }
6349 this._base=b.map(b.bind(function(i){
6350 return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16);
6351 },this),[0,1,2]);
6352 this._delta=b.map(b.bind(function(i){
6353 return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i];
6354 },this),[0,1,2]);
6355 },update:function(_666){
6356 var m="#";
6357 MochiKit.Base.map(MochiKit.Base.bind(function(i){
6358 m+=MochiKit.Color.toColorPart(Math.round(this._base[i]+this._delta[i]*_666));
6359 },this),[0,1,2]);
6360 MochiKit.Style.setStyle(this.element,{backgroundColor:m});
6361 },finish:function(){
6362 MochiKit.Style.setStyle(this.element,MochiKit.Base.update(this.oldStyle,{backgroundColor:this.options.restorecolor}));
6363 }});
6364 MochiKit.Visual.ScrollTo=function(_669,_66a){
6365 var cls=arguments.callee;
6366 if(!(this instanceof cls)){
6367 return new cls(_669,_66a);
6368 }
6369 this.__init__(_669,_66a);
6370 };
6371 MochiKit.Visual.ScrollTo.prototype=new MochiKit.Visual.Base();
6372 MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype,{__class__:MochiKit.Visual.ScrollTo,__init__:function(_66c,_66d){
6373 this.element=MochiKit.DOM.getElement(_66c);
6374 this.start(_66d||{});
6375 },setup:function(){
6376 var p=MochiKit.Position;
6377 p.prepare();
6378 var _66f=p.cumulativeOffset(this.element);
6379 if(this.options.offset){
6380 _66f.y+=this.options.offset;
6381 }
6382 var max;
6383 if(window.innerHeight){
6384 max=window.innerHeight-window.height;
6385 }else{
6386 if(document.documentElement&&document.documentElement.clientHeight){
6387 max=document.documentElement.clientHeight-document.body.scrollHeight;
6388 }else{
6389 if(document.body){
6390 max=document.body.clientHeight-document.body.scrollHeight;
6391 }
6392 }
6393 }
6394 this.scrollStart=p.windowOffset.y;
6395 this.delta=(_66f.y>max?max:_66f.y)-this.scrollStart;
6396 },update:function(_671){
6397 var p=MochiKit.Position;
6398 p.prepare();
6399 window.scrollTo(p.windowOffset.x,this.scrollStart+(_671*this.delta));
6400 }});
6401 MochiKit.Visual.CSS_LENGTH=/^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
6402 MochiKit.Visual.Morph=function(_673,_674){
6403 var cls=arguments.callee;
6404 if(!(this instanceof cls)){
6405 return new cls(_673,_674);
6406 }
6407 this.__init__(_673,_674);
6408 };
6409 MochiKit.Visual.Morph.prototype=new MochiKit.Visual.Base();
6410 MochiKit.Base.update(MochiKit.Visual.Morph.prototype,{__class__:MochiKit.Visual.Morph,__init__:function(_676,_677){
6411 this.element=MochiKit.DOM.getElement(_676);
6412 this.start(_677||{});
6413 },setup:function(){
6414 var b=MochiKit.Base;
6415 var _679=this.options.style;
6416 this.styleStart={};
6417 this.styleEnd={};
6418 this.units={};
6419 var _67a,unit;
6420 for(var s in _679){
6421 _67a=_679[s];
6422 s=b.camelize(s);
6423 if(MochiKit.Visual.CSS_LENGTH.test(_67a)){
6424 var _67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/);
6425 _67a=parseFloat(_67d[1]);
6426 unit=(_67d.length==3)?_67d[2]:null;
6427 this.styleEnd[s]=_67a;
6428 this.units[s]=unit;
6429 _67a=MochiKit.Style.getStyle(this.element,s);
6430 _67d=_67a.match(/^([\+\-]?[0-9\.]+)(.*)$/);
6431 _67a=parseFloat(_67d[1]);
6432 this.styleStart[s]=_67a;
6433 }else{
6434 var c=MochiKit.Color.Color;
6435 _67a=c.fromString(_67a);
6436 if(_67a){
6437 this.units[s]="color";
6438 this.styleEnd[s]=_67a.toHexString();
6439 _67a=MochiKit.Style.getStyle(this.element,s);
6440 this.styleStart[s]=c.fromString(_67a).toHexString();
6441 this.styleStart[s]=b.map(b.bind(function(i){
6442 return parseInt(this.styleStart[s].slice(i*2+1,i*2+3),16);
6443 },this),[0,1,2]);
6444 this.styleEnd[s]=b.map(b.bind(function(i){
6445 return parseInt(this.styleEnd[s].slice(i*2+1,i*2+3),16);
6446 },this),[0,1,2]);
6447 }
6448 }
6449 }
6450 },update:function(_681){
6451 var _682;
6452 for(var s in this.styleStart){
6453 if(this.units[s]=="color"){
6454 var m="#";
6455 var _685=this.styleStart[s];
6456 var end=this.styleEnd[s];
6457 MochiKit.Base.map(MochiKit.Base.bind(function(i){
6458 m+=MochiKit.Color.toColorPart(Math.round(_685[i]+(end[i]-_685[i])*_681));
6459 },this),[0,1,2]);
6460 this.element.style[s]=m;
6461 }else{
6462 _682=this.styleStart[s]+Math.round((this.styleEnd[s]-this.styleStart[s])*_681*1000)/1000+this.units[s];
6463 this.element.style[s]=_682;
6464 }
6465 }
6466 }});
6467 MochiKit.Visual.fade=function(_688,_689){
6468 var s=MochiKit.Style;
6469 var _68b=s.getStyle(_688,"opacity");
6470 _689=MochiKit.Base.update({from:s.getStyle(_688,"opacity")||1,to:0,afterFinishInternal:function(_68c){
6471 if(_68c.options.to!==0){
6472 return;
6473 }
6474 s.hideElement(_68c.element);
6475 s.setStyle(_68c.element,{"opacity":_68b});
6476 }},_689||{});
6477 return new MochiKit.Visual.Opacity(_688,_689);
6478 };
6479 MochiKit.Visual.appear=function(_68d,_68e){
6480 var s=MochiKit.Style;
6481 var v=MochiKit.Visual;
6482 _68e=MochiKit.Base.update({from:(s.getStyle(_68d,"display")=="none"?0:s.getStyle(_68d,"opacity")||0),to:1,afterFinishInternal:function(_691){
6483 v.forceRerendering(_691.element);
6484 },beforeSetupInternal:function(_692){
6485 s.setStyle(_692.element,{"opacity":_692.options.from});
6486 s.showElement(_692.element);
6487 }},_68e||{});
6488 return new v.Opacity(_68d,_68e);
6489 };
6490 MochiKit.Visual.puff=function(_693,_694){
6491 var s=MochiKit.Style;
6492 var v=MochiKit.Visual;
6493 _693=MochiKit.DOM.getElement(_693);
6494 var _697={position:s.getStyle(_693,"position"),top:_693.style.top,left:_693.style.left,width:_693.style.width,height:_693.style.height,opacity:s.getStyle(_693,"opacity")};
6495 _694=MochiKit.Base.update({beforeSetupInternal:function(_698){
6496 MochiKit.Position.absolutize(_698.effects[0].element);
6497 },afterFinishInternal:function(_699){
6498 s.hideElement(_699.effects[0].element);
6499 s.setStyle(_699.effects[0].element,_697);
6500 },scaleContent:true,scaleFromCenter:true},_694||{});
6501 return new v.Parallel([new v.Scale(_693,200,{sync:true,scaleFromCenter:_694.scaleFromCenter,scaleContent:_694.scaleContent,restoreAfterFinish:true}),new v.Opacity(_693,{sync:true,to:0})],_694);
6502 };
6503 MochiKit.Visual.blindUp=function(_69a,_69b){
6504 var d=MochiKit.DOM;
6505 _69a=d.getElement(_69a);
6506 var _69d=d.makeClipping(_69a);
6507 _69b=MochiKit.Base.update({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(_69e){
6508 MochiKit.Style.hideElement(_69e.element);
6509 d.undoClipping(_69e.element,_69d);
6510 }},_69b||{});
6511 return new MochiKit.Visual.Scale(_69a,0,_69b);
6512 };
6513 MochiKit.Visual.blindDown=function(_69f,_6a0){
6514 var d=MochiKit.DOM;
6515 var s=MochiKit.Style;
6516 _69f=d.getElement(_69f);
6517 var _6a3=s.getElementDimensions(_69f);
6518 var _6a4;
6519 _6a0=MochiKit.Base.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6a3.h,originalWidth:_6a3.w},restoreAfterFinish:true,afterSetupInternal:function(_6a5){
6520 _6a4=d.makeClipping(_6a5.element);
6521 s.setStyle(_6a5.element,{height:"0px"});
6522 s.showElement(_6a5.element);
6523 },afterFinishInternal:function(_6a6){
6524 d.undoClipping(_6a6.element,_6a4);
6525 }},_6a0||{});
6526 return new MochiKit.Visual.Scale(_69f,100,_6a0);
6527 };
6528 MochiKit.Visual.switchOff=function(_6a7,_6a8){
6529 var d=MochiKit.DOM;
6530 _6a7=d.getElement(_6a7);
6531 var _6aa=MochiKit.Style.getStyle(_6a7,"opacity");
6532 var _6ab;
6533 _6a8=MochiKit.Base.update({duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetupInternal:function(_6ac){
6534 d.makePositioned(_6ac.element);
6535 _6ab=d.makeClipping(_6ac.element);
6536 },afterFinishInternal:function(_6ad){
6537 MochiKit.Style.hideElement(_6ad.element);
6538 d.undoClipping(_6ad.element,_6ab);
6539 d.undoPositioned(_6ad.element);
6540 MochiKit.Style.setStyle(_6ad.element,{"opacity":_6aa});
6541 }},_6a8||{});
6542 var v=MochiKit.Visual;
6543 return new v.appear(_6a7,{duration:0.4,from:0,transition:v.Transitions.flicker,afterFinishInternal:function(_6af){
6544 new v.Scale(_6af.element,1,_6a8);
6545 }});
6546 };
6547 MochiKit.Visual.dropOut=function(_6b0,_6b1){
6548 var d=MochiKit.DOM;
6549 var s=MochiKit.Style;
6550 _6b0=d.getElement(_6b0);
6551 var _6b4={top:s.getStyle(_6b0,"top"),left:s.getStyle(_6b0,"left"),opacity:s.getStyle(_6b0,"opacity")};
6552 _6b1=MochiKit.Base.update({duration:0.5,distance:100,beforeSetupInternal:function(_6b5){
6553 d.makePositioned(_6b5.effects[0].element);
6554 },afterFinishInternal:function(_6b6){
6555 s.hideElement(_6b6.effects[0].element);
6556 d.undoPositioned(_6b6.effects[0].element);
6557 s.setStyle(_6b6.effects[0].element,_6b4);
6558 }},_6b1||{});
6559 var v=MochiKit.Visual;
6560 return new v.Parallel([new v.Move(_6b0,{x:0,y:_6b1.distance,sync:true}),new v.Opacity(_6b0,{sync:true,to:0})],_6b1);
6561 };
6562 MochiKit.Visual.shake=function(_6b8,_6b9){
6563 var d=MochiKit.DOM;
6564 var v=MochiKit.Visual;
6565 var s=MochiKit.Style;
6566 _6b8=d.getElement(_6b8);
6567 _6b9=MochiKit.Base.update({x:-20,y:0,duration:0.05,afterFinishInternal:function(_6bd){
6568 d.undoPositioned(_6bd.element);
6569 s.setStyle(_6bd.element,_6be);
6570 }},_6b9||{});
6571 var _6be={top:s.getStyle(_6b8,"top"),left:s.getStyle(_6b8,"left")};
6572 return new v.Move(_6b8,{x:20,y:0,duration:0.05,afterFinishInternal:function(_6bf){
6573 new v.Move(_6bf.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c0){
6574 new v.Move(_6c0.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c1){
6575 new v.Move(_6c1.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_6c2){
6576 new v.Move(_6c2.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_6c3){
6577 new v.Move(_6c3.element,_6b9);
6578 }});
6579 }});
6580 }});
6581 }});
6582 }});
6583 };
6584 MochiKit.Visual.slideDown=function(_6c4,_6c5){
6585 var d=MochiKit.DOM;
6586 var b=MochiKit.Base;
6587 var s=MochiKit.Style;
6588 _6c4=d.getElement(_6c4);
6589 if(!_6c4.firstChild){
6590 throw "MochiKit.Visual.slideDown must be used on a element with a child";
6591 }
6592 d.removeEmptyTextNodes(_6c4);
6593 var _6c9=s.getStyle(_6c4.firstChild,"bottom")||0;
6594 var _6ca=s.getElementDimensions(_6c4);
6595 var _6cb;
6596 _6c5=b.update({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_6ca.h,originalWidth:_6ca.w},restoreAfterFinish:true,afterSetupInternal:function(_6cc){
6597 d.makePositioned(_6cc.element);
6598 d.makePositioned(_6cc.element.firstChild);
6599 if(/Opera/.test(navigator.userAgent)){
6600 s.setStyle(_6cc.element,{top:""});
6601 }
6602 _6cb=d.makeClipping(_6cc.element);
6603 s.setStyle(_6cc.element,{height:"0px"});
6604 s.showElement(_6cc.element);
6605 },afterUpdateInternal:function(_6cd){
6606 s.setStyle(_6cd.element.firstChild,{bottom:(_6cd.dims[0]-_6cd.element.clientHeight)+"px"});
6607 },afterFinishInternal:function(_6ce){
6608 d.undoClipping(_6ce.element,_6cb);
6609 if(/MSIE/.test(navigator.userAgent)){
6610 d.undoPositioned(_6ce.element);
6611 d.undoPositioned(_6ce.element.firstChild);
6612 }else{
6613 d.undoPositioned(_6ce.element.firstChild);
6614 d.undoPositioned(_6ce.element);
6615 }
6616 s.setStyle(_6ce.element.firstChild,{bottom:_6c9});
6617 }},_6c5||{});
6618 return new MochiKit.Visual.Scale(_6c4,100,_6c5);
6619 };
6620 MochiKit.Visual.slideUp=function(_6cf,_6d0){
6621 var d=MochiKit.DOM;
6622 var b=MochiKit.Base;
6623 var s=MochiKit.Style;
6624 _6cf=d.getElement(_6cf);
6625 if(!_6cf.firstChild){
6626 throw "MochiKit.Visual.slideUp must be used on a element with a child";
6627 }
6628 d.removeEmptyTextNodes(_6cf);
6629 var _6d4=s.getStyle(_6cf.firstChild,"bottom");
6630 var _6d5;
6631 _6d0=b.update({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(_6d6){
6632 d.makePositioned(_6d6.element);
6633 d.makePositioned(_6d6.element.firstChild);
6634 if(/Opera/.test(navigator.userAgent)){
6635 s.setStyle(_6d6.element,{top:""});
6636 }
6637 _6d5=d.makeClipping(_6d6.element);
6638 s.showElement(_6d6.element);
6639 },afterUpdateInternal:function(_6d7){
6640 s.setStyle(_6d7.element.firstChild,{bottom:(_6d7.dims[0]-_6d7.element.clientHeight)+"px"});
6641 },afterFinishInternal:function(_6d8){
6642 s.hideElement(_6d8.element);
6643 d.undoClipping(_6d8.element,_6d5);
6644 d.undoPositioned(_6d8.element.firstChild);
6645 d.undoPositioned(_6d8.element);
6646 s.setStyle(_6d8.element.firstChild,{bottom:_6d4});
6647 }},_6d0||{});
6648 return new MochiKit.Visual.Scale(_6cf,0,_6d0);
6649 };
6650 MochiKit.Visual.squish=function(_6d9,_6da){
6651 var d=MochiKit.DOM;
6652 var b=MochiKit.Base;
6653 var _6dd;
6654 _6da=b.update({restoreAfterFinish:true,beforeSetupInternal:function(_6de){
6655 _6dd=d.makeClipping(_6de.element);
6656 },afterFinishInternal:function(_6df){
6657 MochiKit.Style.hideElement(_6df.element);
6658 d.undoClipping(_6df.element,_6dd);
6659 }},_6da||{});
6660 return new MochiKit.Visual.Scale(_6d9,/Opera/.test(navigator.userAgent)?1:0,_6da);
6661 };
6662 MochiKit.Visual.grow=function(_6e0,_6e1){
6663 var d=MochiKit.DOM;
6664 var v=MochiKit.Visual;
6665 var s=MochiKit.Style;
6666 _6e0=d.getElement(_6e0);
6667 _6e1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.full,scaleContent:true,scaleFromCenter:false},_6e1||{});
6668 var _6e5={top:_6e0.style.top,left:_6e0.style.left,height:_6e0.style.height,width:_6e0.style.width,opacity:s.getStyle(_6e0,"opacity")};
6669 var dims=s.getElementDimensions(_6e0);
6670 var _6e7,_6e8;
6671 var _6e9,_6ea;
6672 switch(_6e1.direction){
6673 case "top-left":
6674 _6e7=_6e8=_6e9=_6ea=0;
6675 break;
6676 case "top-right":
6677 _6e7=dims.w;
6678 _6e8=_6ea=0;
6679 _6e9=-dims.w;
6680 break;
6681 case "bottom-left":
6682 _6e7=_6e9=0;
6683 _6e8=dims.h;
6684 _6ea=-dims.h;
6685 break;
6686 case "bottom-right":
6687 _6e7=dims.w;
6688 _6e8=dims.h;
6689 _6e9=-dims.w;
6690 _6ea=-dims.h;
6691 break;
6692 case "center":
6693 _6e7=dims.w/2;
6694 _6e8=dims.h/2;
6695 _6e9=-dims.w/2;
6696 _6ea=-dims.h/2;
6697 break;
6698 }
6699 var _6eb=MochiKit.Base.update({beforeSetupInternal:function(_6ec){
6700 s.setStyle(_6ec.effects[0].element,{height:"0px"});
6701 s.showElement(_6ec.effects[0].element);
6702 },afterFinishInternal:function(_6ed){
6703 d.undoClipping(_6ed.effects[0].element);
6704 d.undoPositioned(_6ed.effects[0].element);
6705 s.setStyle(_6ed.effects[0].element,_6e5);
6706 }},_6e1||{});
6707 return new v.Move(_6e0,{x:_6e7,y:_6e8,duration:0.01,beforeSetupInternal:function(_6ee){
6708 s.hideElement(_6ee.element);
6709 d.makeClipping(_6ee.element);
6710 d.makePositioned(_6ee.element);
6711 },afterFinishInternal:function(_6ef){
6712 new v.Parallel([new v.Opacity(_6ef.element,{sync:true,to:1,from:0,transition:_6e1.opacityTransition}),new v.Move(_6ef.element,{x:_6e9,y:_6ea,sync:true,transition:_6e1.moveTransition}),new v.Scale(_6ef.element,100,{scaleMode:{originalHeight:dims.h,originalWidth:dims.w},sync:true,scaleFrom:/Opera/.test(navigator.userAgent)?1:0,transition:_6e1.scaleTransition,scaleContent:_6e1.scaleContent,scaleFromCenter:_6e1.scaleFromCenter,restoreAfterFinish:true})],_6eb);
6713 }});
6714 };
6715 MochiKit.Visual.shrink=function(_6f0,_6f1){
6716 var d=MochiKit.DOM;
6717 var v=MochiKit.Visual;
6718 var s=MochiKit.Style;
6719 _6f0=d.getElement(_6f0);
6720 _6f1=MochiKit.Base.update({direction:"center",moveTransition:v.Transitions.sinoidal,scaleTransition:v.Transitions.sinoidal,opacityTransition:v.Transitions.none,scaleContent:true,scaleFromCenter:false},_6f1||{});
6721 var _6f5={top:_6f0.style.top,left:_6f0.style.left,height:_6f0.style.height,width:_6f0.style.width,opacity:s.getStyle(_6f0,"opacity")};
6722 var dims=s.getElementDimensions(_6f0);
6723 var _6f7,_6f8;
6724 switch(_6f1.direction){
6725 case "top-left":
6726 _6f7=_6f8=0;
6727 break;
6728 case "top-right":
6729 _6f7=dims.w;
6730 _6f8=0;
6731 break;
6732 case "bottom-left":
6733 _6f7=0;
6734 _6f8=dims.h;
6735 break;
6736 case "bottom-right":
6737 _6f7=dims.w;
6738 _6f8=dims.h;
6739 break;
6740 case "center":
6741 _6f7=dims.w/2;
6742 _6f8=dims.h/2;
6743 break;
6744 }
6745 var _6f9;
6746 var _6fa=MochiKit.Base.update({beforeStartInternal:function(_6fb){
6747 _6f9=d.makePositioned(_6fb.effects[0].element);
6748 d.makeClipping(_6fb.effects[0].element);
6749 },afterFinishInternal:function(_6fc){
6750 s.hideElement(_6fc.effects[0].element);
6751 d.undoClipping(_6fc.effects[0].element,_6f9);
6752 d.undoPositioned(_6fc.effects[0].element);
6753 s.setStyle(_6fc.effects[0].element,_6f5);
6754 }},_6f1||{});
6755 return new v.Parallel([new v.Opacity(_6f0,{sync:true,to:0,from:1,transition:_6f1.opacityTransition}),new v.Scale(_6f0,/Opera/.test(navigator.userAgent)?1:0,{sync:true,transition:_6f1.scaleTransition,scaleContent:_6f1.scaleContent,scaleFromCenter:_6f1.scaleFromCenter,restoreAfterFinish:true}),new v.Move(_6f0,{x:_6f7,y:_6f8,sync:true,transition:_6f1.moveTransition})],_6fa);
6756 };
6757 MochiKit.Visual.pulsate=function(_6fd,_6fe){
6758 var d=MochiKit.DOM;
6759 var v=MochiKit.Visual;
6760 var b=MochiKit.Base;
6761 var _702=MochiKit.Style.getStyle(_6fd,"opacity");
6762 _6fe=b.update({duration:3,from:0,afterFinishInternal:function(_703){
6763 MochiKit.Style.setStyle(_703.element,{"opacity":_702});
6764 }},_6fe||{});
6765 var _704=_6fe.transition||v.Transitions.sinoidal;
6766 var _705=b.bind(function(pos){
6767 return _704(1-v.Transitions.pulse(pos,_6fe.pulses));
6768 },_704);
6769 b.bind(_705,_704);
6770 return new v.Opacity(_6fd,b.update({transition:_705},_6fe));
6771 };
6772 MochiKit.Visual.fold=function(_707,_708){
6773 var d=MochiKit.DOM;
6774 var v=MochiKit.Visual;
6775 var s=MochiKit.Style;
6776 _707=d.getElement(_707);
6777 var _70c={top:_707.style.top,left:_707.style.left,width:_707.style.width,height:_707.style.height};
6778 var _70d=d.makeClipping(_707);
6779 _708=MochiKit.Base.update({scaleContent:false,scaleX:false,afterFinishInternal:function(_70e){
6780 new v.Scale(_707,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(_70f){
6781 s.hideElement(_70f.element);
6782 d.undoClipping(_70f.element,_70d);
6783 s.setStyle(_70f.element,_70c);
6784 }});
6785 }},_708||{});
6786 return new v.Scale(_707,5,_708);
6787 };
6788 MochiKit.Visual.Color=MochiKit.Color.Color;
6789 MochiKit.Visual.getElementsComputedStyle=MochiKit.DOM.computedStyle;
6790 MochiKit.Visual.__new__=function(){
6791 var m=MochiKit.Base;
6792 m.nameFunctions(this);
6793 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
6794 };
6795 MochiKit.Visual.EXPORT=["roundElement","roundClass","tagifyText","multiple","toggle","Parallel","Opacity","Move","Scale","Highlight","ScrollTo","Morph","fade","appear","puff","blindUp","blindDown","switchOff","dropOut","shake","slideDown","slideUp","squish","grow","shrink","pulsate","fold"];
6796 MochiKit.Visual.EXPORT_OK=["Base","PAIRS"];
6797 MochiKit.Visual.__new__();
6798 MochiKit.Base._exportSymbols(this,MochiKit.Visual);
6799 if(typeof (MochiKit)=="undefined"){
6800 MochiKit={};
6801 }
6802 if(typeof (MochiKit.MochiKit)=="undefined"){
6803 MochiKit.MochiKit={};
6804 }
6805 MochiKit.MochiKit.NAME="MochiKit.MochiKit";
6806 MochiKit.MochiKit.VERSION="1.4";
6807 MochiKit.MochiKit.__repr__=function(){
6808 return "["+this.NAME+" "+this.VERSION+"]";
6809 };
6810 MochiKit.MochiKit.toString=function(){
6811 return this.__repr__();
6812 };
6813 MochiKit.MochiKit.SUBMODULES=["Base","Iter","Logging","DateTime","Format","Async","DOM","Selector","Style","LoggingPane","Color","Signal","Position","Visual"];
6814 if(typeof (JSAN)!="undefined"||typeof (dojo)!="undefined"){
6815 if(typeof (dojo)!="undefined"){
6816 dojo.provide("MochiKit.MochiKit");
6817 dojo.require("MochiKit.*");
6818 }
6819 if(typeof (JSAN)!="undefined"){
6820 (function(lst){
6821 for(var i=0;i<lst.length;i++){
6822 JSAN.use("MochiKit."+lst[i],[]);
6823 }
6824 })(MochiKit.MochiKit.SUBMODULES);
6825 }
6826 (function(){
6827 var _713=MochiKit.Base.extend;
6828 var self=MochiKit.MochiKit;
6829 var _715=self.SUBMODULES;
6830 var _716=[];
6831 var _717=[];
6832 var _718={};
6833 var i,k,m,all;
6834 for(i=0;i<_715.length;i++){
6835 m=MochiKit[_715[i]];
6836 _713(_716,m.EXPORT);
6837 _713(_717,m.EXPORT_OK);
6838 for(k in m.EXPORT_TAGS){
6839 _718[k]=_713(_718[k],m.EXPORT_TAGS[k]);
6840 }
6841 all=m.EXPORT_TAGS[":all"];
6842 if(!all){
6843 all=_713(null,m.EXPORT,m.EXPORT_OK);
6844 }
6845 var j;
6846 for(j=0;j<all.length;j++){
6847 k=all[j];
6848 self[k]=m[k];
6849 }
6850 }
6851 self.EXPORT=_716;
6852 self.EXPORT_OK=_717;
6853 self.EXPORT_TAGS=_718;
6854 }());
6855 }else{
6856 if(typeof (MochiKit.__compat__)=="undefined"){
6857 MochiKit.__compat__=true;
6858 }
6859 (function(){
6860 if(typeof (document)=="undefined"){
6861 return;
6862 }
6863 var _71e=document.getElementsByTagName("script");
6864 var _71f="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
6865 var base=null;
6866 var _721=null;
6867 var _722={};
6868 var i;
6869 for(i=0;i<_71e.length;i++){
6870 var src=_71e[i].getAttribute("src");
6871 if(!src){
6872 continue;
6873 }
6874 _722[src]=true;
6875 if(src.match(/MochiKit.js$/)){
6876 base=src.substring(0,src.lastIndexOf("MochiKit.js"));
6877 _721=_71e[i];
6878 }
6879 }
6880 if(base===null){
6881 return;
6882 }
6883 var _725=MochiKit.MochiKit.SUBMODULES;
6884 for(var i=0;i<_725.length;i++){
6885 if(MochiKit[_725[i]]){
6886 continue;
6887 }
6888 var uri=base+_725[i]+".js";
6889 if(uri in _722){
6890 continue;
6891 }
6892 if(document.documentElement&&document.documentElement.namespaceURI==_71f){
6893 var s=document.createElementNS(_71f,"script");
6894 s.setAttribute("id","MochiKit_"+base+_725[i]);
6895 s.setAttribute("src",uri);
6896 s.setAttribute("type","application/x-javascript");
6897 _721.parentNode.appendChild(s);
6898 }else{
6899 document.write("<script src=\""+uri+"\" type=\"text/javascript\"></script>");
6900 }
6901 }
6902 })();
6903 }
6904
6905
6906 /***
6907
6908 PlotKit.PlotKit 0.9.1 : PACKED VERSION
6909
6910 THIS FILE IS AUTOMATICALLY GENERATED. If creating patches, please
6911 diff against the source tree, not this file.
6912
6913 For more information, <http://www.liquidx.net/plotkit/>.
6914
6915 Copyright (c) 2006. Alastair Tse.
6916
6917 ***/
6918
6919 try{
6920 if(typeof (MochiKit.Base)=="undefined"||typeof (MochiKit.DOM)=="undefined"||typeof (MochiKit.Color)=="undefined"||typeof (MochiKit.Format)=="undefined"){
6921 throw "";
6922 }
6923 }
6924 catch(e){
6925 throw "PlotKit depends on MochiKit.{Base,Color,DOM,Format}";
6926 }
6927 MochiKit.Base.update(MochiKit.Color.Color.prototype,{asFillColor:function(){
6928 return this.lighterColorWithLevel(0.3);
6929 },asStrokeColor:function(){
6930 return this.darkerColorWithLevel(0.1);
6931 },asPointColor:function(){
6932 return this.lighterColorWithLevel(0.1);
6933 }});
6934 if(typeof (PlotKit)=="undefined"){
6935 PlotKit={};
6936 }
6937 PlotKit.NAME="PlotKit";
6938 PlotKit.VERSION="0.8";
6939 PlotKit.__repr__=function(){
6940 return "["+this.NAME+" "+this.VERSION+"]";
6941 };
6942 PlotKit.toString=function(){
6943 return this.__repr__();
6944 };
6945 if(typeof (PlotKit.Base)=="undefined"){
6946 PlotKit.Base={};
6947 }
6948 PlotKit.Base.NAME="PlotKit.Base";
6949 PlotKit.Base.VERSION=PlotKit.VERSION;
6950 PlotKit.Base.__repr__=function(){
6951 return "["+this.NAME+" "+this.VERSION+"]";
6952 };
6953 PlotKit.Base.toString=function(){
6954 return this.__repr__();
6955 };
6956 PlotKit.Base.usingPrototype=function(){
6957 try{
6958 return (typeof (Object.extend)=="function");
6959 }
6960 catch(e){
6961 return false;
6962 }
6963 };
6964 MochiKit.Base.update(PlotKit.Base,{roundInterval:function(_1,_2,_3){
6965 var _4=MochiKit.Format.roundToFixed;
6966 var _5=_1/_2;
6967 return parseFloat(_4(_5,_3));
6968 },collapse:function(_6){
6969 var m=MochiKit.Base;
6970 var _8=new Array();
6971 for(var i=0;i<_6.length;i++){
6972 _8=m.concat(_8,_6[i]);
6973 }
6974 if(PlotKit.Base.usingPrototype()){
6975 delete _8.extend;
6976 delete _8.from;
6977 delete _8.inspect;
6978 }
6979 return _8;
6980 },uniq:function(_10){
6981 var m=MochiKit.Base;
6982 if(!m.isArrayLike(_10)||(_10.length<1)){
6983 return new Array();
6984 }
6985 var _11=new Array();
6986 var _12=_10[0];
6987 _11.push(_10[0]);
6988 for(var i=1;i<_10.length;i++){
6989 if(m.compare(_10[i],_12)!=0){
6990 _12=_10[i];
6991 _11.push(_10[i]);
6992 }
6993 }
6994 return _11;
6995 },colorScheme:function(){
6996 var mb=MochiKit.Base;
6997 var mc=MochiKit.Color;
6998 var _15=["red","orange","yellow","green","cyan","blue","purple","magenta"];
6999 var _16=function(_17){
7000 return mc.Color[_17+"Color"]();
7001 };
7002 return mb.map(_16,_15);
7003 },baseDarkPrimaryColors:function(){
7004 var _18=MochiKit.Color.Color.fromHexString;
7005 return [_18("#ad3f40"),_18("#ddac2c"),_18("#dfdd0c"),_18("#5276c4"),_18("#739c5a")];
7006 },basePrimaryColors:function(){
7007 var _19=MochiKit.Color.Color.fromHexString;
7008 return [_19("#d24c4d"),_19("#f2b32f"),_19("#ece90e"),_19("#5d83da"),_19("#78a15d")];
7009 },baseBlueColors:function(){
7010 var _20=MochiKit.Color.Color.fromHexString;
7011 return [_20("#4b6b94"),_20("#5d81b4"),_20("#acbad2")];
7012 },palette:function(_21,_22,_23,_24){
7013 var _25=MochiKit.Base.isUndefinedOrNull;
7014 var _26=new Array();
7015 if(_25(_24)){
7016 _24=0.1;
7017 }
7018 if(_25(_23)){
7019 _23=0.4;
7020 }
7021 if(_25(_22)){
7022 _22=-0.2;
7023 }
7024 var _27=_22;
7025 while(_27<=_23){
7026 _26.push(_27);
7027 _27+=_24;
7028 }
7029 var _28=function(_29,_30){
7030 return _29.lighterColorWithLevel(_30);
7031 };
7032 return MochiKit.Base.map(partial(_28,_21),_26);
7033 },excanvasSupported:function(){
7034 if(/MSIE/.test(navigator.userAgent)&&!window.opera){
7035 return true;
7036 }
7037 return false;
7038 },findPosX:function(obj){
7039 var _32=0;
7040 if(obj.offsetParent){
7041 while(obj.offsetParent){
7042 _32+=obj.offsetLeft;
7043 obj=obj.offsetParent;
7044 }
7045 }else{
7046 if(obj.x){
7047 _32+=obj.x;
7048 }
7049 }
7050 return _32;
7051 },findPosY:function(obj){
7052 var _33=0;
7053 if(obj.offsetParent){
7054 while(obj.offsetParent){
7055 _33+=obj.offsetTop;
7056 obj=obj.offsetParent;
7057 }
7058 }else{
7059 if(obj.y){
7060 _33+=obj.y;
7061 }
7062 }
7063 return _33;
7064 },isFuncLike:function(obj){
7065 return (typeof (obj)=="function");
7066 }});
7067 PlotKit.Base.map=function(fn,lst){
7068 if(PlotKit.Base.usingPrototype()){
7069 var _36=[];
7070 for(var x in lst){
7071 if(typeof (lst[x])=="function"){
7072 continue;
7073 }
7074 _36.push(fn(lst[x]));
7075 }
7076 return _36;
7077 }else{
7078 return MochiKit.Base.map(fn,lst);
7079 }
7080 };
7081 PlotKit.Base.items=function(lst){
7082 if(PlotKit.Base.usingPrototype()){
7083 var _38=[];
7084 for(var x in lst){
7085 if(typeof (lst[x])=="function"){
7086 continue;
7087 }
7088 _38.push([x,lst[x]]);
7089 }
7090 return _38;
7091 }else{
7092 return MochiKit.Base.items(lst);
7093 }
7094 };
7095 PlotKit.Base.keys=function(lst){
7096 if(PlotKit.Base.usingPrototype()){
7097 var _39=[];
7098 for(var x in lst){
7099 if(typeof (lst[x])=="function"){
7100 continue;
7101 }
7102 _39.push(x);
7103 }
7104 return _39;
7105 }else{
7106 return MochiKit.Base.keys(lst);
7107 }
7108 };
7109 PlotKit.Base.baseColors=function(){
7110 var _40=MochiKit.Color.Color.fromHexString;
7111 return [_40("#476fb2"),_40("#be2c2b"),_40("#85b730"),_40("#734a99"),_40("#26a1c5"),_40("#fb8707"),_40("#000000")];
7112 };
7113 PlotKit.Base.officeBaseStyle={"axisLineWidth":2,"axisLabelColor":Color.grayColor(),"axisLineColor":Color.whiteColor(),"padding":{top:5,bottom:10,left:30,right:30}};
7114 MochiKit.Base.update(PlotKit.Base,{officeBlue:function(){
7115 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[0]),"backgroundColor":PlotKit.Base.baseColors()[0].lighterColorWithLevel(0.45)};
7116 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7117 return r;
7118 },officeRed:function(){
7119 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[1]),"backgroundColor":PlotKit.Base.baseColors()[1].lighterColorWithLevel(0.5)};
7120 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7121 return r;
7122 },officeGreen:function(){
7123 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[2]),"backgroundColor":PlotKit.Base.baseColors()[2].lighterColorWithLevel(0.5)};
7124 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7125 return r;
7126 },officePurple:function(){
7127 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[3]),"backgroundColor":PlotKit.Base.baseColors()[3].lighterColorWithLevel(0.5)};
7128 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7129 return r;
7130 },officeCyan:function(){
7131 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[4]),"backgroundColor":PlotKit.Base.baseColors()[4].lighterColorWithLevel(0.5)};
7132 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7133 return r;
7134 },officeOrange:function(){
7135 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[5]),"backgroundColor":PlotKit.Base.baseColors()[5].lighterColorWithLevel(0.4)};
7136 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7137 return r;
7138 },officeBlack:function(){
7139 var r={"colorScheme":PlotKit.Base.palette(PlotKit.Base.baseColors()[6],0,0.6),"backgroundColor":PlotKit.Base.baseColors()[6].lighterColorWithLevel(0.9)};
7140 MochiKit.Base.update(r,PlotKit.Base.officeBaseStyle);
7141 return r;
7142 }});
7143 PlotKit.Base.EXPORT=["baseColors","collapse","colorScheme","findPosX","findPosY","officeBaseStyle","officeBlue","officeRed","officeGreen","officePurple","officeCyan","officeOrange","officeBlack","roundInterval","uniq","isFuncLike","excanvasSupported"];
7144 PlotKit.Base.EXPORT_OK=[];
7145 PlotKit.Base.__new__=function(){
7146 var m=MochiKit.Base;
7147 m.nameFunctions(this);
7148 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
7149 };
7150 PlotKit.Base.__new__();
7151 MochiKit.Base._exportSymbols(this,PlotKit.Base);
7152 try{
7153 if(typeof (PlotKit.Base)=="undefined"){
7154 throw "";
7155 }
7156 }
7157 catch(e){
7158 throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.Base";
7159 }
7160 if(typeof (PlotKit.Layout)=="undefined"){
7161 PlotKit.Layout={};
7162 }
7163 PlotKit.Layout.NAME="PlotKit.Layout";
7164 PlotKit.Layout.VERSION=PlotKit.VERSION;
7165 PlotKit.Layout.__repr__=function(){
7166 return "["+this.NAME+" "+this.VERSION+"]";
7167 };
7168 PlotKit.Layout.toString=function(){
7169 return this.__repr__();
7170 };
7171 PlotKit.Layout.valid_styles=["bar","line","pie","point"];
7172 PlotKit.Layout=function(_42,_43){
7173 this.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};
7174 this.style=_42;
7175 MochiKit.Base.update(this.options,_43?_43:{});
7176 if(!MochiKit.Base.isUndefinedOrNull(this.options.xAxis)){
7177 this.minxval=this.options.xAxis[0];
7178 this.maxxval=this.options.xAxis[1];
7179 this.xscale=this.maxxval-this.minxval;
7180 }else{
7181 this.minxval=0;
7182 this.maxxval=null;
7183 this.xscale=null;
7184 }
7185 if(!MochiKit.Base.isUndefinedOrNull(this.options.yAxis)){
7186 this.minyval=this.options.yAxis[0];
7187 this.maxyval=this.options.yAxis[1];
7188 this.yscale=this.maxyval-this.minyval;
7189 }else{
7190 this.minyval=0;
7191 this.maxyval=null;
7192 this.yscale=null;
7193 }
7194 this.bars=new Array();
7195 this.points=new Array();
7196 this.slices=new Array();
7197 this.xticks=new Array();
7198 this.yticks=new Array();
7199 this.datasets=new Array();
7200 this.minxdelta=0;
7201 this.xrange=1;
7202 this.yrange=1;
7203 this.hitTestCache={x2maxy:null};
7204 };
7205 PlotKit.Layout.prototype.addDataset=function(_44,_45){
7206 this.datasets[_44]=_45;
7207 };
7208 PlotKit.Layout.prototype.removeDataset=function(_46,_47){
7209 delete this.datasets[_46];
7210 };
7211 PlotKit.Layout.prototype.addDatasetFromTable=function(_48,_49,_50,_51,_52){
7212 var _53=MochiKit.Base.isUndefinedOrNull;
7213 var _54=MochiKit.DOM.scrapeText;
7214 var _55=MochiKit.Format.strip;
7215 if(_53(_50)){
7216 _50=0;
7217 }
7218 if(_53(_51)){
7219 _51=1;
7220 }
7221 if(_53(_52)){
7222 _52=-1;
7223 }
7224 var _56=_49.tBodies[0].rows;
7225 var _57=new Array();
7226 var _58=new Array();
7227 if(!_53(_56)){
7228 for(var i=0;i<_56.length;i++){
7229 _57.push([parseFloat(_55(_54(_56[i].cells[_50]))),parseFloat(_55(_54(_56[i].cells[_51])))]);
7230 if(_52>=0){
7231 _58.push({v:parseFloat(_55(_54(_56[i].cells[_50]))),label:_55(_54(_56[i].cells[_52]))});
7232 }
7233 }
7234 this.addDataset(_48,_57);
7235 if(_52>=0){
7236 this.options.xTicks=_58;
7237 }
7238 return true;
7239 }
7240 return false;
7241 };
7242 PlotKit.Layout.prototype.evaluate=function(){
7243 this._evaluateLimits();
7244 this._evaluateScales();
7245 if(this.style=="bar"){
7246 if(this.options.barOrientation=="horizontal"){
7247 this._evaluateHorizBarCharts();
7248 }else{
7249 this._evaluateBarCharts();
7250 }
7251 this._evaluateBarTicks();
7252 }else{
7253 if(this.style=="line"){
7254 this._evaluateLineCharts();
7255 this._evaluateLineTicks();
7256 }else{
7257 if(this.style=="pie"){
7258 this._evaluatePieCharts();
7259 this._evaluatePieTicks();
7260 }
7261 }
7262 }
7263 };
7264 PlotKit.Layout.prototype.hitTest=function(x,y){
7265 var f=MochiKit.Format.twoDigitFloat;
7266 if((this.style=="bar")&&this.bars&&(this.bars.length>0)){
7267 for(var i=0;i<this.bars.length;i++){
7268 var bar=this.bars[i];
7269 if((x>=bar.x)&&(x<=bar.x+bar.w)&&(y>=bar.y)&&(y-bar.y<=bar.h)){
7270 return bar;
7271 }
7272 }
7273 }else{
7274 if(this.style=="line"){
7275 if(this.hitTestCache.x2maxy==null){
7276 this._regenerateHitTestCache();
7277 }
7278 var _62=x/this.xscale;
7279 var _63=this.hitTestCache.xvalues;
7280 var _64=null;
7281 var _65=null;
7282 for(var i=1;i<_63.length;i++){
7283 if(_63[i]>_62){
7284 _64=_63[i-1];
7285 _65=_63[i];
7286 break;
7287 }
7288 }
7289 if((_64!=null)){
7290 var _66=this.hitTestCache.x2maxy[_64];
7291 var _67=this.hitTestCache.x2maxy[_65];
7292 var _68=(1-y)/this.yscale;
7293 var _69=(_67-_66)/(_65-_64);
7294 var _70=_66+_69*(_62-_64);
7295 if(_70>=_68){
7296 var obj={xval:_62,yval:_68,xafter:_65,yafter:_67,xbefore:_64,ybefore:_66,yprojected:_70};
7297 return obj;
7298 }
7299 }
7300 }else{
7301 if(this.style=="pie"){
7302 var _71=Math.sqrt((y-0.5)*(y-0.5)+(x-0.5)*(x-0.5));
7303 if(_71>this.options.pieRadius){
7304 return null;
7305 }
7306 var _72=Math.atan2(y-0.5,x-0.5)-Math.PI/2;
7307 for(var i=0;i<this.slices.length;i++){
7308 var _73=this.slices[i];
7309 if(_73.startAngle<_72&&_73.endAngle>=_72){
7310 return _73;
7311 }
7312 }
7313 }
7314 }
7315 }
7316 return null;
7317 };
7318 PlotKit.Layout.prototype.rectForX=function(x){
7319 return null;
7320 };
7321 PlotKit.Layout.prototype.angleRangeForX=function(x){
7322 return null;
7323 };
7324 PlotKit.Layout.prototype._evaluateLimits=function(){
7325 var map=PlotKit.Base.map;
7326 var _75=PlotKit.Base.items;
7327 var _76=MochiKit.Base.itemgetter;
7328 var _77=PlotKit.Base.collapse;
7329 var _78=MochiKit.Base.listMin;
7330 var _79=MochiKit.Base.listMax;
7331 var _80=MochiKit.Base.isUndefinedOrNull;
7332 var all=_77(map(_76(1),_75(this.datasets)));
7333 if(_80(this.options.xAxis)){
7334 if(this.options.xOriginIsZero){
7335 this.minxval=0;
7336 }else{
7337 this.minxval=_78(map(parseFloat,map(_76(0),all)));
7338 }
7339 this.maxxval=_79(map(parseFloat,map(_76(0),all)));
7340 }else{
7341 this.minxval=this.options.xAxis[0];
7342 this.maxxval=this.options.xAxis[1];
7343 this.xscale=this.maxval-this.minxval;
7344 }
7345 if(_80(this.options.yAxis)){
7346 if(this.options.yOriginIsZero){
7347 this.minyval=0;
7348 }else{
7349 this.minyval=_78(map(parseFloat,map(_76(1),all)));
7350 }
7351 this.maxyval=_79(map(parseFloat,map(_76(1),all)));
7352 }else{
7353 this.minyval=this.options.yAxis[0];
7354 this.maxyval=this.options.yAxis[1];
7355 this.yscale=this.maxyval-this.minyval;
7356 }
7357 };
7358 PlotKit.Layout.prototype._evaluateScales=function(){
7359 var _82=MochiKit.Base.isUndefinedOrNull;
7360 this.xrange=this.maxxval-this.minxval;
7361 if(this.xrange==0){
7362 this.xscale=1;
7363 }else{
7364 this.xscale=1/this.xrange;
7365 }
7366 this.yrange=this.maxyval-this.minyval;
7367 if(this.yrange==0){
7368 this.yscale=1;
7369 }else{
7370 this.yscale=1/this.yrange;
7371 }
7372 };
7373 PlotKit.Layout.prototype._uniqueXValues=function(){
7374 var _83=PlotKit.Base.collapse;
7375 var map=PlotKit.Base.map;
7376 var _84=PlotKit.Base.uniq;
7377 var _85=MochiKit.Base.itemgetter;
7378 var _86=PlotKit.Base.items;
7379 var _87=map(parseFloat,map(_85(0),_83(map(_85(1),_86(this.datasets)))));
7380 _87.sort(MochiKit.Base.compare);
7381 return _84(_87);
7382 };
7383 PlotKit.Layout.prototype._evaluateBarCharts=function(){
7384 var _88=PlotKit.Base.items;
7385 var _89=_88(this.datasets).length;
7386 var _90=10000000;
7387 var _91=this._uniqueXValues();
7388 for(var i=1;i<_91.length;i++){
7389 _90=Math.min(Math.abs(_91[i]-_91[i-1]),_90);
7390 }
7391 var _92=0;
7392 var _93=0;
7393 var _94=0;
7394 if(_91.length==1){
7395 _90=1;
7396 this.xscale=1;
7397 this.minxval=_91[0];
7398 _92=1*this.options.barWidthFillFraction;
7399 _93=_92/_89;
7400 _94=(1-this.options.barWidthFillFraction)/2;
7401 }else{
7402 if(this.xrange==1){
7403 this.xscale=0.5;
7404 }else{
7405 if(this.xrange==2){
7406 this.xscale=1/3;
7407 }else{
7408 this.xscale=(1-_90/this.xrange)/this.xrange;
7409 }
7410 }
7411 _92=_90*this.xscale*this.options.barWidthFillFraction;
7412 _93=_92/_89;
7413 _94=_90*this.xscale*(1-this.options.barWidthFillFraction)/2;
7414 }
7415 this.minxdelta=_90;
7416 this.bars=new Array();
7417 var i=0;
7418 for(var _95 in this.datasets){
7419 var _96=this.datasets[_95];
7420 if(PlotKit.Base.isFuncLike(_96)){
7421 continue;
7422 }
7423 for(var j=0;j<_96.length;j++){
7424 var _98=_96[j];
7425 var _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};
7426 if((_99.x>=0)&&(_99.x<=1)&&(_99.y>=0)&&(_99.y<=1)){
7427 this.bars.push(_99);
7428 }
7429 }
7430 i++;
7431 }
7432 };
7433 PlotKit.Layout.prototype._evaluateHorizBarCharts=function(){
7434 var _100=PlotKit.Base.items;
7435 var _101=_100(this.datasets).length;
7436 var _102=10000000;
7437 var _103=this._uniqueXValues();
7438 for(var i=1;i<_103.length;i++){
7439 _102=Math.min(Math.abs(_103[i]-_103[i-1]),_102);
7440 }
7441 var _104=0;
7442 var _105=0;
7443 var _106=0;
7444 if(_103.length==1){
7445 _102=1;
7446 this.xscale=1;
7447 this.minxval=_103[0];
7448 _104=1*this.options.barWidthFillFraction;
7449 _105=_104/_101;
7450 _106=(1-this.options.barWidthFillFraction)/2;
7451 }else{
7452 this.xscale=(1-_102/this.xrange)/this.xrange;
7453 _104=_102*this.xscale*this.options.barWidthFillFraction;
7454 _105=_104/_101;
7455 _106=_102*this.xscale*(1-this.options.barWidthFillFraction)/2;
7456 }
7457 this.minxdelta=_102;
7458 this.bars=new Array();
7459 var i=0;
7460 for(var _107 in this.datasets){
7461 var _108=this.datasets[_107];
7462 if(PlotKit.Base.isFuncLike(_108)){
7463 continue;
7464 }
7465 for(var j=0;j<_108.length;j++){
7466 var item=_108[j];
7467 var 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};
7468 if(rect.y<=0){
7469 rect.y=0;
7470 }
7471 if(rect.y>=1){
7472 rect.y=1;
7473 }
7474 if((rect.x>=0)&&(rect.x<=1)){
7475 this.bars.push(rect);
7476 }
7477 }
7478 i++;
7479 }
7480 };
7481 PlotKit.Layout.prototype._evaluateLineCharts=function(){
7482 var _111=PlotKit.Base.items;
7483 var _112=_111(this.datasets).length;
7484 this.points=new Array();
7485 var i=0;
7486 for(var _113 in this.datasets){
7487 var _114=this.datasets[_113];
7488 if(PlotKit.Base.isFuncLike(_114)){
7489 continue;
7490 }
7491 _114.sort(function(a,b){
7492 return compare(parseFloat(a[0]),parseFloat(b[0]));
7493 });
7494 for(var j=0;j<_114.length;j++){
7495 var item=_114[j];
7496 var _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};
7497 if(_117.y<=0){
7498 _117.y=0;
7499 }
7500 if(_117.y>=1){
7501 _117.y=1;
7502 }
7503 if((_117.x>=0)&&(_117.x<=1)){
7504 this.points.push(_117);
7505 }
7506 }
7507 i++;
7508 }
7509 };
7510 PlotKit.Layout.prototype._evaluatePieCharts=function(){
7511 var _118=PlotKit.Base.items;
7512 var sum=MochiKit.Iter.sum;
7513 var _120=MochiKit.Base.itemgetter;
7514 var _121=_118(this.datasets).length;
7515 var _122=_118(this.datasets)[0][1];
7516 var _123=sum(map(_120(1),_122));
7517 this.slices=new Array();
7518 var _124=0;
7519 for(var i=0;i<_122.length;i++){
7520 var _125=_122[i][1]/_123;
7521 var _126=_124*Math.PI*2;
7522 var _127=(_124+_125)*Math.PI*2;
7523 var _128={fraction:_125,xval:_122[i][0],yval:_122[i][1],startAngle:_126,endAngle:_127};
7524 if(_122[i][1]!=0){
7525 this.slices.push(_128);
7526 }
7527 _124+=_125;
7528 }
7529 };
7530 PlotKit.Layout.prototype._evaluateLineTicksForXAxis=function(){
7531 var _129=MochiKit.Base.isUndefinedOrNull;
7532 if(this.options.xTicks){
7533 this.xticks=new Array();
7534 var _130=function(tick){
7535 var _132=tick.label;
7536 if(_129(_132)){
7537 _132=tick.v.toString();
7538 }
7539 var pos=this.xscale*(tick.v-this.minxval);
7540 if((pos>=0)&&(pos<=1)){
7541 this.xticks.push([pos,_132]);
7542 }
7543 };
7544 MochiKit.Iter.forEach(this.options.xTicks,bind(_130,this));
7545 }else{
7546 if(this.options.xNumberOfTicks){
7547 var _134=this._uniqueXValues();
7548 var _135=this.xrange/this.options.xNumberOfTicks;
7549 var _136=0;
7550 this.xticks=new Array();
7551 for(var i=0;i<=_134.length;i++){
7552 if((_134[i]-this.minxval)>=(_136*_135)){
7553 var pos=this.xscale*(_134[i]-this.minxval);
7554 if((pos>1)||(pos<0)){
7555 continue;
7556 }
7557 this.xticks.push([pos,_134[i]]);
7558 _136++;
7559 }
7560 if(_136>this.options.xNumberOfTicks){
7561 break;
7562 }
7563 }
7564 }
7565 }
7566 };
7567 PlotKit.Layout.prototype._evaluateLineTicksForYAxis=function(){
7568 var _137=MochiKit.Base.isUndefinedOrNull;
7569 if(this.options.yTicks){
7570 this.yticks=new Array();
7571 var _138=function(tick){
7572 var _139=tick.label;
7573 if(_137(_139)){
7574 _139=tick.v.toString();
7575 }
7576 var pos=1-(this.yscale*(tick.v-this.minyval));
7577 if((pos>=0)&&(pos<=1)){
7578 this.yticks.push([pos,_139]);
7579 }
7580 };
7581 MochiKit.Iter.forEach(this.options.yTicks,bind(_138,this));
7582 }else{
7583 if(this.options.yNumberOfTicks){
7584 this.yticks=new Array();
7585 var _140=PlotKit.Base.roundInterval;
7586 var prec=this.options.yTickPrecision;
7587 var _142=_140(this.yrange,this.options.yNumberOfTicks,prec);
7588 for(var i=0;i<=this.options.yNumberOfTicks;i++){
7589 var yval=this.minyval+(i*_142);
7590 var pos=1-((yval-this.minyval)*this.yscale);
7591 if((pos>1)||(pos<0)){
7592 continue;
7593 }
7594 this.yticks.push([pos,MochiKit.Format.roundToFixed(yval,prec)]);
7595 }
7596 }
7597 }
7598 };
7599 PlotKit.Layout.prototype._evaluateLineTicks=function(){
7600 this._evaluateLineTicksForXAxis();
7601 this._evaluateLineTicksForYAxis();
7602 };
7603 PlotKit.Layout.prototype._evaluateBarTicks=function(){
7604 this._evaluateLineTicks();
7605 var _144=function(tick){
7606 return [tick[0]+(this.minxdelta*this.xscale)/2,tick[1]];
7607 };
7608 this.xticks=MochiKit.Base.map(bind(_144,this),this.xticks);
7609 if(this.options.barOrientation=="horizontal"){
7610 var _145=this.xticks;
7611 this.xticks=this.yticks;
7612 this.yticks=_145;
7613 var _146=function(tick){
7614 return [1-tick[0],tick[1]];
7615 };
7616 this.xticks=MochiKit.Base.map(_146,this.xticks);
7617 }
7618 };
7619 PlotKit.Layout.prototype._evaluatePieTicks=function(){
7620 var _147=MochiKit.Base.isUndefinedOrNull;
7621 var _148=MochiKit.Format.numberFormatter("#%");
7622 this.xticks=new Array();
7623 if(this.options.xTicks){
7624 var _149=new Array();
7625 for(var i=0;i<this.slices.length;i++){
7626 _149[this.slices[i].xval]=this.slices[i];
7627 }
7628 for(var i=0;i<this.options.xTicks.length;i++){
7629 var tick=this.options.xTicks[i];
7630 var _150=_149[tick.v];
7631 var _151=tick.label;
7632 if(_150){
7633 if(_147(_151)){
7634 _151=tick.v.toString();
7635 }
7636 _151+=" ("+_148(_150.fraction)+")";
7637 this.xticks.push([tick.v,_151]);
7638 }
7639 }
7640 }else{
7641 for(var i=0;i<this.slices.length;i++){
7642 var _150=this.slices[i];
7643 var _151=_150.xval+" ("+_148(_150.fraction)+")";
7644 this.xticks.push([_150.xval,_151]);
7645 }
7646 }
7647 };
7648 PlotKit.Layout.prototype._regenerateHitTestCache=function(){
7649 this.hitTestCache.xvalues=this._uniqueXValues();
7650 this.hitTestCache.xlookup=new Array();
7651 this.hitTestCache.x2maxy=new Array();
7652 var _152=MochiKit.Base.listMax;
7653 var _153=MochiKit.Base.itemgetter;
7654 var map=MochiKit.Base.map;
7655 var _154=keys(this.datasets);
7656 for(var i=0;i<_154.length;i++){
7657 var _155=this.datasets[_154[i]];
7658 for(var j=0;j<_155.length;j++){
7659 var xval=_155[j][0];
7660 var yval=_155[j][1];
7661 if(this.hitTestCache.xlookup[xval]){
7662 this.hitTestCache.xlookup[xval].push([yval,_154[i]]);
7663 }else{
7664 this.hitTestCache.xlookup[xval]=[[yval,_154[i]]];
7665 }
7666 }
7667 }
7668 for(var x in this.hitTestCache.xlookup){
7669 var _157=this.hitTestCache.xlookup[x];
7670 this.hitTestCache.x2maxy[x]=_152(map(_153(0),_157));
7671 }
7672 };
7673 PlotKit.LayoutModule={};
7674 PlotKit.LayoutModule.Layout=PlotKit.Layout;
7675 PlotKit.LayoutModule.EXPORT=["Layout"];
7676 PlotKit.LayoutModule.EXPORT_OK=[];
7677 PlotKit.LayoutModule.__new__=function(){
7678 var m=MochiKit.Base;
7679 m.nameFunctions(this);
7680 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
7681 };
7682 PlotKit.LayoutModule.__new__();
7683 MochiKit.Base._exportSymbols(this,PlotKit.LayoutModule);
7684 try{
7685 if((typeof (PlotKit.Base)=="undefined")||(typeof (PlotKit.Layout)=="undefined")){
7686 throw "";
7687 }
7688 }
7689 catch(e){
7690 throw "PlotKit.Layout depends on MochiKit.{Base,Color,DOM,Format} and PlotKit.{Base,Layout}";
7691 }
7692 if(typeof (PlotKit.CanvasRenderer)=="undefined"){
7693 PlotKit.CanvasRenderer={};
7694 }
7695 PlotKit.CanvasRenderer.NAME="PlotKit.CanvasRenderer";
7696 PlotKit.CanvasRenderer.VERSION=PlotKit.VERSION;
7697 PlotKit.CanvasRenderer.__repr__=function(){
7698 return "["+this.NAME+" "+this.VERSION+"]";
7699 };
7700 PlotKit.CanvasRenderer.toString=function(){
7701 return this.__repr__();
7702 };
7703 PlotKit.CanvasRenderer=function(_158,_159,_160){
7704 if(arguments.length>0){
7705 this.__init__(_158,_159,_160);
7706 }
7707 };
7708 PlotKit.CanvasRenderer.prototype.__init__=function(_161,_162,_163){
7709 var _164=MochiKit.Base.isUndefinedOrNull;
7710 var _165=MochiKit.Color.Color;
7711 this.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};
7712 MochiKit.Base.update(this.options,_163?_163:{});
7713 this.layout=_162;
7714 this.element=MochiKit.DOM.getElement(_161);
7715 this.container=this.element.parentNode;
7716 this.isIE=PlotKit.Base.excanvasSupported();
7717 if(this.isIE&&!_164(G_vmlCanvasManager)){
7718 this.IEDelay=0.5;
7719 this.maxTries=5;
7720 this.renderDelay=null;
7721 this.clearDelay=null;
7722 this.element=G_vmlCanvasManager.initElement(this.element);
7723 }
7724 this.height=this.element.height;
7725 this.width=this.element.width;
7726 if(_164(this.element)){
7727 throw "CanvasRenderer() - passed canvas is not found";
7728 }
7729 if(!this.isIE&&!(PlotKit.CanvasRenderer.isSupported(this.element))){
7730 throw "CanvasRenderer() - Canvas is not supported.";
7731 }
7732 if(_164(this.container)||(this.container.nodeName.toLowerCase()!="div")){
7733 throw "CanvasRenderer() - <canvas> needs to be enclosed in <div>";
7734 }
7735 this.xlabels=new Array();
7736 this.ylabels=new Array();
7737 this.isFirstRender=true;
7738 this.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};
7739 MochiKit.DOM.updateNodeAttributes(this.container,{"style":{"position":"relative","width":this.width+"px"}});
7740 };
7741 PlotKit.CanvasRenderer.prototype.render=function(){
7742 if(this.isIE){
7743 try{
7744 if(this.renderDelay){
7745 this.renderDelay.cancel();
7746 this.renderDelay=null;
7747 }
7748 var _166=this.element.getContext("2d");
7749 }
7750 catch(e){
7751 this.isFirstRender=false;
7752 if(this.maxTries-->0){
7753 this.renderDelay=MochiKit.Async.wait(this.IEDelay);
7754 this.renderDelay.addCallback(bind(this.render,this));
7755 }
7756 return;
7757 }
7758 }
7759 if(this.options.drawBackground){
7760 this._renderBackground();
7761 }
7762 if(this.layout.style=="bar"){
7763 this._renderBarChart();
7764 this._renderBarAxis();
7765 }else{
7766 if(this.layout.style=="pie"){
7767 this._renderPieChart();
7768 this._renderPieAxis();
7769 }else{
7770 if(this.layout.style=="line"){
7771 this._renderLineChart();
7772 this._renderLineAxis();
7773 }
7774 }
7775 }
7776 };
7777 PlotKit.CanvasRenderer.prototype._renderBarChartWrap=function(data,_168){
7778 var _169=this.element.getContext("2d");
7779 var _170=this.options.colorScheme.length;
7780 var _171=this.options.colorScheme;
7781 var _172=MochiKit.Base.keys(this.layout.datasets);
7782 var _173=_172.length;
7783 for(var i=0;i<_173;i++){
7784 var _174=_172[i];
7785 var _175=_171[i%_170];
7786 _169.save();
7787 _169.fillStyle=_175.toRGBString();
7788 if(this.options.strokeColor){
7789 _169.strokeStyle=this.options.strokeColor.toRGBString();
7790 }else{
7791 if(this.options.strokeColorTransform){
7792 _169.strokeStyle=_175[this.options.strokeColorTransform]().toRGBString();
7793 }
7794 }
7795 _169.lineWidth=this.options.strokeWidth;
7796 var _176=function(obj){
7797 if(obj.name==_174){
7798 _168(_169,obj);
7799 }
7800 };
7801 MochiKit.Iter.forEach(data,bind(_176,this));
7802 _169.restore();
7803 }
7804 };
7805 PlotKit.CanvasRenderer.prototype._renderBarChart=function(){
7806 var bind=MochiKit.Base.bind;
7807 var _178=function(_179,bar){
7808 var x=this.area.w*bar.x+this.area.x;
7809 var y=this.area.h*bar.y+this.area.y;
7810 var w=this.area.w*bar.w;
7811 var h=this.area.h*bar.h;
7812 if((w<1)||(h<1)){
7813 return;
7814 }
7815 if(this.options.shouldFill){
7816 _179.fillRect(x,y,w,h);
7817 }
7818 if(this.options.shouldStroke){
7819 _179.strokeRect(x,y,w,h);
7820 }
7821 };
7822 this._renderBarChartWrap(this.layout.bars,bind(_178,this));
7823 };
7824 PlotKit.CanvasRenderer.prototype._renderLineChart=function(){
7825 var _182=this.element.getContext("2d");
7826 var _183=this.options.colorScheme.length;
7827 var _184=this.options.colorScheme;
7828 var _185=MochiKit.Base.keys(this.layout.datasets);
7829 var _186=_185.length;
7830 var bind=MochiKit.Base.bind;
7831 var _187=MochiKit.Base.partial;
7832 for(var i=0;i<_186;i++){
7833 var _188=_185[i];
7834 var _189=_184[i%_183];
7835 var _190=this.options.strokeColorTransform;
7836 _182.save();
7837 _182.fillStyle=_189.toRGBString();
7838 if(this.options.strokeColor){
7839 _182.strokeStyle=this.options.strokeColor.toRGBString();
7840 }else{
7841 if(this.options.strokeColorTransform){
7842 _182.strokeStyle=_189[_190]().toRGBString();
7843 }
7844 }
7845 _182.lineWidth=this.options.strokeWidth;
7846 var _191=function(ctx){
7847 ctx.beginPath();
7848 ctx.moveTo(this.area.x,this.area.y+this.area.h);
7849 var _193=function(ctx_,_195){
7850 if(_195.name==_188){
7851 ctx_.lineTo(this.area.w*_195.x+this.area.x,this.area.h*_195.y+this.area.y);
7852 }
7853 };
7854 MochiKit.Iter.forEach(this.layout.points,_187(_193,ctx),this);
7855 ctx.lineTo(this.area.w+this.area.x,this.area.h+this.area.y);
7856 ctx.lineTo(this.area.x,this.area.y+this.area.h);
7857 ctx.closePath();
7858 };
7859 if(this.options.shouldFill){
7860 bind(_191,this)(_182);
7861 _182.fill();
7862 }
7863 if(this.options.shouldStroke){
7864 bind(_191,this)(_182);
7865 _182.stroke();
7866 }
7867 _182.restore();
7868 }
7869 };
7870 PlotKit.CanvasRenderer.prototype._renderPieChart=function(){
7871 var _196=this.element.getContext("2d");
7872 var _197=this.options.colorScheme.length;
7873 var _198=this.layout.slices;
7874 var _199=this.area.x+this.area.w*0.5;
7875 var _200=this.area.y+this.area.h*0.5;
7876 var _201=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
7877 if(this.isIE){
7878 _199=parseInt(_199);
7879 _200=parseInt(_200);
7880 _201=parseInt(_201);
7881 }
7882 for(var i=0;i<_198.length;i++){
7883 var _202=this.options.colorScheme[i%_197];
7884 _196.save();
7885 _196.fillStyle=_202.toRGBString();
7886 var _203=function(){
7887 _196.beginPath();
7888 _196.moveTo(_199,_200);
7889 _196.arc(_199,_200,_201,_198[i].startAngle-Math.PI/2,_198[i].endAngle-Math.PI/2,false);
7890 _196.lineTo(_199,_200);
7891 _196.closePath();
7892 };
7893 if(Math.abs(_198[i].startAngle-_198[i].endAngle)>0.001){
7894 if(this.options.shouldFill){
7895 _203();
7896 _196.fill();
7897 }
7898 if(this.options.shouldStroke){
7899 _203();
7900 _196.lineWidth=this.options.strokeWidth;
7901 if(this.options.strokeColor){
7902 _196.strokeStyle=this.options.strokeColor.toRGBString();
7903 }else{
7904 if(this.options.strokeColorTransform){
7905 _196.strokeStyle=_202[this.options.strokeColorTransform]().toRGBString();
7906 }
7907 }
7908 _196.stroke();
7909 }
7910 }
7911 _196.restore();
7912 }
7913 };
7914 PlotKit.CanvasRenderer.prototype._renderBarAxis=function(){
7915 this._renderAxis();
7916 };
7917 PlotKit.CanvasRenderer.prototype._renderLineAxis=function(){
7918 this._renderAxis();
7919 };
7920 PlotKit.CanvasRenderer.prototype._renderAxis=function(){
7921 if(!this.options.drawXAxis&&!this.options.drawYAxis){
7922 return;
7923 }
7924 var _204=this.element.getContext("2d");
7925 var _205={"style":{"position":"absolute","fontSize":this.options.axisLabelFontSize+"px","zIndex":10,"color":this.options.axisLabelColor.toRGBString(),"width":this.options.axisLabelWidth+"px","overflow":"hidden"}};
7926 _204.save();
7927 _204.strokeStyle=this.options.axisLineColor.toRGBString();
7928 _204.lineWidth=this.options.axisLineWidth;
7929 if(this.options.drawYAxis){
7930 if(this.layout.yticks){
7931 var _206=function(tick){
7932 if(typeof (tick)=="function"){
7933 return;
7934 }
7935 var x=this.area.x;
7936 var y=this.area.y+tick[0]*this.area.h;
7937 _204.beginPath();
7938 _204.moveTo(x,y);
7939 _204.lineTo(x-this.options.axisTickSize,y);
7940 _204.closePath();
7941 _204.stroke();
7942 var _207=DIV(_205,tick[1]);
7943 _207.style.top=(y-this.options.axisLabelFontSize)+"px";
7944 _207.style.left=(x-this.options.padding.left-this.options.axisTickSize)+"px";
7945 _207.style.textAlign="right";
7946 _207.style.width=(this.options.padding.left-this.options.axisTickSize*2)+"px";
7947 MochiKit.DOM.appendChildNodes(this.container,_207);
7948 this.ylabels.push(_207);
7949 };
7950 MochiKit.Iter.forEach(this.layout.yticks,bind(_206,this));
7951 }
7952 _204.beginPath();
7953 _204.moveTo(this.area.x,this.area.y);
7954 _204.lineTo(this.area.x,this.area.y+this.area.h);
7955 _204.closePath();
7956 _204.stroke();
7957 }
7958 if(this.options.drawXAxis){
7959 if(this.layout.xticks){
7960 var _206=function(tick){
7961 if(typeof (dataset)=="function"){
7962 return;
7963 }
7964 var x=this.area.x+tick[0]*this.area.w;
7965 var y=this.area.y+this.area.h;
7966 _204.beginPath();
7967 _204.moveTo(x,y);
7968 _204.lineTo(x,y+this.options.axisTickSize);
7969 _204.closePath();
7970 _204.stroke();
7971 var _208=DIV(_205,tick[1]);
7972 _208.style.top=(y+this.options.axisTickSize)+"px";
7973 _208.style.left=(x-this.options.axisLabelWidth/2)+"px";
7974 _208.style.textAlign="center";
7975 _208.style.width=this.options.axisLabelWidth+"px";
7976 MochiKit.DOM.appendChildNodes(this.container,_208);
7977 this.xlabels.push(_208);
7978 };
7979 MochiKit.Iter.forEach(this.layout.xticks,bind(_206,this));
7980 }
7981 _204.beginPath();
7982 _204.moveTo(this.area.x,this.area.y+this.area.h);
7983 _204.lineTo(this.area.x+this.area.w,this.area.y+this.area.h);
7984 _204.closePath();
7985 _204.stroke();
7986 }
7987 _204.restore();
7988 };
7989 PlotKit.CanvasRenderer.prototype._renderPieAxis=function(){
7990 if(!this.options.drawXAxis){
7991 return;
7992 }
7993 if(this.layout.xticks){
7994 var _209=new Array();
7995 for(var i=0;i<this.layout.slices.length;i++){
7996 _209[this.layout.slices[i].xval]=this.layout.slices[i];
7997 }
7998 var _210=this.area.x+this.area.w*0.5;
7999 var _211=this.area.y+this.area.h*0.5;
8000 var _212=Math.min(this.area.w*this.options.pieRadius,this.area.h*this.options.pieRadius);
8001 var _213=this.options.axisLabelWidth;
8002 for(var i=0;i<this.layout.xticks.length;i++){
8003 var _214=_209[this.layout.xticks[i][0]];
8004 if(MochiKit.Base.isUndefinedOrNull(_214)){
8005 continue;
8006 }
8007 var _215=(_214.startAngle+_214.endAngle)/2;
8008 var _216=_215;
8009 if(_216>Math.PI*2){
8010 _216=_216-Math.PI*2;
8011 }else{
8012 if(_216<0){
8013 _216=_216+Math.PI*2;
8014 }
8015 }
8016 var _217=_210+Math.sin(_216)*(_212+10);
8017 var _218=_211-Math.cos(_216)*(_212+10);
8018 var _219={"position":"absolute","zIndex":11,"width":_213+"px","fontSize":this.options.axisLabelFontSize+"px","overflow":"hidden","color":this.options.axisLabelColor.toHexString()};
8019 if(_216<=Math.PI*0.5){
8020 _219["textAlign"]="left";
8021 _219["verticalAlign"]="top";
8022 _219["left"]=_217+"px";
8023 _219["top"]=(_218-this.options.axisLabelFontSize)+"px";
8024 }else{
8025 if((_216>Math.PI*0.5)&&(_216<=Math.PI)){
8026 _219["textAlign"]="left";
8027 _219["verticalAlign"]="bottom";
8028 _219["left"]=_217+"px";
8029 _219["top"]=_218+"px";
8030 }else{
8031 if((_216>Math.PI)&&(_216<=Math.PI*1.5)){
8032 _219["textAlign"]="right";
8033 _219["verticalAlign"]="bottom";
8034 _219["left"]=(_217-_213)+"px";
8035 _219["top"]=_218+"px";
8036 }else{
8037 _219["textAlign"]="right";
8038 _219["verticalAlign"]="bottom";
8039 _219["left"]=(_217-_213)+"px";
8040 _219["top"]=(_218-this.options.axisLabelFontSize)+"px";
8041 }
8042 }
8043 }
8044 var _220=DIV({"style":_219},this.layout.xticks[i][1]);
8045 this.xlabels.push(_220);
8046 MochiKit.DOM.appendChildNodes(this.container,_220);
8047 }
8048 }
8049 };
8050 PlotKit.CanvasRenderer.prototype._renderBackground=function(){
8051 var _221=this.element.getContext("2d");
8052 _221.save();
8053 _221.fillStyle=this.options.backgroundColor.toRGBString();
8054 _221.fillRect(0,0,this.width,this.height);
8055 _221.restore();
8056 };
8057 PlotKit.CanvasRenderer.prototype.clear=function(){
8058 if(this.isIE){
8059 try{
8060 if(this.clearDelay){
8061 this.clearDelay.cancel();
8062 this.clearDelay=null;
8063 }
8064 var _222=this.element.getContext("2d");
8065 }
8066 catch(e){
8067 this.isFirstRender=false;
8068 this.clearDelay=MochiKit.Async.wait(this.IEDelay);
8069 this.clearDelay.addCallback(bind(this.clear,this));
8070 return;
8071 }
8072 }
8073 var _222=this.element.getContext("2d");
8074 _222.clearRect(0,0,this.width,this.height);
8075 MochiKit.Iter.forEach(this.xlabels,MochiKit.DOM.removeElement);
8076 MochiKit.Iter.forEach(this.ylabels,MochiKit.DOM.removeElement);
8077 this.xlabels=new Array();
8078 this.ylabels=new Array();
8079 };
8080 PlotKit.CanvasRenderer.prototype._initialiseEvents=function(){
8081 var _223=MochiKit.Signal.connect;
8082 var bind=MochiKit.Base.bind;
8083 _223(this.element,"onclick",bind(this.onclick,this));
8084 };
8085 PlotKit.CanvasRenderer.prototype._resolveObject=function(e){
8086 var x=(e.mouse().page.x-PlotKit.Base.findPosX(this.element)-this.area.x)/this.area.w;
8087 var y=(e.mouse().page.y-PlotKit.Base.findPosY(this.element)-this.area.y)/this.area.h;
8088 var _225=this.layout.hitTest(x,y);
8089 if(_225){
8090 return _225;
8091 }
8092 return null;
8093 };
8094 PlotKit.CanvasRenderer.prototype._createEventObject=function(_226,e){
8095 if(_226==null){
8096 return null;
8097 }
8098 e.chart=_226;
8099 return e;
8100 };
8101 PlotKit.CanvasRenderer.prototype.onclick=function(e){
8102 var _227=this._resolveObject(e);
8103 var _228=this._createEventObject(_227,e);
8104 if(_228!=null){
8105 MochiKit.Signal.signal(this,"onclick",_228);
8106 }
8107 };
8108 PlotKit.CanvasRenderer.prototype.onmouseover=function(e){
8109 var _229=this._resolveObject(e);
8110 var _230=this._createEventObject(_229,e);
8111 if(_230!=null){
8112 signal(this,"onmouseover",_230);
8113 }
8114 };
8115 PlotKit.CanvasRenderer.prototype.onmouseout=function(e){
8116 var _231=this._resolveObject(e);
8117 var _232=this._createEventObject(_231,e);
8118 if(_232==null){
8119 signal(this,"onmouseout",e);
8120 }else{
8121 signal(this,"onmouseout",_232);
8122 }
8123 };
8124 PlotKit.CanvasRenderer.prototype.onmousemove=function(e){
8125 var _233=this._resolveObject(e);
8126 var _234=this._createEventObject(_233,e);
8127 if((_233==null)&&(this.event_isinside==null)){
8128 return;
8129 }
8130 if((_233!=null)&&(this.event_isinside==null)){
8131 signal(this,"onmouseover",_234);
8132 }
8133 if((_233==null)&&(this.event_isinside!=null)){
8134 signal(this,"onmouseout",_234);
8135 }
8136 if((_233!=null)&&(this.event_isinside!=null)){
8137 signal(this,"onmousemove",_234);
8138 }
8139 this.event_isinside=_233;
8140 };
8141 PlotKit.CanvasRenderer.isSupported=function(_235){
8142 var _236=null;
8143 try{
8144 if(MochiKit.Base.isUndefinedOrNull(_235)){
8145 _236=MochiKit.DOM.CANVAS({});
8146 }else{
8147 _236=MochiKit.DOM.getElement(_235);
8148 }
8149 var _237=_236.getContext("2d");
8150 }
8151 catch(e){
8152 var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);
8153 var _239=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
8154 if((!ie)||(ie[1]<6)||(_239)){
8155 return false;
8156 }
8157 return true;
8158 }
8159 return true;
8160 };
8161 PlotKit.Canvas={};
8162 PlotKit.Canvas.CanvasRenderer=PlotKit.CanvasRenderer;
8163 PlotKit.Canvas.EXPORT=["CanvasRenderer"];
8164 PlotKit.Canvas.EXPORT_OK=["CanvasRenderer"];
8165 PlotKit.Canvas.__new__=function(){
8166 var m=MochiKit.Base;
8167 m.nameFunctions(this);
8168 this.EXPORT_TAGS={":common":this.EXPORT,":all":m.concat(this.EXPORT,this.EXPORT_OK)};
8169 };
8170 PlotKit.Canvas.__new__();
8171 MochiKit.Base._exportSymbols(this,PlotKit.Canvas);
8172
8173
8174 // Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
8175 // All Rights Reserved.
8176
8177 /**
8178 * @fileoverview Subclasses various parts of PlotKit to meet the additional
8179 * needs of DateGraph: grid overlays and error bars
8180 */
8181
8182 // Subclass PlotKit.Layout to add:
8183 // 1. Sigma/errorBars properties
8184 // 2. Copy error terms for PlotKit.CanvasRenderer._renderLineChart
8185
8186 /**
8187 * Creates a new DateGraphLayout object. Options are the same as those allowed
8188 * by the PlotKit.Layout constructor.
8189 * @param {Object} options Options for PlotKit.Layout
8190 * @return {Object} The DateGraphLayout object
8191 */
8192 DateGraphLayout = function(options) {
8193 PlotKit.Layout.call(this, "line", options);
8194 };
8195 DateGraphLayout.prototype = new PlotKit.Layout();
8196
8197 /**
8198 * Behaves the same way as PlotKit.Layout, but also copies the errors
8199 * @private
8200 */
8201 DateGraphLayout.prototype.evaluateWithError = function() {
8202 this.evaluate();
8203 if (!this.options.errorBars) return;
8204
8205 // Copy over the error terms
8206 var i = 0; // index in this.points
8207 for (var setName in this.datasets) {
8208 var j = 0;
8209 var dataset = this.datasets[setName];
8210 if (PlotKit.Base.isFuncLike(dataset)) continue;
8211 for (var j = 0; j < dataset.length; j++, i++) {
8212 var item = dataset[j];
8213 var xv = parseFloat(item[0]);
8214 var yv = parseFloat(item[1]);
8215
8216 if (xv == this.points[i].xval &&
8217 yv == this.points[i].yval) {
8218 this.points[i].errorMinus = parseFloat(item[2]);
8219 this.points[i].errorPlus = parseFloat(item[3]);
8220 }
8221 }
8222 }
8223 };
8224
8225 /**
8226 * Convenience function to remove all the data sets from a graph
8227 */
8228 DateGraphLayout.prototype.removeAllDatasets = function() {
8229 delete this.datasets;
8230 this.datasets = new Array();
8231 };
8232
8233 /**
8234 * Change the values of various layout options
8235 * @param {Object} new_options an associative array of new properties
8236 */
8237 DateGraphLayout.prototype.updateOptions = function(new_options) {
8238 MochiKit.Base.update(this.options, new_options ? new_options : {});
8239 };
8240
8241 // Subclass PlotKit.CanvasRenderer to add:
8242 // 1. X/Y grid overlay
8243 // 2. Ability to draw error bars (if required)
8244
8245 /**
8246 * Sets some PlotKit.CanvasRenderer options
8247 * @param {Object} element The canvas to attach to
8248 * @param {Layout} layout The DateGraphLayout object for this graph.
8249 * @param {Object} options Options to pass on to CanvasRenderer
8250 */
8251 DateGraphCanvasRenderer = function(element, layout, options) {
8252 PlotKit.CanvasRenderer.call(this, element, layout, options);
8253 this.options.shouldFill = false;
8254 this.options.shouldStroke = true;
8255 this.options.drawYGrid = true;
8256 this.options.drawXGrid = true;
8257 this.options.gridLineColor = MochiKit.Color.Color.grayColor();
8258 MochiKit.Base.update(this.options, options);
8259
8260 // TODO(danvk) This shouldn't be necessary: effects should be overlaid
8261 this.options.drawBackground = false;
8262 };
8263 DateGraphCanvasRenderer.prototype = new PlotKit.CanvasRenderer();
8264
8265 /**
8266 * Draw an X/Y grid on top of the existing plot
8267 */
8268 DateGraphCanvasRenderer.prototype.render = function() {
8269 // Do the ordinary rendering, as before
8270 // TODO(danvk) Call super.render()
8271 this._renderLineChart();
8272 this._renderLineAxis();
8273
8274 // Draw the new X/Y grid
8275 var ctx = this.element.getContext("2d");
8276 if (this.options.drawYGrid) {
8277 var ticks = this.layout.yticks;
8278 ctx.save();
8279 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
8280 ctx.lineWidth = this.options.axisLineWidth;
8281 for (var i = 0; i < ticks.length; i++) {
8282 var x = this.area.x;
8283 var y = this.area.y + ticks[i][0] * this.area.h;
8284 ctx.beginPath();
8285 ctx.moveTo(x, y);
8286 ctx.lineTo(x + this.area.w, y);
8287 ctx.closePath();
8288 ctx.stroke();
8289 }
8290 }
8291
8292 if (this.options.drawXGrid) {
8293 var ticks = this.layout.xticks;
8294 ctx.save();
8295 ctx.strokeStyle = this.options.gridLineColor.toRGBString();
8296 ctx.lineWidth = this.options.axisLineWidth;
8297 for (var i=0; i<ticks.length; i++) {
8298 var x = this.area.x + ticks[i][0] * this.area.w;
8299 var y = this.area.y + this.area.h;
8300 ctx.beginPath();
8301 ctx.moveTo(x, y);
8302 ctx.lineTo(x, this.area.y);
8303 ctx.closePath();
8304 ctx.stroke();
8305 }
8306 }
8307 };
8308
8309 /**
8310 * Overrides the CanvasRenderer method to draw error bars
8311 */
8312 DateGraphCanvasRenderer.prototype._renderLineChart = function() {
8313 var context = this.element.getContext("2d");
8314 var colorCount = this.options.colorScheme.length;
8315 var colorScheme = this.options.colorScheme;
8316 var setNames = MochiKit.Base.keys(this.layout.datasets);
8317 var errorBars = this.layout.options.errorBars;
8318 var setCount = setNames.length;
8319 var bind = MochiKit.Base.bind;
8320 var partial = MochiKit.Base.partial;
8321
8322 //Update Points
8323 var updatePoint = function(point) {
8324 point.canvasx = this.area.w * point.x + this.area.x;
8325 point.canvasy = this.area.h * point.y + this.area.y;
8326 }
8327 MochiKit.Iter.forEach(this.layout.points, updatePoint, this);
8328
8329 // create paths
8330 var makePath = function(ctx) {
8331 for (var i = 0; i < setCount; i++) {
8332 var setName = setNames[i];
8333 var color = colorScheme[i%colorCount];
8334 var strokeX = this.options.strokeColorTransform;
8335
8336 // setup graphics context
8337 context.save();
8338 context.strokeStyle = color.toRGBString();
8339 context.lineWidth = this.options.strokeWidth;
8340 ctx.beginPath();
8341 var point = this.layout.points[0];
8342 var first_point = true;
8343 var addPoint = function(ctx_, point) {
8344 if (point.name == setName) {
8345 if (first_point)
8346 ctx_.moveTo(point.canvasx, point.canvasy);
8347 else
8348 ctx_.lineTo(point.canvasx, point.canvasy);
8349 first_point = false;
8350 }
8351 };
8352 MochiKit.Iter.forEach(this.layout.points, partial(addPoint, ctx), this);
8353 ctx.stroke();
8354 }
8355 };
8356
8357 var makeErrorBars = function(ctx) {
8358 for (var i = 0; i < setCount; i++) {
8359 var setName = setNames[i];
8360 var color = colorScheme[i % colorCount];
8361 var strokeX = this.options.strokeColorTransform;
8362
8363 // setup graphics context
8364 context.save();
8365 context.strokeStyle = color.toRGBString();
8366 context.lineWidth = this.options.strokeWidth;
8367 var prevX = -1;
8368 var prevYs = [-1, -1];
8369 var count = 0;
8370 var yscale = this.layout.yscale;
8371 var errorTrapezoid = function(ctx_,point) {
8372 count++;
8373 if (point.name == setName) {
8374 var newYs = [ point.y - point.errorPlus * yscale,
8375 point.y + point.errorMinus * yscale ];
8376 newYs[0] = this.area.h * newYs[0] + this.area.y;
8377 newYs[1] = this.area.h * newYs[1] + this.area.y;
8378 if (prevX >= 0) {
8379 ctx_.moveTo(prevX, prevYs[0]);
8380 ctx_.lineTo(point.canvasx, newYs[0]);
8381 ctx_.lineTo(point.canvasx, newYs[1]);
8382 ctx_.lineTo(prevX, prevYs[1]);
8383 ctx_.closePath();
8384 }
8385 prevYs[0] = newYs[0];
8386 prevYs[1] = newYs[1];
8387 prevX = point.canvasx;
8388 }
8389 };
8390 // should be same color as the lines
8391 var err_color = color.colorWithAlpha(0.15);
8392 ctx.fillStyle = err_color.toRGBString();
8393 ctx.beginPath();
8394 MochiKit.Iter.forEach(this.layout.points, partial(errorTrapezoid, ctx), this);
8395 ctx.fill();
8396 }
8397 };
8398
8399 if (errorBars)
8400 bind(makeErrorBars, this)(context);
8401 bind(makePath, this)(context);
8402 context.restore();
8403 };
8404 // Copyright 2006 Dan Vanderkam (danvdk@gmail.com)
8405 // All Rights Reserved.
8406
8407 /**
8408 * @fileoverview Creates an interactive, zoomable graph based on a CSV file or
8409 * string. DateGraph can handle multiple series with or without error bars. The
8410 * date/value ranges will be automatically set. DateGraph uses the
8411 * &lt;canvas&gt; tag, so it only works in FF1.5+.
8412 * @author danvdk@gmail.com (Dan Vanderkam)
8413
8414 Usage:
8415 <div id="graphdiv" style="width:800px; height:500px;"></div>
8416 <script type="text/javascript">
8417 new DateGraph(document.getElementById("graphdiv"),
8418 "datafile.csv",
8419 ["Series 1", "Series 2"],
8420 { }); // options
8421 </script>
8422
8423 The CSV file is of the form
8424
8425 YYYYMMDD,A1,B1,C1
8426 YYYYMMDD,A2,B2,C2
8427
8428 If null is passed as the third parameter (series names), then the first line
8429 of the CSV file is assumed to contain names for each series.
8430
8431 If the 'errorBars' option is set in the constructor, the input should be of
8432 the form
8433
8434 YYYYMMDD,A1,sigmaA1,B1,sigmaB1,...
8435 YYYYMMDD,A2,sigmaA2,B2,sigmaB2,...
8436
8437 If the 'fractions' option is set, the input should be of the form:
8438
8439 YYYYMMDD,A1/B1,A2/B2,...
8440 YYYYMMDD,A1/B1,A2/B2,...
8441
8442 And error bars will be calculated automatically using a binomial distribution.
8443
8444 For further documentation and examples, see http://www/~danvk/dg/
8445
8446 */
8447
8448 /**
8449 * An interactive, zoomable graph
8450 * @param {String | Function} file A file containing CSV data or a function that
8451 * returns this data. The expected format for each line is
8452 * YYYYMMDD,val1,val2,... or, if attrs.errorBars is set,
8453 * YYYYMMDD,val1,stddev1,val2,stddev2,...
8454 * @param {Array.<String>} labels Labels for the data series
8455 * @param {Object} attrs Various other attributes, e.g. errorBars determines
8456 * whether the input data contains error ranges.
8457 */
8458 DateGraph = function(div, file, labels, attrs) {
8459 if (arguments.length > 0)
8460 this.__init__(div, file, labels, attrs);
8461 };
8462
8463 DateGraph.NAME = "DateGraph";
8464 DateGraph.VERSION = "1.1";
8465 DateGraph.__repr__ = function() {
8466 return "[" + this.NAME + " " + this.VERSION + "]";
8467 };
8468 DateGraph.toString = function() {
8469 return this.__repr__();
8470 };
8471
8472 // Various default values
8473 DateGraph.DEFAULT_ROLL_PERIOD = 1;
8474 DateGraph.DEFAULT_WIDTH = 480;
8475 DateGraph.DEFAULT_HEIGHT = 320;
8476 DateGraph.DEFAULT_STROKE_WIDTH = 1.0;
8477 DateGraph.AXIS_LINE_WIDTH = 0.3;
8478
8479 /**
8480 * Initializes the DateGraph. This creates a new DIV and constructs the PlotKit
8481 * and interaction &lt;canvas&gt; inside of it. See the constructor for details
8482 * on the parameters.
8483 * @param {String | Function} file Source data
8484 * @param {Array.<String>} labels Names of the data series
8485 * @param {Object} attrs Miscellaneous other options
8486 * @private
8487 */
8488 DateGraph.prototype.__init__ = function(div, file, labels, attrs) {
8489 // Copy the important bits into the object
8490 this.maindiv_ = div;
8491 this.labels_ = labels;
8492 this.file_ = file;
8493 this.rollPeriod_ = attrs.rollPeriod || DateGraph.DEFAULT_ROLL_PERIOD;
8494 this.previousVerticalX_ = -1;
8495 this.width_ = parseInt(div.style.width, 10);
8496 this.height_ = parseInt(div.style.height, 10);
8497 this.errorBars_ = attrs.errorBars || false;
8498 this.fractions_ = attrs.fractions || false;
8499 this.strokeWidth_ = attrs.strokeWidth || DateGraph.DEFAULT_STROKE_WIDTH;
8500 this.dateWindow_ = attrs.dateWindow || null;
8501 this.valueRange_ = attrs.valueRange || null;
8502 this.labelsSeparateLines = attrs.labelsSeparateLines || false;
8503 this.labelsDiv_ = attrs.labelsDiv || null;
8504 this.labelsKMB_ = attrs.labelsKMB || false;
8505 this.minTickSize_ = attrs.minTickSize || 0;
8506 this.xValueParser_ = attrs.xValueParser || DateGraph.prototype.dateParser;
8507 this.xValueFormatter_ = attrs.xValueFormatter ||
8508 DateGraph.prototype.dateString_;
8509 this.xTicker_ = attrs.xTicker || DateGraph.prototype.dateTicker;
8510 this.sigma_ = attrs.sigma || 2.0;
8511 this.wilsonInterval_ = attrs.wilsonInterval || true;
8512 this.customBars_ = attrs.customBars || false;
8513 this.attrs_ = attrs;
8514
8515 // Make a note of whether labels will be pulled from the CSV file.
8516 this.labelsFromCSV_ = (this.labels_ == null);
8517 if (this.labels_ == null)
8518 this.labels_ = [];
8519
8520 // Prototype of the callback is "void clickCallback(event, date)"
8521 this.clickCallback_ = attrs.clickCallback || null;
8522
8523 // Prototype of zoom callback is "void dragCallback(minDate, maxDate)"
8524 this.zoomCallback_ = attrs.zoomCallback || null;
8525
8526 // Create the containing DIV and other interactive elements
8527 this.createInterface_();
8528
8529 // Create the PlotKit grapher
8530 this.layoutOptions_ = { 'errorBars': (this.errorBars_ || this.customBars_),
8531 'xOriginIsZero': false };
8532 MochiKit.Base.update(this.layoutOptions_, attrs);
8533 this.setColors_(attrs);
8534
8535 this.layout_ = new DateGraphLayout(this.layoutOptions_);
8536
8537 this.renderOptions_ = { colorScheme: this.colors_,
8538 strokeColor: null,
8539 strokeWidth: this.strokeWidth_,
8540 axisLabelFontSize: 14,
8541 axisLineWidth: DateGraph.AXIS_LINE_WIDTH };
8542 MochiKit.Base.update(this.renderOptions_, attrs);
8543 this.plotter_ = new DateGraphCanvasRenderer(this.hidden_, this.layout_,
8544 this.renderOptions_);
8545
8546 this.createStatusMessage_();
8547 this.createRollInterface_();
8548 this.createDragInterface_();
8549
8550 connect(window, 'onload', this, function(e) { this.start_(); });
8551 };
8552
8553 /**
8554 * Returns the current rolling period, as set by the user or an option.
8555 * @return {Number} The number of days in the rolling window
8556 */
8557 DateGraph.prototype.rollPeriod = function() {
8558 return this.rollPeriod_;
8559 }
8560
8561 /**
8562 * Generates interface elements for the DateGraph: a containing div, a div to
8563 * display the current point, and a textbox to adjust the rolling average
8564 * period.
8565 * @private
8566 */
8567 DateGraph.prototype.createInterface_ = function() {
8568 // Create the all-enclosing graph div
8569 var enclosing = this.maindiv_;
8570
8571 this.graphDiv = MochiKit.DOM.DIV( { style: { 'width': this.width_ + "px",
8572 'height': this.height_ + "px"
8573 }});
8574 appendChildNodes(enclosing, this.graphDiv);
8575
8576 // Create the canvas to store
8577 var canvas = MochiKit.DOM.CANVAS;
8578 this.canvas_ = canvas( { style: { 'position': 'absolute' },
8579 width: this.width_,
8580 height: this.height_});
8581 appendChildNodes(this.graphDiv, this.canvas_);
8582
8583 this.hidden_ = this.createPlotKitCanvas_(this.canvas_);
8584 connect(this.hidden_, 'onmousemove', this, function(e) { this.mouseMove_(e) });
8585 connect(this.hidden_, 'onmouseout', this, function(e) { this.mouseOut_(e) });
8586 }
8587
8588 /**
8589 * Creates the canvas containing the PlotKit graph. Only plotkit ever draws on
8590 * this particular canvas. All DateGraph work is done on this.canvas_.
8591 * @param {Object} canvas The DateGraph canvas to over which to overlay the plot
8592 * @return {Object} The newly-created canvas
8593 * @private
8594 */
8595 DateGraph.prototype.createPlotKitCanvas_ = function(canvas) {
8596 var h = document.createElement("canvas");
8597 h.style.position = "absolute";
8598 h.style.top = canvas.style.top;
8599 h.style.left = canvas.style.left;
8600 h.width = this.width_;
8601 h.height = this.height_;
8602 MochiKit.DOM.appendChildNodes(this.graphDiv, h);
8603 return h;
8604 };
8605
8606 /**
8607 * Generate a set of distinct colors for the data series. This is done with a
8608 * color wheel. Saturation/Value are customizable, and the hue is
8609 * equally-spaced around the color wheel. If a custom set of colors is
8610 * specified, that is used instead.
8611 * @param {Object} attrs Various attributes, e.g. saturation and value
8612 * @private
8613 */
8614 DateGraph.prototype.setColors_ = function(attrs) {
8615 var num = this.labels_.length;
8616 this.colors_ = [];
8617 if (!attrs.colors) {
8618 var sat = attrs.colorSaturation || 1.0;
8619 var val = attrs.colorValue || 0.5;
8620 for (var i = 1; i <= num; i++) {
8621 var hue = (1.0*i/(1+num));
8622 this.colors_.push( MochiKit.Color.Color.fromHSV(hue, sat, val) );
8623 }
8624 } else {
8625 for (var i = 0; i < num; i++) {
8626 var colorStr = attrs.colors[i % attrs.colors.length];
8627 this.colors_.push( MochiKit.Color.Color.fromString(colorStr) );
8628 }
8629 }
8630 }
8631
8632 /**
8633 * Create the div that contains information on the selected point(s)
8634 * This goes in the top right of the canvas, unless an external div has already
8635 * been specified.
8636 * @private
8637 */
8638 DateGraph.prototype.createStatusMessage_ = function(){
8639 if (!this.labelsDiv_) {
8640 var divWidth = 250;
8641 var messagestyle = { "style": {
8642 "position": "absolute",
8643 "fontSize": "14px",
8644 "zIndex": 10,
8645 "width": divWidth + "px",
8646 "top": "0px",
8647 "left": this.width_ - divWidth + "px",
8648 "background": "white",
8649 "textAlign": "left",
8650 "overflow": "hidden"}};
8651 this.labelsDiv_ = MochiKit.DOM.DIV(messagestyle);
8652 MochiKit.DOM.appendChildNodes(this.graphDiv, this.labelsDiv_);
8653 }
8654 };
8655
8656 /**
8657 * Create the text box to adjust the averaging period
8658 * @return {Object} The newly-created text box
8659 * @private
8660 */
8661 DateGraph.prototype.createRollInterface_ = function() {
8662 var padding = this.plotter_.options.padding;
8663 var textAttr = { "type": "text",
8664 "size": "2",
8665 "value": this.rollPeriod_,
8666 "style": { "position": "absolute",
8667 "zIndex": 10,
8668 "top": (this.height_ - 25 - padding.bottom) + "px",
8669 "left": (padding.left+1) + "px" }
8670 };
8671 var roller = MochiKit.DOM.INPUT(textAttr);
8672 var pa = this.graphDiv;
8673 MochiKit.DOM.appendChildNodes(pa, roller);
8674 connect(roller, 'onchange', this,
8675 function() { this.adjustRoll(roller.value); });
8676 return roller;
8677 }
8678
8679 /**
8680 * Set up all the mouse handlers needed to capture dragging behavior for zoom
8681 * events. Uses MochiKit.Signal to attach all the event handlers.
8682 * @private
8683 */
8684 DateGraph.prototype.createDragInterface_ = function() {
8685 var self = this;
8686
8687 // Tracks whether the mouse is down right now
8688 var mouseDown = false;
8689 var dragStartX = null;
8690 var dragStartY = null;
8691 var dragEndX = null;
8692 var dragEndY = null;
8693 var prevEndX = null;
8694
8695 // Utility function to convert page-wide coordinates to canvas coords
8696 var px = PlotKit.Base.findPosX(this.canvas_);
8697 var py = PlotKit.Base.findPosY(this.canvas_);
8698 var getX = function(e) { return e.mouse().page.x - px };
8699 var getY = function(e) { return e.mouse().page.y - py };
8700
8701 // Draw zoom rectangles when the mouse is down and the user moves around
8702 connect(this.hidden_, 'onmousemove', function(event) {
8703 if (mouseDown) {
8704 dragEndX = getX(event);
8705 dragEndY = getY(event);
8706
8707 self.drawZoomRect_(dragStartX, dragEndX, prevEndX);
8708 prevEndX = dragEndX;
8709 }
8710 });
8711
8712 // Track the beginning of drag events
8713 connect(this.hidden_, 'onmousedown', function(event) {
8714 mouseDown = true;
8715 dragStartX = getX(event);
8716 dragStartY = getY(event);
8717 });
8718
8719 // If the user releases the mouse button during a drag, but not over the
8720 // canvas, then it doesn't count as a zooming action.
8721 connect(document, 'onmouseup', this, function(event) {
8722 if (mouseDown) {
8723 mouseDown = false;
8724 dragStartX = null;
8725 dragStartY = null;
8726 }
8727 });
8728
8729 // Temporarily cancel the dragging event when the mouse leaves the graph
8730 connect(this.hidden_, 'onmouseout', this, function(event) {
8731 if (mouseDown) {
8732 dragEndX = null;
8733 dragEndY = null;
8734 }
8735 });
8736
8737 // If the mouse is released on the canvas during a drag event, then it's a
8738 // zoom. Only do the zoom if it's over a large enough area (>= 10 pixels)
8739 connect(this.hidden_, 'onmouseup', this, function(event) {
8740 if (mouseDown) {
8741 mouseDown = false;
8742 dragEndX = getX(event);
8743 dragEndY = getY(event);
8744 var regionWidth = Math.abs(dragEndX - dragStartX);
8745 var regionHeight = Math.abs(dragEndY - dragStartY);
8746
8747 if (regionWidth < 2 && regionHeight < 2 &&
8748 self.clickCallback_ != null &&
8749 self.lastx_ != undefined) {
8750 self.clickCallback_(event, new Date(self.lastx_));
8751 }
8752
8753 if (regionWidth >= 10) {
8754 self.doZoom_(Math.min(dragStartX, dragEndX),
8755 Math.max(dragStartX, dragEndX));
8756 } else {
8757 self.canvas_.getContext("2d").clearRect(0, 0,
8758 self.canvas_.width,
8759 self.canvas_.height);
8760 }
8761
8762 dragStartX = null;
8763 dragStartY = null;
8764 }
8765 });
8766
8767 // Double-clicking zooms back out
8768 connect(this.hidden_, 'ondblclick', this, function(event) {
8769 self.dateWindow_ = null;
8770 self.drawGraph_(self.rawData_);
8771 var minDate = self.rawData_[0][0];
8772 var maxDate = self.rawData_[self.rawData_.length - 1][0];
8773 self.zoomCallback_(minDate, maxDate);
8774 });
8775 };
8776
8777 /**
8778 * Draw a gray zoom rectangle over the desired area of the canvas. Also clears
8779 * up any previous zoom rectangles that were drawn. This could be optimized to
8780 * avoid extra redrawing, but it's tricky to avoid interactions with the status
8781 * dots.
8782 * @param {Number} startX The X position where the drag started, in canvas
8783 * coordinates.
8784 * @param {Number} endX The current X position of the drag, in canvas coords.
8785 * @param {Number} prevEndX The value of endX on the previous call to this
8786 * function. Used to avoid excess redrawing
8787 * @private
8788 */
8789 DateGraph.prototype.drawZoomRect_ = function(startX, endX, prevEndX) {
8790 var ctx = this.canvas_.getContext("2d");
8791
8792 // Clean up from the previous rect if necessary
8793 if (prevEndX) {
8794 ctx.clearRect(Math.min(startX, prevEndX), 0,
8795 Math.abs(startX - prevEndX), this.height_);
8796 }
8797
8798 // Draw a light-grey rectangle to show the new viewing area
8799 if (endX && startX) {
8800 ctx.fillStyle = "rgba(128,128,128,0.33)";
8801 ctx.fillRect(Math.min(startX, endX), 0,
8802 Math.abs(endX - startX), this.height_);
8803 }
8804 };
8805
8806 /**
8807 * Zoom to something containing [lowX, highX]. These are pixel coordinates
8808 * in the canvas. The exact zoom window may be slightly larger if there are no
8809 * data points near lowX or highX. This function redraws the graph.
8810 * @param {Number} lowX The leftmost pixel value that should be visible.
8811 * @param {Number} highX The rightmost pixel value that should be visible.
8812 * @private
8813 */
8814 DateGraph.prototype.doZoom_ = function(lowX, highX) {
8815 // Find the earliest and latest dates contained in this canvasx range.
8816 var points = this.layout_.points;
8817 var minDate = null;
8818 var maxDate = null;
8819 // Find the nearest [minDate, maxDate] that contains [lowX, highX]
8820 for (var i = 0; i < points.length; i++) {
8821 var cx = points[i].canvasx;
8822 var x = points[i].xval;
8823 if (cx < lowX && (minDate == null || x > minDate)) minDate = x;
8824 if (cx > highX && (maxDate == null || x < maxDate)) maxDate = x;
8825 }
8826 // Use the extremes if either is missing
8827 if (minDate == null) minDate = points[0].xval;
8828 if (maxDate == null) maxDate = points[points.length-1].xval;
8829
8830 this.dateWindow_ = [minDate, maxDate];
8831 this.drawGraph_(this.rawData_);
8832 this.zoomCallback_(minDate, maxDate);
8833 };
8834
8835 /**
8836 * When the mouse moves in the canvas, display information about a nearby data
8837 * point and draw dots over those points in the data series. This function
8838 * takes care of cleanup of previously-drawn dots.
8839 * @param {Object} event The mousemove event from the browser.
8840 * @private
8841 */
8842 DateGraph.prototype.mouseMove_ = function(event) {
8843 var canvasx = event.mouse().page.x - PlotKit.Base.findPosX(this.hidden_);
8844 var points = this.layout_.points;
8845
8846 var lastx = -1;
8847 var lasty = -1;
8848
8849 // Loop through all the points and find the date nearest to our current
8850 // location.
8851 var minDist = 1e+100;
8852 var idx = -1;
8853 for (var i = 0; i < points.length; i++) {
8854 var dist = Math.abs(points[i].canvasx - canvasx);
8855 if (dist > minDist) break;
8856 minDist = dist;
8857 idx = i;
8858 }
8859 if (idx >= 0) lastx = points[idx].xval;
8860 // Check that you can really highlight the last day's data
8861 if (canvasx > points[points.length-1].canvasx)
8862 lastx = points[points.length-1].xval;
8863
8864 // Extract the points we've selected
8865 var selPoints = [];
8866 for (var i = 0; i < points.length; i++) {
8867 if (points[i].xval == lastx) {
8868 selPoints.push(points[i]);
8869 }
8870 }
8871
8872 // Clear the previously drawn vertical, if there is one
8873 var circleSize = 3;
8874 var ctx = this.canvas_.getContext("2d");
8875 if (this.previousVerticalX_ >= 0) {
8876 var px = this.previousVerticalX_;
8877 ctx.clearRect(px - circleSize - 1, 0, 2 * circleSize + 2, this.height_);
8878 }
8879
8880 if (selPoints.length > 0) {
8881 var canvasx = selPoints[0].canvasx;
8882
8883 // Set the status message to indicate the selected point(s)
8884 var replace = this.xValueFormatter_(lastx) + ":";
8885 var clen = this.colors_.length;
8886 for (var i = 0; i < selPoints.length; i++) {
8887 if (this.labelsSeparateLines) {
8888 replace += "<br/>";
8889 }
8890 var point = selPoints[i];
8891 replace += " <b><font color='" + this.colors_[i%clen].toHexString() + "'>"
8892 + point.name + "</font></b>:"
8893 + this.round_(point.yval, 2);
8894 }
8895 this.labelsDiv_.innerHTML = replace;
8896
8897 // Save last x position for callbacks.
8898 this.lastx_ = lastx;
8899
8900 // Draw colored circles over the center of each selected point
8901 ctx.save()
8902 for (var i = 0; i < selPoints.length; i++) {
8903 ctx.beginPath();
8904 ctx.fillStyle = this.colors_[i%clen].toRGBString();
8905 ctx.arc(canvasx, selPoints[i%clen].canvasy, circleSize, 0, 360, false);
8906 ctx.fill();
8907 }
8908 ctx.restore();
8909
8910 this.previousVerticalX_ = canvasx;
8911 }
8912 };
8913
8914 /**
8915 * The mouse has left the canvas. Clear out whatever artifacts remain
8916 * @param {Object} event the mouseout event from the browser.
8917 * @private
8918 */
8919 DateGraph.prototype.mouseOut_ = function(event) {
8920 // Get rid of the overlay data
8921 var ctx = this.canvas_.getContext("2d");
8922 ctx.clearRect(0, 0, this.width_, this.height_);
8923 this.labelsDiv_.innerHTML = "";
8924 };
8925
8926 /**
8927 * Convert a JS date (millis since epoch) to YYYY/MM/DD
8928 * @param {Number} date The JavaScript date (ms since epoch)
8929 * @return {String} A date of the form "YYYY/MM/DD"
8930 * @private
8931 */
8932 DateGraph.prototype.dateString_ = function(date) {
8933 var d = new Date(date);
8934
8935 // Get the year:
8936 var year = "" + d.getFullYear();
8937 // Get a 0 padded month string
8938 var month = "" + (d.getMonth() + 1); //months are 0-offset, sigh
8939 if (month.length < 2) month = "0" + month;
8940 // Get a 0 padded day string
8941 var day = "" + d.getDate();
8942 if (day.length < 2) day = "0" + day;
8943
8944 return year + "/" + month + "/" + day;
8945 };
8946
8947 /**
8948 * Round a number to the specified number of digits past the decimal point.
8949 * @param {Number} num The number to round
8950 * @param {Number} places The number of decimals to which to round
8951 * @return {Number} The rounded number
8952 * @private
8953 */
8954 DateGraph.prototype.round_ = function(num, places) {
8955 var shift = Math.pow(10, places);
8956 return Math.round(num * shift)/shift;
8957 };
8958
8959 /**
8960 * Fires when there's data available to be graphed.
8961 * @param {String} data Raw CSV data to be plotted
8962 * @private
8963 */
8964 DateGraph.prototype.loadedEvent_ = function(data) {
8965 this.rawData_ = this.parseCSV_(data);
8966 this.drawGraph_(this.rawData_);
8967 };
8968
8969 DateGraph.prototype.months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
8970 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
8971 DateGraph.prototype.quarters = ["Jan", "Apr", "Jul", "Oct"];
8972
8973 /**
8974 * Add ticks on the x-axis representing years, months, quarters, weeks, or days
8975 * @private
8976 */
8977 DateGraph.prototype.addXTicks_ = function() {
8978 // Determine the correct ticks scale on the x-axis: quarterly, monthly, ...
8979 var startDate, endDate;
8980 if (this.dateWindow_) {
8981 startDate = this.dateWindow_[0];
8982 endDate = this.dateWindow_[1];
8983 } else {
8984 startDate = this.rawData_[0][0];
8985 endDate = this.rawData_[this.rawData_.length - 1][0];
8986 }
8987
8988 var xTicks = this.xTicker_(startDate, endDate);
8989 this.layout_.updateOptions({xTicks: xTicks});
8990 }
8991
8992 /**
8993 * Add ticks to the x-axis based on a date range.
8994 * @param {Number} startDate Start of the date window (millis since epoch)
8995 * @param {Number} endDate End of the date window (millis since epoch)
8996 * @return {Array.<Object>} Array of {label, value} tuples.
8997 * @public
8998 */
8999 DateGraph.prototype.dateTicker = function(startDate, endDate) {
9000 var ONE_DAY = 24*60*60*1000;
9001 startDate = startDate / ONE_DAY;
9002 endDate = endDate / ONE_DAY;
9003 var dateSpan = endDate - startDate;
9004
9005 var scale = [];
9006 var isMonthly = false;
9007 var yearMod = 1;
9008 if (dateSpan > 30 * 366) { // decadal
9009 isMonthly = true;
9010 scale = ["Jan"];
9011 yearMod = 10;
9012 } else if (dateSpan > 4*366) { // annual
9013 scale = ["Jan"];
9014 isMonthly = true;
9015 } else if (dateSpan > 366) { // quarterly
9016 scale = this.quarters;
9017 isMonthly = true;
9018 } else if (dateSpan > 40) { // monthly
9019 scale = this.months;
9020 isMonthly = true;
9021 } else if (dateSpan > 10) { // weekly
9022 for (var week = startDate - 14; week < endDate + 14; week += 7) {
9023 scale.push(week * ONE_DAY);
9024 }
9025 } else { // daily
9026 for (var day = startDate - 14; day < endDate + 14; day += 1) {
9027 scale.push(day * ONE_DAY);
9028 }
9029 }
9030
9031 var xTicks = [];
9032
9033 if (isMonthly) {
9034 var startYear = 1900 + (new Date(startDate* ONE_DAY)).getYear();
9035 var endYear = 1900 + (new Date(endDate * ONE_DAY)).getYear();
9036 for (var i = startYear; i <= endYear; i++) {
9037 if (i % yearMod != 0) continue;
9038 for (var j = 0; j < scale.length; j++ ) {
9039 var date = Date.parse(scale[j] + " 1, " + i);
9040 xTicks.push( {label: scale[j] + "'" + ("" + i).substr(2,2), v: date } );
9041 }
9042 }
9043 } else {
9044 for (var i = 0; i < scale.length; i++) {
9045 var date = new Date(scale[i]);
9046 var year = date.getFullYear().toString();
9047 var label = this.months[date.getMonth()] + date.getDate();
9048 label += "'" + year.substr(year.length - 2, 2);
9049 xTicks.push( {label: label, v: date} );
9050 }
9051 }
9052 return xTicks;
9053 };
9054
9055 /**
9056 * Add ticks when the x axis has numbers on it (instead of dates)
9057 * @param {Number} startDate Start of the date window (millis since epoch)
9058 * @param {Number} endDate End of the date window (millis since epoch)
9059 * @return {Array.<Object>} Array of {label, value} tuples.
9060 * @public
9061 */
9062 DateGraph.prototype.numericTicks = function(minV, maxV) {
9063 var scale;
9064 if (maxV <= 0.0) {
9065 scale = 1.0;
9066 } else {
9067 scale = Math.pow( 10, Math.floor(Math.log(maxV)/Math.log(10.0)) );
9068 }
9069
9070 // Add a smallish number of ticks at human-friendly points
9071 var nTicks = (maxV - minV) / scale;
9072 while (2 * nTicks < 20) {
9073 nTicks *= 2;
9074 }
9075 if ((maxV - minV) / nTicks < this.minTickSize_) {
9076 nTicks = this.round_((maxV - minV) / this.minTickSize_, 1);
9077 }
9078
9079 // Construct labels for the ticks
9080 var ticks = [];
9081 for (var i = 0; i <= nTicks; i++) {
9082 var tickV = minV + i * (maxV - minV) / nTicks;
9083 var label = this.round_(tickV, 2);
9084 if (this.labelsKMB_) {
9085 var k = 1000;
9086 if (tickV >= k*k*k) {
9087 label = this.round_(tickV/(k*k*k), 1) + "B";
9088 } else if (tickV >= k*k) {
9089 label = this.round_(tickV/(k*k), 1) + "M";
9090 } else if (tickV >= k) {
9091 label = this.round_(tickV/k, 1) + "K";
9092 }
9093 }
9094 ticks.push( {label: label, v: tickV} );
9095 }
9096 return ticks;
9097 };
9098
9099 /**
9100 * Adds appropriate ticks on the y-axis
9101 * @param {Number} minY The minimum Y value in the data set
9102 * @param {Number} maxY The maximum Y value in the data set
9103 * @private
9104 */
9105 DateGraph.prototype.addYTicks_ = function(minY, maxY) {
9106 // Set the number of ticks so that the labels are human-friendly.
9107 var ticks = this.numericTicks(minY, maxY);
9108 this.layout_.updateOptions( { yAxis: [minY, maxY],
9109 yTicks: ticks } );
9110 };
9111
9112 /**
9113 * Update the graph with new data. Data is in the format
9114 * [ [date1, val1, val2, ...], [date2, val1, val2, ...] if errorBars=false
9115 * or, if errorBars=true,
9116 * [ [date1, [val1,stddev1], [val2,stddev2], ...], [date2, ...], ...]
9117 * @param {Array.<Object>} data The data (see above)
9118 * @private
9119 */
9120 DateGraph.prototype.drawGraph_ = function(data) {
9121 var maxY = null;
9122 this.layout_.removeAllDatasets();
9123 // Loop over all fields in the dataset
9124 for (var i = 1; i < data[0].length; i++) {
9125 var series = [];
9126 for (var j = 0; j < data.length; j++) {
9127 var date = data[j][0];
9128 series[j] = [date, data[j][i]];
9129 }
9130 series = this.rollingAverage(series, this.rollPeriod_);
9131
9132 // Prune down to the desired range, if necessary (for zooming)
9133 var bars = this.errorBars_ || this.customBars_;
9134 if (this.dateWindow_) {
9135 var low = this.dateWindow_[0];
9136 var high= this.dateWindow_[1];
9137 var pruned = [];
9138 for (var k = 0; k < series.length; k++) {
9139 if (series[k][0] >= low && series[k][0] <= high) {
9140 pruned.push(series[k]);
9141 var y = bars ? series[k][1][0] : series[k][1];
9142 if (maxY == null || y > maxY) maxY = y;
9143 }
9144 }
9145 series = pruned;
9146 } else {
9147 for (var j = 0; j < series.length; j++) {
9148 var y = bars ? series[j][1][0] : series[j][1];
9149 if (maxY == null || y > maxY) {
9150 maxY = bars ? y + series[j][1][1] : y;
9151 }
9152 }
9153 }
9154
9155 if (bars) {
9156 var vals = [];
9157 for (var j=0; j<series.length; j++)
9158 vals[j] = [series[j][0],
9159 series[j][1][0], series[j][1][1], series[j][1][2]];
9160 this.layout_.addDataset(this.labels_[i - 1], vals);
9161 } else {
9162 this.layout_.addDataset(this.labels_[i - 1], series);
9163 }
9164 }
9165
9166 // Use some heuristics to come up with a good maxY value, unless it's been
9167 // set explicitly by the user.
9168 if (this.valueRange_ != null) {
9169 this.addYTicks_(this.valueRange_[0], this.valueRange_[1]);
9170 } else {
9171 // Add some padding and round up to an integer to be human-friendly.
9172 maxY *= 1.1;
9173 if (maxY <= 0.0) maxY = 1.0;
9174 else {
9175 var scale = Math.pow(10, Math.floor(Math.log(maxY) / Math.log(10.0)));
9176 maxY = scale * Math.ceil(maxY / scale);
9177 }
9178 this.addYTicks_(0, maxY);
9179 }
9180
9181 this.addXTicks_();
9182
9183 // Tell PlotKit to use this new data and render itself
9184 this.layout_.evaluateWithError();
9185 this.plotter_.clear();
9186 this.plotter_.render();
9187 this.canvas_.getContext('2d').clearRect(0, 0,
9188 this.canvas_.width, this.canvas_.height);
9189 };
9190
9191 /**
9192 * Calculates the rolling average of a data set.
9193 * If originalData is [label, val], rolls the average of those.
9194 * If originalData is [label, [, it's interpreted as [value, stddev]
9195 * and the roll is returned in the same form, with appropriately reduced
9196 * stddev for each value.
9197 * Note that this is where fractional input (i.e. '5/10') is converted into
9198 * decimal values.
9199 * @param {Array} originalData The data in the appropriate format (see above)
9200 * @param {Number} rollPeriod The number of days over which to average the data
9201 */
9202 DateGraph.prototype.rollingAverage = function(originalData, rollPeriod) {
9203 if (originalData.length < 2)
9204 return originalData;
9205 var rollPeriod = Math.min(rollPeriod, originalData.length - 1);
9206 var rollingData = [];
9207 var sigma = this.sigma_;
9208
9209 if (this.fractions_) {
9210 var num = 0;
9211 var den = 0; // numerator/denominator
9212 var mult = 100.0;
9213 for (var i = 0; i < originalData.length; i++) {
9214 num += originalData[i][1][0];
9215 den += originalData[i][1][1];
9216 if (i - rollPeriod >= 0) {
9217 num -= originalData[i - rollPeriod][1][0];
9218 den -= originalData[i - rollPeriod][1][1];
9219 }
9220
9221 var date = originalData[i][0];
9222 var value = den ? num / den : 0.0;
9223 if (this.errorBars_) {
9224 if (this.wilsonInterval_) {
9225 // For more details on this confidence interval, see:
9226 // http://en.wikipedia.org/wiki/Binomial_confidence_interval
9227 if (den) {
9228 var p = value < 0 ? 0 : value, n = den;
9229 var pm = sigma * Math.sqrt(p*(1-p)/n + sigma*sigma/(4*n*n));
9230 var denom = 1 + sigma * sigma / den;
9231 var low = (p + sigma * sigma / (2 * den) - pm) / denom;
9232 var high = (p + sigma * sigma / (2 * den) + pm) / denom;
9233 rollingData[i] = [date,
9234 [p * mult, (p - low) * mult, (high - p) * mult]];
9235 } else {
9236 rollingData[i] = [date, [0, 0, 0]];
9237 }
9238 } else {
9239 var stddev = den ? sigma * Math.sqrt(value * (1 - value) / den) : 1.0;
9240 rollingData[i] = [date, [mult * value, mult * stddev, mult * stddev]];
9241 }
9242 } else {
9243 rollingData[i] = [date, mult * value];
9244 }
9245 }
9246 } else if (this.customBars_) {
9247 // just ignore the rolling for now.
9248 // TODO(danvk): do something reasonable.
9249 for (var i = 0; i < originalData.length; i++) {
9250 var data = originalData[i][1];
9251 var y = data[1];
9252 rollingData[i] = [originalData[i][0], [y, y - data[0], data[2] - y]];
9253 }
9254 } else {
9255 // Calculate the rolling average for the first rollPeriod - 1 points where
9256 // there is not enough data to roll over the full number of days
9257 var num_init_points = Math.min(rollPeriod - 1, originalData.length - 2);
9258 if (!this.errorBars_){
9259 for (var i = 0; i < num_init_points; i++) {
9260 var sum = 0;
9261 for (var j = 0; j < i + 1; j++)
9262 sum += originalData[j][1];
9263 rollingData[i] = [originalData[i][0], sum / (i + 1)];
9264 }
9265 // Calculate the rolling average for the remaining points
9266 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
9267 i < originalData.length;
9268 i++) {
9269 var sum = 0;
9270 for (var j = i - rollPeriod + 1; j < i + 1; j++)
9271 sum += originalData[j][1];
9272 rollingData[i] = [originalData[i][0], sum / rollPeriod];
9273 }
9274 } else {
9275 for (var i = 0; i < num_init_points; i++) {
9276 var sum = 0;
9277 var variance = 0;
9278 for (var j = 0; j < i + 1; j++) {
9279 sum += originalData[j][1][0];
9280 variance += Math.pow(originalData[j][1][1], 2);
9281 }
9282 var stddev = Math.sqrt(variance)/(i+1);
9283 rollingData[i] = [originalData[i][0],
9284 [sum/(i+1), sigma * stddev, sigma * stddev]];
9285 }
9286 // Calculate the rolling average for the remaining points
9287 for (var i = Math.min(rollPeriod - 1, originalData.length - 2);
9288 i < originalData.length;
9289 i++) {
9290 var sum = 0;
9291 var variance = 0;
9292 for (var j = i - rollPeriod + 1; j < i + 1; j++) {
9293 sum += originalData[j][1][0];
9294 variance += Math.pow(originalData[j][1][1], 2);
9295 }
9296 var stddev = Math.sqrt(variance) / rollPeriod;
9297 rollingData[i] = [originalData[i][0],
9298 [sum / rollPeriod, sigma * stddev, sigma * stddev]];
9299 }
9300 }
9301 }
9302
9303 return rollingData;
9304 };
9305
9306 /**
9307 * Parses a date, returning the number of milliseconds since epoch. This can be
9308 * passed in as an xValueParser in the DateGraph constructor.
9309 * @param {String} A date in YYYYMMDD format.
9310 * @return {Number} Milliseconds since epoch.
9311 * @public
9312 */
9313 DateGraph.prototype.dateParser = function(dateStr) {
9314 var dateStrSlashed;
9315 if (dateStr.search("-") != -1) {
9316 dateStrSlashed = dateStr.replace("-", "/", "g");
9317 } else if (dateStr.search("/") != -1) {
9318 return Date.parse(dateStr);
9319 } else {
9320 dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2)
9321 + "/" + dateStr.substr(6,2);
9322 }
9323 return Date.parse(dateStrSlashed);
9324 };
9325
9326 /**
9327 * Parses a string in a special csv format. We expect a csv file where each
9328 * line is a date point, and the first field in each line is the date string.
9329 * We also expect that all remaining fields represent series.
9330 * if this.errorBars_ is set, then interpret the fields as:
9331 * date, series1, stddev1, series2, stddev2, ...
9332 * @param {Array.<Object>} data See above.
9333 * @private
9334 */
9335 DateGraph.prototype.parseCSV_ = function(data) {
9336 var ret = [];
9337 var lines = data.split("\n");
9338 var start = this.labelsFromCSV_ ? 1 : 0;
9339 if (this.labelsFromCSV_) {
9340 var labels = lines[0].split(",");
9341 labels.shift(); // a "date" parameter is assumed.
9342 this.labels_ = labels;
9343 // regenerate automatic colors.
9344 this.setColors_(this.attrs_);
9345 this.renderOptions_.colorScheme = this.colors_;
9346 MochiKit.Base.update(this.plotter_.options, this.renderOptions_);
9347 MochiKit.Base.update(this.layoutOptions_, this.attrs_);
9348 }
9349
9350 for (var i = start; i < lines.length; i++) {
9351 var line = lines[i];
9352 if (line.length == 0) continue; // skip blank lines
9353 var inFields = line.split(',');
9354 if (inFields.length < 2)
9355 continue;
9356
9357 var fields = [];
9358 fields[0] = this.xValueParser_(inFields[0]);
9359
9360 // If fractions are expected, parse the numbers as "A/B"
9361 if (this.fractions_) {
9362 for (var j = 1; j < inFields.length; j++) {
9363 // TODO(danvk): figure out an appropriate way to flag parse errors.
9364 var vals = inFields[j].split("/");
9365 fields[j] = [parseFloat(vals[0]), parseFloat(vals[1])];
9366 }
9367 } else if (this.errorBars_) {
9368 // If there are error bars, values are (value, stddev) pairs
9369 for (var j = 1; j < inFields.length; j += 2)
9370 fields[(j + 1) / 2] = [parseFloat(inFields[j]),
9371 parseFloat(inFields[j + 1])];
9372 } else if (this.customBars_) {
9373 // Bars are a low;center;high tuple
9374 for (var j = 1; j < inFields.length; j++) {
9375 var vals = inFields[j].split(";");
9376 fields[j] = [ parseFloat(vals[0]),
9377 parseFloat(vals[1]),
9378 parseFloat(vals[2]) ];
9379 }
9380 } else {
9381 // Values are just numbers
9382 for (var j = 1; j < inFields.length; j++)
9383 fields[j] = parseFloat(inFields[j]);
9384 }
9385 ret.push(fields);
9386 }
9387 return ret;
9388 };
9389
9390 /**
9391 * Get the CSV data. If it's in a function, call that function. If it's in a
9392 * file, do an XMLHttpRequest to get it.
9393 * @private
9394 */
9395 DateGraph.prototype.start_ = function() {
9396 if (typeof this.file_ == 'function') {
9397 // Stubbed out to allow this to run off a filesystem
9398 this.loadedEvent_(this.file_());
9399 } else {
9400 var req = new XMLHttpRequest();
9401 var caller = this;
9402 req.onreadystatechange = function () {
9403 if (req.readyState == 4) {
9404 if (req.status == 200) {
9405 caller.loadedEvent_(req.responseText);
9406 }
9407 }
9408 };
9409
9410 req.open("GET", this.file_, true);
9411 req.send(null);
9412 }
9413 };
9414
9415 /**
9416 * Changes various properties of the graph. These can include:
9417 * <ul>
9418 * <li>file: changes the source data for the graph</li>
9419 * <li>errorBars: changes whether the data contains stddev</li>
9420 * </ul>
9421 * @param {Object} attrs The new properties and values
9422 */
9423 DateGraph.prototype.updateOptions = function(attrs) {
9424 if (attrs.errorBars) {
9425 this.errorBars_ = attrs.errorBars;
9426 }
9427 if (attrs.customBars) {
9428 this.customBars_ = attrs.customBars;
9429 }
9430 if (attrs.strokeWidth) {
9431 this.strokeWidth_ = attrs.strokeWidth;
9432 }
9433 if (attrs.rollPeriod) {
9434 this.rollPeriod_ = attrs.rollPeriod;
9435 }
9436 if (attrs.dateWindow) {
9437 this.dateWindow_ = attrs.dateWindow;
9438 }
9439 if (attrs.valueRange) {
9440 this.valueRange_ = attrs.valueRange;
9441 }
9442 if (attrs.minTickSize) {
9443 this.minTickSize_ = attrs.minTickSize;
9444 }
9445 if (typeof(attrs.labels) != 'undefined') {
9446 this.labels_ = attrs.labels;
9447 this.labelsFromCSV_ = (attrs.labels == null);
9448 }
9449 this.layout_.updateOptions({ 'errorBars': this.errorBars_ });
9450 if (attrs['file'] && attrs['file'] != this.file_) {
9451 this.file_ = attrs['file'];
9452 this.start_();
9453 } else {
9454 this.drawGraph_(this.rawData_);
9455 }
9456 };
9457
9458 /**
9459 * Adjusts the number of days in the rolling average. Updates the graph to
9460 * reflect the new averaging period.
9461 * @param {Number} length Number of days over which to average the data.
9462 */
9463 DateGraph.prototype.adjustRoll = function(length) {
9464 this.rollPeriod_ = length;
9465 this.drawGraph_(this.rawData_);
9466 };