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