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