provide installation instructions
[extjs.git] / air / samples / tasks / ext-2.0 / adapter / ext / ext-base.js
1 /*\r
2  * Ext JS Library 0.30\r
3  * Copyright(c) 2006-2009, Ext JS, LLC.\r
4  * licensing@extjs.com\r
5  * \r
6  * http://extjs.com/license\r
7  */\r
8 \r
9 /*\r
10  * Ext JS Library 2.0.1\r
11  * Copyright(c) 2006-2008, Ext JS, LLC.\r
12  * licensing@extjs.com\r
13  * \r
14  * http://extjs.com/license\r
15  */\r
16 \r
17 \r
18 Ext = {version: '2.0.1'};\r
19 \r
20
21 window["undefined"] = window["undefined"];\r
22 \r
23 \r
24 \r
25 \r
26 Ext.apply = function(o, c, defaults){\r
27     if(defaults){\r
28         
29         Ext.apply(o, defaults);\r
30     }\r
31     if(o && c && typeof c == 'object'){\r
32         for(var p in c){\r
33             o[p] = c[p];\r
34         }\r
35     }\r
36     return o;\r
37 };\r
38 \r
39 (function(){\r
40     var idSeed = 0;\r
41     var ua = navigator.userAgent.toLowerCase();\r
42 \r
43     var isStrict = document.compatMode == "CSS1Compat",\r
44         isOpera = ua.indexOf("opera") > -1,\r
45         isSafari = (/webkit|khtml/).test(ua),\r
46         isSafari3 = isSafari && ua.indexOf('webkit/5') != -1,\r
47         isIE = !isOpera && ua.indexOf("msie") > -1,\r
48         isIE7 = !isOpera && ua.indexOf("msie 7") > -1,\r
49         isGecko = !isSafari && ua.indexOf("gecko") > -1,\r
50         isBorderBox = isIE && !isStrict,\r
51         isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1),\r
52         isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1),\r
53         isAir = (ua.indexOf("adobeair") != -1),\r
54         isLinux = (ua.indexOf("linux") != -1),\r
55         isSecure = window.location.href.toLowerCase().indexOf("https") === 0;\r
56 \r
57     
58         if(isIE && !isIE7){\r
59         try{\r
60             document.execCommand("BackgroundImageCache", false, true);\r
61         }catch(e){}\r
62     }\r
63 \r
64     Ext.apply(Ext, {\r
65         \r
66         isStrict : isStrict,\r
67         \r
68         isSecure : isSecure,\r
69         \r
70         isReady : false,\r
71 \r
72         \r
73         enableGarbageCollector : true,\r
74 \r
75         \r
76         enableListenerCollection:false,\r
77 \r
78 \r
79         \r
80         SSL_SECURE_URL : "javascript:false",\r
81 \r
82         \r
83         BLANK_IMAGE_URL : "http:/"+"/extjs.com/s.gif",\r
84 \r
85         \r
86         emptyFn : function(){},\r
87 \r
88         \r
89         applyIf : function(o, c){\r
90             if(o && c){\r
91                 for(var p in c){\r
92                     if(typeof o[p] == "undefined"){ o[p] = c[p]; }\r
93                 }\r
94             }\r
95             return o;\r
96         },\r
97 \r
98         \r
99         addBehaviors : function(o){\r
100             if(!Ext.isReady){\r
101                 Ext.onReady(function(){\r
102                     Ext.addBehaviors(o);\r
103                 });\r
104                 return;\r
105             }\r
106             var cache = {}; 
107             for(var b in o){\r
108                 var parts = b.split('@');\r
109                 if(parts[1]){ 
110                     var s = parts[0];\r
111                     if(!cache[s]){\r
112                         cache[s] = Ext.select(s);\r
113                     }\r
114                     cache[s].on(parts[1], o[b]);\r
115                 }\r
116             }\r
117             cache = null;\r
118         },\r
119 \r
120         \r
121         id : function(el, prefix){\r
122             prefix = prefix || "ext-gen";\r
123             el = Ext.getDom(el);\r
124             var id = prefix + (++idSeed);\r
125             return el ? (el.id ? el.id : (el.id = id)) : id;\r
126         },\r
127 \r
128         \r
129         extend : function(){\r
130             
131             var io = function(o){\r
132                 for(var m in o){\r
133                     this[m] = o[m];\r
134                 }\r
135             };\r
136             var oc = Object.prototype.constructor;\r
137             \r
138             return function(sb, sp, overrides){\r
139                 if(typeof sp == 'object'){\r
140                     overrides = sp;\r
141                     sp = sb;\r
142                     sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, arguments);};\r
143                 }\r
144                 var F = function(){}, sbp, spp = sp.prototype;\r
145                 F.prototype = spp;\r
146                 sbp = sb.prototype = new F();\r
147                 sbp.constructor=sb;\r
148                 sb.superclass=spp;\r
149                 if(spp.constructor == oc){\r
150                     spp.constructor=sp;\r
151                 }\r
152                 sb.override = function(o){\r
153                     Ext.override(sb, o);\r
154                 };\r
155                 sbp.override = io;\r
156                 Ext.override(sb, overrides);\r
157                 return sb;\r
158             };\r
159         }(),\r
160 \r
161         \r
162         override : function(origclass, overrides){\r
163             if(overrides){\r
164                 var p = origclass.prototype;\r
165                 for(var method in overrides){\r
166                     p[method] = overrides[method];\r
167                 }\r
168             }\r
169         },\r
170 \r
171         \r
172         namespace : function(){\r
173             var a=arguments, o=null, i, j, d, rt;\r
174             for (i=0; i<a.length; ++i) {\r
175                 d=a[i].split(".");\r
176                 rt = d[0];\r
177                 eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');\r
178                 for (j=1; j<d.length; ++j) {\r
179                     o[d[j]]=o[d[j]] || {};\r
180                     o=o[d[j]];\r
181                 }\r
182             }\r
183         },\r
184 \r
185         \r
186         urlEncode : function(o){\r
187             if(!o){\r
188                 return "";\r
189             }\r
190             var buf = [];\r
191             for(var key in o){\r
192                 var ov = o[key], k = encodeURIComponent(key);\r
193                 var type = typeof ov;\r
194                 if(type == 'undefined'){\r
195                     buf.push(k, "=&");\r
196                 }else if(type != "function" && type != "object"){\r
197                     buf.push(k, "=", encodeURIComponent(ov), "&");\r
198                 }else if(Ext.isArray(ov)){\r
199                     if (ov.length) {\r
200                             for(var i = 0, len = ov.length; i < len; i++) {\r
201                                 buf.push(k, "=", encodeURIComponent(ov[i] === undefined ? '' : ov[i]), "&");\r
202                             }\r
203                         } else {\r
204                             buf.push(k, "=&");\r
205                         }\r
206                 }\r
207             }\r
208             buf.pop();\r
209             return buf.join("");\r
210         },\r
211 \r
212         \r
213         urlDecode : function(string, overwrite){\r
214             if(!string || !string.length){\r
215                 return {};\r
216             }\r
217             var obj = {};\r
218             var pairs = string.split('&');\r
219             var pair, name, value;\r
220             for(var i = 0, len = pairs.length; i < len; i++){\r
221                 pair = pairs[i].split('=');\r
222                 name = decodeURIComponent(pair[0]);\r
223                 value = decodeURIComponent(pair[1]);\r
224                 if(overwrite !== true){\r
225                     if(typeof obj[name] == "undefined"){\r
226                         obj[name] = value;\r
227                     }else if(typeof obj[name] == "string"){\r
228                         obj[name] = [obj[name]];\r
229                         obj[name].push(value);\r
230                     }else{\r
231                         obj[name].push(value);\r
232                     }\r
233                 }else{\r
234                     obj[name] = value;\r
235                 }\r
236             }\r
237             return obj;\r
238         },\r
239 \r
240         \r
241         each : function(array, fn, scope){\r
242             if(typeof array.length == "undefined" || typeof array == "string"){\r
243                 array = [array];\r
244             }\r
245             for(var i = 0, len = array.length; i < len; i++){\r
246                 if(fn.call(scope || array[i], array[i], i, array) === false){ return i; };\r
247             }\r
248         },\r
249 \r
250         
251         combine : function(){\r
252             var as = arguments, l = as.length, r = [];\r
253             for(var i = 0; i < l; i++){\r
254                 var a = as[i];\r
255                 if(Ext.isArray(a)){\r
256                     r = r.concat(a);\r
257                 }else if(a.length !== undefined && !a.substr){\r
258                     r = r.concat(Array.prototype.slice.call(a, 0));\r
259                 }else{\r
260                     r.push(a);\r
261                 }\r
262             }\r
263             return r;\r
264         },\r
265 \r
266         \r
267         escapeRe : function(s) {\r
268             return s.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1");\r
269         },\r
270 \r
271         
272         callback : function(cb, scope, args, delay){\r
273             if(typeof cb == "function"){\r
274                 if(delay){\r
275                     cb.defer(delay, scope, args || []);\r
276                 }else{\r
277                     cb.apply(scope, args || []);\r
278                 }\r
279             }\r
280         },\r
281 \r
282         \r
283         getDom : function(el){\r
284             if(!el || !document){\r
285                 return null;\r
286             }\r
287             return el.dom ? el.dom : (typeof el == 'string' ? document.getElementById(el) : el);\r
288         },\r
289 \r
290         \r
291         getDoc : function(){\r
292             return Ext.get(document);\r
293         },\r
294 \r
295         \r
296         getBody : function(){\r
297             return Ext.get(document.body || document.documentElement);\r
298         },\r
299 \r
300         \r
301         getCmp : function(id){\r
302             return Ext.ComponentMgr.get(id);\r
303         },\r
304 \r
305         \r
306         num : function(v, defaultValue){\r
307             if(typeof v != 'number'){\r
308                 return defaultValue;\r
309             }\r
310             return v;\r
311         },\r
312 \r
313         \r
314         destroy : function(){\r
315             for(var i = 0, a = arguments, len = a.length; i < len; i++) {\r
316                 var as = a[i];\r
317                 if(as){\r
318                     if(as.dom){\r
319                         as.removeAllListeners();\r
320                         as.remove();\r
321                         continue;\r
322                     }\r
323                     if(typeof as.destroy == 'function'){\r
324                         as.destroy();\r
325                     }\r
326                 }\r
327             }\r
328         },\r
329 \r
330         removeNode : isIE ? function(){\r
331             var d;\r
332             return function(n){\r
333                 if(n){\r
334                     d = d || document.createElement('div');\r
335                     d.appendChild(n);\r
336                     d.innerHTML = '';\r
337                 }\r
338             }\r
339         }() : function(n){\r
340             if(n && n.parentNode){\r
341                 n.parentNode.removeChild(n);\r
342             }\r
343         },\r
344 \r
345         
346         \r
347         type : function(o){\r
348             if(o === undefined || o === null){\r
349                 return false;\r
350             }\r
351             if(o.htmlElement){\r
352                 return 'element';\r
353             }\r
354             var t = typeof o;\r
355             if(t == 'object' && o.nodeName) {\r
356                 switch(o.nodeType) {\r
357                     case 1: return 'element';\r
358                     case 3: return (/\S/).test(o.nodeValue) ? 'textnode' : 'whitespace';\r
359                 }\r
360             }\r
361             if(t == 'object' || t == 'function') {\r
362                 switch(o.constructor) {\r
363                     case Array: return 'array';\r
364                     case RegExp: return 'regexp';\r
365                 }\r
366                 if(typeof o.length == 'number' && typeof o.item == 'function') {\r
367                     return 'nodelist';\r
368                 }\r
369             }\r
370             return t;\r
371         },\r
372 \r
373         \r
374         isEmpty : function(v, allowBlank){\r
375             return v === null || v === undefined || (!allowBlank ? v === '' : false);\r
376         },\r
377 \r
378         value : function(v, defaultValue, allowBlank){\r
379             return Ext.isEmpty(v, allowBlank) ? defaultValue : v;\r
380         },\r
381 \r
382                 isArray : function(v){\r
383                         return v && typeof v.pop == 'function';\r
384                 },\r
385 \r
386                 isDate : function(v){\r
387                         return v && typeof v.getFullYear == 'function';\r
388                 },\r
389 \r
390         \r
391         isOpera : isOpera,\r
392         \r
393         isSafari : isSafari,\r
394         \r
395         isSafari3 : isSafari3,\r
396         \r
397         isSafari2 : isSafari && !isSafari3,\r
398         \r
399         isIE : isIE,\r
400         \r
401         isIE6 : isIE && !isIE7,\r
402         \r
403         isIE7 : isIE7,\r
404         \r
405         isGecko : isGecko,\r
406         \r
407         isBorderBox : isBorderBox,\r
408         \r
409         isLinux : isLinux,\r
410         \r
411         isWindows : isWindows,\r
412         \r
413         isMac : isMac,\r
414         \r
415         isAir : isAir,\r
416 \r
417     \r
418         useShims : ((isIE && !isIE7) || (isGecko && isMac))\r
419     });\r
420 \r
421     
422     Ext.ns = Ext.namespace;\r
423 })();\r
424 \r
425 Ext.ns("Ext", "Ext.util", "Ext.grid", "Ext.dd", "Ext.tree", "Ext.data",\r
426                 "Ext.form", "Ext.menu", "Ext.state", "Ext.lib", "Ext.layout", "Ext.app", "Ext.ux");\r
427 \r
428 \r
429 \r
430 Ext.apply(Function.prototype, {\r
431      \r
432     createCallback : function(){\r
433         
434         var args = arguments;\r
435         var method = this;\r
436         return function() {\r
437             return method.apply(window, args);\r
438         };\r
439     },\r
440 \r
441     \r
442     createDelegate : function(obj, args, appendArgs){\r
443         var method = this;\r
444         return function() {\r
445             var callArgs = args || arguments;\r
446             if(appendArgs === true){\r
447                 callArgs = Array.prototype.slice.call(arguments, 0);\r
448                 callArgs = callArgs.concat(args);\r
449             }else if(typeof appendArgs == "number"){\r
450                 callArgs = Array.prototype.slice.call(arguments, 0); 
451                 var applyArgs = [appendArgs, 0].concat(args); 
452                 Array.prototype.splice.apply(callArgs, applyArgs); 
453             }\r
454             return method.apply(obj || window, callArgs);\r
455         };\r
456     },\r
457 \r
458     \r
459     defer : function(millis, obj, args, appendArgs){\r
460         var fn = this.createDelegate(obj, args, appendArgs);\r
461         if(millis){\r
462             return setTimeout(fn, millis);\r
463         }\r
464         fn();\r
465         return 0;\r
466     },\r
467     \r
468     createSequence : function(fcn, scope){\r
469         if(typeof fcn != "function"){\r
470             return this;\r
471         }\r
472         var method = this;\r
473         return function() {\r
474             var retval = method.apply(this || window, arguments);\r
475             fcn.apply(scope || this || window, arguments);\r
476             return retval;\r
477         };\r
478     },\r
479 \r
480     \r
481     createInterceptor : function(fcn, scope){\r
482         if(typeof fcn != "function"){\r
483             return this;\r
484         }\r
485         var method = this;\r
486         return function() {\r
487             fcn.target = this;\r
488             fcn.method = method;\r
489             if(fcn.apply(scope || this || window, arguments) === false){\r
490                 return;\r
491             }\r
492             return method.apply(this || window, arguments);\r
493         };\r
494     }\r
495 });\r
496 \r
497 \r
498 Ext.applyIf(String, {\r
499 \r
500     \r
501     escape : function(string) {\r
502         return string.replace(/('|\\)/g, "\\$1");\r
503     },\r
504 \r
505     \r
506     leftPad : function (val, size, ch) {\r
507         var result = new String(val);\r
508         if(!ch) {\r
509             ch = " ";\r
510         }\r
511         while (result.length < size) {\r
512             result = ch + result;\r
513         }\r
514         return result.toString();\r
515     },\r
516 \r
517     \r
518     format : function(format){\r
519         var args = Array.prototype.slice.call(arguments, 1);\r
520         return format.replace(/\{(\d+)\}/g, function(m, i){\r
521             return args[i];\r
522         });\r
523     }\r
524 });\r
525 \r
526 \r
527 String.prototype.toggle = function(value, other){\r
528     return this == value ? other : value;\r
529 };\r
530 \r
531 \r
532 String.prototype.trim = function(){\r
533     var re = /^\s+|\s+$/g;\r
534     return function(){ return this.replace(re, ""); };\r
535 }();\r
536 \r
537 Ext.applyIf(Number.prototype, {\r
538     \r
539     constrain : function(min, max){\r
540         return Math.min(Math.max(this, min), max);\r
541     }\r
542 });\r
543 \r
544 Ext.applyIf(Array.prototype, {\r
545     \r
546     indexOf : function(o){\r
547        for (var i = 0, len = this.length; i < len; i++){\r
548               if(this[i] == o) return i;\r
549        }\r
550            return -1;\r
551     },\r
552 \r
553     \r
554     remove : function(o){\r
555        var index = this.indexOf(o);\r
556        if(index != -1){\r
557            this.splice(index, 1);\r
558        }\r
559        return this;\r
560     }\r
561 });\r
562 \r
563 \r
564 Date.prototype.getElapsed = function(date) {\r
565         return Math.abs((date || new Date()).getTime()-this.getTime());\r
566 };\r
567
568 (function() {\r
569     var libFlyweight;\r
570 \r
571     Ext.lib.Dom = {\r
572         getViewWidth : function(full) {\r
573             return full ? this.getDocumentWidth() : this.getViewportWidth();\r
574         },\r
575 \r
576         getViewHeight : function(full) {\r
577             return full ? this.getDocumentHeight() : this.getViewportHeight();\r
578         },\r
579 \r
580         getDocumentHeight: function() {\r
581             var scrollHeight = (document.compatMode != "CSS1Compat") ? document.body.scrollHeight : document.documentElement.scrollHeight;\r
582             return Math.max(scrollHeight, this.getViewportHeight());\r
583         },\r
584 \r
585         getDocumentWidth: function() {\r
586             var scrollWidth = (document.compatMode != "CSS1Compat") ? document.body.scrollWidth : document.documentElement.scrollWidth;\r
587             return Math.max(scrollWidth, this.getViewportWidth());\r
588         },\r
589 \r
590         getViewportHeight: function(){\r
591             if(Ext.isIE){\r
592                 return Ext.isStrict ? document.documentElement.clientHeight :\r
593                          document.body.clientHeight;\r
594             }else{\r
595                 return self.innerHeight;\r
596             }\r
597         },\r
598 \r
599         getViewportWidth: function() {\r
600             if(Ext.isIE){\r
601                 return Ext.isStrict ? document.documentElement.clientWidth :\r
602                          document.body.clientWidth;\r
603             }else{\r
604                 return self.innerWidth;\r
605             }\r
606         },\r
607 \r
608         isAncestor : function(p, c) {\r
609             p = Ext.getDom(p);\r
610             c = Ext.getDom(c);\r
611             if (!p || !c) {\r
612                 return false;\r
613             }\r
614 \r
615             if (p.contains && !Ext.isSafari) {\r
616                 return p.contains(c);\r
617             } else if (p.compareDocumentPosition) {\r
618                 return !!(p.compareDocumentPosition(c) & 16);\r
619             } else {\r
620                 var parent = c.parentNode;\r
621                 while (parent) {\r
622                     if (parent == p) {\r
623                         return true;\r
624                     }\r
625                     else if (!parent.tagName || parent.tagName.toUpperCase() == "HTML") {\r
626                         return false;\r
627                     }\r
628                     parent = parent.parentNode;\r
629                 }\r
630                 return false;\r
631             }\r
632         },\r
633 \r
634         getRegion : function(el) {\r
635             return Ext.lib.Region.getRegion(el);\r
636         },\r
637 \r
638         getY : function(el) {\r
639             return this.getXY(el)[1];\r
640         },\r
641 \r
642         getX : function(el) {\r
643             return this.getXY(el)[0];\r
644         },\r
645 \r
646 \r
647         getXY : function(el) {\r
648             var p, pe, b, scroll, bd = (document.body || document.documentElement);\r
649             el = Ext.getDom(el);\r
650 \r
651             if(el == bd){\r
652                 return [0, 0];\r
653             }\r
654 \r
655             if (el.getBoundingClientRect) {\r
656                 b = el.getBoundingClientRect();\r
657                 scroll = fly(document).getScroll();\r
658                 return [b.left + scroll.left, b.top + scroll.top];\r
659             }\r
660             var x = 0, y = 0;\r
661             \r
662             p = el;\r
663 \r
664             var hasAbsolute = fly(el).getStyle("position") == "absolute";\r
665 \r
666             while (p) {\r
667 \r
668                 x += p.offsetLeft;\r
669                 y += p.offsetTop;\r
670 \r
671                 if (!hasAbsolute && fly(p).getStyle("position") == "absolute") {\r
672                     hasAbsolute = true;\r
673                 }\r
674 \r
675                 if (Ext.isGecko) {\r
676                     pe = fly(p);\r
677                     \r
678                     var bt = parseInt(pe.getStyle("borderTopWidth"), 10) || 0;\r
679                     var bl = parseInt(pe.getStyle("borderLeftWidth"), 10) || 0;\r
680 \r
681 \r
682                     x += bl;\r
683                     y += bt;\r
684 \r
685 \r
686                     if (p != el && pe.getStyle('overflow') != 'visible') {\r
687                         x += bl;\r
688                         y += bt;\r
689                     }\r
690                 }\r
691                 p = p.offsetParent;\r
692             }\r
693 \r
694             if (Ext.isSafari && hasAbsolute) {\r
695                 x -= bd.offsetLeft;\r
696                 y -= bd.offsetTop;\r
697             }\r
698 \r
699             if (Ext.isGecko && !hasAbsolute) {\r
700                 var dbd = fly(bd);\r
701                 x += parseInt(dbd.getStyle("borderLeftWidth"), 10) || 0;\r
702                 y += parseInt(dbd.getStyle("borderTopWidth"), 10) || 0;\r
703             }\r
704 \r
705             p = el.parentNode;\r
706             while (p && p != bd) {\r
707                 if (!Ext.isOpera || (p.tagName != 'TR' && fly(p).getStyle("display") != "inline")) {\r
708                     x -= p.scrollLeft;\r
709                     y -= p.scrollTop;\r
710                 }\r
711                 p = p.parentNode;\r
712             }\r
713             return [x, y];\r
714         },\r
715 \r
716         setXY : function(el, xy) {\r
717             el = Ext.fly(el, '_setXY');\r
718             el.position();\r
719             var pts = el.translatePoints(xy);\r
720             if (xy[0] !== false) {\r
721                 el.dom.style.left = pts.left + "px";\r
722             }\r
723             if (xy[1] !== false) {\r
724                 el.dom.style.top = pts.top + "px";\r
725             }\r
726         },\r
727 \r
728         setX : function(el, x) {\r
729             this.setXY(el, [x, false]);\r
730         },\r
731 \r
732         setY : function(el, y) {\r
733             this.setXY(el, [false, y]);\r
734         }\r
735     };\r
736 \r
737 \r
738     Ext.lib.Event = function() {\r
739         var loadComplete = false;\r
740         var listeners = [];\r
741         var unloadListeners = [];\r
742         var retryCount = 0;\r
743         var onAvailStack = [];\r
744         var counter = 0;\r
745         var lastError = null;\r
746 \r
747         return {\r
748             POLL_RETRYS: 200,\r
749             POLL_INTERVAL: 20,\r
750             EL: 0,\r
751             TYPE: 1,\r
752             FN: 2,\r
753             WFN: 3,\r
754             OBJ: 3,\r
755             ADJ_SCOPE: 4,\r
756             _interval: null,\r
757 \r
758             startInterval: function() {\r
759                 if (!this._interval) {\r
760                     var self = this;\r
761                     var callback = function() {\r
762                         self._tryPreloadAttach();\r
763                     };\r
764                     this._interval = setInterval(callback, this.POLL_INTERVAL);\r
765 \r
766                 }\r
767             },\r
768 \r
769             onAvailable: function(p_id, p_fn, p_obj, p_override) {\r
770                 onAvailStack.push({ id:         p_id,\r
771                     fn:         p_fn,\r
772                     obj:        p_obj,\r
773                     override:   p_override,\r
774                     checkReady: false    });\r
775 \r
776                 retryCount = this.POLL_RETRYS;\r
777                 this.startInterval();\r
778             },\r
779 \r
780 \r
781             addListener: function(el, eventName, fn) {\r
782                 el = Ext.getDom(el);\r
783                 if (!el || !fn) {\r
784                     return false;\r
785                 }\r
786 \r
787                 if ("unload" == eventName) {\r
788                     unloadListeners[unloadListeners.length] =\r
789                     [el, eventName, fn];\r
790                     return true;\r
791                 }\r
792 \r
793                 
794                 var wrappedFn = function(e) {\r
795                     return typeof Ext != 'undefined' ? fn(Ext.lib.Event.getEvent(e)) : false;\r
796                 };\r
797 \r
798                 var li = [el, eventName, fn, wrappedFn];\r
799 \r
800                 var index = listeners.length;\r
801                 listeners[index] = li;\r
802 \r
803                 this.doAdd(el, eventName, wrappedFn, false);\r
804                 return true;\r
805 \r
806             },\r
807 \r
808 \r
809             removeListener: function(el, eventName, fn) {\r
810                 var i, len;\r
811 \r
812                 el = Ext.getDom(el);\r
813 \r
814                 if(!fn) {\r
815                     return this.purgeElement(el, false, eventName);\r
816                 }\r
817 \r
818 \r
819                 if ("unload" == eventName) {\r
820 \r
821                     for (i = 0,len = unloadListeners.length; i < len; i++) {\r
822                         var li = unloadListeners[i];\r
823                         if (li &&\r
824                             li[0] == el &&\r
825                             li[1] == eventName &&\r
826                             li[2] == fn) {\r
827                             unloadListeners.splice(i, 1);\r
828                             return true;\r
829                         }\r
830                     }\r
831 \r
832                     return false;\r
833                 }\r
834 \r
835                 var cacheItem = null;\r
836 \r
837 \r
838                 var index = arguments[3];\r
839 \r
840                 if ("undefined" == typeof index) {\r
841                     index = this._getCacheIndex(el, eventName, fn);\r
842                 }\r
843 \r
844                 if (index >= 0) {\r
845                     cacheItem = listeners[index];\r
846                 }\r
847 \r
848                 if (!el || !cacheItem) {\r
849                     return false;\r
850                 }\r
851 \r
852                 this.doRemove(el, eventName, cacheItem[this.WFN], false);\r
853 \r
854                 delete listeners[index][this.WFN];\r
855                 delete listeners[index][this.FN];\r
856                 listeners.splice(index, 1);\r
857 \r
858                 return true;\r
859 \r
860             },\r
861 \r
862 \r
863             getTarget: function(ev, resolveTextNode) {\r
864                 ev = ev.browserEvent || ev;\r
865                 var t = ev.target || ev.srcElement;\r
866                 return this.resolveTextNode(t);\r
867             },\r
868 \r
869 \r
870             resolveTextNode: function(node) {\r
871                 if (Ext.isSafari && node && 3 == node.nodeType) {\r
872                     return node.parentNode;\r
873                 } else {\r
874                     return node;\r
875                 }\r
876             },\r
877 \r
878 \r
879             getPageX: function(ev) {\r
880                 ev = ev.browserEvent || ev;\r
881                 var x = ev.pageX;\r
882                 if (!x && 0 !== x) {\r
883                     x = ev.clientX || 0;\r
884 \r
885                     if (Ext.isIE) {\r
886                         x += this.getScroll()[1];\r
887                     }\r
888                 }\r
889 \r
890                 return x;\r
891             },\r
892 \r
893 \r
894             getPageY: function(ev) {\r
895                 ev = ev.browserEvent || ev;\r
896                 var y = ev.pageY;\r
897                 if (!y && 0 !== y) {\r
898                     y = ev.clientY || 0;\r
899 \r
900                     if (Ext.isIE) {\r
901                         y += this.getScroll()[0];\r
902                     }\r
903                 }\r
904 \r
905 \r
906                 return y;\r
907             },\r
908 \r
909 \r
910             getXY: function(ev) {\r
911                 ev = ev.browserEvent || ev;\r
912                 return [this.getPageX(ev), this.getPageY(ev)];\r
913             },\r
914 \r
915 \r
916             getRelatedTarget: function(ev) {\r
917                 ev = ev.browserEvent || ev;\r
918                 var t = ev.relatedTarget;\r
919                 if (!t) {\r
920                     if (ev.type == "mouseout") {\r
921                         t = ev.toElement;\r
922                     } else if (ev.type == "mouseover") {\r
923                         t = ev.fromElement;\r
924                     }\r
925                 }\r
926 \r
927                 return this.resolveTextNode(t);\r
928             },\r
929 \r
930 \r
931             getTime: function(ev) {\r
932                 ev = ev.browserEvent || ev;\r
933                 if (!ev.time) {\r
934                     var t = new Date().getTime();\r
935                     try {\r
936                         ev.time = t;\r
937                     } catch(ex) {\r
938                         this.lastError = ex;\r
939                         return t;\r
940                     }\r
941                 }\r
942 \r
943                 return ev.time;\r
944             },\r
945 \r
946 \r
947             stopEvent: function(ev) {\r
948                 this.stopPropagation(ev);\r
949                 this.preventDefault(ev);\r
950             },\r
951 \r
952 \r
953             stopPropagation: function(ev) {\r
954                 ev = ev.browserEvent || ev;\r
955                 if (ev.stopPropagation) {\r
956                     ev.stopPropagation();\r
957                 } else {\r
958                     ev.cancelBubble = true;\r
959                 }\r
960             },\r
961 \r
962 \r
963             preventDefault: function(ev) {\r
964                 ev = ev.browserEvent || ev;\r
965                 if(ev.preventDefault) {\r
966                     ev.preventDefault();\r
967                 } else {\r
968                     ev.returnValue = false;\r
969                 }\r
970             },\r
971 \r
972 \r
973             getEvent: function(e) {\r
974                 var ev = e || window.event;\r
975                 if (!ev) {\r
976                     var c = this.getEvent.caller;\r
977                     while (c) {\r
978                         ev = c.arguments[0];\r
979                         if (ev && Event == ev.constructor) {\r
980                             break;\r
981                         }\r
982                         c = c.caller;\r
983                     }\r
984                 }\r
985                 return ev;\r
986             },\r
987 \r
988 \r
989             getCharCode: function(ev) {\r
990                 ev = ev.browserEvent || ev;\r
991                 return ev.charCode || ev.keyCode || 0;\r
992             },\r
993 \r
994 \r
995             _getCacheIndex: function(el, eventName, fn) {\r
996                 for (var i = 0,len = listeners.length; i < len; ++i) {\r
997                     var li = listeners[i];\r
998                     if (li &&\r
999                         li[this.FN] == fn &&\r
1000                         li[this.EL] == el &&\r
1001                         li[this.TYPE] == eventName) {\r
1002                         return i;\r
1003                     }\r
1004                 }\r
1005 \r
1006                 return -1;\r
1007             },\r
1008 \r
1009 \r
1010             elCache: {},\r
1011 \r
1012 \r
1013             getEl: function(id) {\r
1014                 return document.getElementById(id);\r
1015             },\r
1016 \r
1017 \r
1018             clearCache: function() {\r
1019             },\r
1020 \r
1021 \r
1022             _load: function(e) {\r
1023                 loadComplete = true;\r
1024                 var EU = Ext.lib.Event;\r
1025 \r
1026 \r
1027                 if (Ext.isIE) {\r
1028                     EU.doRemove(window, "load", EU._load);\r
1029                 }\r
1030             },\r
1031 \r
1032 \r
1033             _tryPreloadAttach: function() {\r
1034 \r
1035                 if (this.locked) {\r
1036                     return false;\r
1037                 }\r
1038 \r
1039                 this.locked = true;\r
1040 \r
1041 \r
1042                 var tryAgain = !loadComplete;\r
1043                 if (!tryAgain) {\r
1044                     tryAgain = (retryCount > 0);\r
1045                 }\r
1046 \r
1047 \r
1048                 var notAvail = [];\r
1049                 for (var i = 0,len = onAvailStack.length; i < len; ++i) {\r
1050                     var item = onAvailStack[i];\r
1051                     if (item) {\r
1052                         var el = this.getEl(item.id);\r
1053 \r
1054                         if (el) {\r
1055                             if (!item.checkReady ||\r
1056                                 loadComplete ||\r
1057                                 el.nextSibling ||\r
1058                                 (document && document.body)) {\r
1059 \r
1060                                 var scope = el;\r
1061                                 if (item.override) {\r
1062                                     if (item.override === true) {\r
1063                                         scope = item.obj;\r
1064                                     } else {\r
1065                                         scope = item.override;\r
1066                                     }\r
1067                                 }\r
1068                                 item.fn.call(scope, item.obj);\r
1069                                 onAvailStack[i] = null;\r
1070                             }\r
1071                         } else {\r
1072                             notAvail.push(item);\r
1073                         }\r
1074                     }\r
1075                 }\r
1076 \r
1077                 retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;\r
1078 \r
1079                 if (tryAgain) {\r
1080 \r
1081                     this.startInterval();\r
1082                 } else {\r
1083                     clearInterval(this._interval);\r
1084                     this._interval = null;\r
1085                 }\r
1086 \r
1087                 this.locked = false;\r
1088 \r
1089                 return true;\r
1090 \r
1091             },\r
1092 \r
1093 \r
1094             purgeElement: function(el, recurse, eventName) {\r
1095                 var elListeners = this.getListeners(el, eventName);\r
1096                 if (elListeners) {\r
1097                     for (var i = 0,len = elListeners.length; i < len; ++i) {\r
1098                         var l = elListeners[i];\r
1099                         this.removeListener(el, l.type, l.fn);\r
1100                     }\r
1101                 }\r
1102 \r
1103                 if (recurse && el && el.childNodes) {\r
1104                     for (i = 0,len = el.childNodes.length; i < len; ++i) {\r
1105                         this.purgeElement(el.childNodes[i], recurse, eventName);\r
1106                     }\r
1107                 }\r
1108             },\r
1109 \r
1110 \r
1111             getListeners: function(el, eventName) {\r
1112                 var results = [], searchLists;\r
1113                 if (!eventName) {\r
1114                     searchLists = [listeners, unloadListeners];\r
1115                 } else if (eventName == "unload") {\r
1116                     searchLists = [unloadListeners];\r
1117                 } else {\r
1118                     searchLists = [listeners];\r
1119                 }\r
1120 \r
1121                 for (var j = 0; j < searchLists.length; ++j) {\r
1122                     var searchList = searchLists[j];\r
1123                     if (searchList && searchList.length > 0) {\r
1124                         for (var i = 0,len = searchList.length; i < len; ++i) {\r
1125                             var l = searchList[i];\r
1126                             if (l && l[this.EL] === el &&\r
1127                                 (!eventName || eventName === l[this.TYPE])) {\r
1128                                 results.push({\r
1129                                     type:   l[this.TYPE],\r
1130                                     fn:     l[this.FN],\r
1131                                     obj:    l[this.OBJ],\r
1132                                     adjust: l[this.ADJ_SCOPE],\r
1133                                     index:  i\r
1134                                 });\r
1135                             }\r
1136                         }\r
1137                     }\r
1138                 }\r
1139 \r
1140                 return (results.length) ? results : null;\r
1141             },\r
1142 \r
1143 \r
1144             _unload: function(e) {\r
1145 \r
1146                 var EU = Ext.lib.Event, i, j, l, len, index;\r
1147 \r
1148                 for (i = 0,len = unloadListeners.length; i < len; ++i) {\r
1149                     l = unloadListeners[i];\r
1150                     if (l) {\r
1151                         var scope = window;\r
1152                         if (l[EU.ADJ_SCOPE]) {\r
1153                             if (l[EU.ADJ_SCOPE] === true) {\r
1154                                 scope = l[EU.OBJ];\r
1155                             } else {\r
1156                                 scope = l[EU.ADJ_SCOPE];\r
1157                             }\r
1158                         }\r
1159                         l[EU.FN].call(scope, EU.getEvent(e), l[EU.OBJ]);\r
1160                         unloadListeners[i] = null;\r
1161                         l = null;\r
1162                         scope = null;\r
1163                     }\r
1164                 }\r
1165 \r
1166                 unloadListeners = null;\r
1167 \r
1168                 if (listeners && listeners.length > 0) {\r
1169                     j = listeners.length;\r
1170                     while (j) {\r
1171                         index = j - 1;\r
1172                         l = listeners[index];\r
1173                         if (l) {\r
1174                             EU.removeListener(l[EU.EL], l[EU.TYPE],\r
1175                                     l[EU.FN], index);\r
1176                         }\r
1177                         j = j - 1;\r
1178                     }\r
1179                     l = null;\r
1180 \r
1181                     EU.clearCache();\r
1182                 }\r
1183 \r
1184                 EU.doRemove(window, "unload", EU._unload);\r
1185 \r
1186             },\r
1187 \r
1188 \r
1189             getScroll: function() {\r
1190                 var dd = document.documentElement, db = document.body;\r
1191                 if (dd && (dd.scrollTop || dd.scrollLeft)) {\r
1192                     return [dd.scrollTop, dd.scrollLeft];\r
1193                 } else if (db) {\r
1194                     return [db.scrollTop, db.scrollLeft];\r
1195                 } else {\r
1196                     return [0, 0];\r
1197                 }\r
1198             },\r
1199 \r
1200 \r
1201             doAdd: function () {\r
1202                 if (window.addEventListener) {\r
1203                     return function(el, eventName, fn, capture) {\r
1204                         el.addEventListener(eventName, fn, (capture));\r
1205                     };\r
1206                 } else if (window.attachEvent) {\r
1207                     return function(el, eventName, fn, capture) {\r
1208                         el.attachEvent("on" + eventName, fn);\r
1209                     };\r
1210                 } else {\r
1211                     return function() {\r
1212                     };\r
1213                 }\r
1214             }(),\r
1215 \r
1216 \r
1217             doRemove: function() {\r
1218                 if (window.removeEventListener) {\r
1219                     return function (el, eventName, fn, capture) {\r
1220                         el.removeEventListener(eventName, fn, (capture));\r
1221                     };\r
1222                 } else if (window.detachEvent) {\r
1223                     return function (el, eventName, fn) {\r
1224                         el.detachEvent("on" + eventName, fn);\r
1225                     };\r
1226                 } else {\r
1227                     return function() {\r
1228                     };\r
1229                 }\r
1230             }()\r
1231         };\r
1232 \r
1233     }();\r
1234 \r
1235     var E = Ext.lib.Event;\r
1236     E.on = E.addListener;\r
1237     E.un = E.removeListener;\r
1238     if (document && document.body) {\r
1239         E._load();\r
1240     } else {\r
1241         E.doAdd(window, "load", E._load);\r
1242     }\r
1243     E.doAdd(window, "unload", E._unload);\r
1244     E._tryPreloadAttach();\r
1245 \r
1246     Ext.lib.Ajax = {\r
1247         request : function(method, uri, cb, data, options) {\r
1248             if(options){\r
1249                 var hs = options.headers;\r
1250                 if(hs){\r
1251                     for(var h in hs){\r
1252                         if(hs.hasOwnProperty(h)){\r
1253                             this.initHeader(h, hs[h], false);\r
1254                         }\r
1255                     }\r
1256                 }\r
1257                 if(options.xmlData){\r
1258                     this.initHeader('Content-Type', 'text/xml', false);\r
1259                     method = 'POST';\r
1260                     data = options.xmlData;\r
1261                 }else if(options.jsonData){\r
1262                     this.initHeader('Content-Type', 'text/javascript', false);\r
1263                     method = 'POST';\r
1264                     data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;\r
1265                 }\r
1266             }\r
1267 \r
1268             return this.asyncRequest(method, uri, cb, data);\r
1269         },\r
1270 \r
1271         serializeForm : function(form) {\r
1272             if(typeof form == 'string') {\r
1273                 form = (document.getElementById(form) || document.forms[form]);\r
1274             }\r
1275 \r
1276             var el, name, val, disabled, data = '', hasSubmit = false;\r
1277             for (var i = 0; i < form.elements.length; i++) {\r
1278                 el = form.elements[i];\r
1279                 disabled = form.elements[i].disabled;\r
1280                 name = form.elements[i].name;\r
1281                 val = form.elements[i].value;\r
1282 \r
1283                 if (!disabled && name){\r
1284                     switch (el.type)\r
1285                             {\r
1286                         case 'select-one':\r
1287                         case 'select-multiple':\r
1288                             for (var j = 0; j < el.options.length; j++) {\r
1289                                 if (el.options[j].selected) {\r
1290                                     if (Ext.isIE) {\r
1291                                         data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].attributes['value'].specified ? el.options[j].value : el.options[j].text) + '&';\r
1292                                     }\r
1293                                     else {\r
1294                                         data += encodeURIComponent(name) + '=' + encodeURIComponent(el.options[j].hasAttribute('value') ? el.options[j].value : el.options[j].text) + '&';\r
1295                                     }\r
1296                                 }\r
1297                             }\r
1298                             break;\r
1299                         case 'radio':\r
1300                         case 'checkbox':\r
1301                             if (el.checked) {\r
1302                                 data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';\r
1303                             }\r
1304                             break;\r
1305                         case 'file':\r
1306 \r
1307                         case undefined:\r
1308 \r
1309                         case 'reset':\r
1310 \r
1311                         case 'button':\r
1312 \r
1313                             break;\r
1314                         case 'submit':\r
1315                             if(hasSubmit == false) {\r
1316                                 data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';\r
1317                                 hasSubmit = true;\r
1318                             }\r
1319                             break;\r
1320                         default:\r
1321                             data += encodeURIComponent(name) + '=' + encodeURIComponent(val) + '&';\r
1322                             break;\r
1323                     }\r
1324                 }\r
1325             }\r
1326             data = data.substr(0, data.length - 1);\r
1327             return data;\r
1328         },\r
1329 \r
1330         headers:{},\r
1331 \r
1332         hasHeaders:false,\r
1333 \r
1334         useDefaultHeader:true,\r
1335 \r
1336         defaultPostHeader:'application/x-www-form-urlencoded',\r
1337 \r
1338         useDefaultXhrHeader:true,\r
1339 \r
1340         defaultXhrHeader:'XMLHttpRequest',\r
1341 \r
1342         hasDefaultHeaders:true,\r
1343 \r
1344         defaultHeaders:{},\r
1345 \r
1346         poll:{},\r
1347 \r
1348         timeout:{},\r
1349 \r
1350         pollInterval:50,\r
1351 \r
1352         transactionId:0,\r
1353 \r
1354         setProgId:function(id)\r
1355         {\r
1356             this.activeX.unshift(id);\r
1357         },\r
1358 \r
1359         setDefaultPostHeader:function(b)\r
1360         {\r
1361             this.useDefaultHeader = b;\r
1362         },\r
1363 \r
1364         setDefaultXhrHeader:function(b)\r
1365         {\r
1366             this.useDefaultXhrHeader = b;\r
1367         },\r
1368 \r
1369         setPollingInterval:function(i)\r
1370         {\r
1371             if (typeof i == 'number' && isFinite(i)) {\r
1372                 this.pollInterval = i;\r
1373             }\r
1374         },\r
1375 \r
1376         createXhrObject:function(transactionId)\r
1377         {\r
1378             var obj,http;\r
1379             try\r
1380             {\r
1381 \r
1382                 http = new XMLHttpRequest();\r
1383 \r
1384                 obj = { conn:http, tId:transactionId };\r
1385             }\r
1386             catch(e)\r
1387             {\r
1388                 for (var i = 0; i < this.activeX.length; ++i) {\r
1389                     try\r
1390                     {\r
1391 \r
1392                         http = new ActiveXObject(this.activeX[i]);\r
1393 \r
1394                         obj = { conn:http, tId:transactionId };\r
1395                         break;\r
1396                     }\r
1397                     catch(e) {\r
1398                     }\r
1399                 }\r
1400             }\r
1401             finally\r
1402             {\r
1403                 return obj;\r
1404             }\r
1405         },\r
1406 \r
1407         getConnectionObject:function()\r
1408         {\r
1409             var o;\r
1410             var tId = this.transactionId;\r
1411 \r
1412             try\r
1413             {\r
1414                 o = this.createXhrObject(tId);\r
1415                 if (o) {\r
1416                     this.transactionId++;\r
1417                 }\r
1418             }\r
1419             catch(e) {\r
1420             }\r
1421             finally\r
1422             {\r
1423                 return o;\r
1424             }\r
1425         },\r
1426 \r
1427         asyncRequest:function(method, uri, callback, postData)\r
1428         {\r
1429             var o = this.getConnectionObject();\r
1430 \r
1431             if (!o) {\r
1432                 return null;\r
1433             }\r
1434             else {\r
1435                 o.conn.open(method, uri, true);\r
1436 \r
1437                 if (this.useDefaultXhrHeader) {\r
1438                     if (!this.defaultHeaders['X-Requested-With']) {\r
1439                         this.initHeader('X-Requested-With', this.defaultXhrHeader, true);\r
1440                     }\r
1441                 }\r
1442 \r
1443                 if(postData && this.useDefaultHeader){\r
1444                     this.initHeader('Content-Type', this.defaultPostHeader);\r
1445                 }\r
1446 \r
1447                  if (this.hasDefaultHeaders || this.hasHeaders) {\r
1448                     this.setHeader(o);\r
1449                 }\r
1450 \r
1451                 this.handleReadyState(o, callback);\r
1452                 o.conn.send(postData || null);\r
1453 \r
1454                 return o;\r
1455             }\r
1456         },\r
1457 \r
1458         handleReadyState:function(o, callback)\r
1459         {\r
1460             var oConn = this;\r
1461 \r
1462             if (callback && callback.timeout) {\r
1463                 this.timeout[o.tId] = window.setTimeout(function() {\r
1464                     oConn.abort(o, callback, true);\r
1465                 }, callback.timeout);\r
1466             }\r
1467 \r
1468             this.poll[o.tId] = window.setInterval(\r
1469                     function() {\r
1470                         if (o.conn && o.conn.readyState == 4) {\r
1471                             window.clearInterval(oConn.poll[o.tId]);\r
1472                             delete oConn.poll[o.tId];\r
1473 \r
1474                             if (callback && callback.timeout) {\r
1475                                 window.clearTimeout(oConn.timeout[o.tId]);\r
1476                                 delete oConn.timeout[o.tId];\r
1477                             }\r
1478 \r
1479                             oConn.handleTransactionResponse(o, callback);\r
1480                         }\r
1481                     }\r
1482                     , this.pollInterval);\r
1483         },\r
1484 \r
1485         handleTransactionResponse:function(o, callback, isAbort)\r
1486         {\r
1487 \r
1488             if (!callback) {\r
1489                 this.releaseObject(o);\r
1490                 return;\r
1491             }\r
1492 \r
1493             var httpStatus, responseObject;\r
1494 \r
1495             try\r
1496             {\r
1497                 if (o.conn.status !== undefined && o.conn.status != 0) {\r
1498                     httpStatus = o.conn.status;\r
1499                 }\r
1500                 else {\r
1501                     httpStatus = 13030;\r
1502                 }\r
1503             }\r
1504             catch(e) {\r
1505 \r
1506 \r
1507                 httpStatus = 13030;\r
1508             }\r
1509 \r
1510             if (httpStatus >= 200 && httpStatus < 300) {\r
1511                 responseObject = this.createResponseObject(o, callback.argument);\r
1512                 if (callback.success) {\r
1513                     if (!callback.scope) {\r
1514                         callback.success(responseObject);\r
1515                     }\r
1516                     else {\r
1517 \r
1518 \r
1519                         callback.success.apply(callback.scope, [responseObject]);\r
1520                     }\r
1521                 }\r
1522             }\r
1523             else {\r
1524                 switch (httpStatus) {\r
1525 \r
1526                     case 12002:\r
1527                     case 12029:\r
1528                     case 12030:\r
1529                     case 12031:\r
1530                     case 12152:\r
1531                     case 13030:\r
1532                         responseObject = this.createExceptionObject(o.tId, callback.argument, (isAbort ? isAbort : false));\r
1533                         if (callback.failure) {\r
1534                             if (!callback.scope) {\r
1535                                 callback.failure(responseObject);\r
1536                             }\r
1537                             else {\r
1538                                 callback.failure.apply(callback.scope, [responseObject]);\r
1539                             }\r
1540                         }\r
1541                         break;\r
1542                     default:\r
1543                         responseObject = this.createResponseObject(o, callback.argument);\r
1544                         if (callback.failure) {\r
1545                             if (!callback.scope) {\r
1546                                 callback.failure(responseObject);\r
1547                             }\r
1548                             else {\r
1549                                 callback.failure.apply(callback.scope, [responseObject]);\r
1550                             }\r
1551                         }\r
1552                 }\r
1553             }\r
1554 \r
1555             this.releaseObject(o);\r
1556             responseObject = null;\r
1557         },\r
1558 \r
1559         createResponseObject:function(o, callbackArg)\r
1560         {\r
1561             var obj = {};\r
1562             var headerObj = {};\r
1563 \r
1564             try\r
1565             {\r
1566                 var headerStr = o.conn.getAllResponseHeaders();\r
1567                 var header = headerStr.split('\n');\r
1568                 for (var i = 0; i < header.length; i++) {\r
1569                     var delimitPos = header[i].indexOf(':');\r
1570                     if (delimitPos != -1) {\r
1571                         headerObj[header[i].substring(0, delimitPos)] = header[i].substring(delimitPos + 2);\r
1572                     }\r
1573                 }\r
1574             }\r
1575             catch(e) {\r
1576             }\r
1577 \r
1578             obj.tId = o.tId;\r
1579             obj.status = o.conn.status;\r
1580             obj.statusText = o.conn.statusText;\r
1581             obj.getResponseHeader = headerObj;\r
1582             obj.getAllResponseHeaders = headerStr;\r
1583             obj.responseText = o.conn.responseText;\r
1584             obj.responseXML = o.conn.responseXML;\r
1585 \r
1586             if (typeof callbackArg !== undefined) {\r
1587                 obj.argument = callbackArg;\r
1588             }\r
1589 \r
1590             return obj;\r
1591         },\r
1592 \r
1593         createExceptionObject:function(tId, callbackArg, isAbort)\r
1594         {\r
1595             var COMM_CODE = 0;\r
1596             var COMM_ERROR = 'communication failure';\r
1597             var ABORT_CODE = -1;\r
1598             var ABORT_ERROR = 'transaction aborted';\r
1599 \r
1600             var obj = {};\r
1601 \r
1602             obj.tId = tId;\r
1603             if (isAbort) {\r
1604                 obj.status = ABORT_CODE;\r
1605                 obj.statusText = ABORT_ERROR;\r
1606             }\r
1607             else {\r
1608                 obj.status = COMM_CODE;\r
1609                 obj.statusText = COMM_ERROR;\r
1610             }\r
1611 \r
1612             if (callbackArg) {\r
1613                 obj.argument = callbackArg;\r
1614             }\r
1615 \r
1616             return obj;\r
1617         },\r
1618 \r
1619         initHeader:function(label, value, isDefault)\r
1620         {\r
1621             var headerObj = (isDefault) ? this.defaultHeaders : this.headers;\r
1622 \r
1623             if (headerObj[label] === undefined) {\r
1624                 headerObj[label] = value;\r
1625             }\r
1626             else {\r
1627 \r
1628 \r
1629                 headerObj[label] = value + "," + headerObj[label];\r
1630             }\r
1631 \r
1632             if (isDefault) {\r
1633                 this.hasDefaultHeaders = true;\r
1634             }\r
1635             else {\r
1636                 this.hasHeaders = true;\r
1637             }\r
1638         },\r
1639 \r
1640 \r
1641         setHeader:function(o)\r
1642         {\r
1643             if (this.hasDefaultHeaders) {\r
1644                 for (var prop in this.defaultHeaders) {\r
1645                     if (this.defaultHeaders.hasOwnProperty(prop)) {\r
1646                         o.conn.setRequestHeader(prop, this.defaultHeaders[prop]);\r
1647                     }\r
1648                 }\r
1649             }\r
1650 \r
1651             if (this.hasHeaders) {\r
1652                 for (var prop in this.headers) {\r
1653                     if (this.headers.hasOwnProperty(prop)) {\r
1654                         o.conn.setRequestHeader(prop, this.headers[prop]);\r
1655                     }\r
1656                 }\r
1657                 this.headers = {};\r
1658                 this.hasHeaders = false;\r
1659             }\r
1660         },\r
1661 \r
1662         resetDefaultHeaders:function() {\r
1663             delete this.defaultHeaders;\r
1664             this.defaultHeaders = {};\r
1665             this.hasDefaultHeaders = false;\r
1666         },\r
1667 \r
1668         abort:function(o, callback, isTimeout)\r
1669         {\r
1670             if (this.isCallInProgress(o)) {\r
1671                 o.conn.abort();\r
1672                 window.clearInterval(this.poll[o.tId]);\r
1673                 delete this.poll[o.tId];\r
1674                 if (isTimeout) {\r
1675                     delete this.timeout[o.tId];\r
1676                 }\r
1677 \r
1678                 this.handleTransactionResponse(o, callback, true);\r
1679 \r
1680                 return true;\r
1681             }\r
1682             else {\r
1683                 return false;\r
1684             }\r
1685         },\r
1686 \r
1687 \r
1688         isCallInProgress:function(o)\r
1689         {\r
1690 \r
1691 \r
1692             if (o.conn) {\r
1693                 return o.conn.readyState != 4 && o.conn.readyState != 0;\r
1694             }\r
1695             else {\r
1696 \r
1697                 return false;\r
1698             }\r
1699         },\r
1700 \r
1701 \r
1702         releaseObject:function(o)\r
1703         {\r
1704 \r
1705             o.conn = null;\r
1706 \r
1707             o = null;\r
1708         },\r
1709 \r
1710         activeX:[\r
1711         'MSXML2.XMLHTTP.3.0',\r
1712         'MSXML2.XMLHTTP',\r
1713         'Microsoft.XMLHTTP'\r
1714         ]\r
1715 \r
1716 \r
1717     };\r
1718 \r
1719 \r
1720     Ext.lib.Region = function(t, r, b, l) {\r
1721         this.top = t;\r
1722         this[1] = t;\r
1723         this.right = r;\r
1724         this.bottom = b;\r
1725         this.left = l;\r
1726         this[0] = l;\r
1727     };\r
1728 \r
1729     Ext.lib.Region.prototype = {\r
1730         contains : function(region) {\r
1731             return ( region.left >= this.left &&\r
1732                      region.right <= this.right &&\r
1733                      region.top >= this.top &&\r
1734                      region.bottom <= this.bottom    );\r
1735 \r
1736         },\r
1737 \r
1738         getArea : function() {\r
1739             return ( (this.bottom - this.top) * (this.right - this.left) );\r
1740         },\r
1741 \r
1742         intersect : function(region) {\r
1743             var t = Math.max(this.top, region.top);\r
1744             var r = Math.min(this.right, region.right);\r
1745             var b = Math.min(this.bottom, region.bottom);\r
1746             var l = Math.max(this.left, region.left);\r
1747 \r
1748             if (b >= t && r >= l) {\r
1749                 return new Ext.lib.Region(t, r, b, l);\r
1750             } else {\r
1751                 return null;\r
1752             }\r
1753         },\r
1754         union : function(region) {\r
1755             var t = Math.min(this.top, region.top);\r
1756             var r = Math.max(this.right, region.right);\r
1757             var b = Math.max(this.bottom, region.bottom);\r
1758             var l = Math.min(this.left, region.left);\r
1759 \r
1760             return new Ext.lib.Region(t, r, b, l);\r
1761         },\r
1762 \r
1763         constrainTo : function(r) {\r
1764             this.top = this.top.constrain(r.top, r.bottom);\r
1765             this.bottom = this.bottom.constrain(r.top, r.bottom);\r
1766             this.left = this.left.constrain(r.left, r.right);\r
1767             this.right = this.right.constrain(r.left, r.right);\r
1768             return this;\r
1769         },\r
1770 \r
1771         adjust : function(t, l, b, r) {\r
1772             this.top += t;\r
1773             this.left += l;\r
1774             this.right += r;\r
1775             this.bottom += b;\r
1776             return this;\r
1777         }\r
1778     };\r
1779 \r
1780     Ext.lib.Region.getRegion = function(el) {\r
1781         var p = Ext.lib.Dom.getXY(el);\r
1782 \r
1783         var t = p[1];\r
1784         var r = p[0] + el.offsetWidth;\r
1785         var b = p[1] + el.offsetHeight;\r
1786         var l = p[0];\r
1787 \r
1788         return new Ext.lib.Region(t, r, b, l);\r
1789     };\r
1790 \r
1791     Ext.lib.Point = function(x, y) {\r
1792         if (Ext.isArray(x)) {\r
1793             y = x[1];\r
1794             x = x[0];\r
1795         }\r
1796         this.x = this.right = this.left = this[0] = x;\r
1797         this.y = this.top = this.bottom = this[1] = y;\r
1798     };\r
1799 \r
1800     Ext.lib.Point.prototype = new Ext.lib.Region();\r
1801 \r
1802 \r
1803     Ext.lib.Anim = {\r
1804         scroll : function(el, args, duration, easing, cb, scope) {\r
1805             return this.run(el, args, duration, easing, cb, scope, Ext.lib.Scroll);\r
1806         },\r
1807 \r
1808         motion : function(el, args, duration, easing, cb, scope) {\r
1809             return this.run(el, args, duration, easing, cb, scope, Ext.lib.Motion);\r
1810         },\r
1811 \r
1812         color : function(el, args, duration, easing, cb, scope) {\r
1813             return this.run(el, args, duration, easing, cb, scope, Ext.lib.ColorAnim);\r
1814         },\r
1815 \r
1816         run : function(el, args, duration, easing, cb, scope, type) {\r
1817             type = type || Ext.lib.AnimBase;\r
1818             if (typeof easing == "string") {\r
1819                 easing = Ext.lib.Easing[easing];\r
1820             }\r
1821             var anim = new type(el, args, duration, easing);\r
1822             anim.animateX(function() {\r
1823                 Ext.callback(cb, scope);\r
1824             });\r
1825             return anim;\r
1826         }\r
1827     };\r
1828 \r
1829 \r
1830     function fly(el) {\r
1831         if (!libFlyweight) {\r
1832             libFlyweight = new Ext.Element.Flyweight();\r
1833         }\r
1834         libFlyweight.dom = el;\r
1835         return libFlyweight;\r
1836     }\r
1837 \r
1838 \r
1839     if(Ext.isIE) {\r
1840         function fnCleanUp() {\r
1841             var p = Function.prototype;\r
1842             delete p.createSequence;\r
1843             delete p.defer;\r
1844             delete p.createDelegate;\r
1845             delete p.createCallback;\r
1846             delete p.createInterceptor;\r
1847 \r
1848             window.detachEvent("onunload", fnCleanUp);\r
1849         }\r
1850         window.attachEvent("onunload", fnCleanUp);\r
1851     }\r
1852 \r
1853     Ext.lib.AnimBase = function(el, attributes, duration, method) {\r
1854         if (el) {\r
1855             this.init(el, attributes, duration, method);\r
1856         }\r
1857     };\r
1858 \r
1859     Ext.lib.AnimBase.prototype = {\r
1860 \r
1861         toString: function() {\r
1862             var el = this.getEl();\r
1863             var id = el.id || el.tagName;\r
1864             return ("Anim " + id);\r
1865         },\r
1866 \r
1867         patterns: {\r
1868             noNegatives:        /width|height|opacity|padding/i,\r
1869             offsetAttribute:  /^((width|height)|(top|left))$/,\r
1870             defaultUnit:        /width|height|top$|bottom$|left$|right$/i,\r
1871             offsetUnit:         /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i\r
1872         },\r
1873 \r
1874 \r
1875         doMethod: function(attr, start, end) {\r
1876             return this.method(this.currentFrame, start, end - start, this.totalFrames);\r
1877         },\r
1878 \r
1879 \r
1880         setAttribute: function(attr, val, unit) {\r
1881             if (this.patterns.noNegatives.test(attr)) {\r
1882                 val = (val > 0) ? val : 0;\r
1883             }\r
1884 \r
1885             Ext.fly(this.getEl(), '_anim').setStyle(attr, val + unit);\r
1886         },\r
1887 \r
1888 \r
1889         getAttribute: function(attr) {\r
1890             var el = this.getEl();\r
1891             var val = fly(el).getStyle(attr);\r
1892 \r
1893             if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) {\r
1894                 return parseFloat(val);\r
1895             }\r
1896 \r
1897             var a = this.patterns.offsetAttribute.exec(attr) || [];\r
1898             var pos = !!( a[3] );\r
1899             var box = !!( a[2] );\r
1900 \r
1901 \r
1902             if (box || (fly(el).getStyle('position') == 'absolute' && pos)) {\r
1903                 val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)];\r
1904             } else {\r
1905                 val = 0;\r
1906             }\r
1907 \r
1908             return val;\r
1909         },\r
1910 \r
1911 \r
1912         getDefaultUnit: function(attr) {\r
1913             if (this.patterns.defaultUnit.test(attr)) {\r
1914                 return 'px';\r
1915             }\r
1916 \r
1917             return '';\r
1918         },\r
1919 \r
1920         animateX : function(callback, scope) {\r
1921             var f = function() {\r
1922                 this.onComplete.removeListener(f);\r
1923                 if (typeof callback == "function") {\r
1924                     callback.call(scope || this, this);\r
1925                 }\r
1926             };\r
1927             this.onComplete.addListener(f, this);\r
1928             this.animate();\r
1929         },\r
1930 \r
1931 \r
1932         setRuntimeAttribute: function(attr) {\r
1933             var start;\r
1934             var end;\r
1935             var attributes = this.attributes;\r
1936 \r
1937             this.runtimeAttributes[attr] = {};\r
1938 \r
1939             var isset = function(prop) {\r
1940                 return (typeof prop !== 'undefined');\r
1941             };\r
1942 \r
1943             if (!isset(attributes[attr]['to']) && !isset(attributes[attr]['by'])) {\r
1944                 return false;\r
1945             }\r
1946 \r
1947             start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr);\r
1948 \r
1949 \r
1950             if (isset(attributes[attr]['to'])) {\r
1951                 end = attributes[attr]['to'];\r
1952             } else if (isset(attributes[attr]['by'])) {\r
1953                 if (start.constructor == Array) {\r
1954                     end = [];\r
1955                     for (var i = 0, len = start.length; i < len; ++i) {\r
1956                         end[i] = start[i] + attributes[attr]['by'][i];\r
1957                     }\r
1958                 } else {\r
1959                     end = start + attributes[attr]['by'];\r
1960                 }\r
1961             }\r
1962 \r
1963             this.runtimeAttributes[attr].start = start;\r
1964             this.runtimeAttributes[attr].end = end;\r
1965 \r
1966 \r
1967             this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr);\r
1968         },\r
1969 \r
1970 \r
1971         init: function(el, attributes, duration, method) {\r
1972 \r
1973             var isAnimated = false;\r
1974 \r
1975 \r
1976             var startTime = null;\r
1977 \r
1978 \r
1979             var actualFrames = 0;\r
1980 \r
1981 \r
1982             el = Ext.getDom(el);\r
1983 \r
1984 \r
1985             this.attributes = attributes || {};\r
1986 \r
1987 \r
1988             this.duration = duration || 1;\r
1989 \r
1990 \r
1991             this.method = method || Ext.lib.Easing.easeNone;\r
1992 \r
1993 \r
1994             this.useSeconds = true;\r
1995 \r
1996 \r
1997             this.currentFrame = 0;\r
1998 \r
1999 \r
2000             this.totalFrames = Ext.lib.AnimMgr.fps;\r
2001 \r
2002 \r
2003             this.getEl = function() {\r
2004                 return el;\r
2005             };\r
2006 \r
2007 \r
2008             this.isAnimated = function() {\r
2009                 return isAnimated;\r
2010             };\r
2011 \r
2012 \r
2013             this.getStartTime = function() {\r
2014                 return startTime;\r
2015             };\r
2016 \r
2017             this.runtimeAttributes = {};\r
2018 \r
2019 \r
2020             this.animate = function() {\r
2021                 if (this.isAnimated()) {\r
2022                     return false;\r
2023                 }\r
2024 \r
2025                 this.currentFrame = 0;\r
2026 \r
2027                 this.totalFrames = ( this.useSeconds ) ? Math.ceil(Ext.lib.AnimMgr.fps * this.duration) : this.duration;\r
2028 \r
2029                 Ext.lib.AnimMgr.registerElement(this);\r
2030             };\r
2031 \r
2032 \r
2033             this.stop = function(finish) {\r
2034                 if (finish) {\r
2035                     this.currentFrame = this.totalFrames;\r
2036                     this._onTween.fire();\r
2037                 }\r
2038                 Ext.lib.AnimMgr.stop(this);\r
2039             };\r
2040 \r
2041             var onStart = function() {\r
2042                 this.onStart.fire();\r
2043 \r
2044                 this.runtimeAttributes = {};\r
2045                 for (var attr in this.attributes) {\r
2046                     this.setRuntimeAttribute(attr);\r
2047                 }\r
2048 \r
2049                 isAnimated = true;\r
2050                 actualFrames = 0;\r
2051                 startTime = new Date();\r
2052             };\r
2053 \r
2054 \r
2055             var onTween = function() {\r
2056                 var data = {\r
2057                     duration: new Date() - this.getStartTime(),\r
2058                     currentFrame: this.currentFrame\r
2059                 };\r
2060 \r
2061                 data.toString = function() {\r
2062                     return (\r
2063                             'duration: ' + data.duration +\r
2064                             ', currentFrame: ' + data.currentFrame\r
2065                             );\r
2066                 };\r
2067 \r
2068                 this.onTween.fire(data);\r
2069 \r
2070                 var runtimeAttributes = this.runtimeAttributes;\r
2071 \r
2072                 for (var attr in runtimeAttributes) {\r
2073                     this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit);\r
2074                 }\r
2075 \r
2076                 actualFrames += 1;\r
2077             };\r
2078 \r
2079             var onComplete = function() {\r
2080                 var actual_duration = (new Date() - startTime) / 1000 ;\r
2081 \r
2082                 var data = {\r
2083                     duration: actual_duration,\r
2084                     frames: actualFrames,\r
2085                     fps: actualFrames / actual_duration\r
2086                 };\r
2087 \r
2088                 data.toString = function() {\r
2089                     return (\r
2090                             'duration: ' + data.duration +\r
2091                             ', frames: ' + data.frames +\r
2092                             ', fps: ' + data.fps\r
2093                             );\r
2094                 };\r
2095 \r
2096                 isAnimated = false;\r
2097                 actualFrames = 0;\r
2098                 this.onComplete.fire(data);\r
2099             };\r
2100 \r
2101 \r
2102             this._onStart = new Ext.util.Event(this);\r
2103             this.onStart = new Ext.util.Event(this);\r
2104             this.onTween = new Ext.util.Event(this);\r
2105             this._onTween = new Ext.util.Event(this);\r
2106             this.onComplete = new Ext.util.Event(this);\r
2107             this._onComplete = new Ext.util.Event(this);\r
2108             this._onStart.addListener(onStart);\r
2109             this._onTween.addListener(onTween);\r
2110             this._onComplete.addListener(onComplete);\r
2111         }\r
2112     };\r
2113 \r
2114 \r
2115     Ext.lib.AnimMgr = new function() {\r
2116 \r
2117         var thread = null;\r
2118 \r
2119 \r
2120         var queue = [];\r
2121 \r
2122 \r
2123         var tweenCount = 0;\r
2124 \r
2125 \r
2126         this.fps = 1000;\r
2127 \r
2128 \r
2129         this.delay = 1;\r
2130 \r
2131 \r
2132         this.registerElement = function(tween) {\r
2133             queue[queue.length] = tween;\r
2134             tweenCount += 1;\r
2135             tween._onStart.fire();\r
2136             this.start();\r
2137         };\r
2138 \r
2139 \r
2140         this.unRegister = function(tween, index) {\r
2141             tween._onComplete.fire();\r
2142             index = index || getIndex(tween);\r
2143             if (index != -1) {\r
2144                 queue.splice(index, 1);\r
2145             }\r
2146 \r
2147             tweenCount -= 1;\r
2148             if (tweenCount <= 0) {\r
2149                 this.stop();\r
2150             }\r
2151         };\r
2152 \r
2153 \r
2154         this.start = function() {\r
2155             if (thread === null) {\r
2156                 thread = setInterval(this.run, this.delay);\r
2157             }\r
2158         };\r
2159 \r
2160 \r
2161         this.stop = function(tween) {\r
2162             if (!tween) {\r
2163                 clearInterval(thread);\r
2164 \r
2165                 for (var i = 0, len = queue.length; i < len; ++i) {\r
2166                     if (queue[0].isAnimated()) {\r
2167                         this.unRegister(queue[0], 0);\r
2168                     }\r
2169                 }\r
2170 \r
2171                 queue = [];\r
2172                 thread = null;\r
2173                 tweenCount = 0;\r
2174             }\r
2175             else {\r
2176                 this.unRegister(tween);\r
2177             }\r
2178         };\r
2179 \r
2180 \r
2181         this.run = function() {\r
2182             for (var i = 0, len = queue.length; i < len; ++i) {\r
2183                 var tween = queue[i];\r
2184                 if (!tween || !tween.isAnimated()) {\r
2185                     continue;\r
2186                 }\r
2187 \r
2188                 if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null)\r
2189                 {\r
2190                     tween.currentFrame += 1;\r
2191 \r
2192                     if (tween.useSeconds) {\r
2193                         correctFrame(tween);\r
2194                     }\r
2195                     tween._onTween.fire();\r
2196                 }\r
2197                 else {\r
2198                     Ext.lib.AnimMgr.stop(tween, i);\r
2199                 }\r
2200             }\r
2201         };\r
2202 \r
2203         var getIndex = function(anim) {\r
2204             for (var i = 0, len = queue.length; i < len; ++i) {\r
2205                 if (queue[i] == anim) {\r
2206                     return i;\r
2207                 }\r
2208             }\r
2209             return -1;\r
2210         };\r
2211 \r
2212 \r
2213         var correctFrame = function(tween) {\r
2214             var frames = tween.totalFrames;\r
2215             var frame = tween.currentFrame;\r
2216             var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames);\r
2217             var elapsed = (new Date() - tween.getStartTime());\r
2218             var tweak = 0;\r
2219 \r
2220             if (elapsed < tween.duration * 1000) {\r
2221                 tweak = Math.round((elapsed / expected - 1) * tween.currentFrame);\r
2222             } else {\r
2223                 tweak = frames - (frame + 1);\r
2224             }\r
2225             if (tweak > 0 && isFinite(tweak)) {\r
2226                 if (tween.currentFrame + tweak >= frames) {\r
2227                     tweak = frames - (frame + 1);\r
2228                 }\r
2229 \r
2230                 tween.currentFrame += tweak;\r
2231             }\r
2232         };\r
2233     };\r
2234 \r
2235     Ext.lib.Bezier = new function() {\r
2236 \r
2237         this.getPosition = function(points, t) {\r
2238             var n = points.length;\r
2239             var tmp = [];\r
2240 \r
2241             for (var i = 0; i < n; ++i) {\r
2242                 tmp[i] = [points[i][0], points[i][1]];\r
2243             }\r
2244 \r
2245             for (var j = 1; j < n; ++j) {\r
2246                 for (i = 0; i < n - j; ++i) {\r
2247                     tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];\r
2248                     tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1];\r
2249                 }\r
2250             }\r
2251 \r
2252             return [ tmp[0][0], tmp[0][1] ];\r
2253 \r
2254         };\r
2255     };\r
2256     (function() {\r
2257 \r
2258         Ext.lib.ColorAnim = function(el, attributes, duration, method) {\r
2259             Ext.lib.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method);\r
2260         };\r
2261 \r
2262         Ext.extend(Ext.lib.ColorAnim, Ext.lib.AnimBase);\r
2263 \r
2264 \r
2265         var Y = Ext.lib;\r
2266         var superclass = Y.ColorAnim.superclass;\r
2267         var proto = Y.ColorAnim.prototype;\r
2268 \r
2269         proto.toString = function() {\r
2270             var el = this.getEl();\r
2271             var id = el.id || el.tagName;\r
2272             return ("ColorAnim " + id);\r
2273         };\r
2274 \r
2275         proto.patterns.color = /color$/i;\r
2276         proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;\r
2277         proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;\r
2278         proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;\r
2279         proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/;\r
2280 \r
2281 \r
2282         proto.parseColor = function(s) {\r
2283             if (s.length == 3) {\r
2284                 return s;\r
2285             }\r
2286 \r
2287             var c = this.patterns.hex.exec(s);\r
2288             if (c && c.length == 4) {\r
2289                 return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ];\r
2290             }\r
2291 \r
2292             c = this.patterns.rgb.exec(s);\r
2293             if (c && c.length == 4) {\r
2294                 return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ];\r
2295             }\r
2296 \r
2297             c = this.patterns.hex3.exec(s);\r
2298             if (c && c.length == 4) {\r
2299                 return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ];\r
2300             }\r
2301 \r
2302             return null;\r
2303         };\r
2304 \r
2305         proto.getAttribute = function(attr) {\r
2306             var el = this.getEl();\r
2307             if (this.patterns.color.test(attr)) {\r
2308                 var val = fly(el).getStyle(attr);\r
2309 \r
2310                 if (this.patterns.transparent.test(val)) {\r
2311                     var parent = el.parentNode;\r
2312                     val = fly(parent).getStyle(attr);\r
2313 \r
2314                     while (parent && this.patterns.transparent.test(val)) {\r
2315                         parent = parent.parentNode;\r
2316                         val = fly(parent).getStyle(attr);\r
2317                         if (parent.tagName.toUpperCase() == 'HTML') {\r
2318                             val = '#fff';\r
2319                         }\r
2320                     }\r
2321                 }\r
2322             } else {\r
2323                 val = superclass.getAttribute.call(this, attr);\r
2324             }\r
2325 \r
2326             return val;\r
2327         };\r
2328 \r
2329         proto.doMethod = function(attr, start, end) {\r
2330             var val;\r
2331 \r
2332             if (this.patterns.color.test(attr)) {\r
2333                 val = [];\r
2334                 for (var i = 0, len = start.length; i < len; ++i) {\r
2335                     val[i] = superclass.doMethod.call(this, attr, start[i], end[i]);\r
2336                 }\r
2337 \r
2338                 val = 'rgb(' + Math.floor(val[0]) + ',' + Math.floor(val[1]) + ',' + Math.floor(val[2]) + ')';\r
2339             }\r
2340             else {\r
2341                 val = superclass.doMethod.call(this, attr, start, end);\r
2342             }\r
2343 \r
2344             return val;\r
2345         };\r
2346 \r
2347         proto.setRuntimeAttribute = function(attr) {\r
2348             superclass.setRuntimeAttribute.call(this, attr);\r
2349 \r
2350             if (this.patterns.color.test(attr)) {\r
2351                 var attributes = this.attributes;\r
2352                 var start = this.parseColor(this.runtimeAttributes[attr].start);\r
2353                 var end = this.parseColor(this.runtimeAttributes[attr].end);\r
2354 \r
2355                 if (typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined') {\r
2356                     end = this.parseColor(attributes[attr].by);\r
2357 \r
2358                     for (var i = 0, len = start.length; i < len; ++i) {\r
2359                         end[i] = start[i] + end[i];\r
2360                     }\r
2361                 }\r
2362 \r
2363                 this.runtimeAttributes[attr].start = start;\r
2364                 this.runtimeAttributes[attr].end = end;\r
2365             }\r
2366         };\r
2367     })();\r
2368 \r
2369 \r
2370     Ext.lib.Easing = {\r
2371 \r
2372 \r
2373         easeNone: function (t, b, c, d) {\r
2374             return c * t / d + b;\r
2375         },\r
2376 \r
2377 \r
2378         easeIn: function (t, b, c, d) {\r
2379             return c * (t /= d) * t + b;\r
2380         },\r
2381 \r
2382 \r
2383         easeOut: function (t, b, c, d) {\r
2384             return -c * (t /= d) * (t - 2) + b;\r
2385         },\r
2386 \r
2387 \r
2388         easeBoth: function (t, b, c, d) {\r
2389             if ((t /= d / 2) < 1) {\r
2390                 return c / 2 * t * t + b;\r
2391             }\r
2392 \r
2393             return -c / 2 * ((--t) * (t - 2) - 1) + b;\r
2394         },\r
2395 \r
2396 \r
2397         easeInStrong: function (t, b, c, d) {\r
2398             return c * (t /= d) * t * t * t + b;\r
2399         },\r
2400 \r
2401 \r
2402         easeOutStrong: function (t, b, c, d) {\r
2403             return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r
2404         },\r
2405 \r
2406 \r
2407         easeBothStrong: function (t, b, c, d) {\r
2408             if ((t /= d / 2) < 1) {\r
2409                 return c / 2 * t * t * t * t + b;\r
2410             }\r
2411 \r
2412             return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\r
2413         },\r
2414 \r
2415 \r
2416 \r
2417         elasticIn: function (t, b, c, d, a, p) {\r
2418             if (t == 0) {\r
2419                 return b;\r
2420             }\r
2421             if ((t /= d) == 1) {\r
2422                 return b + c;\r
2423             }\r
2424             if (!p) {\r
2425                 p = d * .3;\r
2426             }\r
2427 \r
2428             if (!a || a < Math.abs(c)) {\r
2429                 a = c;\r
2430                 var s = p / 4;\r
2431             }\r
2432             else {\r
2433                 var s = p / (2 * Math.PI) * Math.asin(c / a);\r
2434             }\r
2435 \r
2436             return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\r
2437         },\r
2438 \r
2439 \r
2440         elasticOut: function (t, b, c, d, a, p) {\r
2441             if (t == 0) {\r
2442                 return b;\r
2443             }\r
2444             if ((t /= d) == 1) {\r
2445                 return b + c;\r
2446             }\r
2447             if (!p) {\r
2448                 p = d * .3;\r
2449             }\r
2450 \r
2451             if (!a || a < Math.abs(c)) {\r
2452                 a = c;\r
2453                 var s = p / 4;\r
2454             }\r
2455             else {\r
2456                 var s = p / (2 * Math.PI) * Math.asin(c / a);\r
2457             }\r
2458 \r
2459             return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\r
2460         },\r
2461 \r
2462 \r
2463         elasticBoth: function (t, b, c, d, a, p) {\r
2464             if (t == 0) {\r
2465                 return b;\r
2466             }\r
2467 \r
2468             if ((t /= d / 2) == 2) {\r
2469                 return b + c;\r
2470             }\r
2471 \r
2472             if (!p) {\r
2473                 p = d * (.3 * 1.5);\r
2474             }\r
2475 \r
2476             if (!a || a < Math.abs(c)) {\r
2477                 a = c;\r
2478                 var s = p / 4;\r
2479             }\r
2480             else {\r
2481                 var s = p / (2 * Math.PI) * Math.asin(c / a);\r
2482             }\r
2483 \r
2484             if (t < 1) {\r
2485                 return -.5 * (a * Math.pow(2, 10 * (t -= 1)) *\r
2486                               Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\r
2487             }\r
2488             return a * Math.pow(2, -10 * (t -= 1)) *\r
2489                    Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;\r
2490         },\r
2491 \r
2492 \r
2493 \r
2494         backIn: function (t, b, c, d, s) {\r
2495             if (typeof s == 'undefined') {\r
2496                 s = 1.70158;\r
2497             }\r
2498             return c * (t /= d) * t * ((s + 1) * t - s) + b;\r
2499         },\r
2500 \r
2501 \r
2502         backOut: function (t, b, c, d, s) {\r
2503             if (typeof s == 'undefined') {\r
2504                 s = 1.70158;\r
2505             }\r
2506             return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\r
2507         },\r
2508 \r
2509 \r
2510         backBoth: function (t, b, c, d, s) {\r
2511             if (typeof s == 'undefined') {\r
2512                 s = 1.70158;\r
2513             }\r
2514 \r
2515             if ((t /= d / 2 ) < 1) {\r
2516                 return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\r
2517             }\r
2518             return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\r
2519         },\r
2520 \r
2521 \r
2522         bounceIn: function (t, b, c, d) {\r
2523             return c - Ext.lib.Easing.bounceOut(d - t, 0, c, d) + b;\r
2524         },\r
2525 \r
2526 \r
2527         bounceOut: function (t, b, c, d) {\r
2528             if ((t /= d) < (1 / 2.75)) {\r
2529                 return c * (7.5625 * t * t) + b;\r
2530             } else if (t < (2 / 2.75)) {\r
2531                 return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;\r
2532             } else if (t < (2.5 / 2.75)) {\r
2533                 return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;\r
2534             }\r
2535             return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;\r
2536         },\r
2537 \r
2538 \r
2539         bounceBoth: function (t, b, c, d) {\r
2540             if (t < d / 2) {\r
2541                 return Ext.lib.Easing.bounceIn(t * 2, 0, c, d) * .5 + b;\r
2542             }\r
2543             return Ext.lib.Easing.bounceOut(t * 2 - d, 0, c, d) * .5 + c * .5 + b;\r
2544         }\r
2545     };\r
2546 \r
2547     (function() {\r
2548         Ext.lib.Motion = function(el, attributes, duration, method) {\r
2549             if (el) {\r
2550                 Ext.lib.Motion.superclass.constructor.call(this, el, attributes, duration, method);\r
2551             }\r
2552         };\r
2553 \r
2554         Ext.extend(Ext.lib.Motion, Ext.lib.ColorAnim);\r
2555 \r
2556 \r
2557         var Y = Ext.lib;\r
2558         var superclass = Y.Motion.superclass;\r
2559         var proto = Y.Motion.prototype;\r
2560 \r
2561         proto.toString = function() {\r
2562             var el = this.getEl();\r
2563             var id = el.id || el.tagName;\r
2564             return ("Motion " + id);\r
2565         };\r
2566 \r
2567         proto.patterns.points = /^points$/i;\r
2568 \r
2569         proto.setAttribute = function(attr, val, unit) {\r
2570             if (this.patterns.points.test(attr)) {\r
2571                 unit = unit || 'px';\r
2572                 superclass.setAttribute.call(this, 'left', val[0], unit);\r
2573                 superclass.setAttribute.call(this, 'top', val[1], unit);\r
2574             } else {\r
2575                 superclass.setAttribute.call(this, attr, val, unit);\r
2576             }\r
2577         };\r
2578 \r
2579         proto.getAttribute = function(attr) {\r
2580             if (this.patterns.points.test(attr)) {\r
2581                 var val = [\r
2582                         superclass.getAttribute.call(this, 'left'),\r
2583                         superclass.getAttribute.call(this, 'top')\r
2584                         ];\r
2585             } else {\r
2586                 val = superclass.getAttribute.call(this, attr);\r
2587             }\r
2588 \r
2589             return val;\r
2590         };\r
2591 \r
2592         proto.doMethod = function(attr, start, end) {\r
2593             var val = null;\r
2594 \r
2595             if (this.patterns.points.test(attr)) {\r
2596                 var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;\r
2597                 val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t);\r
2598             } else {\r
2599                 val = superclass.doMethod.call(this, attr, start, end);\r
2600             }\r
2601             return val;\r
2602         };\r
2603 \r
2604         proto.setRuntimeAttribute = function(attr) {\r
2605             if (this.patterns.points.test(attr)) {\r
2606                 var el = this.getEl();\r
2607                 var attributes = this.attributes;\r
2608                 var start;\r
2609                 var control = attributes['points']['control'] || [];\r
2610                 var end;\r
2611                 var i, len;\r
2612 \r
2613                 if (control.length > 0 && !Ext.isArray(control[0])) {\r
2614                     control = [control];\r
2615                 } else {\r
2616                     var tmp = [];\r
2617                     for (i = 0,len = control.length; i < len; ++i) {\r
2618                         tmp[i] = control[i];\r
2619                     }\r
2620                     control = tmp;\r
2621                 }\r
2622 \r
2623                 Ext.fly(el).position();\r
2624 \r
2625                 if (isset(attributes['points']['from'])) {\r
2626                     Ext.lib.Dom.setXY(el, attributes['points']['from']);\r
2627                 }\r
2628                 else {\r
2629                     Ext.lib.Dom.setXY(el, Ext.lib.Dom.getXY(el));\r
2630                 }\r
2631 \r
2632                 start = this.getAttribute('points');\r
2633 \r
2634 \r
2635                 if (isset(attributes['points']['to'])) {\r
2636                     end = translateValues.call(this, attributes['points']['to'], start);\r
2637 \r
2638                     var pageXY = Ext.lib.Dom.getXY(this.getEl());\r
2639                     for (i = 0,len = control.length; i < len; ++i) {\r
2640                         control[i] = translateValues.call(this, control[i], start);\r
2641                     }\r
2642 \r
2643 \r
2644                 } else if (isset(attributes['points']['by'])) {\r
2645                     end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ];\r
2646 \r
2647                     for (i = 0,len = control.length; i < len; ++i) {\r
2648                         control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];\r
2649                     }\r
2650                 }\r
2651 \r
2652                 this.runtimeAttributes[attr] = [start];\r
2653 \r
2654                 if (control.length > 0) {\r
2655                     this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control);\r
2656                 }\r
2657 \r
2658                 this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end;\r
2659             }\r
2660             else {\r
2661                 superclass.setRuntimeAttribute.call(this, attr);\r
2662             }\r
2663         };\r
2664 \r
2665         var translateValues = function(val, start) {\r
2666             var pageXY = Ext.lib.Dom.getXY(this.getEl());\r
2667             val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ];\r
2668 \r
2669             return val;\r
2670         };\r
2671 \r
2672         var isset = function(prop) {\r
2673             return (typeof prop !== 'undefined');\r
2674         };\r
2675     })();\r
2676 \r
2677 \r
2678     (function() {\r
2679         Ext.lib.Scroll = function(el, attributes, duration, method) {\r
2680             if (el) {\r
2681                 Ext.lib.Scroll.superclass.constructor.call(this, el, attributes, duration, method);\r
2682             }\r
2683         };\r
2684 \r
2685         Ext.extend(Ext.lib.Scroll, Ext.lib.ColorAnim);\r
2686 \r
2687 \r
2688         var Y = Ext.lib;\r
2689         var superclass = Y.Scroll.superclass;\r
2690         var proto = Y.Scroll.prototype;\r
2691 \r
2692         proto.toString = function() {\r
2693             var el = this.getEl();\r
2694             var id = el.id || el.tagName;\r
2695             return ("Scroll " + id);\r
2696         };\r
2697 \r
2698         proto.doMethod = function(attr, start, end) {\r
2699             var val = null;\r
2700 \r
2701             if (attr == 'scroll') {\r
2702                 val = [\r
2703                         this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),\r
2704                         this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)\r
2705                         ];\r
2706 \r
2707             } else {\r
2708                 val = superclass.doMethod.call(this, attr, start, end);\r
2709             }\r
2710             return val;\r
2711         };\r
2712 \r
2713         proto.getAttribute = function(attr) {\r
2714             var val = null;\r
2715             var el = this.getEl();\r
2716 \r
2717             if (attr == 'scroll') {\r
2718                 val = [ el.scrollLeft, el.scrollTop ];\r
2719             } else {\r
2720                 val = superclass.getAttribute.call(this, attr);\r
2721             }\r
2722 \r
2723             return val;\r
2724         };\r
2725 \r
2726         proto.setAttribute = function(attr, val, unit) {\r
2727             var el = this.getEl();\r
2728 \r
2729             if (attr == 'scroll') {\r
2730                 el.scrollLeft = val[0];\r
2731                 el.scrollTop = val[1];\r
2732             } else {\r
2733                 superclass.setAttribute.call(this, attr, val, unit);\r
2734             }\r
2735         };\r
2736     })();\r
2737 \r
2738 \r
2739 })();