]> icculus.org git repositories - duncan/yast2-web-wt.git/blob - examples/ext/ext-core-debug.js
examples
[duncan/yast2-web-wt.git] / examples / ext / ext-core-debug.js
1 /*\r
2  * Ext JS Library 1.1.1\r
3  * Copyright(c) 2006-2007, Ext JS, LLC.\r
4  * licensing@extjs.com\r
5  * \r
6  * http://www.extjs.com/license\r
7  */\r
8 \r
9 \r
10 Ext.DomHelper = function(){\r
11     var tempTableEl = null;\r
12     var emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i;\r
13     var tableRe = /^table|tbody|tr|td$/i;\r
14     \r
15     
16     \r
17     var createHtml = function(o){\r
18         if(typeof o == 'string'){\r
19             return o;\r
20         }\r
21         var b = "";\r
22         if(!o.tag){\r
23             o.tag = "div";\r
24         }\r
25         b += "<" + o.tag;\r
26         for(var attr in o){\r
27             if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || typeof o[attr] == "function") continue;\r
28             if(attr == "style"){\r
29                 var s = o["style"];\r
30                 if(typeof s == "function"){\r
31                     s = s.call();\r
32                 }\r
33                 if(typeof s == "string"){\r
34                     b += ' style="' + s + '"';\r
35                 }else if(typeof s == "object"){\r
36                     b += ' style="';\r
37                     for(var key in s){\r
38                         if(typeof s[key] != "function"){\r
39                             b += key + ":" + s[key] + ";";\r
40                         }\r
41                     }\r
42                     b += '"';\r
43                 }\r
44             }else{\r
45                 if(attr == "cls"){\r
46                     b += ' class="' + o["cls"] + '"';\r
47                 }else if(attr == "htmlFor"){\r
48                     b += ' for="' + o["htmlFor"] + '"';\r
49                 }else{\r
50                     b += " " + attr + '="' + o[attr] + '"';\r
51                 }\r
52             }\r
53         }\r
54         if(emptyTags.test(o.tag)){\r
55             b += "/>";\r
56         }else{\r
57             b += ">";\r
58             var cn = o.children || o.cn;\r
59             if(cn){\r
60                 if(cn instanceof Array){\r
61                     for(var i = 0, len = cn.length; i < len; i++) {\r
62                         b += createHtml(cn[i], b);\r
63                     }\r
64                 }else{\r
65                     b += createHtml(cn, b);\r
66                 }\r
67             }\r
68             if(o.html){\r
69                 b += o.html;\r
70             }\r
71             b += "</" + o.tag + ">";\r
72         }\r
73         return b;\r
74     };\r
75 \r
76     
77     \r
78     var createDom = function(o, parentNode){\r
79         var el = document.createElement(o.tag||'div');\r
80         var useSet = el.setAttribute ? true : false; 
81         for(var attr in o){\r
82             if(attr == "tag" || attr == "children" || attr == "cn" || attr == "html" || attr == "style" || typeof o[attr] == "function") continue;\r
83             if(attr=="cls"){\r
84                 el.className = o["cls"];\r
85             }else{\r
86                 if(useSet) el.setAttribute(attr, o[attr]);\r
87                 else el[attr] = o[attr];\r
88             }\r
89         }\r
90         Ext.DomHelper.applyStyles(el, o.style);\r
91         var cn = o.children || o.cn;\r
92         if(cn){\r
93             if(cn instanceof Array){\r
94                 for(var i = 0, len = cn.length; i < len; i++) {\r
95                     createDom(cn[i], el);\r
96                 }\r
97             }else{\r
98                 createDom(cn, el);\r
99             }\r
100         }\r
101         if(o.html){\r
102             el.innerHTML = o.html;\r
103         }\r
104         if(parentNode){\r
105            parentNode.appendChild(el);\r
106         }\r
107         return el;\r
108     };\r
109 \r
110     var ieTable = function(depth, s, h, e){\r
111         tempTableEl.innerHTML = [s, h, e].join('');\r
112         var i = -1, el = tempTableEl;\r
113         while(++i < depth){\r
114             el = el.firstChild;\r
115         }\r
116         return el;\r
117     };\r
118 \r
119     
120     var ts = '<table>',\r
121         te = '</table>',\r
122         tbs = ts+'<tbody>',\r
123         tbe = '</tbody>'+te,\r
124         trs = tbs + '<tr>',\r
125         tre = '</tr>'+tbe;\r
126 \r
127     \r
128     var insertIntoTable = function(tag, where, el, html){\r
129         if(!tempTableEl){\r
130             tempTableEl = document.createElement('div');\r
131         }\r
132         var node;\r
133         var before = null;\r
134         if(tag == 'td'){\r
135             if(where == 'afterbegin' || where == 'beforeend'){ 
136                 return;\r
137             }\r
138             if(where == 'beforebegin'){\r
139                 before = el;\r
140                 el = el.parentNode;\r
141             } else{\r
142                 before = el.nextSibling;\r
143                 el = el.parentNode;\r
144             }\r
145             node = ieTable(4, trs, html, tre);\r
146         }\r
147         else if(tag == 'tr'){\r
148             if(where == 'beforebegin'){\r
149                 before = el;\r
150                 el = el.parentNode;\r
151                 node = ieTable(3, tbs, html, tbe);\r
152             } else if(where == 'afterend'){\r
153                 before = el.nextSibling;\r
154                 el = el.parentNode;\r
155                 node = ieTable(3, tbs, html, tbe);\r
156             } else{ 
157                 if(where == 'afterbegin'){\r
158                     before = el.firstChild;\r
159                 }\r
160                 node = ieTable(4, trs, html, tre);\r
161             }\r
162         } else if(tag == 'tbody'){\r
163             if(where == 'beforebegin'){\r
164                 before = el;\r
165                 el = el.parentNode;\r
166                 node = ieTable(2, ts, html, te);\r
167             } else if(where == 'afterend'){\r
168                 before = el.nextSibling;\r
169                 el = el.parentNode;\r
170                 node = ieTable(2, ts, html, te);\r
171             } else{\r
172                 if(where == 'afterbegin'){\r
173                     before = el.firstChild;\r
174                 }\r
175                 node = ieTable(3, tbs, html, tbe);\r
176             }\r
177         } else{ 
178             if(where == 'beforebegin' || where == 'afterend'){ 
179                 return;\r
180             }\r
181             if(where == 'afterbegin'){\r
182                 before = el.firstChild;\r
183             }\r
184             node = ieTable(2, ts, html, te);\r
185         }\r
186         el.insertBefore(node, before);\r
187         return node;\r
188     };\r
189 \r
190     return {\r
191     \r
192     useDom : false,\r
193 \r
194     \r
195     markup : function(o){\r
196         return createHtml(o);\r
197     },\r
198 \r
199     \r
200     applyStyles : function(el, styles){\r
201         if(styles){\r
202            el = Ext.fly(el);\r
203            if(typeof styles == "string"){\r
204                var re = /\s?([a-z\-]*)\:\s?([^;]*);?/gi;\r
205                var matches;\r
206                while ((matches = re.exec(styles)) != null){\r
207                    el.setStyle(matches[1], matches[2]);\r
208                }\r
209            }else if (typeof styles == "object"){\r
210                for (var style in styles){\r
211                   el.setStyle(style, styles[style]);\r
212                }\r
213            }else if (typeof styles == "function"){\r
214                 Ext.DomHelper.applyStyles(el, styles.call());\r
215            }\r
216         }\r
217     },\r
218 \r
219     \r
220     insertHtml : function(where, el, html){\r
221         where = where.toLowerCase();\r
222         if(el.insertAdjacentHTML){\r
223             if(tableRe.test(el.tagName)){\r
224                 var rs;\r
225                 if(rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html)){\r
226                     return rs;\r
227                 }\r
228             }\r
229             switch(where){\r
230                 case "beforebegin":\r
231                     el.insertAdjacentHTML('BeforeBegin', html);\r
232                     return el.previousSibling;\r
233                 case "afterbegin":\r
234                     el.insertAdjacentHTML('AfterBegin', html);\r
235                     return el.firstChild;\r
236                 case "beforeend":\r
237                     el.insertAdjacentHTML('BeforeEnd', html);\r
238                     return el.lastChild;\r
239                 case "afterend":\r
240                     el.insertAdjacentHTML('AfterEnd', html);\r
241                     return el.nextSibling;\r
242             }\r
243             throw 'Illegal insertion point -> "' + where + '"';\r
244         }\r
245         var range = el.ownerDocument.createRange();\r
246         var frag;\r
247         switch(where){\r
248              case "beforebegin":\r
249                 range.setStartBefore(el);\r
250                 frag = range.createContextualFragment(html);\r
251                 el.parentNode.insertBefore(frag, el);\r
252                 return el.previousSibling;\r
253              case "afterbegin":\r
254                 if(el.firstChild){\r
255                     range.setStartBefore(el.firstChild);\r
256                     frag = range.createContextualFragment(html);\r
257                     el.insertBefore(frag, el.firstChild);\r
258                     return el.firstChild;\r
259                 }else{\r
260                     el.innerHTML = html;\r
261                     return el.firstChild;\r
262                 }\r
263             case "beforeend":\r
264                 if(el.lastChild){\r
265                     range.setStartAfter(el.lastChild);\r
266                     frag = range.createContextualFragment(html);\r
267                     el.appendChild(frag);\r
268                     return el.lastChild;\r
269                 }else{\r
270                     el.innerHTML = html;\r
271                     return el.lastChild;\r
272                 }\r
273             case "afterend":\r
274                 range.setStartAfter(el);\r
275                 frag = range.createContextualFragment(html);\r
276                 el.parentNode.insertBefore(frag, el.nextSibling);\r
277                 return el.nextSibling;\r
278             }\r
279             throw 'Illegal insertion point -> "' + where + '"';\r
280     },\r
281 \r
282     \r
283     insertBefore : function(el, o, returnElement){\r
284         return this.doInsert(el, o, returnElement, "beforeBegin");\r
285     },\r
286 \r
287     \r
288     insertAfter : function(el, o, returnElement){\r
289         return this.doInsert(el, o, returnElement, "afterEnd", "nextSibling");\r
290     },\r
291 \r
292     \r
293     insertFirst : function(el, o, returnElement){\r
294         return this.doInsert(el, o, returnElement, "afterBegin");\r
295     },\r
296 \r
297     
298     doInsert : function(el, o, returnElement, pos, sibling){\r
299         el = Ext.getDom(el);\r
300         var newNode;\r
301         if(this.useDom){\r
302             newNode = createDom(o, null);\r
303             el.parentNode.insertBefore(newNode, sibling ? el[sibling] : el);\r
304         }else{\r
305             var html = createHtml(o);\r
306             newNode = this.insertHtml(pos, el, html);\r
307         }\r
308         return returnElement ? Ext.get(newNode, true) : newNode;\r
309     },\r
310 \r
311     \r
312     append : function(el, o, returnElement){\r
313         el = Ext.getDom(el);\r
314         var newNode;\r
315         if(this.useDom){\r
316             newNode = createDom(o, null);\r
317             el.appendChild(newNode);\r
318         }else{\r
319             var html = createHtml(o);\r
320             newNode = this.insertHtml("beforeEnd", el, html);\r
321         }\r
322         return returnElement ? Ext.get(newNode, true) : newNode;\r
323     },\r
324 \r
325     \r
326     overwrite : function(el, o, returnElement){\r
327         el = Ext.getDom(el);\r
328         el.innerHTML = createHtml(o);\r
329         return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;\r
330     },\r
331 \r
332     \r
333     createTemplate : function(o){\r
334         var html = createHtml(o);\r
335         return new Ext.Template(html);\r
336     }\r
337     };\r
338 }();\r
339
340 \r
341 Ext.Template = function(html){\r
342     if(html instanceof Array){\r
343         html = html.join("");\r
344     }else if(arguments.length > 1){\r
345         html = Array.prototype.join.call(arguments, "");\r
346     }\r
347     \r
348     this.html = html;\r
349     \r
350 };\r
351 Ext.Template.prototype = {\r
352     \r
353     applyTemplate : function(values){\r
354         if(this.compiled){\r
355             return this.compiled(values);\r
356         }\r
357         var useF = this.disableFormats !== true;\r
358         var fm = Ext.util.Format, tpl = this;\r
359         var fn = function(m, name, format, args){\r
360             if(format && useF){\r
361                 if(format.substr(0, 5) == "this."){\r
362                     return tpl.call(format.substr(5), values[name], values);\r
363                 }else{\r
364                     if(args){\r
365                         
366                         
367                         
368                         var re = /^\s*['"](.*)["']\s*$/;\r
369                         args = args.split(',');\r
370                         for(var i = 0, len = args.length; i < len; i++){\r
371                             args[i] = args[i].replace(re, "$1");\r
372                         }\r
373                         args = [values[name]].concat(args);\r
374                     }else{\r
375                         args = [values[name]];\r
376                     }\r
377                     return fm[format].apply(fm, args);\r
378                 }\r
379             }else{\r
380                 return values[name] !== undefined ? values[name] : "";\r
381             }\r
382         };\r
383         return this.html.replace(this.re, fn);\r
384     },\r
385     \r
386     \r
387     set : function(html, compile){\r
388         this.html = html;\r
389         this.compiled = null;\r
390         if(compile){\r
391             this.compile();\r
392         }\r
393         return this;\r
394     },\r
395     \r
396     \r
397     disableFormats : false,\r
398     \r
399     \r
400     re : /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,\r
401     \r
402     \r
403     compile : function(){\r
404         var fm = Ext.util.Format;\r
405         var useF = this.disableFormats !== true;\r
406         var sep = Ext.isGecko ? "+" : ",";\r
407         var fn = function(m, name, format, args){\r
408             if(format && useF){\r
409                 args = args ? ',' + args : "";\r
410                 if(format.substr(0, 5) != "this."){\r
411                     format = "fm." + format + '(';\r
412                 }else{\r
413                     format = 'this.call("'+ format.substr(5) + '", ';\r
414                     args = ", values";\r
415                 }\r
416             }else{\r
417                 args= ''; format = "(values['" + name + "'] == undefined ? '' : ";\r
418             }\r
419             return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";\r
420         };\r
421         var body;\r
422         
423         if(Ext.isGecko){\r
424             body = "this.compiled = function(values){ return '" +\r
425                    this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn) +\r
426                     "';};";\r
427         }else{\r
428             body = ["this.compiled = function(values){ return ['"];\r
429             body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.re, fn));\r
430             body.push("'].join('');};");\r
431             body = body.join('');\r
432         }\r
433         eval(body);\r
434         return this;\r
435     },\r
436     \r
437     
438     call : function(fnName, value, allValues){\r
439         return this[fnName](value, allValues);\r
440     },\r
441     \r
442     \r
443     insertFirst: function(el, values, returnElement){\r
444         return this.doInsert('afterBegin', el, values, returnElement);\r
445     },\r
446 \r
447     \r
448     insertBefore: function(el, values, returnElement){\r
449         return this.doInsert('beforeBegin', el, values, returnElement);\r
450     },\r
451 \r
452     \r
453     insertAfter : function(el, values, returnElement){\r
454         return this.doInsert('afterEnd', el, values, returnElement);\r
455     },\r
456     \r
457     \r
458     append : function(el, values, returnElement){\r
459         return this.doInsert('beforeEnd', el, values, returnElement);\r
460     },\r
461 \r
462     doInsert : function(where, el, values, returnEl){\r
463         el = Ext.getDom(el);\r
464         var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));\r
465         return returnEl ? Ext.get(newNode, true) : newNode;\r
466     },\r
467 \r
468     \r
469     overwrite : function(el, values, returnElement){\r
470         el = Ext.getDom(el);\r
471         el.innerHTML = this.applyTemplate(values);\r
472         return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;\r
473     }\r
474 };\r
475 \r
476 Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;\r
477 \r
478
479 Ext.DomHelper.Template = Ext.Template;\r
480 \r
481 \r
482 Ext.Template.from = function(el){\r
483     el = Ext.getDom(el);\r
484     return new Ext.Template(el.value || el.innerHTML);\r
485 };
486 \r
487 \r
488 Ext.DomQuery = function(){\r
489     var cache = {}, simpleCache = {}, valueCache = {};\r
490     var nonSpace = /\S/;\r
491     var trimRe = /^\s+|\s+$/g;\r
492     var tplRe = /\{(\d+)\}/g;\r
493     var modeRe = /^(\s?[\/>+~]\s?|\s|$)/;\r
494     var tagTokenRe = /^(#)?([\w-\*]+)/;\r
495     var nthRe = /(\d*)n\+?(\d*)/, nthRe2 = /\D/;\r
496 \r
497     function child(p, index){\r
498         var i = 0;\r
499         var n = p.firstChild;\r
500         while(n){\r
501             if(n.nodeType == 1){\r
502                if(++i == index){\r
503                    return n;\r
504                }\r
505             }\r
506             n = n.nextSibling;\r
507         }\r
508         return null;\r
509     };\r
510 \r
511     function next(n){\r
512         while((n = n.nextSibling) && n.nodeType != 1);\r
513         return n;\r
514     };\r
515 \r
516     function prev(n){\r
517         while((n = n.previousSibling) && n.nodeType != 1);\r
518         return n;\r
519     };\r
520 \r
521     function children(d){\r
522         var n = d.firstChild, ni = -1;\r
523             while(n){\r
524                 var nx = n.nextSibling;\r
525                 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){\r
526                     d.removeChild(n);\r
527                 }else{\r
528                     n.nodeIndex = ++ni;\r
529                 }\r
530                 n = nx;\r
531             }\r
532             return this;\r
533         };\r
534 \r
535     function byClassName(c, a, v){\r
536         if(!v){\r
537             return c;\r
538         }\r
539         var r = [], ri = -1, cn;\r
540         for(var i = 0, ci; ci = c[i]; i++){\r
541             if((' '+ci.className+' ').indexOf(v) != -1){\r
542                 r[++ri] = ci;\r
543             }\r
544         }\r
545         return r;\r
546     };\r
547 \r
548     function attrValue(n, attr){\r
549         if(!n.tagName && typeof n.length != "undefined"){\r
550             n = n[0];\r
551         }\r
552         if(!n){\r
553             return null;\r
554         }\r
555         if(attr == "for"){\r
556             return n.htmlFor;\r
557         }\r
558         if(attr == "class" || attr == "className"){\r
559             return n.className;\r
560         }\r
561         return n.getAttribute(attr) || n[attr];\r
562 \r
563     };\r
564 \r
565     function getNodes(ns, mode, tagName){\r
566         var result = [], ri = -1, cs;\r
567         if(!ns){\r
568             return result;\r
569         }\r
570         tagName = tagName || "*";\r
571         if(typeof ns.getElementsByTagName != "undefined"){\r
572             ns = [ns];\r
573         }\r
574         if(!mode){\r
575             for(var i = 0, ni; ni = ns[i]; i++){\r
576                 cs = ni.getElementsByTagName(tagName);\r
577                 for(var j = 0, ci; ci = cs[j]; j++){\r
578                     result[++ri] = ci;\r
579                 }\r
580             }\r
581         }else if(mode == "/" || mode == ">"){\r
582             var utag = tagName.toUpperCase();\r
583             for(var i = 0, ni, cn; ni = ns[i]; i++){\r
584                 cn = ni.children || ni.childNodes;\r
585                 for(var j = 0, cj; cj = cn[j]; j++){\r
586                     if(cj.nodeName == utag || cj.nodeName == tagName  || tagName == '*'){\r
587                         result[++ri] = cj;\r
588                     }\r
589                 }\r
590             }\r
591         }else if(mode == "+"){\r
592             var utag = tagName.toUpperCase();\r
593             for(var i = 0, n; n = ns[i]; i++){\r
594                 while((n = n.nextSibling) && n.nodeType != 1);\r
595                 if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){\r
596                     result[++ri] = n;\r
597                 }\r
598             }\r
599         }else if(mode == "~"){\r
600             for(var i = 0, n; n = ns[i]; i++){\r
601                 while((n = n.nextSibling) && (n.nodeType != 1 || (tagName == '*' || n.tagName.toLowerCase()!=tagName)));\r
602                 if(n){\r
603                     result[++ri] = n;\r
604                 }\r
605             }\r
606         }\r
607         return result;\r
608     };\r
609 \r
610     function concat(a, b){\r
611         if(b.slice){\r
612             return a.concat(b);\r
613         }\r
614         for(var i = 0, l = b.length; i < l; i++){\r
615             a[a.length] = b[i];\r
616         }\r
617         return a;\r
618     }\r
619 \r
620     function byTag(cs, tagName){\r
621         if(cs.tagName || cs == document){\r
622             cs = [cs];\r
623         }\r
624         if(!tagName){\r
625             return cs;\r
626         }\r
627         var r = [], ri = -1;\r
628         tagName = tagName.toLowerCase();\r
629         for(var i = 0, ci; ci = cs[i]; i++){\r
630             if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){\r
631                 r[++ri] = ci;\r
632             }\r
633         }\r
634         return r;\r
635     };\r
636 \r
637     function byId(cs, attr, id){\r
638         if(cs.tagName || cs == document){\r
639             cs = [cs];\r
640         }\r
641         if(!id){\r
642             return cs;\r
643         }\r
644         var r = [], ri = -1;\r
645         for(var i = 0,ci; ci = cs[i]; i++){\r
646             if(ci && ci.id == id){\r
647                 r[++ri] = ci;\r
648                 return r;\r
649             }\r
650         }\r
651         return r;\r
652     };\r
653 \r
654     function byAttribute(cs, attr, value, op, custom){\r
655         var r = [], ri = -1, st = custom=="{";\r
656         var f = Ext.DomQuery.operators[op];\r
657         for(var i = 0, ci; ci = cs[i]; i++){\r
658             var a;\r
659             if(st){\r
660                 a = Ext.DomQuery.getStyle(ci, attr);\r
661             }\r
662             else if(attr == "class" || attr == "className"){\r
663                 a = ci.className;\r
664             }else if(attr == "for"){\r
665                 a = ci.htmlFor;\r
666             }else if(attr == "href"){\r
667                 a = ci.getAttribute("href", 2);\r
668             }else{\r
669                 a = ci.getAttribute(attr);\r
670             }\r
671             if((f && f(a, value)) || (!f && a)){\r
672                 r[++ri] = ci;\r
673             }\r
674         }\r
675         return r;\r
676     };\r
677 \r
678     function byPseudo(cs, name, value){\r
679         return Ext.DomQuery.pseudos[name](cs, value);\r
680     };\r
681 \r
682     
683     
684     
685     var isIE = window.ActiveXObject ? true : false;\r
686 \r
687     
688     
689     eval("var batch = 30803;");\r
690 \r
691     var key = 30803;\r
692 \r
693     function nodupIEXml(cs){\r
694         var d = ++key;\r
695         cs[0].setAttribute("_nodup", d);\r
696         var r = [cs[0]];\r
697         for(var i = 1, len = cs.length; i < len; i++){\r
698             var c = cs[i];\r
699             if(!c.getAttribute("_nodup") != d){\r
700                 c.setAttribute("_nodup", d);\r
701                 r[r.length] = c;\r
702             }\r
703         }\r
704         for(var i = 0, len = cs.length; i < len; i++){\r
705             cs[i].removeAttribute("_nodup");\r
706         }\r
707         return r;\r
708     }\r
709 \r
710     function nodup(cs){\r
711         if(!cs){\r
712             return [];\r
713         }\r
714         var len = cs.length, c, i, r = cs, cj, ri = -1;\r
715         if(!len || typeof cs.nodeType != "undefined" || len == 1){\r
716             return cs;\r
717         }\r
718         if(isIE && typeof cs[0].selectSingleNode != "undefined"){\r
719             return nodupIEXml(cs);\r
720         }\r
721         var d = ++key;\r
722         cs[0]._nodup = d;\r
723         for(i = 1; c = cs[i]; i++){\r
724             if(c._nodup != d){\r
725                 c._nodup = d;\r
726             }else{\r
727                 r = [];\r
728                 for(var j = 0; j < i; j++){\r
729                     r[++ri] = cs[j];\r
730                 }\r
731                 for(j = i+1; cj = cs[j]; j++){\r
732                     if(cj._nodup != d){\r
733                         cj._nodup = d;\r
734                         r[++ri] = cj;\r
735                     }\r
736                 }\r
737                 return r;\r
738             }\r
739         }\r
740         return r;\r
741     }\r
742 \r
743     function quickDiffIEXml(c1, c2){\r
744         var d = ++key;\r
745         for(var i = 0, len = c1.length; i < len; i++){\r
746             c1[i].setAttribute("_qdiff", d);\r
747         }\r
748         var r = [];\r
749         for(var i = 0, len = c2.length; i < len; i++){\r
750             if(c2[i].getAttribute("_qdiff") != d){\r
751                 r[r.length] = c2[i];\r
752             }\r
753         }\r
754         for(var i = 0, len = c1.length; i < len; i++){\r
755            c1[i].removeAttribute("_qdiff");\r
756         }\r
757         return r;\r
758     }\r
759 \r
760     function quickDiff(c1, c2){\r
761         var len1 = c1.length;\r
762         if(!len1){\r
763             return c2;\r
764         }\r
765         if(isIE && c1[0].selectSingleNode){\r
766             return quickDiffIEXml(c1, c2);\r
767         }\r
768         var d = ++key;\r
769         for(var i = 0; i < len1; i++){\r
770             c1[i]._qdiff = d;\r
771         }\r
772         var r = [];\r
773         for(var i = 0, len = c2.length; i < len; i++){\r
774             if(c2[i]._qdiff != d){\r
775                 r[r.length] = c2[i];\r
776             }\r
777         }\r
778         return r;\r
779     }\r
780 \r
781     function quickId(ns, mode, root, id){\r
782         if(ns == root){\r
783            var d = root.ownerDocument || root;\r
784            return d.getElementById(id);\r
785         }\r
786         ns = getNodes(ns, mode, "*");\r
787         return byId(ns, null, id);\r
788     }\r
789 \r
790     return {\r
791         getStyle : function(el, name){\r
792             return Ext.fly(el).getStyle(name);\r
793         },\r
794         \r
795         compile : function(path, type){\r
796             type = type || "select";\r
797 \r
798             var fn = ["var f = function(root){\n var mode; ++batch; var n = root || document;\n"];\r
799             var q = path, mode, lq;\r
800             var tk = Ext.DomQuery.matchers;\r
801             var tklen = tk.length;\r
802             var mm;\r
803 \r
804             
805             var lmode = q.match(modeRe);\r
806             if(lmode && lmode[1]){\r
807                 fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';\r
808                 q = q.replace(lmode[1], "");\r
809             }\r
810             
811             while(path.substr(0, 1)=="/"){\r
812                 path = path.substr(1);\r
813             }\r
814 \r
815             while(q && lq != q){\r
816                 lq = q;\r
817                 var tm = q.match(tagTokenRe);\r
818                 if(type == "select"){\r
819                     if(tm){\r
820                         if(tm[1] == "#"){\r
821                             fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';\r
822                         }else{\r
823                             fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';\r
824                         }\r
825                         q = q.replace(tm[0], "");\r
826                     }else if(q.substr(0, 1) != '@'){\r
827                         fn[fn.length] = 'n = getNodes(n, mode, "*");';\r
828                     }\r
829                 }else{\r
830                     if(tm){\r
831                         if(tm[1] == "#"){\r
832                             fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';\r
833                         }else{\r
834                             fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';\r
835                         }\r
836                         q = q.replace(tm[0], "");\r
837                     }\r
838                 }\r
839                 while(!(mm = q.match(modeRe))){\r
840                     var matched = false;\r
841                     for(var j = 0; j < tklen; j++){\r
842                         var t = tk[j];\r
843                         var m = q.match(t.re);\r
844                         if(m){\r
845                             fn[fn.length] = t.select.replace(tplRe, function(x, i){\r
846                                                     return m[i];\r
847                                                 });\r
848                             q = q.replace(m[0], "");\r
849                             matched = true;\r
850                             break;\r
851                         }\r
852                     }\r
853                     
854                     if(!matched){\r
855                         throw 'Error parsing selector, parsing failed at "' + q + '"';\r
856                     }\r
857                 }\r
858                 if(mm[1]){\r
859                     fn[fn.length] = 'mode="'+mm[1].replace(trimRe, "")+'";';\r
860                     q = q.replace(mm[1], "");\r
861                 }\r
862             }\r
863             fn[fn.length] = "return nodup(n);\n}";\r
864             eval(fn.join(""));\r
865             return f;\r
866         },\r
867 \r
868         \r
869         select : function(path, root, type){\r
870             if(!root || root == document){\r
871                 root = document;\r
872             }\r
873             if(typeof root == "string"){\r
874                 root = document.getElementById(root);\r
875             }\r
876             var paths = path.split(",");\r
877             var results = [];\r
878             for(var i = 0, len = paths.length; i < len; i++){\r
879                 var p = paths[i].replace(trimRe, "");\r
880                 if(!cache[p]){\r
881                     cache[p] = Ext.DomQuery.compile(p);\r
882                     if(!cache[p]){\r
883                         throw p + " is not a valid selector";\r
884                     }\r
885                 }\r
886                 var result = cache[p](root);\r
887                 if(result && result != document){\r
888                     results = results.concat(result);\r
889                 }\r
890             }\r
891             if(paths.length > 1){\r
892                 return nodup(results);\r
893             }\r
894             return results;\r
895         },\r
896 \r
897         \r
898         selectNode : function(path, root){\r
899             return Ext.DomQuery.select(path, root)[0];\r
900         },\r
901 \r
902         \r
903         selectValue : function(path, root, defaultValue){\r
904             path = path.replace(trimRe, "");\r
905             if(!valueCache[path]){\r
906                 valueCache[path] = Ext.DomQuery.compile(path, "select");\r
907             }\r
908             var n = valueCache[path](root);\r
909             n = n[0] ? n[0] : n;\r
910             var v = (n && n.firstChild ? n.firstChild.nodeValue : null);\r
911             return ((v === null||v === undefined||v==='') ? defaultValue : v);\r
912         },\r
913 \r
914         \r
915         selectNumber : function(path, root, defaultValue){\r
916             var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);\r
917             return parseFloat(v);\r
918         },\r
919 \r
920         \r
921         is : function(el, ss){\r
922             if(typeof el == "string"){\r
923                 el = document.getElementById(el);\r
924             }\r
925             var isArray = (el instanceof Array);\r
926             var result = Ext.DomQuery.filter(isArray ? el : [el], ss);\r
927             return isArray ? (result.length == el.length) : (result.length > 0);\r
928         },\r
929 \r
930         \r
931         filter : function(els, ss, nonMatches){\r
932             ss = ss.replace(trimRe, "");\r
933             if(!simpleCache[ss]){\r
934                 simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");\r
935             }\r
936             var result = simpleCache[ss](els);\r
937             return nonMatches ? quickDiff(result, els) : result;\r
938         },\r
939 \r
940         \r
941         matchers : [{\r
942                 re: /^\.([\w-]+)/,\r
943                 select: 'n = byClassName(n, null, " {1} ");'\r
944             }, {\r
945                 re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,\r
946                 select: 'n = byPseudo(n, "{1}", "{2}");'\r
947             },{\r
948                 re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,\r
949                 select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'\r
950             }, {\r
951                 re: /^#([\w-]+)/,\r
952                 select: 'n = byId(n, null, "{1}");'\r
953             },{\r
954                 re: /^@([\w-]+)/,\r
955                 select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'\r
956             }\r
957         ],\r
958 \r
959         \r
960         operators : {\r
961             "=" : function(a, v){\r
962                 return a == v;\r
963             },\r
964             "!=" : function(a, v){\r
965                 return a != v;\r
966             },\r
967             "^=" : function(a, v){\r
968                 return a && a.substr(0, v.length) == v;\r
969             },\r
970             "$=" : function(a, v){\r
971                 return a && a.substr(a.length-v.length) == v;\r
972             },\r
973             "*=" : function(a, v){\r
974                 return a && a.indexOf(v) !== -1;\r
975             },\r
976             "%=" : function(a, v){\r
977                 return (a % v) == 0;\r
978             },\r
979             "|=" : function(a, v){\r
980                 return a && (a == v || a.substr(0, v.length+1) == v+'-');\r
981             },\r
982             "~=" : function(a, v){\r
983                 return a && (' '+a+' ').indexOf(' '+v+' ') != -1;\r
984             }\r
985         },\r
986 \r
987         \r
988         pseudos : {\r
989             "first-child" : function(c){\r
990                 var r = [], ri = -1, n;\r
991                 for(var i = 0, ci; ci = n = c[i]; i++){\r
992                     while((n = n.previousSibling) && n.nodeType != 1);\r
993                     if(!n){\r
994                         r[++ri] = ci;\r
995                     }\r
996                 }\r
997                 return r;\r
998             },\r
999 \r
1000             "last-child" : function(c){\r
1001                 var r = [], ri = -1, n;\r
1002                 for(var i = 0, ci; ci = n = c[i]; i++){\r
1003                     while((n = n.nextSibling) && n.nodeType != 1);\r
1004                     if(!n){\r
1005                         r[++ri] = ci;\r
1006                     }\r
1007                 }\r
1008                 return r;\r
1009             },\r
1010 \r
1011             "nth-child" : function(c, a) {\r
1012                 var r = [], ri = -1;\r
1013                 var m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a);\r
1014                 var f = (m[1] || 1) - 0, l = m[2] - 0;\r
1015                 for(var i = 0, n; n = c[i]; i++){\r
1016                     var pn = n.parentNode;\r
1017                     if (batch != pn._batch) {\r
1018                         var j = 0;\r
1019                         for(var cn = pn.firstChild; cn; cn = cn.nextSibling){\r
1020                             if(cn.nodeType == 1){\r
1021                                cn.nodeIndex = ++j;\r
1022                             }\r
1023                         }\r
1024                         pn._batch = batch;\r
1025                     }\r
1026                     if (f == 1) {\r
1027                         if (l == 0 || n.nodeIndex == l){\r
1028                             r[++ri] = n;\r
1029                         }\r
1030                     } else if ((n.nodeIndex + l) % f == 0){\r
1031                         r[++ri] = n;\r
1032                     }\r
1033                 }\r
1034 \r
1035                 return r;\r
1036             },\r
1037 \r
1038             "only-child" : function(c){\r
1039                 var r = [], ri = -1;;\r
1040                 for(var i = 0, ci; ci = c[i]; i++){\r
1041                     if(!prev(ci) && !next(ci)){\r
1042                         r[++ri] = ci;\r
1043                     }\r
1044                 }\r
1045                 return r;\r
1046             },\r
1047 \r
1048             "empty" : function(c){\r
1049                 var r = [], ri = -1;\r
1050                 for(var i = 0, ci; ci = c[i]; i++){\r
1051                     var cns = ci.childNodes, j = 0, cn, empty = true;\r
1052                     while(cn = cns[j]){\r
1053                         ++j;\r
1054                         if(cn.nodeType == 1 || cn.nodeType == 3){\r
1055                             empty = false;\r
1056                             break;\r
1057                         }\r
1058                     }\r
1059                     if(empty){\r
1060                         r[++ri] = ci;\r
1061                     }\r
1062                 }\r
1063                 return r;\r
1064             },\r
1065 \r
1066             "contains" : function(c, v){\r
1067                 var r = [], ri = -1;\r
1068                 for(var i = 0, ci; ci = c[i]; i++){\r
1069                     if((ci.textContent||ci.innerText||'').indexOf(v) != -1){\r
1070                         r[++ri] = ci;\r
1071                     }\r
1072                 }\r
1073                 return r;\r
1074             },\r
1075 \r
1076             "nodeValue" : function(c, v){\r
1077                 var r = [], ri = -1;\r
1078                 for(var i = 0, ci; ci = c[i]; i++){\r
1079                     if(ci.firstChild && ci.firstChild.nodeValue == v){\r
1080                         r[++ri] = ci;\r
1081                     }\r
1082                 }\r
1083                 return r;\r
1084             },\r
1085 \r
1086             "checked" : function(c){\r
1087                 var r = [], ri = -1;\r
1088                 for(var i = 0, ci; ci = c[i]; i++){\r
1089                     if(ci.checked == true){\r
1090                         r[++ri] = ci;\r
1091                     }\r
1092                 }\r
1093                 return r;\r
1094             },\r
1095 \r
1096             "not" : function(c, ss){\r
1097                 return Ext.DomQuery.filter(c, ss, true);\r
1098             },\r
1099 \r
1100             "odd" : function(c){\r
1101                 return this["nth-child"](c, "odd");\r
1102             },\r
1103 \r
1104             "even" : function(c){\r
1105                 return this["nth-child"](c, "even");\r
1106             },\r
1107 \r
1108             "nth" : function(c, a){\r
1109                 return c[a-1] || [];\r
1110             },\r
1111 \r
1112             "first" : function(c){\r
1113                 return c[0] || [];\r
1114             },\r
1115 \r
1116             "last" : function(c){\r
1117                 return c[c.length-1] || [];\r
1118             },\r
1119 \r
1120             "has" : function(c, ss){\r
1121                 var s = Ext.DomQuery.select;\r
1122                 var r = [], ri = -1;\r
1123                 for(var i = 0, ci; ci = c[i]; i++){\r
1124                     if(s(ss, ci).length > 0){\r
1125                         r[++ri] = ci;\r
1126                     }\r
1127                 }\r
1128                 return r;\r
1129             },\r
1130 \r
1131             "next" : function(c, ss){\r
1132                 var is = Ext.DomQuery.is;\r
1133                 var r = [], ri = -1;\r
1134                 for(var i = 0, ci; ci = c[i]; i++){\r
1135                     var n = next(ci);\r
1136                     if(n && is(n, ss)){\r
1137                         r[++ri] = ci;\r
1138                     }\r
1139                 }\r
1140                 return r;\r
1141             },\r
1142 \r
1143             "prev" : function(c, ss){\r
1144                 var is = Ext.DomQuery.is;\r
1145                 var r = [], ri = -1;\r
1146                 for(var i = 0, ci; ci = c[i]; i++){\r
1147                     var n = prev(ci);\r
1148                     if(n && is(n, ss)){\r
1149                         r[++ri] = ci;\r
1150                     }\r
1151                 }\r
1152                 return r;\r
1153             }\r
1154         }\r
1155     };\r
1156 }();\r
1157 \r
1158 \r
1159 Ext.query = Ext.DomQuery.select;\r
1160
1161
1162 Ext.util.Observable = function(){
1163     if(this.listeners){
1164         this.on(this.listeners);
1165         delete this.listeners;
1166     }
1167 };
1168 Ext.util.Observable.prototype = {
1169     
1170     fireEvent : function(){
1171         var ce = this.events[arguments[0].toLowerCase()];
1172         if(typeof ce == "object"){
1173             return ce.fire.apply(ce, Array.prototype.slice.call(arguments, 1));
1174         }else{
1175             return true;
1176         }
1177     },
1178
1179         filterOptRe : /^(?:scope|delay|buffer|single)$/,
1180
1181     
1182     addListener : function(eventName, fn, scope, o){
1183         if(typeof eventName == "object"){
1184             o = eventName;
1185             for(var e in o){
1186                 if(this.filterOptRe.test(e)){
1187                     continue;
1188                 }
1189                 if(typeof o[e] == "function"){
1190                                         this.addListener(e, o[e], o.scope,  o);
1191                 }else{
1192                                         this.addListener(e, o[e].fn, o[e].scope, o[e]);
1193                 }
1194             }
1195             return;
1196         }
1197         o = (!o || typeof o == "boolean") ? {} : o;
1198         eventName = eventName.toLowerCase();
1199         var ce = this.events[eventName] || true;
1200         if(typeof ce == "boolean"){
1201             ce = new Ext.util.Event(this, eventName);
1202             this.events[eventName] = ce;
1203         }
1204         ce.addListener(fn, scope, o);
1205     },
1206
1207     
1208     removeListener : function(eventName, fn, scope){
1209         var ce = this.events[eventName.toLowerCase()];
1210         if(typeof ce == "object"){
1211             ce.removeListener(fn, scope);
1212         }
1213     },
1214
1215     
1216     purgeListeners : function(){
1217         for(var evt in this.events){
1218             if(typeof this.events[evt] == "object"){
1219                  this.events[evt].clearListeners();
1220             }
1221         }
1222     },
1223
1224     relayEvents : function(o, events){
1225         var createHandler = function(ename){
1226             return function(){
1227                 return this.fireEvent.apply(this, Ext.combine(ename, Array.prototype.slice.call(arguments, 0)));
1228             };
1229         };
1230         for(var i = 0, len = events.length; i < len; i++){
1231             var ename = events[i];
1232             if(!this.events[ename]){ this.events[ename] = true; };
1233             o.on(ename, createHandler(ename), this);
1234         }
1235     },
1236
1237     
1238     addEvents : function(o){
1239         if(!this.events){
1240             this.events = {};
1241         }
1242         Ext.applyIf(this.events, o);
1243     },
1244
1245     
1246     hasListener : function(eventName){
1247         var e = this.events[eventName];
1248         return typeof e == "object" && e.listeners.length > 0;
1249     }
1250 };
1251
1252 Ext.util.Observable.prototype.on = Ext.util.Observable.prototype.addListener;
1253
1254 Ext.util.Observable.prototype.un = Ext.util.Observable.prototype.removeListener;
1255
1256
1257 Ext.util.Observable.capture = function(o, fn, scope){
1258     o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
1259 };
1260
1261
1262 Ext.util.Observable.releaseCapture = function(o){
1263     o.fireEvent = Ext.util.Observable.prototype.fireEvent;
1264 };
1265
1266 (function(){
1267
1268     var createBuffered = function(h, o, scope){
1269         var task = new Ext.util.DelayedTask();
1270         return function(){
1271             task.delay(o.buffer, h, scope, Array.prototype.slice.call(arguments, 0));
1272         };
1273     };
1274
1275     var createSingle = function(h, e, fn, scope){
1276         return function(){
1277             e.removeListener(fn, scope);
1278             return h.apply(scope, arguments);
1279         };
1280     };
1281
1282     var createDelayed = function(h, o, scope){
1283         return function(){
1284             var args = Array.prototype.slice.call(arguments, 0);
1285             setTimeout(function(){
1286                 h.apply(scope, args);
1287             }, o.delay || 10);
1288         };
1289     };
1290
1291     Ext.util.Event = function(obj, name){
1292         this.name = name;
1293         this.obj = obj;
1294         this.listeners = [];
1295     };
1296
1297     Ext.util.Event.prototype = {
1298         addListener : function(fn, scope, options){
1299             var o = options || {};
1300             scope = scope || this.obj;
1301             if(!this.isListening(fn, scope)){
1302                 var l = {fn: fn, scope: scope, options: o};
1303                 var h = fn;
1304                 if(o.delay){
1305                     h = createDelayed(h, o, scope);
1306                 }
1307                 if(o.single){
1308                     h = createSingle(h, this, fn, scope);
1309                 }
1310                 if(o.buffer){
1311                     h = createBuffered(h, o, scope);
1312                 }
1313                 l.fireFn = h;
1314                 if(!this.firing){                     this.listeners.push(l);
1315                 }else{
1316                     this.listeners = this.listeners.slice(0);
1317                     this.listeners.push(l);
1318                 }
1319             }
1320         },
1321
1322         findListener : function(fn, scope){
1323             scope = scope || this.obj;
1324             var ls = this.listeners;
1325             for(var i = 0, len = ls.length; i < len; i++){
1326                 var l = ls[i];
1327                 if(l.fn == fn && l.scope == scope){
1328                     return i;
1329                 }
1330             }
1331             return -1;
1332         },
1333
1334         isListening : function(fn, scope){
1335             return this.findListener(fn, scope) != -1;
1336         },
1337
1338         removeListener : function(fn, scope){
1339             var index;
1340             if((index = this.findListener(fn, scope)) != -1){
1341                 if(!this.firing){
1342                     this.listeners.splice(index, 1);
1343                 }else{
1344                     this.listeners = this.listeners.slice(0);
1345                     this.listeners.splice(index, 1);
1346                 }
1347                 return true;
1348             }
1349             return false;
1350         },
1351
1352         clearListeners : function(){
1353             this.listeners = [];
1354         },
1355
1356         fire : function(){
1357             var ls = this.listeners, scope, len = ls.length;
1358             if(len > 0){
1359                 this.firing = true;
1360                 var args = Array.prototype.slice.call(arguments, 0);
1361                 for(var i = 0; i < len; i++){
1362                     var l = ls[i];
1363                     if(l.fireFn.apply(l.scope||this.obj||window, arguments) === false){
1364                         this.firing = false;
1365                         return false;
1366                     }
1367                 }
1368                 this.firing = false;
1369             }
1370             return true;
1371         }
1372     };
1373 })();
1374 \r
1375 Ext.EventManager = function(){\r
1376     var docReadyEvent, docReadyProcId, docReadyState = false;\r
1377     var resizeEvent, resizeTask, textEvent, textSize;\r
1378     var E = Ext.lib.Event;\r
1379     var D = Ext.lib.Dom;\r
1380 \r
1381 \r
1382     var fireDocReady = function(){\r
1383         if(!docReadyState){\r
1384             docReadyState = true;\r
1385             Ext.isReady = true;\r
1386             if(docReadyProcId){\r
1387                 clearInterval(docReadyProcId);\r
1388             }\r
1389             if(Ext.isGecko || Ext.isOpera) {\r
1390                 document.removeEventListener("DOMContentLoaded", fireDocReady, false);\r
1391             }\r
1392             if(Ext.isIE){\r
1393                 var defer = document.getElementById("ie-deferred-loader");\r
1394                 if(defer){\r
1395                     defer.onreadystatechange = null;\r
1396                     defer.parentNode.removeChild(defer);\r
1397                 }\r
1398             }\r
1399             if(docReadyEvent){\r
1400                 docReadyEvent.fire();\r
1401                 docReadyEvent.clearListeners();\r
1402             }\r
1403         }\r
1404     };\r
1405     \r
1406     var initDocReady = function(){\r
1407         docReadyEvent = new Ext.util.Event();\r
1408         if(Ext.isGecko || Ext.isOpera) {\r
1409             document.addEventListener("DOMContentLoaded", fireDocReady, false);\r
1410         }else if(Ext.isIE){\r
1411             document.write("<s"+'cript id="ie-deferred-loader" defer="defer" src="/'+'/:"></s'+"cript>");\r
1412             var defer = document.getElementById("ie-deferred-loader");\r
1413             defer.onreadystatechange = function(){\r
1414                 if(this.readyState == "complete"){\r
1415                     fireDocReady();\r
1416                 }\r
1417             };\r
1418         }else if(Ext.isSafari){ \r
1419             docReadyProcId = setInterval(function(){\r
1420                 var rs = document.readyState;\r
1421                 if(rs == "complete") {\r
1422                     fireDocReady();     \r
1423                  }\r
1424             }, 10);\r
1425         }\r
1426         
1427         E.on(window, "load", fireDocReady);\r
1428     };\r
1429 \r
1430     var createBuffered = function(h, o){\r
1431         var task = new Ext.util.DelayedTask(h);\r
1432         return function(e){\r
1433             
1434             e = new Ext.EventObjectImpl(e);\r
1435             task.delay(o.buffer, h, null, [e]);\r
1436         };\r
1437     };\r
1438 \r
1439     var createSingle = function(h, el, ename, fn){\r
1440         return function(e){\r
1441             Ext.EventManager.removeListener(el, ename, fn);\r
1442             h(e);\r
1443         };\r
1444     };\r
1445 \r
1446     var createDelayed = function(h, o){\r
1447         return function(e){\r
1448             
1449             e = new Ext.EventObjectImpl(e);\r
1450             setTimeout(function(){\r
1451                 h(e);\r
1452             }, o.delay || 10);\r
1453         };\r
1454     };\r
1455 \r
1456     var listen = function(element, ename, opt, fn, scope){\r
1457         var o = (!opt || typeof opt == "boolean") ? {} : opt;\r
1458         fn = fn || o.fn; scope = scope || o.scope;\r
1459         var el = Ext.getDom(element);\r
1460         if(!el){\r
1461             throw "Error listening for \"" + ename + '\". Element "' + element + '" doesn\'t exist.';\r
1462         }\r
1463         var h = function(e){\r
1464             e = Ext.EventObject.setEvent(e);\r
1465             var t;\r
1466             if(o.delegate){\r
1467                 t = e.getTarget(o.delegate, el);\r
1468                 if(!t){\r
1469                     return;\r
1470                 }\r
1471             }else{\r
1472                 t = e.target;\r
1473             }\r
1474             if(o.stopEvent === true){\r
1475                 e.stopEvent();\r
1476             }\r
1477             if(o.preventDefault === true){\r
1478                e.preventDefault();\r
1479             }\r
1480             if(o.stopPropagation === true){\r
1481                 e.stopPropagation();\r
1482             }\r
1483 \r
1484             if(o.normalized === false){\r
1485                 e = e.browserEvent;\r
1486             }\r
1487 \r
1488             fn.call(scope || el, e, t, o);\r
1489         };\r
1490         if(o.delay){\r
1491             h = createDelayed(h, o);\r
1492         }\r
1493         if(o.single){\r
1494             h = createSingle(h, el, ename, fn);\r
1495         }\r
1496         if(o.buffer){\r
1497             h = createBuffered(h, o);\r
1498         }\r
1499         fn._handlers = fn._handlers || [];\r
1500         fn._handlers.push([Ext.id(el), ename, h]);\r
1501 \r
1502         E.on(el, ename, h);\r
1503         if(ename == "mousewheel" && el.addEventListener){ 
1504             el.addEventListener("DOMMouseScroll", h, false);\r
1505             E.on(window, 'unload', function(){\r
1506                 el.removeEventListener("DOMMouseScroll", h, false);\r
1507             });\r
1508         }\r
1509         if(ename == "mousedown" && el == document){ 
1510             Ext.EventManager.stoppedMouseDownEvent.addListener(h);\r
1511         }\r
1512         return h;\r
1513     };\r
1514 \r
1515     var stopListening = function(el, ename, fn){\r
1516         var id = Ext.id(el), hds = fn._handlers, hd = fn;\r
1517         if(hds){\r
1518             for(var i = 0, len = hds.length; i < len; i++){\r
1519                 var h = hds[i];\r
1520                 if(h[0] == id && h[1] == ename){\r
1521                     hd = h[2];\r
1522                     hds.splice(i, 1);\r
1523                     break;\r
1524                 }\r
1525             }\r
1526         }\r
1527         E.un(el, ename, hd);\r
1528         el = Ext.getDom(el);\r
1529         if(ename == "mousewheel" && el.addEventListener){\r
1530             el.removeEventListener("DOMMouseScroll", hd, false);\r
1531         }\r
1532         if(ename == "mousedown" && el == document){ 
1533             Ext.EventManager.stoppedMouseDownEvent.removeListener(hd);\r
1534         }\r
1535     };\r
1536 \r
1537     var propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/;\r
1538     var pub = {\r
1539         \r
1540         \r
1541         wrap : function(fn, scope, override){\r
1542             return function(e){\r
1543                 Ext.EventObject.setEvent(e);\r
1544                 fn.call(override ? scope || window : window, Ext.EventObject, scope);\r
1545             };\r
1546         },\r
1547         \r
1548         \r
1549         addListener : function(element, eventName, fn, scope, options){\r
1550             if(typeof eventName == "object"){\r
1551                 var o = eventName;\r
1552                 for(var e in o){\r
1553                     if(propRe.test(e)){\r
1554                         continue;\r
1555                     }\r
1556                     if(typeof o[e] == "function"){\r
1557                         
1558                         listen(element, e, o, o[e], o.scope);\r
1559                     }else{\r
1560                         
1561                         listen(element, e, o[e]);\r
1562                     }\r
1563                 }\r
1564                 return;\r
1565             }\r
1566             return listen(element, eventName, options, fn, scope);\r
1567         },\r
1568         \r
1569         \r
1570         removeListener : function(element, eventName, fn){\r
1571             return stopListening(element, eventName, fn);\r
1572         },\r
1573         \r
1574         \r
1575         onDocumentReady : function(fn, scope, options){\r
1576             if(docReadyState){ 
1577                 docReadyEvent.addListener(fn, scope, options);\r
1578                 docReadyEvent.fire();\r
1579                 docReadyEvent.clearListeners();\r
1580                 return;\r
1581             }\r
1582             if(!docReadyEvent){\r
1583                 initDocReady();\r
1584             }\r
1585             docReadyEvent.addListener(fn, scope, options);\r
1586         },\r
1587         \r
1588         \r
1589         onWindowResize : function(fn, scope, options){\r
1590             if(!resizeEvent){\r
1591                 resizeEvent = new Ext.util.Event();\r
1592                 resizeTask = new Ext.util.DelayedTask(function(){\r
1593                     resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
1594                 });\r
1595                 E.on(window, "resize", function(){\r
1596                     if(Ext.isIE){\r
1597                         resizeTask.delay(50);\r
1598                     }else{\r
1599                         resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
1600                     }\r
1601                 });\r
1602             }\r
1603             resizeEvent.addListener(fn, scope, options);\r
1604         },\r
1605 \r
1606         \r
1607         onTextResize : function(fn, scope, options){\r
1608             if(!textEvent){\r
1609                 textEvent = new Ext.util.Event();\r
1610                 var textEl = new Ext.Element(document.createElement('div'));\r
1611                 textEl.dom.className = 'x-text-resize';\r
1612                 textEl.dom.innerHTML = 'X';\r
1613                 textEl.appendTo(document.body);\r
1614                 textSize = textEl.dom.offsetHeight;\r
1615                 setInterval(function(){\r
1616                     if(textEl.dom.offsetHeight != textSize){\r
1617                         textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);\r
1618                     }\r
1619                 }, this.textResizeInterval);\r
1620             }\r
1621             textEvent.addListener(fn, scope, options);\r
1622         },\r
1623 \r
1624         \r
1625         removeResizeListener : function(fn, scope){\r
1626             if(resizeEvent){\r
1627                 resizeEvent.removeListener(fn, scope);\r
1628             }\r
1629         },\r
1630 \r
1631         
1632         fireResize : function(){\r
1633             if(resizeEvent){\r
1634                 resizeEvent.fire(D.getViewWidth(), D.getViewHeight());\r
1635             }   \r
1636         },\r
1637         \r
1638         ieDeferSrc : false,\r
1639         \r
1640         textResizeInterval : 50\r
1641     };\r
1642      \r
1643     pub.on = pub.addListener;\r
1644     pub.un = pub.removeListener;\r
1645 \r
1646     pub.stoppedMouseDownEvent = new Ext.util.Event();\r
1647     return pub;\r
1648 }();\r
1649 \r
1650 Ext.onReady = Ext.EventManager.onDocumentReady;\r
1651 \r
1652 Ext.onReady(function(){\r
1653     var bd = Ext.get(document.body);\r
1654     if(!bd){ return; }\r
1655 \r
1656     var cls = [\r
1657             Ext.isIE ? "ext-ie"\r
1658             : Ext.isGecko ? "ext-gecko"\r
1659             : Ext.isOpera ? "ext-opera"\r
1660             : Ext.isSafari ? "ext-safari" : ""];\r
1661 \r
1662     if(Ext.isMac){\r
1663         cls.push("ext-mac");\r
1664     }\r
1665     if(Ext.isLinux){\r
1666         cls.push("ext-linux");\r
1667     }\r
1668     if(Ext.isBorderBox){\r
1669         cls.push('ext-border-box');\r
1670     }\r
1671     if(Ext.isStrict){ 
1672         var p = bd.dom.parentNode;\r
1673         if(p){\r
1674             p.className += ' ext-strict';\r
1675         }\r
1676     }\r
1677     bd.addClass(cls.join(' '));\r
1678 });\r
1679 \r
1680 \r
1681 Ext.EventObject = function(){\r
1682     \r
1683     var E = Ext.lib.Event;\r
1684     \r
1685     
1686     var safariKeys = {\r
1687         63234 : 37, 
1688         63235 : 39, 
1689         63232 : 38, 
1690         63233 : 40, 
1691         63276 : 33, 
1692         63277 : 34, 
1693         63272 : 46, 
1694         63273 : 36, 
1695         63275 : 35  
1696     };\r
1697 \r
1698     
1699     var btnMap = Ext.isIE ? {1:0,4:1,2:2} :\r
1700                 (Ext.isSafari ? {1:0,2:1,3:2} : {0:0,1:1,2:2});\r
1701 \r
1702     Ext.EventObjectImpl = function(e){\r
1703         if(e){\r
1704             this.setEvent(e.browserEvent || e);\r
1705         }\r
1706     };\r
1707     Ext.EventObjectImpl.prototype = {\r
1708         \r
1709         browserEvent : null,\r
1710         \r
1711         button : -1,\r
1712         \r
1713         shiftKey : false,\r
1714         \r
1715         ctrlKey : false,\r
1716         \r
1717         altKey : false,\r
1718 \r
1719         \r
1720         BACKSPACE : 8,\r
1721         \r
1722         TAB : 9,\r
1723         \r
1724         RETURN : 13,\r
1725         \r
1726         ENTER : 13,\r
1727         \r
1728         SHIFT : 16,\r
1729         \r
1730         CONTROL : 17,\r
1731         \r
1732         ESC : 27,\r
1733         \r
1734         SPACE : 32,\r
1735         \r
1736         PAGEUP : 33,\r
1737         \r
1738         PAGEDOWN : 34,\r
1739         \r
1740         END : 35,\r
1741         \r
1742         HOME : 36,\r
1743         \r
1744         LEFT : 37,\r
1745         \r
1746         UP : 38,\r
1747         \r
1748         RIGHT : 39,\r
1749         \r
1750         DOWN : 40,\r
1751         \r
1752         DELETE : 46,\r
1753         \r
1754         F5 : 116,\r
1755 \r
1756            \r
1757         setEvent : function(e){\r
1758             if(e == this || (e && e.browserEvent)){ 
1759                 return e;\r
1760             }\r
1761             this.browserEvent = e;\r
1762             if(e){\r
1763                 
1764                 this.button = e.button ? btnMap[e.button] : (e.which ? e.which-1 : -1);\r
1765                 if(e.type == 'click' && this.button == -1){\r
1766                     this.button = 0;\r
1767                 }\r
1768                 this.type = e.type;\r
1769                 this.shiftKey = e.shiftKey;\r
1770                 
1771                 this.ctrlKey = e.ctrlKey || e.metaKey;\r
1772                 this.altKey = e.altKey;\r
1773                 
1774                 this.keyCode = e.keyCode;\r
1775                 this.charCode = e.charCode;\r
1776                 
1777                 this.target = E.getTarget(e);\r
1778                 
1779                 this.xy = E.getXY(e);\r
1780             }else{\r
1781                 this.button = -1;\r
1782                 this.shiftKey = false;\r
1783                 this.ctrlKey = false;\r
1784                 this.altKey = false;\r
1785                 this.keyCode = 0;\r
1786                 this.charCode =0;\r
1787                 this.target = null;\r
1788                 this.xy = [0, 0];\r
1789             }\r
1790             return this;\r
1791         },\r
1792 \r
1793         \r
1794         stopEvent : function(){\r
1795             if(this.browserEvent){\r
1796                 if(this.browserEvent.type == 'mousedown'){\r
1797                     Ext.EventManager.stoppedMouseDownEvent.fire(this);\r
1798                 }\r
1799                 E.stopEvent(this.browserEvent);\r
1800             }\r
1801         },\r
1802 \r
1803         \r
1804         preventDefault : function(){\r
1805             if(this.browserEvent){\r
1806                 E.preventDefault(this.browserEvent);\r
1807             }\r
1808         },\r
1809 \r
1810         \r
1811         isNavKeyPress : function(){\r
1812             var k = this.keyCode;\r
1813             k = Ext.isSafari ? (safariKeys[k] || k) : k;\r
1814             return (k >= 33 && k <= 40) || k == this.RETURN || k == this.TAB || k == this.ESC;\r
1815         },\r
1816 \r
1817         isSpecialKey : function(){\r
1818             var k = this.keyCode;\r
1819             return (this.type == 'keypress' && this.ctrlKey) || k == 9 || k == 13  || k == 40 || k == 27 ||\r
1820             (k == 16) || (k == 17) ||\r
1821             (k >= 18 && k <= 20) ||\r
1822             (k >= 33 && k <= 35) ||\r
1823             (k >= 36 && k <= 39) ||\r
1824             (k >= 44 && k <= 45);\r
1825         },\r
1826         \r
1827         stopPropagation : function(){\r
1828             if(this.browserEvent){\r
1829                 if(this.type == 'mousedown'){\r
1830                     Ext.EventManager.stoppedMouseDownEvent.fire(this);\r
1831                 }\r
1832                 E.stopPropagation(this.browserEvent);\r
1833             }\r
1834         },\r
1835 \r
1836         \r
1837         getCharCode : function(){\r
1838             return this.charCode || this.keyCode;\r
1839         },\r
1840 \r
1841         \r
1842         getKey : function(){\r
1843             var k = this.keyCode || this.charCode;\r
1844             return Ext.isSafari ? (safariKeys[k] || k) : k;\r
1845         },\r
1846 \r
1847         \r
1848         getPageX : function(){\r
1849             return this.xy[0];\r
1850         },\r
1851 \r
1852         \r
1853         getPageY : function(){\r
1854             return this.xy[1];\r
1855         },\r
1856 \r
1857         \r
1858         getTime : function(){\r
1859             if(this.browserEvent){\r
1860                 return E.getTime(this.browserEvent);\r
1861             }\r
1862             return null;\r
1863         },\r
1864 \r
1865         \r
1866         getXY : function(){\r
1867             return this.xy;\r
1868         },\r
1869 \r
1870         \r
1871         getTarget : function(selector, maxDepth, returnEl){\r
1872             return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : this.target;\r
1873         },\r
1874         \r
1875         getRelatedTarget : function(){\r
1876             if(this.browserEvent){\r
1877                 return E.getRelatedTarget(this.browserEvent);\r
1878             }\r
1879             return null;\r
1880         },\r
1881 \r
1882         \r
1883         getWheelDelta : function(){\r
1884             var e = this.browserEvent;\r
1885             var delta = 0;\r
1886             if(e.wheelDelta){ \r
1887                 delta = e.wheelDelta/120;\r
1888             }else if(e.detail){ \r
1889                 delta = -e.detail/3;\r
1890             }\r
1891             return delta;\r
1892         },\r
1893 \r
1894         \r
1895         hasModifier : function(){\r
1896             return !!((this.ctrlKey || this.altKey) || this.shiftKey);\r
1897         },\r
1898 \r
1899         \r
1900         within : function(el, related){\r
1901             var t = this[related ? "getRelatedTarget" : "getTarget"]();\r
1902             return t && Ext.fly(el).contains(t);\r
1903         },\r
1904 \r
1905         getPoint : function(){\r
1906             return new Ext.lib.Point(this.xy[0], this.xy[1]);\r
1907         }\r
1908     };\r
1909 \r
1910     return new Ext.EventObjectImpl();\r
1911 }();\r
1912             \r
1913     
1914 \r
1915 (function(){\r
1916 var D = Ext.lib.Dom;\r
1917 var E = Ext.lib.Event;\r
1918 var A = Ext.lib.Anim;\r
1919 \r
1920
1921 var propCache = {};\r
1922 var camelRe = /(-[a-z])/gi;\r
1923 var camelFn = function(m, a){ return a.charAt(1).toUpperCase(); };\r
1924 var view = document.defaultView;\r
1925 \r
1926 Ext.Element = function(element, forceNew){\r
1927     var dom = typeof element == "string" ?\r
1928             document.getElementById(element) : element;\r
1929     if(!dom){ 
1930         return null;\r
1931     }\r
1932     var id = dom.id;\r
1933     if(forceNew !== true && id && Ext.Element.cache[id]){ 
1934         return Ext.Element.cache[id];\r
1935     }\r
1936 \r
1937     \r
1938     this.dom = dom;\r
1939 \r
1940     \r
1941     this.id = id || Ext.id(dom);\r
1942 };\r
1943 \r
1944 var El = Ext.Element;\r
1945 \r
1946 El.prototype = {\r
1947     \r
1948     originalDisplay : "",\r
1949 \r
1950     visibilityMode : 1,\r
1951     \r
1952     defaultUnit : "px",\r
1953     \r
1954     setVisibilityMode : function(visMode){\r
1955         this.visibilityMode = visMode;\r
1956         return this;\r
1957     },\r
1958     \r
1959     enableDisplayMode : function(display){\r
1960         this.setVisibilityMode(El.DISPLAY);\r
1961         if(typeof display != "undefined") this.originalDisplay = display;\r
1962         return this;\r
1963     },\r
1964 \r
1965     \r
1966     findParent : function(simpleSelector, maxDepth, returnEl){\r
1967         var p = this.dom, b = document.body, depth = 0, dq = Ext.DomQuery, stopEl;\r
1968         maxDepth = maxDepth || 50;\r
1969         if(typeof maxDepth != "number"){\r
1970             stopEl = Ext.getDom(maxDepth);\r
1971             maxDepth = 10;\r
1972         }\r
1973         while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){\r
1974             if(dq.is(p, simpleSelector)){\r
1975                 return returnEl ? Ext.get(p) : p;\r
1976             }\r
1977             depth++;\r
1978             p = p.parentNode;\r
1979         }\r
1980         return null;\r
1981     },\r
1982 \r
1983 \r
1984     \r
1985     findParentNode : function(simpleSelector, maxDepth, returnEl){\r
1986         var p = Ext.fly(this.dom.parentNode, '_internal');\r
1987         return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;\r
1988     },\r
1989 \r
1990     \r
1991     up : function(simpleSelector, maxDepth){\r
1992         return this.findParentNode(simpleSelector, maxDepth, true);\r
1993     },\r
1994 \r
1995 \r
1996 \r
1997     \r
1998     is : function(simpleSelector){\r
1999         return Ext.DomQuery.is(this.dom, simpleSelector);\r
2000     },\r
2001 \r
2002     \r
2003     animate : function(args, duration, onComplete, easing, animType){\r
2004         this.anim(args, {duration: duration, callback: onComplete, easing: easing}, animType);\r
2005         return this;\r
2006     },\r
2007 \r
2008     \r
2009     anim : function(args, opt, animType, defaultDur, defaultEase, cb){\r
2010         animType = animType || 'run';\r
2011         opt = opt || {};\r
2012         var anim = Ext.lib.Anim[animType](\r
2013             this.dom, args,\r
2014             (opt.duration || defaultDur) || .35,\r
2015             (opt.easing || defaultEase) || 'easeOut',\r
2016             function(){\r
2017                 Ext.callback(cb, this);\r
2018                 Ext.callback(opt.callback, opt.scope || this, [this, opt]);\r
2019             },\r
2020             this\r
2021         );\r
2022         opt.anim = anim;\r
2023         return anim;\r
2024     },\r
2025 \r
2026     
2027     preanim : function(a, i){\r
2028         return !a[i] ? false : (typeof a[i] == "object" ? a[i]: {duration: a[i+1], callback: a[i+2], easing: a[i+3]});\r
2029     },\r
2030 \r
2031     \r
2032     clean : function(forceReclean){\r
2033         if(this.isCleaned && forceReclean !== true){\r
2034             return this;\r
2035         }\r
2036         var ns = /\S/;\r
2037         var d = this.dom, n = d.firstChild, ni = -1;\r
2038             while(n){\r
2039                 var nx = n.nextSibling;\r
2040                 if(n.nodeType == 3 && !ns.test(n.nodeValue)){\r
2041                     d.removeChild(n);\r
2042                 }else{\r
2043                     n.nodeIndex = ++ni;\r
2044                 }\r
2045                 n = nx;\r
2046             }\r
2047             this.isCleaned = true;\r
2048             return this;\r
2049         },\r
2050 \r
2051     
2052     calcOffsetsTo : function(el){\r
2053         el = Ext.get(el);\r
2054         var d = el.dom;\r
2055         var restorePos = false;\r
2056         if(el.getStyle('position') == 'static'){\r
2057             el.position('relative');\r
2058             restorePos = true;\r
2059         }\r
2060         var x = 0, y =0;\r
2061         var op = this.dom;\r
2062         while(op && op != d && op.tagName != 'HTML'){\r
2063             x+= op.offsetLeft;\r
2064             y+= op.offsetTop;\r
2065             op = op.offsetParent;\r
2066         }\r
2067         if(restorePos){\r
2068             el.position('static');\r
2069         }\r
2070         return [x, y];\r
2071     },\r
2072 \r
2073     \r
2074     scrollIntoView : function(container, hscroll){\r
2075         var c = Ext.getDom(container) || document.body;\r
2076         var el = this.dom;\r
2077 \r
2078         var o = this.calcOffsetsTo(c),\r
2079             l = o[0],\r
2080             t = o[1],\r
2081             b = t+el.offsetHeight,\r
2082             r = l+el.offsetWidth;\r
2083 \r
2084         var ch = c.clientHeight;\r
2085         var ct = parseInt(c.scrollTop, 10);\r
2086         var cl = parseInt(c.scrollLeft, 10);\r
2087         var cb = ct + ch;\r
2088         var cr = cl + c.clientWidth;\r
2089 \r
2090         if(t < ct){\r
2091                 c.scrollTop = t;\r
2092         }else if(b > cb){\r
2093             c.scrollTop = b-ch;\r
2094         }\r
2095 \r
2096         if(hscroll !== false){\r
2097             if(l < cl){\r
2098                 c.scrollLeft = l;\r
2099             }else if(r > cr){\r
2100                 c.scrollLeft = r-c.clientWidth;\r
2101             }\r
2102         }\r
2103         return this;\r
2104     },\r
2105 \r
2106     
2107     scrollChildIntoView : function(child, hscroll){\r
2108         Ext.fly(child, '_scrollChildIntoView').scrollIntoView(this, hscroll);\r
2109     },\r
2110 \r
2111     \r
2112     autoHeight : function(animate, duration, onComplete, easing){\r
2113         var oldHeight = this.getHeight();\r
2114         this.clip();\r
2115         this.setHeight(1); 
2116         setTimeout(function(){\r
2117             var height = parseInt(this.dom.scrollHeight, 10); 
2118             if(!animate){\r
2119                 this.setHeight(height);\r
2120                 this.unclip();\r
2121                 if(typeof onComplete == "function"){\r
2122                     onComplete();\r
2123                 }\r
2124             }else{\r
2125                 this.setHeight(oldHeight); 
2126                 this.setHeight(height, animate, duration, function(){\r
2127                     this.unclip();\r
2128                     if(typeof onComplete == "function") onComplete();\r
2129                 }.createDelegate(this), easing);\r
2130             }\r
2131         }.createDelegate(this), 0);\r
2132         return this;\r
2133     },\r
2134 \r
2135     \r
2136     contains : function(el){\r
2137         if(!el){return false;}\r
2138         return D.isAncestor(this.dom, el.dom ? el.dom : el);\r
2139     },\r
2140 \r
2141     \r
2142     isVisible : function(deep) {\r
2143         var vis = !(this.getStyle("visibility") == "hidden" || this.getStyle("display") == "none");\r
2144         if(deep !== true || !vis){\r
2145             return vis;\r
2146         }\r
2147         var p = this.dom.parentNode;\r
2148         while(p && p.tagName.toLowerCase() != "body"){\r
2149             if(!Ext.fly(p, '_isVisible').isVisible()){\r
2150                 return false;\r
2151             }\r
2152             p = p.parentNode;\r
2153         }\r
2154         return true;\r
2155     },\r
2156 \r
2157     \r
2158     select : function(selector, unique){\r
2159         return El.select(selector, unique, this.dom);\r
2160     },\r
2161 \r
2162     \r
2163     query : function(selector, unique){\r
2164         return Ext.DomQuery.select(selector, this.dom);\r
2165     },\r
2166 \r
2167     \r
2168     child : function(selector, returnDom){\r
2169         var n = Ext.DomQuery.selectNode(selector, this.dom);\r
2170         return returnDom ? n : Ext.get(n);\r
2171     },\r
2172 \r
2173     \r
2174     down : function(selector, returnDom){\r
2175         var n = Ext.DomQuery.selectNode(" > " + selector, this.dom);\r
2176         return returnDom ? n : Ext.get(n);\r
2177     },\r
2178 \r
2179     \r
2180     initDD : function(group, config, overrides){\r
2181         var dd = new Ext.dd.DD(Ext.id(this.dom), group, config);\r
2182         return Ext.apply(dd, overrides);\r
2183     },\r
2184 \r
2185     \r
2186     initDDProxy : function(group, config, overrides){\r
2187         var dd = new Ext.dd.DDProxy(Ext.id(this.dom), group, config);\r
2188         return Ext.apply(dd, overrides);\r
2189     },\r
2190 \r
2191     \r
2192     initDDTarget : function(group, config, overrides){\r
2193         var dd = new Ext.dd.DDTarget(Ext.id(this.dom), group, config);\r
2194         return Ext.apply(dd, overrides);\r
2195     },\r
2196 \r
2197     \r
2198      setVisible : function(visible, animate){\r
2199         if(!animate || !A){\r
2200             if(this.visibilityMode == El.DISPLAY){\r
2201                 this.setDisplayed(visible);\r
2202             }else{\r
2203                 this.fixDisplay();\r
2204                 this.dom.style.visibility = visible ? "visible" : "hidden";\r
2205             }\r
2206         }else{\r
2207             
2208             var dom = this.dom;\r
2209             var visMode = this.visibilityMode;\r
2210             if(visible){\r
2211                 this.setOpacity(.01);\r
2212                 this.setVisible(true);\r
2213             }\r
2214             this.anim({opacity: { to: (visible?1:0) }},\r
2215                   this.preanim(arguments, 1),\r
2216                   null, .35, 'easeIn', function(){\r
2217                      if(!visible){\r
2218                          if(visMode == El.DISPLAY){\r
2219                              dom.style.display = "none";\r
2220                          }else{\r
2221                              dom.style.visibility = "hidden";\r
2222                          }\r
2223                          Ext.get(dom).setOpacity(1);\r
2224                      }\r
2225                  });\r
2226         }\r
2227         return this;\r
2228     },\r
2229 \r
2230     \r
2231     isDisplayed : function() {\r
2232         return this.getStyle("display") != "none";\r
2233     },\r
2234 \r
2235     \r
2236     toggle : function(animate){\r
2237         this.setVisible(!this.isVisible(), this.preanim(arguments, 0));\r
2238         return this;\r
2239     },\r
2240 \r
2241     \r
2242     setDisplayed : function(value) {\r
2243         if(typeof value == "boolean"){\r
2244            value = value ? this.originalDisplay : "none";\r
2245         }\r
2246         this.setStyle("display", value);\r
2247         return this;\r
2248     },\r
2249 \r
2250     \r
2251     focus : function() {\r
2252         try{\r
2253             this.dom.focus();\r
2254         }catch(e){}\r
2255         return this;\r
2256     },\r
2257 \r
2258     \r
2259     blur : function() {\r
2260         try{\r
2261             this.dom.blur();\r
2262         }catch(e){}\r
2263         return this;\r
2264     },\r
2265 \r
2266     \r
2267     addClass : function(className){\r
2268         if(className instanceof Array){\r
2269             for(var i = 0, len = className.length; i < len; i++) {\r
2270                 this.addClass(className[i]);\r
2271             }\r
2272         }else{\r
2273             if(className && !this.hasClass(className)){\r
2274                 this.dom.className = this.dom.className + " " + className;\r
2275             }\r
2276         }\r
2277         return this;\r
2278     },\r
2279 \r
2280     \r
2281     radioClass : function(className){\r
2282         var siblings = this.dom.parentNode.childNodes;\r
2283         for(var i = 0; i < siblings.length; i++) {\r
2284                 var s = siblings[i];\r
2285                 if(s.nodeType == 1){\r
2286                     Ext.get(s).removeClass(className);\r
2287                 }\r
2288         }\r
2289         this.addClass(className);\r
2290         return this;\r
2291     },\r
2292 \r
2293     \r
2294     removeClass : function(className){\r
2295         if(!className || !this.dom.className){\r
2296             return this;\r
2297         }\r
2298         if(className instanceof Array){\r
2299             for(var i = 0, len = className.length; i < len; i++) {\r
2300                 this.removeClass(className[i]);\r
2301             }\r
2302         }else{\r
2303             if(this.hasClass(className)){\r
2304                 var re = this.classReCache[className];\r
2305                 if (!re) {\r
2306                    re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', "g");\r
2307                    this.classReCache[className] = re;\r
2308                 }\r
2309                 this.dom.className =\r
2310                     this.dom.className.replace(re, " ");\r
2311             }\r
2312         }\r
2313         return this;\r
2314     },\r
2315 \r
2316     
2317     classReCache: {},\r
2318 \r
2319     \r
2320     toggleClass : function(className){\r
2321         if(this.hasClass(className)){\r
2322             this.removeClass(className);\r
2323         }else{\r
2324             this.addClass(className);\r
2325         }\r
2326         return this;\r
2327     },\r
2328 \r
2329     \r
2330     hasClass : function(className){\r
2331         return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;\r
2332     },\r
2333 \r
2334     \r
2335     replaceClass : function(oldClassName, newClassName){\r
2336         this.removeClass(oldClassName);\r
2337         this.addClass(newClassName);\r
2338         return this;\r
2339     },\r
2340 \r
2341     \r
2342     getStyles : function(){\r
2343         var a = arguments, len = a.length, r = {};\r
2344         for(var i = 0; i < len; i++){\r
2345             r[a[i]] = this.getStyle(a[i]);\r
2346         }\r
2347         return r;\r
2348     },\r
2349 \r
2350     \r
2351     getStyle : function(){\r
2352         return view && view.getComputedStyle ?\r
2353             function(prop){\r
2354                 var el = this.dom, v, cs, camel;\r
2355                 if(prop == 'float'){\r
2356                     prop = "cssFloat";\r
2357                 }\r
2358                 if(v = el.style[prop]){\r
2359                     return v;\r
2360                 }\r
2361                 if(cs = view.getComputedStyle(el, "")){\r
2362                     if(!(camel = propCache[prop])){\r
2363                         camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
2364                     }\r
2365                     return cs[camel];\r
2366                 }\r
2367                 return null;\r
2368             } :\r
2369             function(prop){\r
2370                 var el = this.dom, v, cs, camel;\r
2371                 if(prop == 'opacity'){\r
2372                     if(typeof el.style.filter == 'string'){\r
2373                         var m = el.style.filter.match(/alpha\(opacity=(.*)\)/i);\r
2374                         if(m){\r
2375                             var fv = parseFloat(m[1]);\r
2376                             if(!isNaN(fv)){\r
2377                                 return fv ? fv / 100 : 0;\r
2378                             }\r
2379                         }\r
2380                     }\r
2381                     return 1;\r
2382                 }else if(prop == 'float'){\r
2383                     prop = "styleFloat";\r
2384                 }\r
2385                 if(!(camel = propCache[prop])){\r
2386                     camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
2387                 }\r
2388                 if(v = el.style[camel]){\r
2389                     return v;\r
2390                 }\r
2391                 if(cs = el.currentStyle){\r
2392                     return cs[camel];\r
2393                 }\r
2394                 return null;\r
2395             };\r
2396     }(),\r
2397 \r
2398     \r
2399     setStyle : function(prop, value){\r
2400         if(typeof prop == "string"){\r
2401             var camel;\r
2402             if(!(camel = propCache[prop])){\r
2403                 camel = propCache[prop] = prop.replace(camelRe, camelFn);\r
2404             }\r
2405             if(camel == 'opacity') {\r
2406                 this.setOpacity(value);\r
2407             }else{\r
2408                 this.dom.style[camel] = value;\r
2409             }\r
2410         }else{\r
2411             for(var style in prop){\r
2412                 if(typeof prop[style] != "function"){\r
2413                    this.setStyle(style, prop[style]);\r
2414                 }\r
2415             }\r
2416         }\r
2417         return this;\r
2418     },\r
2419 \r
2420     \r
2421     applyStyles : function(style){\r
2422         Ext.DomHelper.applyStyles(this.dom, style);\r
2423         return this;\r
2424     },\r
2425 \r
2426     \r
2427     getX : function(){\r
2428         return D.getX(this.dom);\r
2429     },\r
2430 \r
2431     \r
2432     getY : function(){\r
2433         return D.getY(this.dom);\r
2434     },\r
2435 \r
2436     \r
2437     getXY : function(){\r
2438         return D.getXY(this.dom);\r
2439     },\r
2440 \r
2441     \r
2442     setX : function(x, animate){\r
2443         if(!animate || !A){\r
2444             D.setX(this.dom, x);\r
2445         }else{\r
2446             this.setXY([x, this.getY()], this.preanim(arguments, 1));\r
2447         }\r
2448         return this;\r
2449     },\r
2450 \r
2451     \r
2452     setY : function(y, animate){\r
2453         if(!animate || !A){\r
2454             D.setY(this.dom, y);\r
2455         }else{\r
2456             this.setXY([this.getX(), y], this.preanim(arguments, 1));\r
2457         }\r
2458         return this;\r
2459     },\r
2460 \r
2461     \r
2462     setLeft : function(left){\r
2463         this.setStyle("left", this.addUnits(left));\r
2464         return this;\r
2465     },\r
2466 \r
2467     \r
2468     setTop : function(top){\r
2469         this.setStyle("top", this.addUnits(top));\r
2470         return this;\r
2471     },\r
2472 \r
2473     \r
2474     setRight : function(right){\r
2475         this.setStyle("right", this.addUnits(right));\r
2476         return this;\r
2477     },\r
2478 \r
2479     \r
2480     setBottom : function(bottom){\r
2481         this.setStyle("bottom", this.addUnits(bottom));\r
2482         return this;\r
2483     },\r
2484 \r
2485     \r
2486     setXY : function(pos, animate){\r
2487         if(!animate || !A){\r
2488             D.setXY(this.dom, pos);\r
2489         }else{\r
2490             this.anim({points: {to: pos}}, this.preanim(arguments, 1), 'motion');\r
2491         }\r
2492         return this;\r
2493     },\r
2494 \r
2495     \r
2496     setLocation : function(x, y, animate){\r
2497         this.setXY([x, y], this.preanim(arguments, 2));\r
2498         return this;\r
2499     },\r
2500 \r
2501     \r
2502     moveTo : function(x, y, animate){\r
2503         this.setXY([x, y], this.preanim(arguments, 2));\r
2504         return this;\r
2505     },\r
2506 \r
2507     \r
2508     getRegion : function(){\r
2509         return D.getRegion(this.dom);\r
2510     },\r
2511 \r
2512     \r
2513     getHeight : function(contentHeight){\r
2514         var h = this.dom.offsetHeight || 0;\r
2515         return contentHeight !== true ? h : h-this.getBorderWidth("tb")-this.getPadding("tb");\r
2516     },\r
2517 \r
2518     \r
2519     getWidth : function(contentWidth){\r
2520         var w = this.dom.offsetWidth || 0;\r
2521         return contentWidth !== true ? w : w-this.getBorderWidth("lr")-this.getPadding("lr");\r
2522     },\r
2523 \r
2524     \r
2525     getComputedHeight : function(){\r
2526         var h = Math.max(this.dom.offsetHeight, this.dom.clientHeight);\r
2527         if(!h){\r
2528             h = parseInt(this.getStyle('height'), 10) || 0;\r
2529             if(!this.isBorderBox()){\r
2530                 h += this.getFrameWidth('tb');\r
2531             }\r
2532         }\r
2533         return h;\r
2534     },\r
2535 \r
2536     \r
2537     getComputedWidth : function(){\r
2538         var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);\r
2539         if(!w){\r
2540             w = parseInt(this.getStyle('width'), 10) || 0;\r
2541             if(!this.isBorderBox()){\r
2542                 w += this.getFrameWidth('lr');\r
2543             }\r
2544         }\r
2545         return w;\r
2546     },\r
2547 \r
2548     \r
2549     getSize : function(contentSize){\r
2550         return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};\r
2551     },\r
2552 \r
2553     \r
2554     getViewSize : function(){\r
2555         var d = this.dom, doc = document, aw = 0, ah = 0;\r
2556         if(d == doc || d == doc.body){\r
2557             return {width : D.getViewWidth(), height: D.getViewHeight()};\r
2558         }else{\r
2559             return {\r
2560                 width : d.clientWidth,\r
2561                 height: d.clientHeight\r
2562             };\r
2563         }\r
2564     },\r
2565 \r
2566     \r
2567     getValue : function(asNumber){\r
2568         return asNumber ? parseInt(this.dom.value, 10) : this.dom.value;\r
2569     },\r
2570 \r
2571     
2572     adjustWidth : function(width){\r
2573         if(typeof width == "number"){\r
2574             if(this.autoBoxAdjust && !this.isBorderBox()){\r
2575                width -= (this.getBorderWidth("lr") + this.getPadding("lr"));\r
2576             }\r
2577             if(width < 0){\r
2578                 width = 0;\r
2579             }\r
2580         }\r
2581         return width;\r
2582     },\r
2583 \r
2584     
2585     adjustHeight : function(height){\r
2586         if(typeof height == "number"){\r
2587            if(this.autoBoxAdjust && !this.isBorderBox()){\r
2588                height -= (this.getBorderWidth("tb") + this.getPadding("tb"));\r
2589            }\r
2590            if(height < 0){\r
2591                height = 0;\r
2592            }\r
2593         }\r
2594         return height;\r
2595     },\r
2596 \r
2597     \r
2598     setWidth : function(width, animate){\r
2599         width = this.adjustWidth(width);\r
2600         if(!animate || !A){\r
2601             this.dom.style.width = this.addUnits(width);\r
2602         }else{\r
2603             this.anim({width: {to: width}}, this.preanim(arguments, 1));\r
2604         }\r
2605         return this;\r
2606     },\r
2607 \r
2608     \r
2609      setHeight : function(height, animate){\r
2610         height = this.adjustHeight(height);\r
2611         if(!animate || !A){\r
2612             this.dom.style.height = this.addUnits(height);\r
2613         }else{\r
2614             this.anim({height: {to: height}}, this.preanim(arguments, 1));\r
2615         }\r
2616         return this;\r
2617     },\r
2618 \r
2619     \r
2620      setSize : function(width, height, animate){\r
2621         if(typeof width == "object"){ 
2622             height = width.height; width = width.width;\r
2623         }\r
2624         width = this.adjustWidth(width); height = this.adjustHeight(height);\r
2625         if(!animate || !A){\r
2626             this.dom.style.width = this.addUnits(width);\r
2627             this.dom.style.height = this.addUnits(height);\r
2628         }else{\r
2629             this.anim({width: {to: width}, height: {to: height}}, this.preanim(arguments, 2));\r
2630         }\r
2631         return this;\r
2632     },\r
2633 \r
2634     \r
2635     setBounds : function(x, y, width, height, animate){\r
2636         if(!animate || !A){\r
2637             this.setSize(width, height);\r
2638             this.setLocation(x, y);\r
2639         }else{\r
2640             width = this.adjustWidth(width); height = this.adjustHeight(height);\r
2641             this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}},\r
2642                           this.preanim(arguments, 4), 'motion');\r
2643         }\r
2644         return this;\r
2645     },\r
2646 \r
2647     \r
2648     setRegion : function(region, animate){\r
2649         this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, this.preanim(arguments, 1));\r
2650         return this;\r
2651     },\r
2652 \r
2653     \r
2654     addListener : function(eventName, fn, scope, options){\r
2655         Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);\r
2656     },\r
2657 \r
2658     \r
2659     removeListener : function(eventName, fn){\r
2660         Ext.EventManager.removeListener(this.dom,  eventName, fn);\r
2661         return this;\r
2662     },\r
2663 \r
2664     \r
2665     removeAllListeners : function(){\r
2666         E.purgeElement(this.dom);\r
2667         return this;\r
2668     },\r
2669 \r
2670     relayEvent : function(eventName, observable){\r
2671         this.on(eventName, function(e){\r
2672             observable.fireEvent(eventName, e);\r
2673         });\r
2674     },\r
2675 \r
2676     \r
2677      setOpacity : function(opacity, animate){\r
2678         if(!animate || !A){\r
2679             var s = this.dom.style;\r
2680             if(Ext.isIE){\r
2681                 s.zoom = 1;\r
2682                 s.filter = (s.filter || '').replace(/alpha\([^\)]*\)/gi,"") +\r
2683                            (opacity == 1 ? "" : "alpha(opacity=" + opacity * 100 + ")");\r
2684             }else{\r
2685                 s.opacity = opacity;\r
2686             }\r
2687         }else{\r
2688             this.anim({opacity: {to: opacity}}, this.preanim(arguments, 1), null, .35, 'easeIn');\r
2689         }\r
2690         return this;\r
2691     },\r
2692 \r
2693     \r
2694     getLeft : function(local){\r
2695         if(!local){\r
2696             return this.getX();\r
2697         }else{\r
2698             return parseInt(this.getStyle("left"), 10) || 0;\r
2699         }\r
2700     },\r
2701 \r
2702     \r
2703     getRight : function(local){\r
2704         if(!local){\r
2705             return this.getX() + this.getWidth();\r
2706         }else{\r
2707             return (this.getLeft(true) + this.getWidth()) || 0;\r
2708         }\r
2709     },\r
2710 \r
2711     \r
2712     getTop : function(local) {\r
2713         if(!local){\r
2714             return this.getY();\r
2715         }else{\r
2716             return parseInt(this.getStyle("top"), 10) || 0;\r
2717         }\r
2718     },\r
2719 \r
2720     \r
2721     getBottom : function(local){\r
2722         if(!local){\r
2723             return this.getY() + this.getHeight();\r
2724         }else{\r
2725             return (this.getTop(true) + this.getHeight()) || 0;\r
2726         }\r
2727     },\r
2728 \r
2729     \r
2730     position : function(pos, zIndex, x, y){\r
2731         if(!pos){\r
2732            if(this.getStyle('position') == 'static'){\r
2733                this.setStyle('position', 'relative');\r
2734            }\r
2735         }else{\r
2736             this.setStyle("position", pos);\r
2737         }\r
2738         if(zIndex){\r
2739             this.setStyle("z-index", zIndex);\r
2740         }\r
2741         if(x !== undefined && y !== undefined){\r
2742             this.setXY([x, y]);\r
2743         }else if(x !== undefined){\r
2744             this.setX(x);\r
2745         }else if(y !== undefined){\r
2746             this.setY(y);\r
2747         }\r
2748     },\r
2749 \r
2750     \r
2751     clearPositioning : function(value){\r
2752         value = value ||'';\r
2753         this.setStyle({\r
2754             "left": value,\r
2755             "right": value,\r
2756             "top": value,\r
2757             "bottom": value,\r
2758             "z-index": "",\r
2759             "position" : "static"\r
2760         });\r
2761         return this;\r
2762     },\r
2763 \r
2764     \r
2765     getPositioning : function(){\r
2766         var l = this.getStyle("left");\r
2767         var t = this.getStyle("top");\r
2768         return {\r
2769             "position" : this.getStyle("position"),\r
2770             "left" : l,\r
2771             "right" : l ? "" : this.getStyle("right"),\r
2772             "top" : t,\r
2773             "bottom" : t ? "" : this.getStyle("bottom"),\r
2774             "z-index" : this.getStyle("z-index")\r
2775         };\r
2776     },\r
2777 \r
2778     \r
2779     getBorderWidth : function(side){\r
2780         return this.addStyles(side, El.borders);\r
2781     },\r
2782 \r
2783     \r
2784     getPadding : function(side){\r
2785         return this.addStyles(side, El.paddings);\r
2786     },\r
2787 \r
2788     \r
2789     setPositioning : function(pc){\r
2790         this.applyStyles(pc);\r
2791         if(pc.right == "auto"){\r
2792             this.dom.style.right = "";\r
2793         }\r
2794         if(pc.bottom == "auto"){\r
2795             this.dom.style.bottom = "";\r
2796         }\r
2797         return this;\r
2798     },\r
2799 \r
2800     
2801     fixDisplay : function(){\r
2802         if(this.getStyle("display") == "none"){\r
2803             this.setStyle("visibility", "hidden");\r
2804             this.setStyle("display", this.originalDisplay); 
2805             if(this.getStyle("display") == "none"){ 
2806                 this.setStyle("display", "block");\r
2807             }\r
2808         }\r
2809     },\r
2810 \r
2811     \r
2812      setLeftTop : function(left, top){\r
2813         this.dom.style.left = this.addUnits(left);\r
2814         this.dom.style.top = this.addUnits(top);\r
2815         return this;\r
2816     },\r
2817 \r
2818     \r
2819      move : function(direction, distance, animate){\r
2820         var xy = this.getXY();\r
2821         direction = direction.toLowerCase();\r
2822         switch(direction){\r
2823             case "l":\r
2824             case "left":\r
2825                 this.moveTo(xy[0]-distance, xy[1], this.preanim(arguments, 2));\r
2826                 break;\r
2827            case "r":\r
2828            case "right":\r
2829                 this.moveTo(xy[0]+distance, xy[1], this.preanim(arguments, 2));\r
2830                 break;\r
2831            case "t":\r
2832            case "top":\r
2833            case "up":\r
2834                 this.moveTo(xy[0], xy[1]-distance, this.preanim(arguments, 2));\r
2835                 break;\r
2836            case "b":\r
2837            case "bottom":\r
2838            case "down":\r
2839                 this.moveTo(xy[0], xy[1]+distance, this.preanim(arguments, 2));\r
2840                 break;\r
2841         }\r
2842         return this;\r
2843     },\r
2844 \r
2845     \r
2846     clip : function(){\r
2847         if(!this.isClipped){\r
2848            this.isClipped = true;\r
2849            this.originalClip = {\r
2850                "o": this.getStyle("overflow"),\r
2851                "x": this.getStyle("overflow-x"),\r
2852                "y": this.getStyle("overflow-y")\r
2853            };\r
2854            this.setStyle("overflow", "hidden");\r
2855            this.setStyle("overflow-x", "hidden");\r
2856            this.setStyle("overflow-y", "hidden");\r
2857         }\r
2858         return this;\r
2859     },\r
2860 \r
2861     \r
2862     unclip : function(){\r
2863         if(this.isClipped){\r
2864             this.isClipped = false;\r
2865             var o = this.originalClip;\r
2866             if(o.o){this.setStyle("overflow", o.o);}\r
2867             if(o.x){this.setStyle("overflow-x", o.x);}\r
2868             if(o.y){this.setStyle("overflow-y", o.y);}\r
2869         }\r
2870         return this;\r
2871     },\r
2872 \r
2873 \r
2874     \r
2875     getAnchorXY : function(anchor, local, s){\r
2876         
2877         
2878 \r
2879         var w, h, vp = false;\r
2880         if(!s){\r
2881             var d = this.dom;\r
2882             if(d == document.body || d == document){\r
2883                 vp = true;\r
2884                 w = D.getViewWidth(); h = D.getViewHeight();\r
2885             }else{\r
2886                 w = this.getWidth(); h = this.getHeight();\r
2887             }\r
2888         }else{\r
2889             w = s.width;  h = s.height;\r
2890         }\r
2891         var x = 0, y = 0, r = Math.round;\r
2892         switch((anchor || "tl").toLowerCase()){\r
2893             case "c":\r
2894                 x = r(w*.5);\r
2895                 y = r(h*.5);\r
2896             break;\r
2897             case "t":\r
2898                 x = r(w*.5);\r
2899                 y = 0;\r
2900             break;\r
2901             case "l":\r
2902                 x = 0;\r
2903                 y = r(h*.5);\r
2904             break;\r
2905             case "r":\r
2906                 x = w;\r
2907                 y = r(h*.5);\r
2908             break;\r
2909             case "b":\r
2910                 x = r(w*.5);\r
2911                 y = h;\r
2912             break;\r
2913             case "tl":\r
2914                 x = 0;\r
2915                 y = 0;\r
2916             break;\r
2917             case "bl":\r
2918                 x = 0;\r
2919                 y = h;\r
2920             break;\r
2921             case "br":\r
2922                 x = w;\r
2923                 y = h;\r
2924             break;\r
2925             case "tr":\r
2926                 x = w;\r
2927                 y = 0;\r
2928             break;\r
2929         }\r
2930         if(local === true){\r
2931             return [x, y];\r
2932         }\r
2933         if(vp){\r
2934             var sc = this.getScroll();\r
2935             return [x + sc.left, y + sc.top];\r
2936         }\r
2937         
2938         var o = this.getXY();\r
2939         return [x+o[0], y+o[1]];\r
2940     },\r
2941 \r
2942     \r
2943     getAlignToXY : function(el, p, o){\r
2944         el = Ext.get(el);\r
2945         var d = this.dom;\r
2946         if(!el.dom){\r
2947             throw "Element.alignTo with an element that doesn't exist";\r
2948         }\r
2949         var c = false; 
2950         var p1 = "", p2 = "";\r
2951         o = o || [0,0];\r
2952 \r
2953         if(!p){\r
2954             p = "tl-bl";\r
2955         }else if(p == "?"){\r
2956             p = "tl-bl?";\r
2957         }else if(p.indexOf("-") == -1){\r
2958             p = "tl-" + p;\r
2959         }\r
2960         p = p.toLowerCase();\r
2961         var m = p.match(/^([a-z]+)-([a-z]+)(\?)?$/);\r
2962         if(!m){\r
2963            throw "Element.alignTo with an invalid alignment " + p;\r
2964         }\r
2965         p1 = m[1]; p2 = m[2]; c = !!m[3];\r
2966 \r
2967         
2968         
2969         var a1 = this.getAnchorXY(p1, true);\r
2970         var a2 = el.getAnchorXY(p2, false);\r
2971         var x = a2[0] - a1[0] + o[0];\r
2972         var y = a2[1] - a1[1] + o[1];\r
2973         if(c){\r
2974             
2975             var w = this.getWidth(), h = this.getHeight(), r = el.getRegion();\r
2976             
2977             var dw = D.getViewWidth()-5, dh = D.getViewHeight()-5;\r
2978 \r
2979             
2980             
2981             
2982             var p1y = p1.charAt(0), p1x = p1.charAt(p1.length-1);\r
2983            var p2y = p2.charAt(0), p2x = p2.charAt(p2.length-1);\r
2984            var swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));\r
2985            var swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));\r
2986 \r
2987            var doc = document;\r
2988            var scrollX = (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0)+5;\r
2989            var scrollY = (doc.documentElement.scrollTop || doc.body.scrollTop || 0)+5;\r
2990 \r
2991            if((x+w) > dw + scrollX){\r
2992                 x = swapX ? r.left-w : dw+scrollX-w;\r
2993             }\r
2994            if(x < scrollX){\r
2995                x = swapX ? r.right : scrollX;\r
2996            }\r
2997            if((y+h) > dh + scrollY){\r
2998                 y = swapY ? r.top-h : dh+scrollY-h;\r
2999             }\r
3000            if (y < scrollY){\r
3001                y = swapY ? r.bottom : scrollY;\r
3002            }\r
3003         }\r
3004         return [x,y];\r
3005     },\r
3006 \r
3007     
3008     getConstrainToXY : function(){\r
3009         var os = {top:0, left:0, bottom:0, right: 0};\r
3010 \r
3011         return function(el, local, offsets, proposedXY){\r
3012             el = Ext.get(el);\r
3013             offsets = offsets ? Ext.applyIf(offsets, os) : os;\r
3014 \r
3015             var vw, vh, vx = 0, vy = 0;\r
3016             if(el.dom == document.body || el.dom == document){\r
3017                 vw = Ext.lib.Dom.getViewWidth();\r
3018                 vh = Ext.lib.Dom.getViewHeight();\r
3019             }else{\r
3020                 vw = el.dom.clientWidth;\r
3021                 vh = el.dom.clientHeight;\r
3022                 if(!local){\r
3023                     var vxy = el.getXY();\r
3024                     vx = vxy[0];\r
3025                     vy = vxy[1];\r
3026                 }\r
3027             }\r
3028 \r
3029             var s = el.getScroll();\r
3030 \r
3031             vx += offsets.left + s.left;\r
3032             vy += offsets.top + s.top;\r
3033 \r
3034             vw -= offsets.right;\r
3035             vh -= offsets.bottom;\r
3036 \r
3037             var vr = vx+vw;\r
3038             var vb = vy+vh;\r
3039 \r
3040             var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);\r
3041             var x = xy[0], y = xy[1];\r
3042             var w = this.dom.offsetWidth, h = this.dom.offsetHeight;\r
3043 \r
3044             
3045             var moved = false;\r
3046 \r
3047             
3048             if((x + w) > vr){\r
3049                 x = vr - w;\r
3050                 moved = true;\r
3051             }\r
3052             if((y + h) > vb){\r
3053                 y = vb - h;\r
3054                 moved = true;\r
3055             }\r
3056             
3057             if(x < vx){\r
3058                 x = vx;\r
3059                 moved = true;\r
3060             }\r
3061             if(y < vy){\r
3062                 y = vy;\r
3063                 moved = true;\r
3064             }\r
3065             return moved ? [x, y] : false;\r
3066         };\r
3067     }(),\r
3068 \r
3069     
3070     adjustForConstraints : function(xy, parent, offsets){\r
3071         return this.getConstrainToXY(parent || document, false, offsets, xy) ||  xy;\r
3072     },\r
3073 \r
3074     \r
3075     alignTo : function(element, position, offsets, animate){\r
3076         var xy = this.getAlignToXY(element, position, offsets);\r
3077         this.setXY(xy, this.preanim(arguments, 3));\r
3078         return this;\r
3079     },\r
3080 \r
3081     \r
3082     anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){\r
3083         var action = function(){\r
3084             this.alignTo(el, alignment, offsets, animate);\r
3085             Ext.callback(callback, this);\r
3086         };\r
3087         Ext.EventManager.onWindowResize(action, this);\r
3088         var tm = typeof monitorScroll;\r
3089         if(tm != 'undefined'){\r
3090             Ext.EventManager.on(window, 'scroll', action, this,\r
3091                 {buffer: tm == 'number' ? monitorScroll : 50});\r
3092         }\r
3093         action.call(this); 
3094         return this;\r
3095     },\r
3096     \r
3097     clearOpacity : function(){\r
3098         if (window.ActiveXObject) {\r
3099             if(typeof this.dom.style.filter == 'string' && (/alpha/i).test(this.dom.style.filter)){\r
3100                 this.dom.style.filter = "";\r
3101             }\r
3102         } else {\r
3103             this.dom.style.opacity = "";\r
3104             this.dom.style["-moz-opacity"] = "";\r
3105             this.dom.style["-khtml-opacity"] = "";\r
3106         }\r
3107         return this;\r
3108     },\r
3109 \r
3110     \r
3111     hide : function(animate){\r
3112         this.setVisible(false, this.preanim(arguments, 0));\r
3113         return this;\r
3114     },\r
3115 \r
3116     \r
3117     show : function(animate){\r
3118         this.setVisible(true, this.preanim(arguments, 0));\r
3119         return this;\r
3120     },\r
3121 \r
3122     \r
3123     addUnits : function(size){\r
3124         return Ext.Element.addUnits(size, this.defaultUnit);\r
3125     },\r
3126 \r
3127     \r
3128     beginMeasure : function(){\r
3129         var el = this.dom;\r
3130         if(el.offsetWidth || el.offsetHeight){\r
3131             return this; 
3132         }\r
3133         var changed = [];\r
3134         var p = this.dom, b = document.body; 
3135         while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p != b){\r
3136             var pe = Ext.get(p);\r
3137             if(pe.getStyle('display') == 'none'){\r
3138                 changed.push({el: p, visibility: pe.getStyle("visibility")});\r
3139                 p.style.visibility = "hidden";\r
3140                 p.style.display = "block";\r
3141             }\r
3142             p = p.parentNode;\r
3143         }\r
3144         this._measureChanged = changed;\r
3145         return this;\r
3146 \r
3147     },\r
3148 \r
3149     \r
3150     endMeasure : function(){\r
3151         var changed = this._measureChanged;\r
3152         if(changed){\r
3153             for(var i = 0, len = changed.length; i < len; i++) {\r
3154                 var r = changed[i];\r
3155                 r.el.style.visibility = r.visibility;\r
3156                 r.el.style.display = "none";\r
3157             }\r
3158             this._measureChanged = null;\r
3159         }\r
3160         return this;\r
3161     },\r
3162 \r
3163     \r
3164     update : function(html, loadScripts, callback){\r
3165         if(typeof html == "undefined"){\r
3166             html = "";\r
3167         }\r
3168         if(loadScripts !== true){\r
3169             this.dom.innerHTML = html;\r
3170             if(typeof callback == "function"){\r
3171                 callback();\r
3172             }\r
3173             return this;\r
3174         }\r
3175         var id = Ext.id();\r
3176         var dom = this.dom;\r
3177 \r
3178         html += '<span id="' + id + '"></span>';\r
3179 \r
3180         E.onAvailable(id, function(){\r
3181             var hd = document.getElementsByTagName("head")[0];\r
3182             var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;\r
3183             var srcRe = /\ssrc=([\'\"])(.*?)\1/i;\r
3184             var typeRe = /\stype=([\'\"])(.*?)\1/i;\r
3185 \r
3186             var match;\r
3187             while(match = re.exec(html)){\r
3188                 var attrs = match[1];\r
3189                 var srcMatch = attrs ? attrs.match(srcRe) : false;\r
3190                 if(srcMatch && srcMatch[2]){\r
3191                    var s = document.createElement("script");\r
3192                    s.src = srcMatch[2];\r
3193                    var typeMatch = attrs.match(typeRe);\r
3194                    if(typeMatch && typeMatch[2]){\r
3195                        s.type = typeMatch[2];\r
3196                    }\r
3197                    hd.appendChild(s);\r
3198                 }else if(match[2] && match[2].length > 0){\r
3199                     if(window.execScript) {\r
3200                        window.execScript(match[2]);\r
3201                     } else {\r
3202                        window.eval(match[2]);\r
3203                     }\r
3204                 }\r
3205             }\r
3206             var el = document.getElementById(id);\r
3207             if(el){el.parentNode.removeChild(el);}\r
3208             if(typeof callback == "function"){\r
3209                 callback();\r
3210             }\r
3211         });\r
3212         dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/ig, "");\r
3213         return this;\r
3214     },\r
3215 \r
3216     \r
3217     load : function(){\r
3218         var um = this.getUpdateManager();\r
3219         um.update.apply(um, arguments);\r
3220         return this;\r
3221     },\r
3222 \r
3223     \r
3224     getUpdateManager : function(){\r
3225         if(!this.updateManager){\r
3226             this.updateManager = new Ext.UpdateManager(this);\r
3227         }\r
3228         return this.updateManager;\r
3229     },\r
3230 \r
3231     \r
3232     unselectable : function(){\r
3233         this.dom.unselectable = "on";\r
3234         this.swallowEvent("selectstart", true);\r
3235         this.applyStyles("-moz-user-select:none;-khtml-user-select:none;");\r
3236         this.addClass("x-unselectable");\r
3237         return this;\r
3238     },\r
3239 \r
3240     \r
3241     getCenterXY : function(){\r
3242         return this.getAlignToXY(document, 'c-c');\r
3243     },\r
3244 \r
3245     \r
3246     center : function(centerIn){\r
3247         this.alignTo(centerIn || document, 'c-c');\r
3248         return this;\r
3249     },\r
3250 \r
3251     \r
3252     isBorderBox : function(){\r
3253         return noBoxAdjust[this.dom.tagName.toLowerCase()] || Ext.isBorderBox;\r
3254     },\r
3255 \r
3256     \r
3257     getBox : function(contentBox, local){\r
3258         var xy;\r
3259         if(!local){\r
3260             xy = this.getXY();\r
3261         }else{\r
3262             var left = parseInt(this.getStyle("left"), 10) || 0;\r
3263             var top = parseInt(this.getStyle("top"), 10) || 0;\r
3264             xy = [left, top];\r
3265         }\r
3266         var el = this.dom, w = el.offsetWidth, h = el.offsetHeight, bx;\r
3267         if(!contentBox){\r
3268             bx = {x: xy[0], y: xy[1], 0: xy[0], 1: xy[1], width: w, height: h};\r
3269         }else{\r
3270             var l = this.getBorderWidth("l")+this.getPadding("l");\r
3271             var r = this.getBorderWidth("r")+this.getPadding("r");\r
3272             var t = this.getBorderWidth("t")+this.getPadding("t");\r
3273             var b = this.getBorderWidth("b")+this.getPadding("b");\r
3274             bx = {x: xy[0]+l, y: xy[1]+t, 0: xy[0]+l, 1: xy[1]+t, width: w-(l+r), height: h-(t+b)};\r
3275         }\r
3276         bx.right = bx.x + bx.width;\r
3277         bx.bottom = bx.y + bx.height;\r
3278         return bx;\r
3279     },\r
3280 \r
3281     \r
3282     getFrameWidth : function(sides, onlyContentBox){\r
3283         return onlyContentBox && Ext.isBorderBox ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));\r
3284     },\r
3285 \r
3286     \r
3287     setBox : function(box, adjust, animate){\r
3288         var w = box.width, h = box.height;\r
3289         if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){\r
3290            w -= (this.getBorderWidth("lr") + this.getPadding("lr"));\r
3291            h -= (this.getBorderWidth("tb") + this.getPadding("tb"));\r
3292         }\r
3293         this.setBounds(box.x, box.y, w, h, this.preanim(arguments, 2));\r
3294         return this;\r
3295     },\r
3296 \r
3297     \r
3298      repaint : function(){\r
3299         var dom = this.dom;\r
3300         this.addClass("x-repaint");\r
3301         setTimeout(function(){\r
3302             Ext.get(dom).removeClass("x-repaint");\r
3303         }, 1);\r
3304         return this;\r
3305     },\r
3306 \r
3307     \r
3308     getMargins : function(side){\r
3309         if(!side){\r
3310             return {\r
3311                 top: parseInt(this.getStyle("margin-top"), 10) || 0,\r
3312                 left: parseInt(this.getStyle("margin-left"), 10) || 0,\r
3313                 bottom: parseInt(this.getStyle("margin-bottom"), 10) || 0,\r
3314                 right: parseInt(this.getStyle("margin-right"), 10) || 0\r
3315             };\r
3316         }else{\r
3317             return this.addStyles(side, El.margins);\r
3318          }\r
3319     },\r
3320 \r
3321     
3322     addStyles : function(sides, styles){\r
3323         var val = 0, v, w;\r
3324         for(var i = 0, len = sides.length; i < len; i++){\r
3325             v = this.getStyle(styles[sides.charAt(i)]);\r
3326             if(v){\r
3327                  w = parseInt(v, 10);\r
3328                  if(w){ val += w; }\r
3329             }\r
3330         }\r
3331         return val;\r
3332     },\r
3333 \r
3334     \r
3335     createProxy : function(config, renderTo, matchBox){\r
3336         if(renderTo){\r
3337             renderTo = Ext.getDom(renderTo);\r
3338         }else{\r
3339             renderTo = document.body;\r
3340         }\r
3341         config = typeof config == "object" ?\r
3342             config : {tag : "div", cls: config};\r
3343         var proxy = Ext.DomHelper.append(renderTo, config, true);\r
3344         if(matchBox){\r
3345            proxy.setBox(this.getBox());\r
3346         }\r
3347         return proxy;\r
3348     },\r
3349 \r
3350     \r
3351     mask : function(msg, msgCls){\r
3352         if(this.getStyle("position") == "static"){\r
3353             this.setStyle("position", "relative");\r
3354         }\r
3355         if(!this._mask){\r
3356             this._mask = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask"}, true);\r
3357         }\r
3358         this.addClass("x-masked");\r
3359         this._mask.setDisplayed(true);\r
3360         if(typeof msg == 'string'){\r
3361             if(!this._maskMsg){\r
3362                 this._maskMsg = Ext.DomHelper.append(this.dom, {cls:"ext-el-mask-msg", cn:{tag:'div'}}, true);\r
3363             }\r
3364             var mm = this._maskMsg;\r
3365             mm.dom.className = msgCls ? "ext-el-mask-msg " + msgCls : "ext-el-mask-msg";\r
3366             mm.dom.firstChild.innerHTML = msg;\r
3367             mm.setDisplayed(true);\r
3368             mm.center(this);\r
3369         }\r
3370         if(Ext.isIE && !(Ext.isIE7 && Ext.isStrict) && this.getStyle('height') == 'auto'){ 
3371             this._mask.setHeight(this.getHeight());\r
3372         }\r
3373         return this._mask;\r
3374     },\r
3375 \r
3376     \r
3377     unmask : function(removeEl){\r
3378         if(this._mask){\r
3379             if(removeEl === true){\r
3380                 this._mask.remove();\r
3381                 delete this._mask;\r
3382                 if(this._maskMsg){\r
3383                     this._maskMsg.remove();\r
3384                     delete this._maskMsg;\r
3385                 }\r
3386             }else{\r
3387                 this._mask.setDisplayed(false);\r
3388                 if(this._maskMsg){\r
3389                     this._maskMsg.setDisplayed(false);\r
3390                 }\r
3391             }\r
3392         }\r
3393         this.removeClass("x-masked");\r
3394     },\r
3395 \r
3396     \r
3397     isMasked : function(){\r
3398         return this._mask && this._mask.isVisible();\r
3399     },\r
3400 \r
3401     \r
3402     createShim : function(){\r
3403         var el = document.createElement('iframe');\r
3404         el.frameBorder = 'no';\r
3405         el.className = 'ext-shim';\r
3406         if(Ext.isIE && Ext.isSecure){\r
3407             el.src = Ext.SSL_SECURE_URL;\r
3408         }\r
3409         var shim = Ext.get(this.dom.parentNode.insertBefore(el, this.dom));\r
3410         shim.autoBoxAdjust = false;\r
3411         return shim;\r
3412     },\r
3413 \r
3414     \r
3415     remove : function(){\r
3416         if(this.dom.parentNode){\r
3417             this.dom.parentNode.removeChild(this.dom);\r
3418         }\r
3419         delete El.cache[this.dom.id];\r
3420     },\r
3421 \r
3422     \r
3423     addClassOnOver : function(className, preventFlicker){\r
3424         this.on("mouseover", function(){\r
3425             Ext.fly(this, '_internal').addClass(className);\r
3426         }, this.dom);\r
3427         var removeFn = function(e){\r
3428             if(preventFlicker !== true || !e.within(this, true)){\r
3429                 Ext.fly(this, '_internal').removeClass(className);\r
3430             }\r
3431         };\r
3432         this.on("mouseout", removeFn, this.dom);\r
3433         return this;\r
3434     },\r
3435 \r
3436     \r
3437     addClassOnFocus : function(className){\r
3438         this.on("focus", function(){\r
3439             Ext.fly(this, '_internal').addClass(className);\r
3440         }, this.dom);\r
3441         this.on("blur", function(){\r
3442             Ext.fly(this, '_internal').removeClass(className);\r
3443         }, this.dom);\r
3444         return this;\r
3445     },\r
3446     \r
3447     addClassOnClick : function(className){\r
3448         var dom = this.dom;\r
3449         this.on("mousedown", function(){\r
3450             Ext.fly(dom, '_internal').addClass(className);\r
3451             var d = Ext.get(document);\r
3452             var fn = function(){\r
3453                 Ext.fly(dom, '_internal').removeClass(className);\r
3454                 d.removeListener("mouseup", fn);\r
3455             };\r
3456             d.on("mouseup", fn);\r
3457         });\r
3458         return this;\r
3459     },\r
3460 \r
3461     \r
3462     swallowEvent : function(eventName, preventDefault){\r
3463         var fn = function(e){\r
3464             e.stopPropagation();\r
3465             if(preventDefault){\r
3466                 e.preventDefault();\r
3467             }\r
3468         };\r
3469         if(eventName instanceof Array){\r
3470             for(var i = 0, len = eventName.length; i < len; i++){\r
3471                  this.on(eventName[i], fn);\r
3472             }\r
3473             return this;\r
3474         }\r
3475         this.on(eventName, fn);\r
3476         return this;\r
3477     },\r
3478 \r
3479     \r
3480   fitToParentDelegate : Ext.emptyFn, 
3481 \r
3482     \r
3483     fitToParent : function(monitorResize, targetParent) {\r
3484       Ext.EventManager.removeResizeListener(this.fitToParentDelegate); 
3485       this.fitToParentDelegate = Ext.emptyFn; 
3486       if (monitorResize === true && !this.dom.parentNode) { 
3487         return;\r
3488       }\r
3489       var p = Ext.get(targetParent || this.dom.parentNode);\r
3490       this.setSize(p.getComputedWidth() - p.getFrameWidth('lr'), p.getComputedHeight() - p.getFrameWidth('tb'));\r
3491       if (monitorResize === true) {\r
3492         this.fitToParentDelegate = this.fitToParent.createDelegate(this, [true, targetParent]);\r
3493         Ext.EventManager.onWindowResize(this.fitToParentDelegate);\r
3494       }\r
3495       return this;\r
3496     },\r
3497 \r
3498     \r
3499     getNextSibling : function(){\r
3500         var n = this.dom.nextSibling;\r
3501         while(n && n.nodeType != 1){\r
3502             n = n.nextSibling;\r
3503         }\r
3504         return n;\r
3505     },\r
3506 \r
3507     \r
3508     getPrevSibling : function(){\r
3509         var n = this.dom.previousSibling;\r
3510         while(n && n.nodeType != 1){\r
3511             n = n.previousSibling;\r
3512         }\r
3513         return n;\r
3514     },\r
3515 \r
3516 \r
3517     \r
3518     appendChild: function(el){\r
3519         el = Ext.get(el);\r
3520         el.appendTo(this);\r
3521         return this;\r
3522     },\r
3523 \r
3524     \r
3525     createChild: function(config, insertBefore, returnDom){\r
3526         config = config || {tag:'div'};\r
3527         if(insertBefore){\r
3528             return Ext.DomHelper.insertBefore(insertBefore, config, returnDom !== true);\r
3529         }\r
3530         return Ext.DomHelper[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);\r
3531     },\r
3532 \r
3533     \r
3534     appendTo: function(el){\r
3535         el = Ext.getDom(el);\r
3536         el.appendChild(this.dom);\r
3537         return this;\r
3538     },\r
3539 \r
3540     \r
3541     insertBefore: function(el){\r
3542         el = Ext.getDom(el);\r
3543         el.parentNode.insertBefore(this.dom, el);\r
3544         return this;\r
3545     },\r
3546 \r
3547     \r
3548     insertAfter: function(el){\r
3549         el = Ext.getDom(el);\r
3550         el.parentNode.insertBefore(this.dom, el.nextSibling);\r
3551         return this;\r
3552     },\r
3553 \r
3554     \r
3555     insertFirst: function(el, returnDom){\r
3556         el = el || {};\r
3557         if(typeof el == 'object' && !el.nodeType){ 
3558             return this.createChild(el, this.dom.firstChild, returnDom);\r
3559         }else{\r
3560             el = Ext.getDom(el);\r
3561             this.dom.insertBefore(el, this.dom.firstChild);\r
3562             return !returnDom ? Ext.get(el) : el;\r
3563         }\r
3564     },\r
3565 \r
3566     \r
3567     insertSibling: function(el, where, returnDom){\r
3568         where = where ? where.toLowerCase() : 'before';\r
3569         el = el || {};\r
3570         var rt, refNode = where == 'before' ? this.dom : this.dom.nextSibling;\r
3571 \r
3572         if(typeof el == 'object' && !el.nodeType){ 
3573             if(where == 'after' && !this.dom.nextSibling){\r
3574                 rt = Ext.DomHelper.append(this.dom.parentNode, el, !returnDom);\r
3575             }else{\r
3576                 rt = Ext.DomHelper[where == 'after' ? 'insertAfter' : 'insertBefore'](this.dom, el, !returnDom);\r
3577             }\r
3578 \r
3579         }else{\r
3580             rt = this.dom.parentNode.insertBefore(Ext.getDom(el),\r
3581                         where == 'before' ? this.dom : this.dom.nextSibling);\r
3582             if(!returnDom){\r
3583                 rt = Ext.get(rt);\r
3584             }\r
3585         }\r
3586         return rt;\r
3587     },\r
3588 \r
3589     \r
3590     wrap: function(config, returnDom){\r
3591         if(!config){\r
3592             config = {tag: "div"};\r
3593         }\r
3594         var newEl = Ext.DomHelper.insertBefore(this.dom, config, !returnDom);\r
3595         newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);\r
3596         return newEl;\r
3597     },\r
3598 \r
3599     \r
3600     replace: function(el){\r
3601         el = Ext.get(el);\r
3602         this.insertBefore(el);\r
3603         el.remove();\r
3604         return this;\r
3605     },\r
3606 \r
3607     \r
3608     insertHtml : function(where, html, returnEl){\r
3609         var el = Ext.DomHelper.insertHtml(where, this.dom, html);\r
3610         return returnEl ? Ext.get(el) : el;\r
3611     },\r
3612 \r
3613     \r
3614     set : function(o, useSet){\r
3615         var el = this.dom;\r
3616         useSet = typeof useSet == 'undefined' ? (el.setAttribute ? true : false) : useSet;\r
3617         for(var attr in o){\r
3618             if(attr == "style" || typeof o[attr] == "function") continue;\r
3619             if(attr=="cls"){\r
3620                 el.className = o["cls"];\r
3621             }else{\r
3622                 if(useSet) el.setAttribute(attr, o[attr]);\r
3623                 else el[attr] = o[attr];\r
3624             }\r
3625         }\r
3626         if(o.style){\r
3627             Ext.DomHelper.applyStyles(el, o.style);\r
3628         }\r
3629         return this;\r
3630     },\r
3631 \r
3632     \r
3633     addKeyListener : function(key, fn, scope){\r
3634         var config;\r
3635         if(typeof key != "object" || key instanceof Array){\r
3636             config = {\r
3637                 key: key,\r
3638                 fn: fn,\r
3639                 scope: scope\r
3640             };\r
3641         }else{\r
3642             config = {\r
3643                 key : key.key,\r
3644                 shift : key.shift,\r
3645                 ctrl : key.ctrl,\r
3646                 alt : key.alt,\r
3647                 fn: fn,\r
3648                 scope: scope\r
3649             };\r
3650         }\r
3651         return new Ext.KeyMap(this, config);\r
3652     },\r
3653 \r
3654     \r
3655     addKeyMap : function(config){\r
3656         return new Ext.KeyMap(this, config);\r
3657     },\r
3658 \r
3659     \r
3660      isScrollable : function(){\r
3661         var dom = this.dom;\r
3662         return dom.scrollHeight > dom.clientHeight || dom.scrollWidth > dom.clientWidth;\r
3663     },\r
3664 \r
3665     \r
3666 \r
3667     scrollTo : function(side, value, animate){\r
3668         var prop = side.toLowerCase() == "left" ? "scrollLeft" : "scrollTop";\r
3669         if(!animate || !A){\r
3670             this.dom[prop] = value;\r
3671         }else{\r
3672             var to = prop == "scrollLeft" ? [value, this.dom.scrollTop] : [this.dom.scrollLeft, value];\r
3673             this.anim({scroll: {"to": to}}, this.preanim(arguments, 2), 'scroll');\r
3674         }\r
3675         return this;\r
3676     },\r
3677 \r
3678     \r
3679      scroll : function(direction, distance, animate){\r
3680          if(!this.isScrollable()){\r
3681              return;\r
3682          }\r
3683          var el = this.dom;\r
3684          var l = el.scrollLeft, t = el.scrollTop;\r
3685          var w = el.scrollWidth, h = el.scrollHeight;\r
3686          var cw = el.clientWidth, ch = el.clientHeight;\r
3687          direction = direction.toLowerCase();\r
3688          var scrolled = false;\r
3689          var a = this.preanim(arguments, 2);\r
3690          switch(direction){\r
3691              case "l":\r
3692              case "left":\r
3693                  if(w - l > cw){\r
3694                      var v = Math.min(l + distance, w-cw);\r
3695                      this.scrollTo("left", v, a);\r
3696                      scrolled = true;\r
3697                  }\r
3698                  break;\r
3699             case "r":\r
3700             case "right":\r
3701                  if(l > 0){\r
3702                      var v = Math.max(l - distance, 0);\r
3703                      this.scrollTo("left", v, a);\r
3704                      scrolled = true;\r
3705                  }\r
3706                  break;\r
3707             case "t":\r
3708             case "top":\r
3709             case "up":\r
3710                  if(t > 0){\r
3711                      var v = Math.max(t - distance, 0);\r
3712                      this.scrollTo("top", v, a);\r
3713                      scrolled = true;\r
3714                  }\r
3715                  break;\r
3716             case "b":\r
3717             case "bottom":\r
3718             case "down":\r
3719                  if(h - t > ch){\r
3720                      var v = Math.min(t + distance, h-ch);\r
3721                      this.scrollTo("top", v, a);\r
3722                      scrolled = true;\r
3723                  }\r
3724                  break;\r
3725          }\r
3726          return scrolled;\r
3727     },\r
3728 \r
3729     \r
3730     translatePoints : function(x, y){\r
3731         if(typeof x == 'object' || x instanceof Array){\r
3732             y = x[1]; x = x[0];\r
3733         }\r
3734         var p = this.getStyle('position');\r
3735         var o = this.getXY();\r
3736 \r
3737         var l = parseInt(this.getStyle('left'), 10);\r
3738         var t = parseInt(this.getStyle('top'), 10);\r
3739 \r
3740         if(isNaN(l)){\r
3741             l = (p == "relative") ? 0 : this.dom.offsetLeft;\r
3742         }\r
3743         if(isNaN(t)){\r
3744             t = (p == "relative") ? 0 : this.dom.offsetTop;\r
3745         }\r
3746 \r
3747         return {left: (x - o[0] + l), top: (y - o[1] + t)};\r
3748     },\r
3749 \r
3750     \r
3751     getScroll : function(){\r
3752         var d = this.dom, doc = document;\r
3753         if(d == doc || d == doc.body){\r
3754             var l = window.pageXOffset || doc.documentElement.scrollLeft || doc.body.scrollLeft || 0;\r
3755             var t = window.pageYOffset || doc.documentElement.scrollTop || doc.body.scrollTop || 0;\r
3756             return {left: l, top: t};\r
3757         }else{\r
3758             return {left: d.scrollLeft, top: d.scrollTop};\r
3759         }\r
3760     },\r
3761 \r
3762     \r
3763     getColor : function(attr, defaultValue, prefix){\r
3764         var v = this.getStyle(attr);\r
3765         if(!v || v == "transparent" || v == "inherit") {\r
3766             return defaultValue;\r
3767         }\r
3768         var color = typeof prefix == "undefined" ? "#" : prefix;\r
3769         if(v.substr(0, 4) == "rgb("){\r
3770             var rvs = v.slice(4, v.length -1).split(",");\r
3771             for(var i = 0; i < 3; i++){\r
3772                 var h = parseInt(rvs[i]).toString(16);\r
3773                 if(h < 16){\r
3774                     h = "0" + h;\r
3775                 }\r
3776                 color += h;\r
3777             }\r
3778         } else {\r
3779             if(v.substr(0, 1) == "#"){\r
3780                 if(v.length == 4) {\r
3781                     for(var i = 1; i < 4; i++){\r
3782                         var c = v.charAt(i);\r
3783                         color +=  c + c;\r
3784                     }\r
3785                 }else if(v.length == 7){\r
3786                     color += v.substr(1);\r
3787                 }\r
3788             }\r
3789         }\r
3790         return(color.length > 5 ? color.toLowerCase() : defaultValue);\r
3791     },\r
3792 \r
3793     \r
3794     boxWrap : function(cls){\r
3795         cls = cls || 'x-box';\r
3796         var el = Ext.get(this.insertHtml('beforeBegin', String.format('<div class="{0}">'+El.boxMarkup+'</div>', cls)));\r
3797         el.child('.'+cls+'-mc').dom.appendChild(this.dom);\r
3798         return el;\r
3799     },\r
3800 \r
3801     \r
3802     getAttributeNS : Ext.isIE ? function(ns, name){\r
3803         var d = this.dom;\r
3804         var type = typeof d[ns+":"+name];\r
3805         if(type != 'undefined' && type != 'unknown'){\r
3806             return d[ns+":"+name];\r
3807         }\r
3808         return d[name];\r
3809     } : function(ns, name){\r
3810         var d = this.dom;\r
3811         return d.getAttributeNS(ns, name) || d.getAttribute(ns+":"+name) || d.getAttribute(name) || d[name];\r
3812     }\r
3813 };\r
3814 \r
3815 var ep = El.prototype;\r
3816 \r
3817 \r
3818 ep.on = ep.addListener;\r
3819     
3820 ep.mon = ep.addListener;\r
3821 \r
3822 \r
3823 ep.un = ep.removeListener;\r
3824 \r
3825 \r
3826 ep.autoBoxAdjust = true;\r
3827 \r
3828
3829 El.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;\r
3830 \r
3831
3832 El.addUnits = function(v, defaultUnit){\r
3833     if(v === "" || v == "auto"){\r
3834         return v;\r
3835     }\r
3836     if(v === undefined){\r
3837         return '';\r
3838     }\r
3839     if(typeof v == "number" || !El.unitPattern.test(v)){\r
3840         return v + (defaultUnit || 'px');\r
3841     }\r
3842     return v;\r
3843 };\r
3844 \r
3845
3846 El.boxMarkup = '<div class="{0}-tl"><div class="{0}-tr"><div class="{0}-tc"></div></div></div><div class="{0}-ml"><div class="{0}-mr"><div class="{0}-mc"></div></div></div><div class="{0}-bl"><div class="{0}-br"><div class="{0}-bc"></div></div></div>';\r
3847 \r
3848 El.VISIBILITY = 1;\r
3849 \r
3850 El.DISPLAY = 2;\r
3851 \r
3852 El.borders = {l: "border-left-width", r: "border-right-width", t: "border-top-width", b: "border-bottom-width"};\r
3853 El.paddings = {l: "padding-left", r: "padding-right", t: "padding-top", b: "padding-bottom"};\r
3854 El.margins = {l: "margin-left", r: "margin-right", t: "margin-top", b: "margin-bottom"};\r
3855 \r
3856 \r
3857 \r
3858 \r
3859 El.cache = {};\r
3860 \r
3861 var docEl;\r
3862 \r
3863 \r
3864 El.get = function(el){\r
3865     var ex, elm, id;\r
3866     if(!el){ return null; }\r
3867     if(typeof el == "string"){ 
3868         if(!(elm = document.getElementById(el))){\r
3869             return null;\r
3870         }\r
3871         if(ex = El.cache[el]){\r
3872             ex.dom = elm;\r
3873         }else{\r
3874             ex = El.cache[el] = new El(elm);\r
3875         }\r
3876         return ex;\r
3877     }else if(el.tagName){ 
3878         if(!(id = el.id)){\r
3879             id = Ext.id(el);\r
3880         }\r
3881         if(ex = El.cache[id]){\r
3882             ex.dom = el;\r
3883         }else{\r
3884             ex = El.cache[id] = new El(el);\r
3885         }\r
3886         return ex;\r
3887     }else if(el instanceof El){\r
3888         if(el != docEl){\r
3889             el.dom = document.getElementById(el.id) || el.dom; 
3890                                                           
3891             El.cache[el.id] = el; 
3892         }\r
3893         return el;\r
3894     }else if(el.isComposite){\r
3895         return el;\r
3896     }else if(el instanceof Array){\r
3897         return El.select(el);\r
3898     }else if(el == document){\r
3899         
3900         if(!docEl){\r
3901             var f = function(){};\r
3902             f.prototype = El.prototype;\r
3903             docEl = new f();\r
3904             docEl.dom = document;\r
3905         }\r
3906         return docEl;\r
3907     }\r
3908     return null;\r
3909 };\r
3910 \r
3911
3912 El.uncache = function(el){\r
3913     for(var i = 0, a = arguments, len = a.length; i < len; i++) {\r
3914         if(a[i]){\r
3915             delete El.cache[a[i].id || a[i]];\r
3916         }\r
3917     }\r
3918 };\r
3919 \r
3920
3921
3922
3923 El.garbageCollect = function(){\r
3924     if(!Ext.enableGarbageCollector){\r
3925         clearInterval(El.collectorThread);\r
3926         return;\r
3927     }\r
3928     for(var eid in El.cache){\r
3929         var el = El.cache[eid], d = el.dom;\r
3930         
3931         
3932         
3933         
3934         
3935         
3936         
3937         
3938         
3939         
3940         
3941         
3942         
3943         
3944         
3945         
3946         
3947         if(!d || !d.parentNode || (!d.offsetParent && !document.getElementById(eid))){\r
3948             delete El.cache[eid];\r
3949             if(d && Ext.enableListenerCollection){\r
3950                 E.purgeElement(d);\r
3951             }\r
3952         }\r
3953     }\r
3954 }\r
3955 El.collectorThreadId = setInterval(El.garbageCollect, 30000);\r
3956 \r
3957 \r
3958
3959 El.Flyweight = function(dom){\r
3960     this.dom = dom;\r
3961 };\r
3962 El.Flyweight.prototype = El.prototype;\r
3963 \r
3964 El._flyweights = {};\r
3965 \r
3966 El.fly = function(el, named){\r
3967     named = named || '_global';\r
3968     el = Ext.getDom(el);\r
3969     if(!el){\r
3970         return null;\r
3971     }\r
3972     if(!El._flyweights[named]){\r
3973         El._flyweights[named] = new El.Flyweight();\r
3974     }\r
3975     El._flyweights[named].dom = el;\r
3976     return El._flyweights[named];\r
3977 };\r
3978 \r
3979 \r
3980 Ext.get = El.get;\r
3981 \r
3982 Ext.fly = El.fly;\r
3983 \r
3984
3985 var noBoxAdjust = Ext.isStrict ? {\r
3986     select:1\r
3987 } : {\r
3988     input:1, select:1, textarea:1\r
3989 };\r
3990 if(Ext.isIE || Ext.isGecko){\r
3991     noBoxAdjust['button'] = 1;\r
3992 }\r
3993 \r
3994 \r
3995 Ext.EventManager.on(window, 'unload', function(){\r
3996     delete El.cache;\r
3997     delete El._flyweights;\r
3998 });\r
3999 })();
4000
4001 Ext.enableFx = true;
4002
4003
4004 Ext.Fx = {
4005         
4006     slideIn : function(anchor, o){
4007         var el = this.getFxEl();
4008         o = o || {};
4009
4010         el.queueFx(o, function(){
4011
4012             anchor = anchor || "t";
4013
4014                         this.fixDisplay();
4015
4016                         var r = this.getFxRestore();
4017             var b = this.getBox();
4018                         this.setSize(b);
4019
4020                         var wrap = this.fxWrap(r.pos, o, "hidden");
4021
4022             var st = this.dom.style;
4023             st.visibility = "visible";
4024             st.position = "absolute";
4025
4026                         var after = function(){
4027                 el.fxUnwrap(wrap, r.pos, o);
4028                 st.width = r.width;
4029                 st.height = r.height;
4030                 el.afterFx(o);
4031             };
4032                         var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height};
4033
4034             switch(anchor.toLowerCase()){
4035                 case "t":
4036                     wrap.setSize(b.width, 0);
4037                     st.left = st.bottom = "0";
4038                     a = {height: bh};
4039                 break;
4040                 case "l":
4041                     wrap.setSize(0, b.height);
4042                     st.right = st.top = "0";
4043                     a = {width: bw};
4044                 break;
4045                 case "r":
4046                     wrap.setSize(0, b.height);
4047                     wrap.setX(b.right);
4048                     st.left = st.top = "0";
4049                     a = {width: bw, points: pt};
4050                 break;
4051                 case "b":
4052                     wrap.setSize(b.width, 0);
4053                     wrap.setY(b.bottom);
4054                     st.left = st.top = "0";
4055                     a = {height: bh, points: pt};
4056                 break;
4057                 case "tl":
4058                     wrap.setSize(0, 0);
4059                     st.right = st.bottom = "0";
4060                     a = {width: bw, height: bh};
4061                 break;
4062                 case "bl":
4063                     wrap.setSize(0, 0);
4064                     wrap.setY(b.y+b.height);
4065                     st.right = st.top = "0";
4066                     a = {width: bw, height: bh, points: pt};
4067                 break;
4068                 case "br":
4069                     wrap.setSize(0, 0);
4070                     wrap.setXY([b.right, b.bottom]);
4071                     st.left = st.top = "0";
4072                     a = {width: bw, height: bh, points: pt};
4073                 break;
4074                 case "tr":
4075                     wrap.setSize(0, 0);
4076                     wrap.setX(b.x+b.width);
4077                     st.left = st.bottom = "0";
4078                     a = {width: bw, height: bh, points: pt};
4079                 break;
4080             }
4081             this.dom.style.visibility = "visible";
4082             wrap.show();
4083
4084             arguments.callee.anim = wrap.fxanim(a,
4085                 o,
4086                 'motion',
4087                 .5,
4088                 'easeOut', after);
4089         });
4090         return this;
4091     },
4092     
4093         
4094     slideOut : function(anchor, o){
4095         var el = this.getFxEl();
4096         o = o || {};
4097
4098         el.queueFx(o, function(){
4099
4100             anchor = anchor || "t";
4101
4102                         var r = this.getFxRestore();
4103             
4104             var b = this.getBox();
4105                         this.setSize(b);
4106
4107                         var wrap = this.fxWrap(r.pos, o, "visible");
4108
4109             var st = this.dom.style;
4110             st.visibility = "visible";
4111             st.position = "absolute";
4112
4113             wrap.setSize(b);
4114
4115             var after = function(){
4116                 if(o.useDisplay){
4117                     el.setDisplayed(false);
4118                 }else{
4119                     el.hide();
4120                 }
4121
4122                 el.fxUnwrap(wrap, r.pos, o);
4123
4124                 st.width = r.width;
4125                 st.height = r.height;
4126
4127                 el.afterFx(o);
4128             };
4129
4130             var a, zero = {to: 0};
4131             switch(anchor.toLowerCase()){
4132                 case "t":
4133                     st.left = st.bottom = "0";
4134                     a = {height: zero};
4135                 break;
4136                 case "l":
4137                     st.right = st.top = "0";
4138                     a = {width: zero};
4139                 break;
4140                 case "r":
4141                     st.left = st.top = "0";
4142                     a = {width: zero, points: {to:[b.right, b.y]}};
4143                 break;
4144                 case "b":
4145                     st.left = st.top = "0";
4146                     a = {height: zero, points: {to:[b.x, b.bottom]}};
4147                 break;
4148                 case "tl":
4149                     st.right = st.bottom = "0";
4150                     a = {width: zero, height: zero};
4151                 break;
4152                 case "bl":
4153                     st.right = st.top = "0";
4154                     a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}};
4155                 break;
4156                 case "br":
4157                     st.left = st.top = "0";
4158                     a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}};
4159                 break;
4160                 case "tr":
4161                     st.left = st.bottom = "0";
4162                     a = {width: zero, height: zero, points: {to:[b.right, b.y]}};
4163                 break;
4164             }
4165
4166             arguments.callee.anim = wrap.fxanim(a,
4167                 o,
4168                 'motion',
4169                 .5,
4170                 "easeOut", after);
4171         });
4172         return this;
4173     },
4174
4175         
4176     puff : function(o){
4177         var el = this.getFxEl();
4178         o = o || {};
4179
4180         el.queueFx(o, function(){
4181             this.clearOpacity();
4182             this.show();
4183
4184                         var r = this.getFxRestore();
4185             var st = this.dom.style;
4186
4187             var after = function(){
4188                 if(o.useDisplay){
4189                     el.setDisplayed(false);
4190                 }else{
4191                     el.hide();
4192                 }
4193
4194                 el.clearOpacity();
4195
4196                 el.setPositioning(r.pos);
4197                 st.width = r.width;
4198                 st.height = r.height;
4199                 st.fontSize = '';
4200                 el.afterFx(o);
4201             };
4202
4203             var width = this.getWidth();
4204             var height = this.getHeight();
4205
4206             arguments.callee.anim = this.fxanim({
4207                     width : {to: this.adjustWidth(width * 2)},
4208                     height : {to: this.adjustHeight(height * 2)},
4209                     points : {by: [-(width * .5), -(height * .5)]},
4210                     opacity : {to: 0},
4211                     fontSize: {to:200, unit: "%"}
4212                 },
4213                 o,
4214                 'motion',
4215                 .5,
4216                 "easeOut", after);
4217         });
4218         return this;
4219     },
4220
4221         
4222     switchOff : function(o){
4223         var el = this.getFxEl();
4224         o = o || {};
4225
4226         el.queueFx(o, function(){
4227             this.clearOpacity();
4228             this.clip();
4229
4230                         var r = this.getFxRestore();
4231             var st = this.dom.style;
4232
4233             var after = function(){
4234                 if(o.useDisplay){
4235                     el.setDisplayed(false);
4236                 }else{
4237                     el.hide();
4238                 }
4239
4240                 el.clearOpacity();
4241                 el.setPositioning(r.pos);
4242                 st.width = r.width;
4243                 st.height = r.height;
4244
4245                 el.afterFx(o);
4246             };
4247
4248             this.fxanim({opacity:{to:0.3}}, null, null, .1, null, function(){
4249                 this.clearOpacity();
4250                 (function(){
4251                     this.fxanim({
4252                         height:{to:1},
4253                         points:{by:[0, this.getHeight() * .5]}
4254                     }, o, 'motion', 0.3, 'easeIn', after);
4255                 }).defer(100, this);
4256             });
4257         });
4258         return this;
4259     },
4260
4261         
4262     highlight : function(color, o){
4263         var el = this.getFxEl();
4264         o = o || {};
4265
4266         el.queueFx(o, function(){
4267             color = color || "ffff9c";
4268             attr = o.attr || "backgroundColor";
4269
4270             this.clearOpacity();
4271             this.show();
4272
4273             var origColor = this.getColor(attr);
4274             var restoreColor = this.dom.style[attr];
4275             endColor = (o.endColor || origColor) || "ffffff";
4276
4277             var after = function(){
4278                 el.dom.style[attr] = restoreColor;
4279                 el.afterFx(o);
4280             };
4281
4282             var a = {};
4283             a[attr] = {from: color, to: endColor};
4284             arguments.callee.anim = this.fxanim(a,
4285                 o,
4286                 'color',
4287                 1,
4288                 'easeIn', after);
4289         });
4290         return this;
4291     },
4292
4293    
4294     frame : function(color, count, o){
4295         var el = this.getFxEl();
4296         o = o || {};
4297
4298         el.queueFx(o, function(){
4299             color = color || "#C3DAF9";
4300             if(color.length == 6){
4301                 color = "#" + color;
4302             }
4303             count = count || 1;
4304             duration = o.duration || 1;
4305             this.show();
4306
4307             var b = this.getBox();
4308             var animFn = function(){
4309                 var proxy = this.createProxy({
4310
4311                      style:{
4312                         visbility:"hidden",
4313                         position:"absolute",
4314                         "z-index":"35000",                         border:"0px solid " + color
4315                      }
4316                   });
4317                 var scale = Ext.isBorderBox ? 2 : 1;
4318                 proxy.animate({
4319                     top:{from:b.y, to:b.y - 20},
4320                     left:{from:b.x, to:b.x - 20},
4321                     borderWidth:{from:0, to:10},
4322                     opacity:{from:1, to:0},
4323                     height:{from:b.height, to:(b.height + (20*scale))},
4324                     width:{from:b.width, to:(b.width + (20*scale))}
4325                 }, duration, function(){
4326                     proxy.remove();
4327                 });
4328                 if(--count > 0){
4329                      animFn.defer((duration/2)*1000, this);
4330                 }else{
4331                     el.afterFx(o);
4332                 }
4333             };
4334             animFn.call(this);
4335         });
4336         return this;
4337     },
4338
4339    
4340     pause : function(seconds){
4341         var el = this.getFxEl();
4342         var o = {};
4343
4344         el.queueFx(o, function(){
4345             setTimeout(function(){
4346                 el.afterFx(o);
4347             }, seconds * 1000);
4348         });
4349         return this;
4350     },
4351
4352    
4353     fadeIn : function(o){
4354         var el = this.getFxEl();
4355         o = o || {};
4356         el.queueFx(o, function(){
4357             this.setOpacity(0);
4358             this.fixDisplay();
4359             this.dom.style.visibility = 'visible';
4360             var to = o.endOpacity || 1;
4361             arguments.callee.anim = this.fxanim({opacity:{to:to}},
4362                 o, null, .5, "easeOut", function(){
4363                 if(to == 1){
4364                     this.clearOpacity();
4365                 }
4366                 el.afterFx(o);
4367             });
4368         });
4369         return this;
4370     },
4371
4372    
4373     fadeOut : function(o){
4374         var el = this.getFxEl();
4375         o = o || {};
4376         el.queueFx(o, function(){
4377             arguments.callee.anim = this.fxanim({opacity:{to:o.endOpacity || 0}},
4378                 o, null, .5, "easeOut", function(){
4379                 if(this.visibilityMode == Ext.Element.DISPLAY || o.useDisplay){
4380                      this.dom.style.display = "none";
4381                 }else{
4382                      this.dom.style.visibility = "hidden";
4383                 }
4384                 this.clearOpacity();
4385                 el.afterFx(o);
4386             });
4387         });
4388         return this;
4389     },
4390
4391    
4392     scale : function(w, h, o){
4393         this.shift(Ext.apply({}, o, {
4394             width: w,
4395             height: h
4396         }));
4397         return this;
4398     },
4399
4400    
4401     shift : function(o){
4402         var el = this.getFxEl();
4403         o = o || {};
4404         el.queueFx(o, function(){
4405             var a = {}, w = o.width, h = o.height, x = o.x, y = o.y,  op = o.opacity;
4406             if(w !== undefined){
4407                 a.width = {to: this.adjustWidth(w)};
4408             }
4409             if(h !== undefined){
4410                 a.height = {to: this.adjustHeight(h)};
4411             }
4412             if(x !== undefined || y !== undefined){
4413                 a.points = {to: [
4414                     x !== undefined ? x : this.getX(),
4415                     y !== undefined ? y : this.getY()
4416                 ]};
4417             }
4418             if(op !== undefined){
4419                 a.opacity = {to: op};
4420             }
4421             if(o.xy !== undefined){
4422                 a.points = {to: o.xy};
4423             }
4424             arguments.callee.anim = this.fxanim(a,
4425                 o, 'motion', .35, "easeOut", function(){
4426                 el.afterFx(o);
4427             });
4428         });
4429         return this;
4430     },
4431
4432         
4433     ghost : function(anchor, o){
4434         var el = this.getFxEl();
4435         o = o || {};
4436
4437         el.queueFx(o, function(){
4438             anchor = anchor || "b";
4439
4440                         var r = this.getFxRestore();
4441             var w = this.getWidth(),
4442                 h = this.getHeight();
4443
4444             var st = this.dom.style;
4445
4446             var after = function(){
4447                 if(o.useDisplay){
4448                     el.setDisplayed(false);
4449                 }else{
4450                     el.hide();
4451                 }
4452
4453                 el.clearOpacity();
4454                 el.setPositioning(r.pos);
4455                 st.width = r.width;
4456                 st.height = r.height;
4457
4458                 el.afterFx(o);
4459             };
4460
4461             var a = {opacity: {to: 0}, points: {}}, pt = a.points;
4462             switch(anchor.toLowerCase()){
4463                 case "t":
4464                     pt.by = [0, -h];
4465                 break;
4466                 case "l":
4467                     pt.by = [-w, 0];
4468                 break;
4469                 case "r":
4470                     pt.by = [w, 0];
4471                 break;
4472                 case "b":
4473                     pt.by = [0, h];
4474                 break;
4475                 case "tl":
4476                     pt.by = [-w, -h];
4477                 break;
4478                 case "bl":
4479                     pt.by = [-w, h];
4480                 break;
4481                 case "br":
4482                     pt.by = [w, h];
4483                 break;
4484                 case "tr":
4485                     pt.by = [w, -h];
4486                 break;
4487             }
4488
4489             arguments.callee.anim = this.fxanim(a,
4490                 o,
4491                 'motion',
4492                 .5,
4493                 "easeOut", after);
4494         });
4495         return this;
4496     },
4497
4498         
4499     syncFx : function(){
4500         this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
4501             block : false,
4502             concurrent : true,
4503             stopFx : false
4504         });
4505         return this;
4506     },
4507
4508         
4509     sequenceFx : function(){
4510         this.fxDefaults = Ext.apply(this.fxDefaults || {}, {
4511             block : false,
4512             concurrent : false,
4513             stopFx : false
4514         });
4515         return this;
4516     },
4517
4518         
4519     nextFx : function(){
4520         var ef = this.fxQueue[0];
4521         if(ef){
4522             ef.call(this);
4523         }
4524     },
4525
4526         
4527     hasActiveFx : function(){
4528         return this.fxQueue && this.fxQueue[0];
4529     },
4530
4531         
4532     stopFx : function(){
4533         if(this.hasActiveFx()){
4534             var cur = this.fxQueue[0];
4535             if(cur && cur.anim && cur.anim.isAnimated()){
4536                 this.fxQueue = [cur];                 cur.anim.stop(true);
4537             }
4538         }
4539         return this;
4540     },
4541
4542         
4543     beforeFx : function(o){
4544         if(this.hasActiveFx() && !o.concurrent){
4545            if(o.stopFx){
4546                this.stopFx();
4547                return true;
4548            }
4549            return false;
4550         }
4551         return true;
4552     },
4553
4554         
4555     hasFxBlock : function(){
4556         var q = this.fxQueue;
4557         return q && q[0] && q[0].block;
4558     },
4559
4560         
4561     queueFx : function(o, fn){
4562         if(!this.fxQueue){
4563             this.fxQueue = [];
4564         }
4565         if(!this.hasFxBlock()){
4566             Ext.applyIf(o, this.fxDefaults);
4567             if(!o.concurrent){
4568                 var run = this.beforeFx(o);
4569                 fn.block = o.block;
4570                 this.fxQueue.push(fn);
4571                 if(run){
4572                     this.nextFx();
4573                 }
4574             }else{
4575                 fn.call(this);
4576             }
4577         }
4578         return this;
4579     },
4580
4581         
4582     fxWrap : function(pos, o, vis){
4583         var wrap;
4584         if(!o.wrap || !(wrap = Ext.get(o.wrap))){
4585             var wrapXY;
4586             if(o.fixPosition){
4587                 wrapXY = this.getXY();
4588             }
4589             var div = document.createElement("div");
4590             div.style.visibility = vis;
4591             wrap = Ext.get(this.dom.parentNode.insertBefore(div, this.dom));
4592             wrap.setPositioning(pos);
4593             if(wrap.getStyle("position") == "static"){
4594                 wrap.position("relative");
4595             }
4596             this.clearPositioning('auto');
4597             wrap.clip();
4598             wrap.dom.appendChild(this.dom);
4599             if(wrapXY){
4600                 wrap.setXY(wrapXY);
4601             }
4602         }
4603         return wrap;
4604     },
4605
4606         
4607     fxUnwrap : function(wrap, pos, o){
4608         this.clearPositioning();
4609         this.setPositioning(pos);
4610         if(!o.wrap){
4611             wrap.dom.parentNode.insertBefore(this.dom, wrap.dom);
4612             wrap.remove();
4613         }
4614     },
4615
4616         
4617     getFxRestore : function(){
4618         var st = this.dom.style;
4619         return {pos: this.getPositioning(), width: st.width, height : st.height};
4620     },
4621
4622         
4623     afterFx : function(o){
4624         if(o.afterStyle){
4625             this.applyStyles(o.afterStyle);
4626         }
4627         if(o.afterCls){
4628             this.addClass(o.afterCls);
4629         }
4630         if(o.remove === true){
4631             this.remove();
4632         }
4633         Ext.callback(o.callback, o.scope, [this]);
4634         if(!o.concurrent){
4635             this.fxQueue.shift();
4636             this.nextFx();
4637         }
4638     },
4639
4640         
4641     getFxEl : function(){         return Ext.get(this.dom);
4642     },
4643
4644         
4645     fxanim : function(args, opt, animType, defaultDur, defaultEase, cb){
4646         animType = animType || 'run';
4647         opt = opt || {};
4648         var anim = Ext.lib.Anim[animType](
4649             this.dom, args,
4650             (opt.duration || defaultDur) || .35,
4651             (opt.easing || defaultEase) || 'easeOut',
4652             function(){
4653                 Ext.callback(cb, this);
4654             },
4655             this
4656         );
4657         opt.anim = anim;
4658         return anim;
4659     }
4660 };
4661
4662 Ext.Fx.resize = Ext.Fx.scale;
4663
4664 Ext.apply(Ext.Element.prototype, Ext.Fx);
4665
4666 \r
4667 Ext.CompositeElement = function(els){\r
4668     this.elements = [];\r
4669     this.addElements(els);\r
4670 };\r
4671 Ext.CompositeElement.prototype = {\r
4672     isComposite: true,\r
4673     addElements : function(els){\r
4674         if(!els) return this;\r
4675         if(typeof els == "string"){\r
4676             els = Ext.Element.selectorFunction(els);\r
4677         }\r
4678         var yels = this.elements;\r
4679         var index = yels.length-1;\r
4680         for(var i = 0, len = els.length; i < len; i++) {\r
4681                 yels[++index] = Ext.get(els[i]);\r
4682         }\r
4683         return this;\r
4684     },\r
4685 \r
4686     \r
4687     fill : function(els){\r
4688         this.elements = [];\r
4689         this.add(els);\r
4690         return this;\r
4691     },\r
4692 \r
4693     \r
4694     filter : function(selector){\r
4695         var els = [];\r
4696         this.each(function(el){\r
4697             if(el.is(selector)){\r
4698                 els[els.length] = el.dom;\r
4699             }\r
4700         });\r
4701         this.fill(els);\r
4702         return this;\r
4703     },\r
4704 \r
4705     invoke : function(fn, args){\r
4706         var els = this.elements;\r
4707         for(var i = 0, len = els.length; i < len; i++) {\r
4708                 Ext.Element.prototype[fn].apply(els[i], args);\r
4709         }\r
4710         return this;\r
4711     },\r
4712     \r
4713     add : function(els){\r
4714         if(typeof els == "string"){\r
4715             this.addElements(Ext.Element.selectorFunction(els));\r
4716         }else if(els.length !== undefined){\r
4717             this.addElements(els);\r
4718         }else{\r
4719             this.addElements([els]);\r
4720         }\r
4721         return this;\r
4722     },\r
4723     \r
4724     each : function(fn, scope){\r
4725         var els = this.elements;\r
4726         for(var i = 0, len = els.length; i < len; i++){\r
4727             if(fn.call(scope || els[i], els[i], this, i) === false) {\r
4728                 break;\r
4729             }\r
4730         }\r
4731         return this;\r
4732     },\r
4733 \r
4734     \r
4735     item : function(index){\r
4736         return this.elements[index] || null;\r
4737     },\r
4738 \r
4739     \r
4740     first : function(){\r
4741         return this.item(0);\r
4742     },\r
4743 \r
4744     \r
4745     last : function(){\r
4746         return this.item(this.elements.length-1);\r
4747     },\r
4748 \r
4749     \r
4750     getCount : function(){\r
4751         return this.elements.length;\r
4752     },\r
4753 \r
4754     \r
4755     contains : function(el){\r
4756         return this.indexOf(el) !== -1;\r
4757     },\r
4758 \r
4759     \r
4760     indexOf : function(el){\r
4761         return this.elements.indexOf(Ext.get(el));\r
4762     },\r
4763 \r
4764 \r
4765     \r
4766     removeElement : function(el, removeDom){\r
4767         if(el instanceof Array){\r
4768             for(var i = 0, len = el.length; i < len; i++){\r
4769                 this.removeElement(el[i]);\r
4770             }\r
4771             return this;\r
4772         }\r
4773         var index = typeof el == 'number' ? el : this.indexOf(el);\r
4774         if(index !== -1){\r
4775             if(removeDom){\r
4776                 var d = this.elements[index];\r
4777                 if(d.dom){\r
4778                     d.remove();\r
4779                 }else{\r
4780                     d.parentNode.removeChild(d);\r
4781                 }\r
4782             }\r
4783             this.elements.splice(index, 1);\r
4784         }\r
4785         return this;\r
4786     },\r
4787 \r
4788     \r
4789     replaceElement : function(el, replacement, domReplace){\r
4790         var index = typeof el == 'number' ? el : this.indexOf(el);\r
4791         if(index !== -1){\r
4792             if(domReplace){\r
4793                 this.elements[index].replaceWith(replacement);\r
4794             }else{\r
4795                 this.elements.splice(index, 1, Ext.get(replacement))\r
4796             }\r
4797         }\r
4798         return this;\r
4799     },\r
4800 \r
4801     \r
4802     clear : function(){\r
4803         this.elements = [];\r
4804     }\r
4805 };\r
4806 (function(){\r
4807 Ext.CompositeElement.createCall = function(proto, fnName){\r
4808     if(!proto[fnName]){\r
4809         proto[fnName] = function(){\r
4810             return this.invoke(fnName, arguments);\r
4811         };\r
4812     }\r
4813 };\r
4814 for(var fnName in Ext.Element.prototype){\r
4815     if(typeof Ext.Element.prototype[fnName] == "function"){\r
4816         Ext.CompositeElement.createCall(Ext.CompositeElement.prototype, fnName);\r
4817     }\r
4818 };\r
4819 })();\r
4820 \r
4821 \r
4822 Ext.CompositeElementLite = function(els){\r
4823     Ext.CompositeElementLite.superclass.constructor.call(this, els);\r
4824     this.el = new Ext.Element.Flyweight();\r
4825 };\r
4826 Ext.extend(Ext.CompositeElementLite, Ext.CompositeElement, {\r
4827     addElements : function(els){\r
4828         if(els){\r
4829             if(els instanceof Array){\r
4830                 this.elements = this.elements.concat(els);\r
4831             }else{\r
4832                 var yels = this.elements;\r
4833                 var index = yels.length-1;\r
4834                 for(var i = 0, len = els.length; i < len; i++) {\r
4835                     yels[++index] = els[i];\r
4836                 }\r
4837             }\r
4838         }\r
4839         return this;\r
4840     },\r
4841     invoke : function(fn, args){\r
4842         var els = this.elements;\r
4843         var el = this.el;\r
4844         for(var i = 0, len = els.length; i < len; i++) {\r
4845             el.dom = els[i];\r
4846                 Ext.Element.prototype[fn].apply(el, args);\r
4847         }\r
4848         return this;\r
4849     },\r
4850     \r
4851     item : function(index){\r
4852         if(!this.elements[index]){\r
4853             return null;\r
4854         }\r
4855         this.el.dom = this.elements[index];\r
4856         return this.el;\r
4857     },\r
4858 \r
4859     
4860     addListener : function(eventName, handler, scope, opt){\r
4861         var els = this.elements;\r
4862         for(var i = 0, len = els.length; i < len; i++) {\r
4863             Ext.EventManager.on(els[i], eventName, handler, scope || els[i], opt);\r
4864         }\r
4865         return this;\r
4866     },\r
4867 \r
4868     \r
4869     each : function(fn, scope){\r
4870         var els = this.elements;\r
4871         var el = this.el;\r
4872         for(var i = 0, len = els.length; i < len; i++){\r
4873             el.dom = els[i];\r
4874                 if(fn.call(scope || el, el, this, i) === false){\r
4875                 break;\r
4876             }\r
4877         }\r
4878         return this;\r
4879     },\r
4880 \r
4881     indexOf : function(el){\r
4882         return this.elements.indexOf(Ext.getDom(el));\r
4883     },\r
4884 \r
4885     replaceElement : function(el, replacement, domReplace){\r
4886         var index = typeof el == 'number' ? el : this.indexOf(el);\r
4887         if(index !== -1){\r
4888             replacement = Ext.getDom(replacement);\r
4889             if(domReplace){\r
4890                 var d = this.elements[index];\r
4891                 d.parentNode.insertBefore(replacement, d);\r
4892                 d.parentNode.removeChild(d);\r
4893             }\r
4894             this.elements.splice(index, 1, replacement);\r
4895         }\r
4896         return this;\r
4897     }\r
4898 });\r
4899 Ext.CompositeElementLite.prototype.on = Ext.CompositeElementLite.prototype.addListener;\r
4900 if(Ext.DomQuery){\r
4901     Ext.Element.selectorFunction = Ext.DomQuery.select;\r
4902 }\r
4903 \r
4904 Ext.Element.select = function(selector, unique, root){\r
4905     var els;\r
4906     if(typeof selector == "string"){\r
4907         els = Ext.Element.selectorFunction(selector, root);\r
4908     }else if(selector.length !== undefined){\r
4909         els = selector;\r
4910     }else{\r
4911         throw "Invalid selector";\r
4912     }\r
4913     if(unique === true){\r
4914         return new Ext.CompositeElement(els);\r
4915     }else{\r
4916         return new Ext.CompositeElementLite(els);\r
4917     }\r
4918 };\r
4919 \r
4920 Ext.select = Ext.Element.select;
4921 \r
4922 Ext.data.Connection = function(config){\r
4923     Ext.apply(this, config);\r
4924     this.addEvents({\r
4925         \r
4926         "beforerequest" : true,\r
4927         \r
4928         "requestcomplete" : true,\r
4929         \r
4930         "requestexception" : true\r
4931     });\r
4932     Ext.data.Connection.superclass.constructor.call(this);\r
4933 };\r
4934 \r
4935 Ext.extend(Ext.data.Connection, Ext.util.Observable, {\r
4936     \r
4937     \r
4938     \r
4939     \r
4940     \r
4941     timeout : 30000,\r
4942     \r
4943     autoAbort:false,\r
4944 \r
4945     \r
4946     disableCaching: true,\r
4947 \r
4948     \r
4949     request : function(o){\r
4950         if(this.fireEvent("beforerequest", this, o) !== false){\r
4951             var p = o.params;\r
4952 \r
4953             if(typeof p == "function"){\r
4954                 p = p.call(o.scope||window, o);\r
4955             }\r
4956             if(typeof p == "object"){\r
4957                 p = Ext.urlEncode(o.params);\r
4958             }\r
4959             if(this.extraParams){\r
4960                 var extras = Ext.urlEncode(this.extraParams);\r
4961                 p = p ? (p + '&' + extras) : extras;\r
4962             }\r
4963 \r
4964             var url = o.url || this.url;\r
4965             if(typeof url == 'function'){\r
4966                 url = url.call(o.scope||window, o);\r
4967             }\r
4968 \r
4969             if(o.form){\r
4970                 var form = Ext.getDom(o.form);\r
4971                 url = url || form.action;\r
4972 \r
4973                 var enctype = form.getAttribute("enctype");\r
4974                 if(o.isUpload || (enctype && enctype.toLowerCase() == 'multipart/form-data')){\r
4975                     return this.doFormUpload(o, p, url);\r
4976                 }\r
4977                 var f = Ext.lib.Ajax.serializeForm(form);\r
4978                 p = p ? (p + '&' + f) : f;\r
4979             }\r
4980 \r
4981             var hs = o.headers;\r
4982             if(this.defaultHeaders){\r
4983                 hs = Ext.apply(hs || {}, this.defaultHeaders);\r
4984                 if(!o.headers){\r
4985                     o.headers = hs;\r
4986                 }\r
4987             }\r
4988 \r
4989             var cb = {\r
4990                 success: this.handleResponse,\r
4991                 failure: this.handleFailure,\r
4992                 scope: this,\r
4993                 argument: {options: o},\r
4994                 timeout : this.timeout\r
4995             };\r
4996 \r
4997             var method = o.method||this.method||(p ? "POST" : "GET");\r
4998 \r
4999             if(method == 'GET' && (this.disableCaching && o.disableCaching !== false) || o.disableCaching === true){\r
5000                 url += (url.indexOf('?') != -1 ? '&' : '?') + '_dc=' + (new Date().getTime());\r
5001             }\r
5002 \r
5003             if(typeof o.autoAbort == 'boolean'){ 
5004                 if(o.autoAbort){\r
5005                     this.abort();\r
5006                 }\r
5007             }else if(this.autoAbort !== false){\r
5008                 this.abort();\r
5009             }\r
5010 \r
5011             if((method == 'GET' && p) || o.xmlData){\r
5012                 url += (url.indexOf('?') != -1 ? '&' : '?') + p;\r
5013                 p = '';\r
5014             }\r
5015             this.transId = Ext.lib.Ajax.request(method, url, cb, p, o);\r
5016             return this.transId;\r
5017         }else{\r
5018             Ext.callback(o.callback, o.scope, [o, null, null]);\r
5019             return null;\r
5020         }\r
5021     },\r
5022 \r
5023     \r
5024     isLoading : function(transId){\r
5025         if(transId){\r
5026             return Ext.lib.Ajax.isCallInProgress(transId);\r
5027         }else{\r
5028             return this.transId ? true : false;\r
5029         }\r
5030     },\r
5031 \r
5032     \r
5033     abort : function(transId){\r
5034         if(transId || this.isLoading()){\r
5035             Ext.lib.Ajax.abort(transId || this.transId);\r
5036         }\r
5037     },\r
5038 \r
5039     
5040     handleResponse : function(response){\r
5041         this.transId = false;\r
5042         var options = response.argument.options;\r
5043         response.argument = options ? options.argument : null;\r
5044         this.fireEvent("requestcomplete", this, response, options);\r
5045         Ext.callback(options.success, options.scope, [response, options]);\r
5046         Ext.callback(options.callback, options.scope, [options, true, response]);\r
5047     },\r
5048 \r
5049     
5050     handleFailure : function(response, e){\r
5051         this.transId = false;\r
5052         var options = response.argument.options;\r
5053         response.argument = options ? options.argument : null;\r
5054         this.fireEvent("requestexception", this, response, options, e);\r
5055         Ext.callback(options.failure, options.scope, [response, options]);\r
5056         Ext.callback(options.callback, options.scope, [options, false, response]);\r
5057     },\r
5058 \r
5059     
5060     doFormUpload : function(o, ps, url){\r
5061         var id = Ext.id();\r
5062         var frame = document.createElement('iframe');\r
5063         frame.id = id;\r
5064         frame.name = id;\r
5065         frame.className = 'x-hidden';\r
5066         if(Ext.isIE){\r
5067             frame.src = Ext.SSL_SECURE_URL;\r
5068         }\r
5069         document.body.appendChild(frame);\r
5070 \r
5071         if(Ext.isIE){\r
5072            document.frames[id].name = id;\r
5073         }\r
5074 \r
5075         var form = Ext.getDom(o.form);\r
5076         form.target = id;\r
5077         form.method = 'POST';\r
5078         form.enctype = form.encoding = 'multipart/form-data';\r
5079         if(url){\r
5080             form.action = url;\r
5081         }\r
5082 \r
5083         var hiddens, hd;\r
5084         if(ps){ 
5085             hiddens = [];\r
5086             ps = Ext.urlDecode(ps, false);\r
5087             for(var k in ps){\r
5088                 if(ps.hasOwnProperty(k)){\r
5089                     hd = document.createElement('input');\r
5090                     hd.type = 'hidden';\r
5091                     hd.name = k;\r
5092                     hd.value = ps[k];\r
5093                     form.appendChild(hd);\r
5094                     hiddens.push(hd);\r
5095                 }\r
5096             }\r
5097         }\r
5098 \r
5099         function cb(){\r
5100             var r = {  
5101                 responseText : '',\r
5102                 responseXML : null\r
5103             };\r
5104 \r
5105             r.argument = o ? o.argument : null;\r
5106 \r
5107             try { 
5108                 var doc;\r
5109                 if(Ext.isIE){\r
5110                     doc = frame.contentWindow.document;\r
5111                 }else {\r
5112                     doc = (frame.contentDocument || window.frames[id].document);\r
5113                 }\r
5114                 if(doc && doc.body){\r
5115                     r.responseText = doc.body.innerHTML;\r
5116                 }\r
5117                 if(doc && doc.XMLDocument){\r
5118                     r.responseXML = doc.XMLDocument;\r
5119                 }else {\r
5120                     r.responseXML = doc;\r
5121                 }\r
5122             }\r
5123             catch(e) {\r
5124                 
5125             }\r
5126 \r
5127             Ext.EventManager.removeListener(frame, 'load', cb, this);\r
5128 \r
5129             this.fireEvent("requestcomplete", this, r, o);\r
5130             Ext.callback(o.success, o.scope, [r, o]);\r
5131             Ext.callback(o.callback, o.scope, [o, true, r]);\r
5132 \r
5133             setTimeout(function(){document.body.removeChild(frame);}, 100);\r
5134         }\r
5135 \r
5136         Ext.EventManager.on(frame, 'load', cb, this);\r
5137         form.submit();\r
5138 \r
5139         if(hiddens){ 
5140             for(var i = 0, len = hiddens.length; i < len; i++){\r
5141                 form.removeChild(hiddens[i]);\r
5142             }\r
5143         }\r
5144     }\r
5145 });\r
5146 \r
5147 \r
5148 Ext.Ajax = new Ext.data.Connection({\r
5149     
5150    \r
5151     \r
5152     \r
5153     \r
5154     \r
5155     \r
5156 \r
5157     \r
5158 \r
5159     \r
5160     \r
5161     \r
5162     \r
5163     \r
5164     \r
5165 \r
5166     \r
5167     autoAbort : false,\r
5168 \r
5169     \r
5170     serializeForm : function(form){\r
5171         return Ext.lib.Ajax.serializeForm(form);\r
5172     }\r
5173 });
5174 \r
5175 Ext.UpdateManager = function(el, forceNew){\r
5176     el = Ext.get(el);\r
5177     if(!forceNew && el.updateManager){\r
5178         return el.updateManager;\r
5179     }\r
5180     \r
5181     this.el = el;\r
5182     \r
5183     this.defaultUrl = null;\r
5184 \r
5185     this.addEvents({\r
5186         \r
5187         "beforeupdate": true,\r
5188         \r
5189         "update": true,\r
5190         \r
5191         "failure": true\r
5192     });\r
5193     var d = Ext.UpdateManager.defaults;\r
5194     \r
5195     this.sslBlankUrl = d.sslBlankUrl;\r
5196     \r
5197     this.disableCaching = d.disableCaching;\r
5198     \r
5199     this.indicatorText = d.indicatorText;\r
5200     \r
5201     this.showLoadIndicator = d.showLoadIndicator;\r
5202     \r
5203     this.timeout = d.timeout;\r
5204 \r
5205     \r
5206     this.loadScripts = d.loadScripts;\r
5207 \r
5208     \r
5209     this.transaction = null;\r
5210 \r
5211     \r
5212     this.autoRefreshProcId = null;\r
5213     \r
5214     this.refreshDelegate = this.refresh.createDelegate(this);\r
5215     \r
5216     this.updateDelegate = this.update.createDelegate(this);\r
5217     \r
5218     this.formUpdateDelegate = this.formUpdate.createDelegate(this);\r
5219     \r
5220     this.successDelegate = this.processSuccess.createDelegate(this);\r
5221     \r
5222     this.failureDelegate = this.processFailure.createDelegate(this);\r
5223 \r
5224     if(!this.renderer){\r
5225      \r
5226     this.renderer = new Ext.UpdateManager.BasicRenderer();\r
5227     }\r
5228     \r
5229     Ext.UpdateManager.superclass.constructor.call(this);\r
5230 };\r
5231 \r
5232 Ext.extend(Ext.UpdateManager, Ext.util.Observable, {\r
5233     \r
5234     getEl : function(){\r
5235         return this.el;\r
5236     },\r
5237     \r
5238     update : function(url, params, callback, discardUrl){\r
5239         if(this.fireEvent("beforeupdate", this.el, url, params) !== false){\r
5240             var method = this.method, cfg;\r
5241             if(typeof url == "object"){ 
5242                 cfg = url;\r
5243                 url = cfg.url;\r
5244                 params = params || cfg.params;\r
5245                 callback = callback || cfg.callback;\r
5246                 discardUrl = discardUrl || cfg.discardUrl;\r
5247                 if(callback && cfg.scope){\r
5248                     callback = callback.createDelegate(cfg.scope);\r
5249                 }\r
5250                 if(typeof cfg.method != "undefined"){method = cfg.method;};\r
5251                 if(typeof cfg.nocache != "undefined"){this.disableCaching = cfg.nocache;};\r
5252                 if(typeof cfg.text != "undefined"){this.indicatorText = '<div class="loading-indicator">'+cfg.text+"</div>";};\r
5253                 if(typeof cfg.scripts != "undefined"){this.loadScripts = cfg.scripts;};\r
5254                 if(typeof cfg.timeout != "undefined"){this.timeout = cfg.timeout;};\r
5255             }\r
5256             this.showLoading();\r
5257             if(!discardUrl){\r
5258                 this.defaultUrl = url;\r
5259             }\r
5260             if(typeof url == "function"){\r
5261                 url = url.call(this);\r
5262             }\r
5263 \r
5264             method = method || (params ? "POST" : "GET");\r
5265             if(method == "GET"){\r
5266                 url = this.prepareUrl(url);\r
5267             }\r
5268 \r
5269             var o = Ext.apply(cfg ||{}, {\r
5270                 url : url,\r
5271                 params: params,\r
5272                 success: this.successDelegate,\r
5273                 failure: this.failureDelegate,\r
5274                 callback: undefined,\r
5275                 timeout: (this.timeout*1000),\r
5276                 argument: {"url": url, "form": null, "callback": callback, "params": params}\r
5277             });\r
5278 \r
5279             this.transaction = Ext.Ajax.request(o);\r
5280         }\r
5281     },\r
5282 \r
5283     \r
5284     formUpdate : function(form, url, reset, callback){\r
5285         if(this.fireEvent("beforeupdate", this.el, form, url) !== false){\r
5286             if(typeof url == "function"){\r
5287                 url = url.call(this);\r
5288             }\r
5289             form = Ext.getDom(form)\r
5290             this.transaction = Ext.Ajax.request({\r
5291                 form: form,\r
5292                 url:url,\r
5293                 success: this.successDelegate,\r
5294                 failure: this.failureDelegate,\r
5295                 timeout: (this.timeout*1000),\r
5296                 argument: {"url": url, "form": form, "callback": callback, "reset": reset}\r
5297             });\r
5298             this.showLoading.defer(1, this);\r
5299         }\r
5300     },\r
5301 \r
5302     \r
5303     refresh : function(callback){\r
5304         if(this.defaultUrl == null){\r
5305             return;\r
5306         }\r
5307         this.update(this.defaultUrl, null, callback, true);\r
5308     },\r
5309 \r
5310     \r
5311     startAutoRefresh : function(interval, url, params, callback, refreshNow){\r
5312         if(refreshNow){\r
5313             this.update(url || this.defaultUrl, params, callback, true);\r
5314         }\r
5315         if(this.autoRefreshProcId){\r
5316             clearInterval(this.autoRefreshProcId);\r
5317         }\r
5318         this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000);\r
5319     },\r
5320 \r
5321     \r
5322      stopAutoRefresh : function(){\r
5323         if(this.autoRefreshProcId){\r
5324             clearInterval(this.autoRefreshProcId);\r
5325             delete this.autoRefreshProcId;\r
5326         }\r
5327     },\r
5328 \r
5329     isAutoRefreshing : function(){\r
5330        return this.autoRefreshProcId ? true : false;\r
5331     },\r
5332     \r
5333     showLoading : function(){\r
5334         if(this.showLoadIndicator){\r
5335             this.el.update(this.indicatorText);\r
5336         }\r
5337     },\r
5338 \r
5339     \r
5340     prepareUrl : function(url){\r
5341         if(this.disableCaching){\r
5342             var append = "_dc=" + (new Date().getTime());\r
5343             if(url.indexOf("?") !== -1){\r
5344                 url += "&" + append;\r
5345             }else{\r
5346                 url += "?" + append;\r
5347             }\r
5348         }\r
5349         return url;\r
5350     },\r
5351 \r
5352     \r
5353     processSuccess : function(response){\r
5354         this.transaction = null;\r
5355         if(response.argument.form && response.argument.reset){\r
5356             try{ 
5357                 response.argument.form.reset();\r
5358             }catch(e){}\r
5359         }\r
5360         if(this.loadScripts){\r
5361             this.renderer.render(this.el, response, this,\r
5362                 this.updateComplete.createDelegate(this, [response]));\r
5363         }else{\r
5364             this.renderer.render(this.el, response, this);\r
5365             this.updateComplete(response);\r
5366         }\r
5367     },\r
5368 \r
5369     updateComplete : function(response){\r
5370         this.fireEvent("update", this.el, response);\r
5371         if(typeof response.argument.callback == "function"){\r
5372             response.argument.callback(this.el, true, response);\r
5373         }\r
5374     },\r
5375 \r
5376     \r
5377     processFailure : function(response){\r
5378         this.transaction = null;\r
5379         this.fireEvent("failure", this.el, response);\r
5380         if(typeof response.argument.callback == "function"){\r
5381             response.argument.callback(this.el, false, response);\r
5382         }\r
5383     },\r
5384 \r
5385     \r
5386     setRenderer : function(renderer){\r
5387         this.renderer = renderer;\r
5388     },\r
5389 \r
5390     getRenderer : function(){\r
5391        return this.renderer;\r
5392     },\r
5393 \r
5394     \r
5395     setDefaultUrl : function(defaultUrl){\r
5396         this.defaultUrl = defaultUrl;\r
5397     },\r
5398 \r
5399     \r
5400     abort : function(){\r
5401         if(this.transaction){\r
5402             Ext.Ajax.abort(this.transaction);\r
5403         }\r
5404     },\r
5405 \r
5406     \r
5407     isUpdating : function(){\r
5408         if(this.transaction){\r
5409             return Ext.Ajax.isLoading(this.transaction);\r
5410         }\r
5411         return false;\r
5412     }\r
5413 });\r
5414 \r
5415 \r
5416    Ext.UpdateManager.defaults = {\r
5417        \r
5418          timeout : 30,\r
5419 \r
5420          \r
5421         loadScripts : false,\r
5422 \r
5423         \r
5424         sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false"),\r
5425         \r
5426         disableCaching : false,\r
5427         \r
5428         showLoadIndicator : true,\r
5429         \r
5430         indicatorText : '<div class="loading-indicator">Loading...</div>'\r
5431    };\r
5432 \r
5433 \r
5434 Ext.UpdateManager.updateElement = function(el, url, params, options){\r
5435     var um = Ext.get(el, true).getUpdateManager();\r
5436     Ext.apply(um, options);\r
5437     um.update(url, params, options ? options.callback : null);\r
5438 };\r
5439
5440 Ext.UpdateManager.update = Ext.UpdateManager.updateElement;\r
5441 \r
5442 Ext.UpdateManager.BasicRenderer = function(){};\r
5443 \r
5444 Ext.UpdateManager.BasicRenderer.prototype = {\r
5445     \r
5446      render : function(el, response, updateManager, callback){\r
5447         el.update(response.responseText, updateManager.loadScripts, callback);\r
5448     }\r
5449 };\r
5450
5451
5452 Ext.util.DelayedTask = function(fn, scope, args){
5453     var id = null, d, t;
5454
5455     var call = function(){
5456         var now = new Date().getTime();
5457         if(now - t >= d){
5458             clearInterval(id);
5459             id = null;
5460             fn.apply(scope, args || []);
5461         }
5462     };
5463     
5464     this.delay = function(delay, newFn, newScope, newArgs){
5465         if(id && delay != d){
5466             this.cancel();
5467         }
5468         d = delay;
5469         t = new Date().getTime();
5470         fn = newFn || fn;
5471         scope = newScope || scope;
5472         args = newArgs || args;
5473         if(!id){
5474             id = setInterval(call, d);
5475         }
5476     };
5477
5478     
5479     this.cancel = function(){
5480         if(id){
5481             clearInterval(id);
5482             id = null;
5483         }
5484     };
5485 };