ext-all-debug.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:1167k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. Ext.DomHelper = function(){
  8.     var tempTableEl = null,
  9.         emptyTags = /^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,
  10.         tableRe = /^table|tbody|tr|td$/i,
  11.         pub,
  12.         
  13.         afterbegin = 'afterbegin',
  14.         afterend = 'afterend',
  15.         beforebegin = 'beforebegin',
  16.         beforeend = 'beforeend',
  17.         ts = '<table>',
  18.         te = '</table>',
  19.         tbs = ts+'<tbody>',
  20.         tbe = '</tbody>'+te,
  21.         trs = tbs + '<tr>',
  22.         tre = '</tr>'+tbe;
  23.     
  24.     function doInsert(el, o, returnElement, pos, sibling, append){
  25.         var newNode = pub.insertHtml(pos, Ext.getDom(el), createHtml(o));
  26.         return returnElement ? Ext.get(newNode, true) : newNode;
  27.     }
  28.     
  29.     function createHtml(o){
  30.         var b = '',
  31.             attr,
  32.             val,
  33.             key,
  34.             keyVal,
  35.             cn;
  36.         if(Ext.isString(o)){
  37.             b = o;
  38.         } else if (Ext.isArray(o)) {
  39.             for (var i=0; i < o.length; i++) {
  40.                 if(o[i]) {
  41.                     b += createHtml(o[i]);
  42.                 }
  43.             };
  44.         } else {
  45.             b += '<' + (o.tag = o.tag || 'div');
  46.             Ext.iterate(o, function(attr, val){
  47.                 if(!/tag|children|cn|html$/i.test(attr)){
  48.                     if (Ext.isObject(val)) {
  49.                         b += ' ' + attr + '="';
  50.                         Ext.iterate(val, function(key, keyVal){
  51.                             b += key + ':' + keyVal + ';';
  52.                         });
  53.                         b += '"';
  54.                     }else{
  55.                         b += ' ' + ({cls : 'class', htmlFor : 'for'}[attr] || attr) + '="' + val + '"';
  56.                     }
  57.                 }
  58.             });
  59.             
  60.             if (emptyTags.test(o.tag)) {
  61.                 b += '/>';
  62.             } else {
  63.                 b += '>';
  64.                 if ((cn = o.children || o.cn)) {
  65.                     b += createHtml(cn);
  66.                 } else if(o.html){
  67.                     b += o.html;
  68.                 }
  69.                 b += '</' + o.tag + '>';
  70.             }
  71.         }
  72.         return b;
  73.     }
  74.     function ieTable(depth, s, h, e){
  75.         tempTableEl.innerHTML = [s, h, e].join('');
  76.         var i = -1,
  77.             el = tempTableEl,
  78.             ns;
  79.         while(++i < depth){
  80.             el = el.firstChild;
  81.         }
  82.         if(ns = el.nextSibling){
  83.             var df = document.createDocumentFragment();
  84.             while(el){
  85.                 ns = el.nextSibling;
  86.                 df.appendChild(el);
  87.                 el = ns;
  88.             }
  89.             el = df;
  90.         }
  91.         return el;
  92.     }
  93.     
  94.     function insertIntoTable(tag, where, el, html) {
  95.         var node,
  96.             before;
  97.         tempTableEl = tempTableEl || document.createElement('div');
  98.         if(tag == 'td' && (where == afterbegin || where == beforeend) ||
  99.            !/td|tr|tbody/i.test(tag) && (where == beforebegin || where == afterend)) {
  100.             return;
  101.         }
  102.         before = where == beforebegin ? el :
  103.                  where == afterend ? el.nextSibling :
  104.                  where == afterbegin ? el.firstChild : null;
  105.         if (where == beforebegin || where == afterend) {
  106.             el = el.parentNode;
  107.         }
  108.         if (tag == 'td' || (tag == 'tr' && (where == beforeend || where == afterbegin))) {
  109.             node = ieTable(4, trs, html, tre);
  110.         } else if ((tag == 'tbody' && (where == beforeend || where == afterbegin)) ||
  111.                    (tag == 'tr' && (where == beforebegin || where == afterend))) {
  112.             node = ieTable(3, tbs, html, tbe);
  113.         } else {
  114.             node = ieTable(2, ts, html, te);
  115.         }
  116.         el.insertBefore(node, before);
  117.         return node;
  118.     }
  119.     pub = {
  120.         
  121.         markup : function(o){
  122.             return createHtml(o);
  123.         },
  124.         
  125.         
  126.         applyStyles : function(el, styles){
  127.             if(styles){
  128.                 var i = 0,
  129.                     len,
  130.                     style;
  131.                 el = Ext.fly(el);
  132.                 if(Ext.isFunction(styles)){
  133.                     styles = styles.call();
  134.                 }
  135.                 if(Ext.isString(styles)){
  136.                     styles = styles.trim().split(/s*(?::|;)s*/);
  137.                     for(len = styles.length; i < len;){
  138.                         el.setStyle(styles[i++], styles[i++]);
  139.                     }
  140.                 }else if (Ext.isObject(styles)){
  141.                     el.setStyle(styles);
  142.                 }
  143.             }
  144.         },
  145.         
  146.         insertHtml : function(where, el, html){
  147.             var hash = {},
  148.                 hashVal,
  149.                 setStart,
  150.                 range,
  151.                 frag,
  152.                 rangeEl,
  153.                 rs;
  154.             where = where.toLowerCase();
  155.             
  156.             hash[beforebegin] = ['BeforeBegin', 'previousSibling'];
  157.             hash[afterend] = ['AfterEnd', 'nextSibling'];
  158.             if (el.insertAdjacentHTML) {
  159.                 if(tableRe.test(el.tagName) && (rs = insertIntoTable(el.tagName.toLowerCase(), where, el, html))){
  160.                     return rs;
  161.                 }
  162.                 
  163.                 hash[afterbegin] = ['AfterBegin', 'firstChild'];
  164.                 hash[beforeend] = ['BeforeEnd', 'lastChild'];
  165.                 if ((hashVal = hash[where])) {
  166.                     el.insertAdjacentHTML(hashVal[0], html);
  167.                     return el[hashVal[1]];
  168.                 }
  169.             } else {
  170.                 range = el.ownerDocument.createRange();
  171.                 setStart = 'setStart' + (/end/i.test(where) ? 'After' : 'Before');
  172.                 if (hash[where]) {
  173.                     range[setStart](el);
  174.                     frag = range.createContextualFragment(html);
  175.                     el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
  176.                     return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
  177.                 } else {
  178.                     rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
  179.                     if (el.firstChild) {
  180.                         range[setStart](el[rangeEl]);
  181.                         frag = range.createContextualFragment(html);
  182.                         if(where == afterbegin){
  183.                             el.insertBefore(frag, el.firstChild);
  184.                         }else{
  185.                             el.appendChild(frag);
  186.                         }
  187.                     } else {
  188.                         el.innerHTML = html;
  189.                     }
  190.                     return el[rangeEl];
  191.                 }
  192.             }
  193.             throw 'Illegal insertion point -> "' + where + '"';
  194.         },
  195.         
  196.         insertBefore : function(el, o, returnElement){
  197.             return doInsert(el, o, returnElement, beforebegin);
  198.         },
  199.         
  200.         insertAfter : function(el, o, returnElement){
  201.             return doInsert(el, o, returnElement, afterend, 'nextSibling');
  202.         },
  203.         
  204.         insertFirst : function(el, o, returnElement){
  205.             return doInsert(el, o, returnElement, afterbegin, 'firstChild');
  206.         },
  207.         
  208.         append : function(el, o, returnElement){
  209.             return doInsert(el, o, returnElement, beforeend, '', true);
  210.         },
  211.         
  212.         overwrite : function(el, o, returnElement){
  213.             el = Ext.getDom(el);
  214.             el.innerHTML = createHtml(o);
  215.             return returnElement ? Ext.get(el.firstChild) : el.firstChild;
  216.         },
  217.         createHtml : createHtml
  218.     };
  219.     return pub;
  220. }();
  221. Ext.apply(Ext.DomHelper,
  222. function(){
  223. var pub,
  224. afterbegin = 'afterbegin',
  225.      afterend = 'afterend',
  226.      beforebegin = 'beforebegin',
  227.      beforeend = 'beforeend';
  228.     function doInsert(el, o, returnElement, pos, sibling, append){
  229.         el = Ext.getDom(el);
  230.         var newNode;
  231.         if (pub.useDom) {
  232.             newNode = createDom(o, null);
  233.             if (append) {
  234.             el.appendChild(newNode);
  235.             } else {
  236.          (sibling == 'firstChild' ? el : el.parentNode).insertBefore(newNode, el[sibling] || el);
  237.             }
  238.         } else {
  239.             newNode = Ext.DomHelper.insertHtml(pos, el, Ext.DomHelper.createHtml(o));
  240.         }
  241.         return returnElement ? Ext.get(newNode, true) : newNode;
  242.     }
  243.     
  244.     function createDom(o, parentNode){
  245.         var el,
  246.          doc = document,
  247.          useSet,
  248.          attr,
  249.          val,
  250.          cn;
  251.         if (Ext.isArray(o)) {                       
  252.             el = doc.createDocumentFragment(); 
  253.         Ext.each(o, function(v) {
  254.                 createDom(v, el);
  255.             });
  256.         } else if (Ext.isString(o)) {         
  257.             el = doc.createTextNode(o);
  258.         } else {
  259.             el = doc.createElement( o.tag || 'div' );
  260.             useSet = !!el.setAttribute; 
  261.             Ext.iterate(o, function(attr, val){
  262.                 if(!/tag|children|cn|html|style/.test(attr)){
  263.                 if(attr == 'cls'){
  264.                     el.className = val;
  265.                 }else{
  266.                         if(useSet){
  267.                             el.setAttribute(attr, val);
  268.                         }else{
  269.                             el[attr] = val;
  270.                         }
  271.                 }
  272.                 }
  273.             });
  274.             Ext.DomHelper.applyStyles(el, o.style);
  275.             if ((cn = o.children || o.cn)) {
  276.                 createDom(cn, el);
  277.             } else if (o.html) {
  278.                 el.innerHTML = o.html;
  279.             }
  280.         }
  281.         if(parentNode){
  282.            parentNode.appendChild(el);
  283.         }
  284.         return el;
  285.     }
  286. pub = {
  287.     createTemplate : function(o){
  288.         var html = Ext.DomHelper.createHtml(o);
  289.         return new Ext.Template(html);
  290.     },
  291.     useDom : false,
  292.     
  293.     insertBefore : function(el, o, returnElement){
  294.         return doInsert(el, o, returnElement, beforebegin);
  295.     },
  296.     
  297.     insertAfter : function(el, o, returnElement){
  298.         return doInsert(el, o, returnElement, afterend, 'nextSibling');
  299.     },
  300.     
  301.     insertFirst : function(el, o, returnElement){
  302.         return doInsert(el, o, returnElement, afterbegin, 'firstChild');
  303.     },
  304.     
  305.     append: function(el, o, returnElement){
  306.             return doInsert(el, o, returnElement, beforeend, '', true);
  307.         },
  308.     
  309.         createDom: createDom
  310. };
  311. return pub;
  312. }());
  313. Ext.Template = function(html){
  314.     var me = this,
  315.      a = arguments,
  316.      buf = [];
  317.     if (Ext.isArray(html)) {
  318.         html = html.join("");
  319.     } else if (a.length > 1) {
  320.     Ext.each(a, function(v) {
  321.             if (Ext.isObject(v)) {
  322.                 Ext.apply(me, v);
  323.             } else {
  324.                 buf.push(v);
  325.             }
  326.         });
  327.         html = buf.join('');
  328.     }
  329.     
  330.     me.html = html;
  331.     
  332.     if (me.compiled) {
  333.         me.compile();
  334.     }
  335. };
  336. Ext.Template.prototype = {
  337.     
  338.     re : /{([w-]+)}/g,
  339.     
  340.     
  341.     applyTemplate : function(values){
  342. var me = this;
  343.         return me.compiled ?
  344.          me.compiled(values) :
  345. me.html.replace(me.re, function(m, name){
  346.          return values[name] !== undefined ? values[name] : "";
  347.         });
  348. },
  349.     
  350.     set : function(html, compile){
  351.     var me = this;
  352.         me.html = html;
  353.         me.compiled = null;
  354.         return compile ? me.compile() : me;
  355.     },
  356.     
  357.     compile : function(){
  358.         var me = this,
  359.          sep = Ext.isGecko ? "+" : ",";
  360.         function fn(m, name){                        
  361.         name = "values['" + name + "']";
  362.         return "'"+ sep + '(' + name + " == undefined ? '' : " + name + ')' + sep + "'";
  363.         }
  364.                 
  365.         eval("this.compiled = function(values){ return " + (Ext.isGecko ? "'" : "['") +
  366.              me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn) +
  367.              (Ext.isGecko ?  "';};" : "'].join('');};"));
  368.         return me;
  369.     },
  370.     
  371.     insertFirst: function(el, values, returnElement){
  372.         return this.doInsert('afterBegin', el, values, returnElement);
  373.     },
  374.     
  375.     insertBefore: function(el, values, returnElement){
  376.         return this.doInsert('beforeBegin', el, values, returnElement);
  377.     },
  378.     
  379.     insertAfter : function(el, values, returnElement){
  380.         return this.doInsert('afterEnd', el, values, returnElement);
  381.     },
  382.     
  383.     append : function(el, values, returnElement){
  384.         return this.doInsert('beforeEnd', el, values, returnElement);
  385.     },
  386.     doInsert : function(where, el, values, returnEl){
  387.         el = Ext.getDom(el);
  388.         var newNode = Ext.DomHelper.insertHtml(where, el, this.applyTemplate(values));
  389.         return returnEl ? Ext.get(newNode, true) : newNode;
  390.     },
  391.     
  392.     overwrite : function(el, values, returnElement){
  393.         el = Ext.getDom(el);
  394.         el.innerHTML = this.applyTemplate(values);
  395.         return returnElement ? Ext.get(el.firstChild, true) : el.firstChild;
  396.     }
  397. };
  398. Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate;
  399. Ext.Template.from = function(el, config){
  400.     el = Ext.getDom(el);
  401.     return new Ext.Template(el.value || el.innerHTML, config || '');
  402. };
  403. Ext.apply(Ext.Template.prototype, {
  404.     
  405.     disableFormats : false,
  406.     
  407.     
  408.     re : /{([w-]+)(?::([w.]*)(?:((.*?)?))?)?}/g,
  409.     
  410.     applyTemplate : function(values){
  411. var me = this,
  412. useF = me.disableFormats !== true,
  413.          fm = Ext.util.Format, 
  414.          tpl = me;     
  415.     
  416.         if(me.compiled){
  417.             return me.compiled(values);
  418.         }
  419.         function fn(m, name, format, args){
  420.             if (format && useF) {
  421.                 if (format.substr(0, 5) == "this.") {
  422.                     return tpl.call(format.substr(5), values[name], values);
  423.                 } else {
  424.                     if (args) {
  425.                         
  426.                         
  427.                         
  428.                         var re = /^s*['"](.*)["']s*$/;
  429.                         args = args.split(',');
  430.                         for(var i = 0, len = args.length; i < len; i++){
  431.                             args[i] = args[i].replace(re, "$1");
  432.                         }
  433.                         args = [values[name]].concat(args);
  434.                     } else {
  435.                         args = [values[name]];
  436.                     }
  437.                     return fm[format].apply(fm, args);
  438.                 }
  439.             } else {
  440.                 return values[name] !== undefined ? values[name] : "";
  441.             }
  442.         }
  443.         return me.html.replace(me.re, fn);
  444.     },
  445.     
  446.     compile : function(){
  447.         var me = this,
  448.          fm = Ext.util.Format,
  449.          useF = me.disableFormats !== true,
  450.          sep = Ext.isGecko ? "+" : ",",
  451.          body;
  452.         
  453.         function fn(m, name, format, args){
  454.             if(format && useF){
  455.                 args = args ? ',' + args : "";
  456.                 if(format.substr(0, 5) != "this."){
  457.                     format = "fm." + format + '(';
  458.                 }else{
  459.                     format = 'this.call("'+ format.substr(5) + '", ';
  460.                     args = ", values";
  461.                 }
  462.             }else{
  463.                 args= ''; format = "(values['" + name + "'] == undefined ? '' : ";
  464.             }
  465.             return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'";
  466.         }
  467.         
  468.         
  469.         if(Ext.isGecko){
  470.             body = "this.compiled = function(values){ return '" +
  471.                    me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn) +
  472.                     "';};";
  473.         }else{
  474.             body = ["this.compiled = function(values){ return ['"];
  475.             body.push(me.html.replace(/\/g, '\\').replace(/(rn|n)/g, '\n').replace(/'/g, "\'").replace(this.re, fn));
  476.             body.push("'].join('');};");
  477.             body = body.join('');
  478.         }
  479.         eval(body);
  480.         return me;
  481.     },
  482.     
  483.     
  484.     call : function(fnName, value, allValues){
  485.         return this[fnName](value, allValues);
  486.     }
  487. });
  488. Ext.Template.prototype.apply = Ext.Template.prototype.applyTemplate; 
  489. Ext.DomQuery = function(){
  490.     var cache = {}, 
  491.      simpleCache = {}, 
  492.      valueCache = {},
  493.      nonSpace = /S/,
  494.      trimRe = /^s+|s+$/g,
  495.      tplRe = /{(d+)}/g,
  496.      modeRe = /^(s?[/>+~]s?|s|$)/,
  497.      tagTokenRe = /^(#)?([w-*]+)/,
  498.      nthRe = /(d*)n+?(d*)/, 
  499.      nthRe2 = /D/,
  500.     
  501.     
  502.     
  503.     isIE = window.ActiveXObject ? true : false,
  504.     key = 30803;
  505.     
  506.     
  507. eval("var batch = 30803;");    
  508.     function child(p, index){
  509.         var i = 0,
  510.          n = p.firstChild;
  511.         while(n){
  512.             if(n.nodeType == 1){
  513.                if(++i == index){
  514.                    return n;
  515.                }
  516.             }
  517.             n = n.nextSibling;
  518.         }
  519.         return null;
  520.     };
  521.     function next(n){
  522.         while((n = n.nextSibling) && n.nodeType != 1);
  523.         return n;
  524.     };
  525.     function prev(n){
  526.         while((n = n.previousSibling) && n.nodeType != 1);
  527.         return n;
  528.     };
  529.     function children(d){
  530.         var n = d.firstChild, ni = -1,
  531.          nx;
  532.       while(n){
  533.           nx = n.nextSibling;
  534.           if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
  535.               d.removeChild(n);
  536.           }else{
  537.               n.nodeIndex = ++ni;
  538.           }
  539.           n = nx;
  540.       }
  541.       return this;
  542.   };
  543.     function byClassName(c, a, v){
  544.         if(!v){
  545.             return c;
  546.         }
  547.         var r = [], ri = -1, cn;
  548.         for(var i = 0, ci; ci = c[i]; i++){
  549.             if((' '+ci.className+' ').indexOf(v) != -1){
  550.                 r[++ri] = ci;
  551.             }
  552.         }
  553.         return r;
  554.     };
  555.     function attrValue(n, attr){
  556.         if(!n.tagName && typeof n.length != "undefined"){
  557.             n = n[0];
  558.         }
  559.         if(!n){
  560.             return null;
  561.         }
  562.         if(attr == "for"){
  563.             return n.htmlFor;
  564.         }
  565.         if(attr == "class" || attr == "className"){
  566.             return n.className;
  567.         }
  568.         return n.getAttribute(attr) || n[attr];
  569.     };
  570.     function getNodes(ns, mode, tagName){
  571.         var result = [], ri = -1, cs;
  572.         if(!ns){
  573.             return result;
  574.         }
  575.         tagName = tagName || "*";
  576.         if(typeof ns.getElementsByTagName != "undefined"){
  577.             ns = [ns];
  578.         }
  579.         if(!mode){
  580.             for(var i = 0, ni; ni = ns[i]; i++){
  581.                 cs = ni.getElementsByTagName(tagName);
  582.                 for(var j = 0, ci; ci = cs[j]; j++){
  583.                     result[++ri] = ci;
  584.                 }
  585.             }
  586.         }else if(mode == "/" || mode == ">"){
  587.             var utag = tagName.toUpperCase();
  588.             for(var i = 0, ni, cn; ni = ns[i]; i++){
  589.                 cn = ni.childNodes;
  590.                 for(var j = 0, cj; cj = cn[j]; j++){
  591.                     if(cj.nodeName == utag || cj.nodeName == tagName  || tagName == '*'){
  592.                         result[++ri] = cj;
  593.                     }
  594.                 }
  595.             }
  596.         }else if(mode == "+"){
  597.             var utag = tagName.toUpperCase();
  598.             for(var i = 0, n; n = ns[i]; i++){
  599.                 while((n = n.nextSibling) && n.nodeType != 1);
  600.                 if(n && (n.nodeName == utag || n.nodeName == tagName || tagName == '*')){
  601.                     result[++ri] = n;
  602.                 }
  603.             }
  604.         }else if(mode == "~"){
  605.             var utag = tagName.toUpperCase();
  606.             for(var i = 0, n; n = ns[i]; i++){
  607.                 while((n = n.nextSibling)){
  608.                     if (n.nodeName == utag || n.nodeName == tagName || tagName == '*'){
  609.                         result[++ri] = n;
  610.                     }
  611.                 }
  612.             }
  613.         }
  614.         return result;
  615.     };
  616.     function concat(a, b){
  617.         if(b.slice){
  618.             return a.concat(b);
  619.         }
  620.         for(var i = 0, l = b.length; i < l; i++){
  621.             a[a.length] = b[i];
  622.         }
  623.         return a;
  624.     }
  625.     function byTag(cs, tagName){
  626.         if(cs.tagName || cs == document){
  627.             cs = [cs];
  628.         }
  629.         if(!tagName){
  630.             return cs;
  631.         }
  632.         var r = [], ri = -1;
  633.         tagName = tagName.toLowerCase();
  634.         for(var i = 0, ci; ci = cs[i]; i++){
  635.             if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
  636.                 r[++ri] = ci;
  637.             }
  638.         }
  639.         return r;
  640.     };
  641.     function byId(cs, attr, id){
  642.         if(cs.tagName || cs == document){
  643.             cs = [cs];
  644.         }
  645.         if(!id){
  646.             return cs;
  647.         }
  648.         var r = [], ri = -1;
  649.         for(var i = 0,ci; ci = cs[i]; i++){
  650.             if(ci && ci.id == id){
  651.                 r[++ri] = ci;
  652.                 return r;
  653.             }
  654.         }
  655.         return r;
  656.     };
  657.     function byAttribute(cs, attr, value, op, custom){
  658.         var r = [], 
  659.          ri = -1, 
  660.          st = custom=="{",
  661.          f = Ext.DomQuery.operators[op];
  662.         for(var i = 0, ci; ci = cs[i]; i++){
  663.             if(ci.nodeType != 1){
  664.                 continue;
  665.             }
  666.             var a;
  667.             if(st){
  668.                 a = Ext.DomQuery.getStyle(ci, attr);
  669.             }
  670.             else if(attr == "class" || attr == "className"){
  671.                 a = ci.className;
  672.             }else if(attr == "for"){
  673.                 a = ci.htmlFor;
  674.             }else if(attr == "href"){
  675.                 a = ci.getAttribute("href", 2);
  676.             }else{
  677.                 a = ci.getAttribute(attr);
  678.             }
  679.             if((f && f(a, value)) || (!f && a)){
  680.                 r[++ri] = ci;
  681.             }
  682.         }
  683.         return r;
  684.     };
  685.     function byPseudo(cs, name, value){
  686.         return Ext.DomQuery.pseudos[name](cs, value);
  687.     };
  688.     function nodupIEXml(cs){
  689.         var d = ++key, 
  690.          r;
  691.         cs[0].setAttribute("_nodup", d);
  692.         r = [cs[0]];
  693.         for(var i = 1, len = cs.length; i < len; i++){
  694.             var c = cs[i];
  695.             if(!c.getAttribute("_nodup") != d){
  696.                 c.setAttribute("_nodup", d);
  697.                 r[r.length] = c;
  698.             }
  699.         }
  700.         for(var i = 0, len = cs.length; i < len; i++){
  701.             cs[i].removeAttribute("_nodup");
  702.         }
  703.         return r;
  704.     }
  705.     function nodup(cs){
  706.         if(!cs){
  707.             return [];
  708.         }
  709.         var len = cs.length, c, i, r = cs, cj, ri = -1;
  710.         if(!len || typeof cs.nodeType != "undefined" || len == 1){
  711.             return cs;
  712.         }
  713.         if(isIE && typeof cs[0].selectSingleNode != "undefined"){
  714.             return nodupIEXml(cs);
  715.         }
  716.         var d = ++key;
  717.         cs[0]._nodup = d;
  718.         for(i = 1; c = cs[i]; i++){
  719.             if(c._nodup != d){
  720.                 c._nodup = d;
  721.             }else{
  722.                 r = [];
  723.                 for(var j = 0; j < i; j++){
  724.                     r[++ri] = cs[j];
  725.                 }
  726.                 for(j = i+1; cj = cs[j]; j++){
  727.                     if(cj._nodup != d){
  728.                         cj._nodup = d;
  729.                         r[++ri] = cj;
  730.                     }
  731.                 }
  732.                 return r;
  733.             }
  734.         }
  735.         return r;
  736.     }
  737.     function quickDiffIEXml(c1, c2){
  738.         var d = ++key,
  739.          r = [];
  740.         for(var i = 0, len = c1.length; i < len; i++){
  741.             c1[i].setAttribute("_qdiff", d);
  742.         }        
  743.         for(var i = 0, len = c2.length; i < len; i++){
  744.             if(c2[i].getAttribute("_qdiff") != d){
  745.                 r[r.length] = c2[i];
  746.             }
  747.         }
  748.         for(var i = 0, len = c1.length; i < len; i++){
  749.            c1[i].removeAttribute("_qdiff");
  750.         }
  751.         return r;
  752.     }
  753.     function quickDiff(c1, c2){
  754.         var len1 = c1.length,
  755.          d = ++key,
  756.          r = [];
  757.         if(!len1){
  758.             return c2;
  759.         }
  760.         if(isIE && typeof c1[0].selectSingleNode != "undefined"){
  761.             return quickDiffIEXml(c1, c2);
  762.         }        
  763.         for(var i = 0; i < len1; i++){
  764.             c1[i]._qdiff = d;
  765.         }        
  766.         for(var i = 0, len = c2.length; i < len; i++){
  767.             if(c2[i]._qdiff != d){
  768.                 r[r.length] = c2[i];
  769.             }
  770.         }
  771.         return r;
  772.     }
  773.     function quickId(ns, mode, root, id){
  774.         if(ns == root){
  775.            var d = root.ownerDocument || root;
  776.            return d.getElementById(id);
  777.         }
  778.         ns = getNodes(ns, mode, "*");
  779.         return byId(ns, null, id);
  780.     }
  781.     return {
  782.         getStyle : function(el, name){
  783.             return Ext.fly(el).getStyle(name);
  784.         },
  785.         
  786.         compile : function(path, type){
  787.             type = type || "select";
  788.             var fn = ["var f = function(root){n var mode; ++batch; var n = root || document;n"],
  789.              q = path, mode, lq,
  790.              tk = Ext.DomQuery.matchers,
  791.              tklen = tk.length,
  792.              mm,
  793.             
  794.              lmode = q.match(modeRe);
  795.             
  796.             if(lmode && lmode[1]){
  797.                 fn[fn.length] = 'mode="'+lmode[1].replace(trimRe, "")+'";';
  798.                 q = q.replace(lmode[1], "");
  799.             }
  800.             
  801.             while(path.substr(0, 1)=="/"){
  802.                 path = path.substr(1);
  803.             }
  804.             while(q && lq != q){
  805.                 lq = q;
  806.                 var tm = q.match(tagTokenRe);
  807.                 if(type == "select"){
  808.                     if(tm){
  809.                         if(tm[1] == "#"){
  810.                             fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
  811.                         }else{
  812.                             fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
  813.                         }
  814.                         q = q.replace(tm[0], "");
  815.                     }else if(q.substr(0, 1) != '@'){
  816.                         fn[fn.length] = 'n = getNodes(n, mode, "*");';
  817.                     }
  818.                 }else{
  819.                     if(tm){
  820.                         if(tm[1] == "#"){
  821.                             fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
  822.                         }else{
  823.                             fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
  824.                         }
  825.                         q = q.replace(tm[0], "");
  826.                     }
  827.                 }
  828.                 while(!(mm = q.match(modeRe))){
  829.                     var matched = false;
  830.                     for(var j = 0; j < tklen; j++){
  831.                         var t = tk[j];
  832.                         var m = q.match(t.re);
  833.                         if(m){
  834.                             fn[fn.length] = t.select.replace(tplRe, function(x, i){
  835.                                                     return m[i];
  836.                                                 });
  837.                             q = q.replace(m[0], "");
  838.                             matched = true;
  839.                             break;
  840.                         }
  841.                     }
  842.                     
  843.                     if(!matched){
  844.                         throw 'Error parsing selector, parsing failed at "' + q + '"';
  845.                     }
  846.                 }
  847.                 if(mm[1]){
  848.                     fn[fn.length] = 'mode="'+mm[1].replace(trimRe, "")+'";';
  849.                     q = q.replace(mm[1], "");
  850.                 }
  851.             }
  852.             fn[fn.length] = "return nodup(n);n}";
  853.             eval(fn.join(""));
  854.             return f;
  855.         },
  856.         
  857.         select : function(path, root, type){
  858.             if(!root || root == document){
  859.                 root = document;
  860.             }
  861.             if(typeof root == "string"){
  862.                 root = document.getElementById(root);
  863.             }
  864.             var paths = path.split(","),
  865.              results = [];
  866.             for(var i = 0, len = paths.length; i < len; i++){
  867.                 var p = paths[i].replace(trimRe, "");
  868.                 if(!cache[p]){
  869.                     cache[p] = Ext.DomQuery.compile(p);
  870.                     if(!cache[p]){
  871.                         throw p + " is not a valid selector";
  872.                     }
  873.                 }
  874.                 var result = cache[p](root);
  875.                 if(result && result != document){
  876.                     results = results.concat(result);
  877.                 }
  878.             }
  879.             if(paths.length > 1){
  880.                 return nodup(results);
  881.             }
  882.             return results;
  883.         },
  884.         
  885.         selectNode : function(path, root){
  886.             return Ext.DomQuery.select(path, root)[0];
  887.         },
  888.         
  889.         selectValue : function(path, root, defaultValue){
  890.             path = path.replace(trimRe, "");
  891.             if(!valueCache[path]){
  892.                 valueCache[path] = Ext.DomQuery.compile(path, "select");
  893.             }
  894.             var n = valueCache[path](root), v;
  895.             n = n[0] ? n[0] : n;
  896.             
  897.             if (typeof n.normalize == 'function') n.normalize();
  898.             
  899.             v = (n && n.firstChild ? n.firstChild.nodeValue : null);
  900.             return ((v === null||v === undefined||v==='') ? defaultValue : v);
  901.         },
  902.         
  903.         selectNumber : function(path, root, defaultValue){
  904.             var v = Ext.DomQuery.selectValue(path, root, defaultValue || 0);
  905.             return parseFloat(v);
  906.         },
  907.         
  908.         is : function(el, ss){
  909.             if(typeof el == "string"){
  910.                 el = document.getElementById(el);
  911.             }
  912.             var isArray = Ext.isArray(el),
  913.              result = Ext.DomQuery.filter(isArray ? el : [el], ss);
  914.             return isArray ? (result.length == el.length) : (result.length > 0);
  915.         },
  916.         
  917.         filter : function(els, ss, nonMatches){
  918.             ss = ss.replace(trimRe, "");
  919.             if(!simpleCache[ss]){
  920.                 simpleCache[ss] = Ext.DomQuery.compile(ss, "simple");
  921.             }
  922.             var result = simpleCache[ss](els);
  923.             return nonMatches ? quickDiff(result, els) : result;
  924.         },
  925.         
  926.         matchers : [{
  927.                 re: /^.([w-]+)/,
  928.                 select: 'n = byClassName(n, null, " {1} ");'
  929.             }, {
  930.                 re: /^:([w-]+)(?:(((?:[^s>/]*|.*?))))?/,
  931.                 select: 'n = byPseudo(n, "{1}", "{2}");'
  932.             },{
  933.                 re: /^(?:([[{])(?:@)?([w-]+)s?(?:(=|.=)s?['"]?(.*?)["']?)?[]}])/,
  934.                 select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
  935.             }, {
  936.                 re: /^#([w-]+)/,
  937.                 select: 'n = byId(n, null, "{1}");'
  938.             },{
  939.                 re: /^@([w-]+)/,
  940.                 select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
  941.             }
  942.         ],
  943.         
  944.         operators : {
  945.             "=" : function(a, v){
  946.                 return a == v;
  947.             },
  948.             "!=" : function(a, v){
  949.                 return a != v;
  950.             },
  951.             "^=" : function(a, v){
  952.                 return a && a.substr(0, v.length) == v;
  953.             },
  954.             "$=" : function(a, v){
  955.                 return a && a.substr(a.length-v.length) == v;
  956.             },
  957.             "*=" : function(a, v){
  958.                 return a && a.indexOf(v) !== -1;
  959.             },
  960.             "%=" : function(a, v){
  961.                 return (a % v) == 0;
  962.             },
  963.             "|=" : function(a, v){
  964.                 return a && (a == v || a.substr(0, v.length+1) == v+'-');
  965.             },
  966.             "~=" : function(a, v){
  967.                 return a && (' '+a+' ').indexOf(' '+v+' ') != -1;
  968.             }
  969.         },
  970.         
  971.         pseudos : {
  972.             "first-child" : function(c){
  973.                 var r = [], ri = -1, n;
  974.                 for(var i = 0, ci; ci = n = c[i]; i++){
  975.                     while((n = n.previousSibling) && n.nodeType != 1);
  976.                     if(!n){
  977.                         r[++ri] = ci;
  978.                     }
  979.                 }
  980.                 return r;
  981.             },
  982.             "last-child" : function(c){
  983.                 var r = [], ri = -1, n;
  984.                 for(var i = 0, ci; ci = n = c[i]; i++){
  985.                     while((n = n.nextSibling) && n.nodeType != 1);
  986.                     if(!n){
  987.                         r[++ri] = ci;
  988.                     }
  989.                 }
  990.                 return r;
  991.             },
  992.             "nth-child" : function(c, a) {
  993.                 var r = [], ri = -1,
  994.                  m = nthRe.exec(a == "even" && "2n" || a == "odd" && "2n+1" || !nthRe2.test(a) && "n+" + a || a),
  995.                  f = (m[1] || 1) - 0, l = m[2] - 0;
  996.                 for(var i = 0, n; n = c[i]; i++){
  997.                     var pn = n.parentNode;
  998.                     if (batch != pn._batch) {
  999.                         var j = 0;
  1000.                         for(var cn = pn.firstChild; cn; cn = cn.nextSibling){
  1001.                             if(cn.nodeType == 1){
  1002.                                cn.nodeIndex = ++j;
  1003.                             }
  1004.                         }
  1005.                         pn._batch = batch;
  1006.                     }
  1007.                     if (f == 1) {
  1008.                         if (l == 0 || n.nodeIndex == l){
  1009.                             r[++ri] = n;
  1010.                         }
  1011.                     } else if ((n.nodeIndex + l) % f == 0){
  1012.                         r[++ri] = n;
  1013.                     }
  1014.                 }
  1015.                 return r;
  1016.             },
  1017.             "only-child" : function(c){
  1018.                 var r = [], ri = -1;;
  1019.                 for(var i = 0, ci; ci = c[i]; i++){
  1020.                     if(!prev(ci) && !next(ci)){
  1021.                         r[++ri] = ci;
  1022.                     }
  1023.                 }
  1024.                 return r;
  1025.             },
  1026.             "empty" : function(c){
  1027.                 var r = [], ri = -1;
  1028.                 for(var i = 0, ci; ci = c[i]; i++){
  1029.                     var cns = ci.childNodes, j = 0, cn, empty = true;
  1030.                     while(cn = cns[j]){
  1031.                         ++j;
  1032.                         if(cn.nodeType == 1 || cn.nodeType == 3){
  1033.                             empty = false;
  1034.                             break;
  1035.                         }
  1036.                     }
  1037.                     if(empty){
  1038.                         r[++ri] = ci;
  1039.                     }
  1040.                 }
  1041.                 return r;
  1042.             },
  1043.             "contains" : function(c, v){
  1044.                 var r = [], ri = -1;
  1045.                 for(var i = 0, ci; ci = c[i]; i++){
  1046.                     if((ci.textContent||ci.innerText||'').indexOf(v) != -1){
  1047.                         r[++ri] = ci;
  1048.                     }
  1049.                 }
  1050.                 return r;
  1051.             },
  1052.             "nodeValue" : function(c, v){
  1053.                 var r = [], ri = -1;
  1054.                 for(var i = 0, ci; ci = c[i]; i++){
  1055.                     if(ci.firstChild && ci.firstChild.nodeValue == v){
  1056.                         r[++ri] = ci;
  1057.                     }
  1058.                 }
  1059.                 return r;
  1060.             },
  1061.             "checked" : function(c){
  1062.                 var r = [], ri = -1;
  1063.                 for(var i = 0, ci; ci = c[i]; i++){
  1064.                     if(ci.checked == true){
  1065.                         r[++ri] = ci;
  1066.                     }
  1067.                 }
  1068.                 return r;
  1069.             },
  1070.             "not" : function(c, ss){
  1071.                 return Ext.DomQuery.filter(c, ss, true);
  1072.             },
  1073.             "any" : function(c, selectors){
  1074.                 var ss = selectors.split('|'),
  1075.                  r = [], ri = -1, s;
  1076.                 for(var i = 0, ci; ci = c[i]; i++){
  1077.                     for(var j = 0; s = ss[j]; j++){
  1078.                         if(Ext.DomQuery.is(ci, s)){
  1079.                             r[++ri] = ci;
  1080.                             break;
  1081.                         }
  1082.                     }
  1083.                 }
  1084.                 return r;
  1085.             },
  1086.             "odd" : function(c){
  1087.                 return this["nth-child"](c, "odd");
  1088.             },
  1089.             "even" : function(c){
  1090.                 return this["nth-child"](c, "even");
  1091.             },
  1092.             "nth" : function(c, a){
  1093.                 return c[a-1] || [];
  1094.             },
  1095.             "first" : function(c){
  1096.                 return c[0] || [];
  1097.             },
  1098.             "last" : function(c){
  1099.                 return c[c.length-1] || [];
  1100.             },
  1101.             "has" : function(c, ss){
  1102.                 var s = Ext.DomQuery.select,
  1103.                  r = [], ri = -1;
  1104.                 for(var i = 0, ci; ci = c[i]; i++){
  1105.                     if(s(ss, ci).length > 0){
  1106.                         r[++ri] = ci;
  1107.                     }
  1108.                 }
  1109.                 return r;
  1110.             },
  1111.             "next" : function(c, ss){
  1112.                 var is = Ext.DomQuery.is,
  1113.                  r = [], ri = -1;
  1114.                 for(var i = 0, ci; ci = c[i]; i++){
  1115.                     var n = next(ci);
  1116.                     if(n && is(n, ss)){
  1117.                         r[++ri] = ci;
  1118.                     }
  1119.                 }
  1120.                 return r;
  1121.             },
  1122.             "prev" : function(c, ss){
  1123.                 var is = Ext.DomQuery.is,
  1124.                  r = [], ri = -1;
  1125.                 for(var i = 0, ci; ci = c[i]; i++){
  1126.                     var n = prev(ci);
  1127.                     if(n && is(n, ss)){
  1128.                         r[++ri] = ci;
  1129.                     }
  1130.                 }
  1131.                 return r;
  1132.             }
  1133.         }
  1134.     };
  1135. }();
  1136. Ext.query = Ext.DomQuery.select;
  1137. Ext.util.DelayedTask = function(fn, scope, args){
  1138.     var me = this,
  1139.      id,    
  1140.      call = function(){
  1141.      clearInterval(id);
  1142.         id = null;
  1143.         fn.apply(scope, args || []);
  1144.     };
  1145.     
  1146.     
  1147.     me.delay = function(delay, newFn, newScope, newArgs){
  1148.         me.cancel();
  1149.         fn = newFn || fn;
  1150.         scope = newScope || scope;
  1151.         args = newArgs || args;
  1152.         id = setInterval(call, delay);
  1153.     };
  1154.     
  1155.     me.cancel = function(){
  1156.         if(id){
  1157.             clearInterval(id);
  1158.             id = null;
  1159.         }
  1160.     };
  1161. };(function(){
  1162. var EXTUTIL = Ext.util,
  1163.     TOARRAY = Ext.toArray,
  1164.     EACH = Ext.each,
  1165.     ISOBJECT = Ext.isObject,
  1166.     TRUE = true,
  1167.     FALSE = false;
  1168. EXTUTIL.Observable = function(){
  1169.     
  1170.     var me = this, e = me.events;
  1171.     if(me.listeners){
  1172.         me.on(me.listeners);
  1173.         delete me.listeners;
  1174.     }
  1175.     me.events = e || {};
  1176. };
  1177. EXTUTIL.Observable.prototype = {
  1178.     
  1179.     filterOptRe : /^(?:scope|delay|buffer|single)$/,
  1180.     
  1181.     fireEvent : function(){
  1182.         var a = TOARRAY(arguments),
  1183.             ename = a[0].toLowerCase(),
  1184.             me = this,
  1185.             ret = TRUE,
  1186.             ce = me.events[ename],
  1187.             q,
  1188.             c;
  1189.         if (me.eventsSuspended === TRUE) {
  1190.             if (q = me.eventQueue) {
  1191.                 q.push(a);
  1192.             }
  1193.         }
  1194.         else if(ISOBJECT(ce) && ce.bubble){
  1195.             if(ce.fire.apply(ce, a.slice(1)) === FALSE) {
  1196.                 return FALSE;
  1197.             }
  1198.             c = me.getBubbleTarget && me.getBubbleTarget();
  1199.             if(c && c.enableBubble) {
  1200.                 if(!c.events[ename] || !Ext.isObject(c.events[ename]) || !c.events[ename].bubble) {
  1201.                     c.enableBubble(ename);
  1202.                 }
  1203.                 return c.fireEvent.apply(c, a);
  1204.             }
  1205.         }
  1206.         else {
  1207.             if (ISOBJECT(ce)) {
  1208.                 a.shift();
  1209.                 ret = ce.fire.apply(ce, a);
  1210.             }
  1211.         }
  1212.         return ret;
  1213.     },
  1214.     
  1215.     addListener : function(eventName, fn, scope, o){
  1216.         var me = this,
  1217.             e,
  1218.             oe,
  1219.             isF,
  1220.         ce;
  1221.         if (ISOBJECT(eventName)) {
  1222.             o = eventName;
  1223.             for (e in o){
  1224.                 oe = o[e];
  1225.                 if (!me.filterOptRe.test(e)) {
  1226.                     me.addListener(e, oe.fn || oe, oe.scope || o.scope, oe.fn ? oe : o);
  1227.                 }
  1228.             }
  1229.         } else {
  1230.             eventName = eventName.toLowerCase();
  1231.             ce = me.events[eventName] || TRUE;
  1232.             if (Ext.isBoolean(ce)) {
  1233.                 me.events[eventName] = ce = new EXTUTIL.Event(me, eventName);
  1234.             }
  1235.             ce.addListener(fn, scope, ISOBJECT(o) ? o : {});
  1236.         }
  1237.     },
  1238.     
  1239.     removeListener : function(eventName, fn, scope){
  1240.         var ce = this.events[eventName.toLowerCase()];
  1241.         if (ISOBJECT(ce)) {
  1242.             ce.removeListener(fn, scope);
  1243.         }
  1244.     },
  1245.     
  1246.     purgeListeners : function(){
  1247.         var events = this.events,
  1248.             evt,
  1249.             key;
  1250.         for(key in events){
  1251.             evt = events[key];
  1252.             if(ISOBJECT(evt)){
  1253.                 evt.clearListeners();
  1254.             }
  1255.         }
  1256.     },
  1257.     
  1258.     addEvents : function(o){
  1259.         var me = this;
  1260.         me.events = me.events || {};
  1261.         if (Ext.isString(o)) {
  1262.             var a = arguments,
  1263.                 i = a.length;
  1264.             while(i--) {
  1265.                 me.events[a[i]] = me.events[a[i]] || TRUE;
  1266.             }
  1267.         } else {
  1268.             Ext.applyIf(me.events, o);
  1269.         }
  1270.     },
  1271.     
  1272.     hasListener : function(eventName){
  1273.         var e = this.events[eventName];
  1274.         return ISOBJECT(e) && e.listeners.length > 0;
  1275.     },
  1276.     
  1277.     suspendEvents : function(queueSuspended){
  1278.         this.eventsSuspended = TRUE;
  1279.         if(queueSuspended && !this.eventQueue){
  1280.             this.eventQueue = [];
  1281.         }
  1282.     },
  1283.     
  1284.     resumeEvents : function(){
  1285.         var me = this,
  1286.             queued = me.eventQueue || [];
  1287.         me.eventsSuspended = FALSE;
  1288.         delete me.eventQueue;
  1289.         EACH(queued, function(e) {
  1290.             me.fireEvent.apply(me, e);
  1291.         });
  1292.     }
  1293. };
  1294. var OBSERVABLE = EXTUTIL.Observable.prototype;
  1295. OBSERVABLE.on = OBSERVABLE.addListener;
  1296. OBSERVABLE.un = OBSERVABLE.removeListener;
  1297. EXTUTIL.Observable.releaseCapture = function(o){
  1298.     o.fireEvent = OBSERVABLE.fireEvent;
  1299. };
  1300. function createTargeted(h, o, scope){
  1301.     return function(){
  1302.         if(o.target == arguments[0]){
  1303.             h.apply(scope, TOARRAY(arguments));
  1304.         }
  1305.     };
  1306. };
  1307. function createBuffered(h, o, fn, scope){
  1308.     fn.task = new EXTUTIL.DelayedTask();
  1309.     return function(){
  1310.         fn.task.delay(o.buffer, h, scope, TOARRAY(arguments));
  1311.     };
  1312. }
  1313. function createSingle(h, e, fn, scope){
  1314.     return function(){
  1315.         e.removeListener(fn, scope);
  1316.         return h.apply(scope, arguments);
  1317.     };
  1318. }
  1319. function createDelayed(h, o, fn, scope){
  1320.     return function(){
  1321.         var task = new EXTUTIL.DelayedTask();
  1322.         if(!fn.tasks) {
  1323.             fn.tasks = [];
  1324.         }
  1325.         fn.tasks.push(task);
  1326.         task.delay(o.delay || 10, h, scope, TOARRAY(arguments));
  1327.     };
  1328. };
  1329. EXTUTIL.Event = function(obj, name){
  1330.     this.name = name;
  1331.     this.obj = obj;
  1332.     this.listeners = [];
  1333. };
  1334. EXTUTIL.Event.prototype = {
  1335.     addListener : function(fn, scope, options){
  1336.         var me = this,
  1337.             l;
  1338.         scope = scope || me.obj;
  1339.         if(!me.isListening(fn, scope)){
  1340.             l = me.createListener(fn, scope, options);
  1341.             if(me.firing){ 
  1342.                 me.listeners = me.listeners.slice(0);
  1343.             }
  1344.             me.listeners.push(l);
  1345.         }
  1346.     },
  1347.     createListener: function(fn, scope, o){
  1348.         o = o || {}, scope = scope || this.obj;
  1349.         var l = {
  1350.             fn: fn,
  1351.             scope: scope,
  1352.             options: o
  1353.         }, h = fn;
  1354.         if(o.target){
  1355.             h = createTargeted(h, o, scope);
  1356.         }
  1357.         if(o.delay){
  1358.             h = createDelayed(h, o, fn, scope);
  1359.         }
  1360.         if(o.single){
  1361.             h = createSingle(h, this, fn, scope);
  1362.         }
  1363.         if(o.buffer){
  1364.             h = createBuffered(h, o, fn, scope);
  1365.         }
  1366.         l.fireFn = h;
  1367.         return l;
  1368.     },
  1369.     findListener : function(fn, scope){
  1370.         var list = this.listeners,
  1371.             i = list.length,
  1372.             l,
  1373.             s;
  1374.         while(i--) {
  1375.             l = list[i];
  1376.             if(l) {
  1377.                 s = l.scope;
  1378.                 if(l.fn == fn && (s == scope || s == this.obj)){
  1379.                     return i;
  1380.                 }
  1381.             }
  1382.         }
  1383.         return -1;
  1384.     },
  1385.     isListening : function(fn, scope){
  1386.         return this.findListener(fn, scope) != -1;
  1387.     },
  1388.     removeListener : function(fn, scope){
  1389.         var index,
  1390.             l,
  1391.             k,
  1392.             me = this,
  1393.             ret = FALSE;
  1394.         if((index = me.findListener(fn, scope)) != -1){
  1395.             if (me.firing) {
  1396.                 me.listeners = me.listeners.slice(0);
  1397.             }
  1398.             l = me.listeners[index].fn;
  1399.             
  1400.             if(l.task) {
  1401.                 l.task.cancel();
  1402.                 delete l.task;
  1403.             }
  1404.             
  1405.             k = l.tasks && l.tasks.length;
  1406.             if(k) {
  1407.                 while(k--) {
  1408.                     l.tasks[k].cancel();
  1409.                 }
  1410.                 delete l.tasks;
  1411.             }
  1412.             me.listeners.splice(index, 1);
  1413.             ret = TRUE;
  1414.         }
  1415.         return ret;
  1416.     },
  1417.     
  1418.     clearListeners : function(){
  1419.         var me = this,
  1420.             l = me.listeners,
  1421.             i = l.length;
  1422.         while(i--) {
  1423.             me.removeListener(l[i].fn, l[i].scope);
  1424.         }
  1425.     },
  1426.     fire : function(){
  1427.         var me = this,
  1428.             args = TOARRAY(arguments),
  1429.             listeners = me.listeners,
  1430.             len = listeners.length,
  1431.             i = 0,
  1432.             l;
  1433.         if(len > 0){
  1434.             me.firing = TRUE;
  1435.             for (; i < len; i++) {
  1436.                 l = listeners[i];
  1437.                 if(l && l.fireFn.apply(l.scope || me.obj || window, args) === FALSE) {
  1438.                     return (me.firing = FALSE);
  1439.                 }
  1440.             }
  1441.         }
  1442.         me.firing = FALSE;
  1443.         return TRUE;
  1444.     }
  1445. };
  1446. })();
  1447. Ext.apply(Ext.util.Observable.prototype, function(){
  1448.     
  1449.     
  1450.     
  1451.     function getMethodEvent(method){
  1452.         var e = (this.methodEvents = this.methodEvents ||
  1453.         {})[method], returnValue, v, cancel, obj = this;
  1454.         if (!e) {
  1455.             this.methodEvents[method] = e = {};
  1456.             e.originalFn = this[method];
  1457.             e.methodName = method;
  1458.             e.before = [];
  1459.             e.after = [];
  1460.             var makeCall = function(fn, scope, args){
  1461.                 if (!Ext.isEmpty(v = fn.apply(scope || obj, args))) {
  1462.                     if (Ext.isObject(v)) {
  1463.                         returnValue = !Ext.isEmpty(v.returnValue) ? v.returnValue : v;
  1464.                         cancel = !!v.cancel;
  1465.                     }
  1466.                     else
  1467.                         if (v === false) {
  1468.                             cancel = true;
  1469.                         }
  1470.                         else {
  1471.                             returnValue = v;
  1472.                         }
  1473.                 }
  1474.             };
  1475.             this[method] = function(){
  1476.                 var args = Ext.toArray(arguments);
  1477.                 returnValue = v = undefined;
  1478.                 cancel = false;
  1479.                 Ext.each(e.before, function(b){
  1480.                     makeCall(b.fn, b.scope, args);
  1481.                     if (cancel) {
  1482.                         return returnValue;
  1483.                     }
  1484.                 });
  1485.                 if (!Ext.isEmpty(v = e.originalFn.apply(obj, args))) {
  1486.                     returnValue = v;
  1487.                 }
  1488.                 Ext.each(e.after, function(a){
  1489.                     makeCall(a.fn, a.scope, args);
  1490.                     if (cancel) {
  1491.                         return returnValue;
  1492.                     }
  1493.                 });
  1494.                 return returnValue;
  1495.             };
  1496.         }
  1497.         return e;
  1498.     }
  1499.     return {
  1500.         
  1501.         
  1502.         
  1503.         beforeMethod : function(method, fn, scope){
  1504.             getMethodEvent.call(this, method).before.push({
  1505.                 fn: fn,
  1506.                 scope: scope
  1507.             });
  1508.         },
  1509.         
  1510.         afterMethod : function(method, fn, scope){
  1511.             getMethodEvent.call(this, method).after.push({
  1512.                 fn: fn,
  1513.                 scope: scope
  1514.             });
  1515.         },
  1516.         removeMethodListener: function(method, fn, scope){
  1517.             var e = getMethodEvent.call(this, method), found = false;
  1518.             Ext.each(e.before, function(b, i, arr){
  1519.                 if (b.fn == fn && b.scope == scope) {
  1520.                     arr.splice(i, 1);
  1521.                     found = true;
  1522.                     return false;
  1523.                 }
  1524.             });
  1525.             if (!found) {
  1526.                 Ext.each(e.after, function(a, i, arr){
  1527.                     if (a.fn == fn && a.scope == scope) {
  1528.                         arr.splice(i, 1);
  1529.                         return false;
  1530.                     }
  1531.                 });
  1532.             }
  1533.         },
  1534.         
  1535.         relayEvents : function(o, events){
  1536.             var me = this;
  1537.             function createHandler(ename){
  1538.                 return function(){
  1539.                     return me.fireEvent.apply(me, [ename].concat(Ext.toArray(arguments)));
  1540.                 };
  1541.             }
  1542.             Ext.each(events, function(ename){
  1543.                 me.events[ename] = me.events[ename] || true;
  1544.                 o.on(ename, createHandler(ename), me);
  1545.             });
  1546.         },
  1547.         
  1548.         enableBubble : function(events){
  1549.             var me = this;
  1550.             if(!Ext.isEmpty(events)){
  1551.                 events = Ext.isArray(events) ? events : Ext.toArray(arguments);
  1552.                 Ext.each(events, function(ename){
  1553.                     ename = ename.toLowerCase();
  1554.                     var ce = me.events[ename] || true;
  1555.                     if (Ext.isBoolean(ce)) {
  1556.                         ce = new Ext.util.Event(me, ename);
  1557.                         me.events[ename] = ce;
  1558.                     }
  1559.                     ce.bubble = true;
  1560.                 });
  1561.             }
  1562.         }
  1563.     };
  1564. }());
  1565. Ext.util.Observable.capture = function(o, fn, scope){
  1566.     o.fireEvent = o.fireEvent.createInterceptor(fn, scope);
  1567. };
  1568. Ext.util.Observable.observeClass = function(c, listeners){
  1569.     if(c){
  1570.       if(!c.fireEvent){
  1571.           Ext.apply(c, new Ext.util.Observable());
  1572.           Ext.util.Observable.capture(c.prototype, c.fireEvent, c);
  1573.       }
  1574.       if(Ext.isObject(listeners)){
  1575.           c.on(listeners);
  1576.       }
  1577.       return c;
  1578.    }
  1579. };
  1580. Ext.EventManager = function(){
  1581.     var docReadyEvent,
  1582.         docReadyProcId,
  1583.         docReadyState = false,
  1584.         E = Ext.lib.Event,
  1585.         D = Ext.lib.Dom,
  1586.         DOC = document,
  1587.         WINDOW = window,
  1588.         IEDEFERED = "ie-deferred-loader",
  1589.         DOMCONTENTLOADED = "DOMContentLoaded",
  1590.         propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
  1591.         
  1592.         specialElCache = [];
  1593.      function getId(el){
  1594.         var id = false,
  1595.             i = 0,
  1596.             len = specialElCache.length,
  1597.             id = false,
  1598.             skip = false,
  1599.             o;
  1600.         if(el){
  1601.             if(el.getElementById || el.navigator){
  1602.                 
  1603.                 for(; i < len; ++i){
  1604.                     o = specialElCache[i];
  1605.                     if(o.el === el){
  1606.                         id = o.id;
  1607.                         break;
  1608.                     }
  1609.                 }
  1610.                 if(!id){
  1611.                     
  1612.                     id = Ext.id(el);
  1613.                     specialElCache.push({
  1614.                         id: id,
  1615.                         el: el
  1616.                     });
  1617.                     skip = true;
  1618.                 }
  1619.             }else{
  1620.                 id = Ext.id(el);
  1621.             }
  1622.             if(!Ext.elCache[id]){
  1623.                 Ext.Element.addToCache(new Ext.Element(el), id);
  1624.                 if(skip){
  1625.                     Ext.elCache[id].skipGC = true;
  1626.                 }
  1627.             }
  1628.         }
  1629.         return id;
  1630.      };
  1631.     
  1632.     function addListener(el, ename, fn, wrap, scope){
  1633.         el = Ext.getDom(el);
  1634.         var id = getId(el),
  1635.             es = Ext.elCache[id].events,
  1636.             wfn;
  1637.         wfn = E.on(el, ename, wrap);
  1638.         es[ename] = es[ename] || [];
  1639.         es[ename].push([fn, wrap, scope, wfn]);
  1640.         
  1641.         
  1642.         if(ename == "mousewheel" && el.addEventListener){ 
  1643.             var args = ["DOMMouseScroll", wrap, false];
  1644.             el.addEventListener.apply(el, args);
  1645.             Ext.EventManager.addListener(WINDOW, 'unload', function(){
  1646.                 el.removeEventListener.apply(el, args);
  1647.             });
  1648.         }
  1649.         if(ename == "mousedown" && el == document){ 
  1650.             Ext.EventManager.stoppedMouseDownEvent.addListener(wrap);
  1651.         }
  1652.     };
  1653.     function fireDocReady(){
  1654.         if(!docReadyState){
  1655.             Ext.isReady = docReadyState = true;
  1656.             if(docReadyProcId){
  1657.                 clearInterval(docReadyProcId);
  1658.             }
  1659.             if(Ext.isGecko || Ext.isOpera) {
  1660.                 DOC.removeEventListener(DOMCONTENTLOADED, fireDocReady, false);
  1661.             }
  1662.             if(Ext.isIE){
  1663.                 var defer = DOC.getElementById(IEDEFERED);
  1664.                 if(defer){
  1665.                     defer.onreadystatechange = null;
  1666.                     defer.parentNode.removeChild(defer);
  1667.                 }
  1668.             }
  1669.             if(docReadyEvent){
  1670.                 docReadyEvent.fire();
  1671.                 docReadyEvent.listeners = []; 
  1672.             }
  1673.         }
  1674.     };
  1675.     function initDocReady(){
  1676.         var COMPLETE = "complete";
  1677.         docReadyEvent = new Ext.util.Event();
  1678.         if (Ext.isGecko || Ext.isOpera) {
  1679.             DOC.addEventListener(DOMCONTENTLOADED, fireDocReady, false);
  1680.         } else if (Ext.isIE){
  1681.             DOC.write("<s"+'cript id=' + IEDEFERED + ' defer="defer" src="/'+'/:"></s'+"cript>");
  1682.             DOC.getElementById(IEDEFERED).onreadystatechange = function(){
  1683.                 if(this.readyState == COMPLETE){
  1684.                     fireDocReady();
  1685.                 }
  1686.             };
  1687.         } else if (Ext.isWebKit){
  1688.             docReadyProcId = setInterval(function(){
  1689.                 if(DOC.readyState == COMPLETE) {
  1690.                     fireDocReady();
  1691.                  }
  1692.             }, 10);
  1693.         }
  1694.         
  1695.         E.on(WINDOW, "load", fireDocReady);
  1696.     };
  1697.     function createTargeted(h, o){
  1698.         return function(){
  1699.             var args = Ext.toArray(arguments);
  1700.             if(o.target == Ext.EventObject.setEvent(args[0]).target){
  1701.                 h.apply(this, args);
  1702.             }
  1703.         };
  1704.     };
  1705.     function createBuffered(h, o, fn){
  1706.         fn.task = new Ext.util.DelayedTask(h);
  1707.         var w = function(e){
  1708.             
  1709.             fn.task.delay(o.buffer, h, null, [new Ext.EventObjectImpl(e)]);
  1710.         };
  1711.         return w;
  1712.     };
  1713.     function createSingle(h, el, ename, fn, scope){
  1714.         return function(e){
  1715.             Ext.EventManager.removeListener(el, ename, fn, scope);
  1716.             h(e);
  1717.         };
  1718.     };
  1719.     function createDelayed(h, o, fn){
  1720.         return function(e){
  1721.             var task = new Ext.util.DelayedTask(h);
  1722.             if(!fn.tasks) {
  1723.                 fn.tasks = [];
  1724.             }
  1725.             fn.tasks.push(task);
  1726.             task.delay(o.delay || 10, h, null, [new Ext.EventObjectImpl(e)]);
  1727.         };
  1728.     };
  1729.     function listen(element, ename, opt, fn, scope){
  1730.         var o = !Ext.isObject(opt) ? {} : opt,
  1731.             el = Ext.getDom(element);
  1732.         fn = fn || o.fn;
  1733.         scope = scope || o.scope;
  1734.         if(!el){
  1735.             throw "Error listening for "" + ename + '". Element "' + element + '" doesn't exist.';
  1736.         }
  1737.         function h(e){
  1738.             
  1739.             if(!Ext){
  1740.                 return;
  1741.             }
  1742.             e = Ext.EventObject.setEvent(e);
  1743.             var t;
  1744.             if (o.delegate) {
  1745.                 if(!(t = e.getTarget(o.delegate, el))){
  1746.                     return;
  1747.                 }
  1748.             } else {
  1749.                 t = e.target;
  1750.             }
  1751.             if (o.stopEvent) {
  1752.                 e.stopEvent();
  1753.             }
  1754.             if (o.preventDefault) {
  1755.                e.preventDefault();
  1756.             }
  1757.             if (o.stopPropagation) {
  1758.                 e.stopPropagation();
  1759.             }
  1760.             if (o.normalized) {
  1761.                 e = e.browserEvent;
  1762.             }
  1763.             fn.call(scope || el, e, t, o);
  1764.         };
  1765.         if(o.target){
  1766.             h = createTargeted(h, o);
  1767.         }
  1768.         if(o.delay){
  1769.             h = createDelayed(h, o, fn);
  1770.         }
  1771.         if(o.single){
  1772.             h = createSingle(h, el, ename, fn, scope);
  1773.         }
  1774.         if(o.buffer){
  1775.             h = createBuffered(h, o, fn);
  1776.         }
  1777.         addListener(el, ename, fn, h, scope);
  1778.         return h;
  1779.     };
  1780.     var pub = {
  1781.         
  1782.         addListener : function(element, eventName, fn, scope, options){
  1783.             if(Ext.isObject(eventName)){
  1784.                 var o = eventName, e, val;
  1785.                 for(e in o){
  1786.                     val = o[e];
  1787.                     if(!propRe.test(e)){
  1788.                         if(Ext.isFunction(val)){
  1789.                             
  1790.                             listen(element, e, o, val, o.scope);
  1791.                         }else{
  1792.                             
  1793.                             listen(element, e, val);
  1794.                         }
  1795.                     }
  1796.                 }
  1797.             } else {
  1798.                 listen(element, eventName, options, fn, scope);
  1799.             }
  1800.         },
  1801.         
  1802.         removeListener : function(el, eventName, fn, scope){
  1803.             el = Ext.getDom(el);
  1804.             var id = getId(el),
  1805.                 f = el && (Ext.elCache[id].events)[eventName] || [],
  1806.                 wrap, i, l, k, wf;
  1807.             for (i = 0, len = f.length; i < len; i++) {
  1808.                 if (Ext.isArray(f[i]) && f[i][0] == fn && (!scope || f[i][2] == scope)) {
  1809.                     if(fn.task) {
  1810.                         fn.task.cancel();
  1811.                         delete fn.task;
  1812.                     }
  1813.                     k = fn.tasks && fn.tasks.length;
  1814.                     if(k) {
  1815.                         while(k--) {
  1816.                             fn.tasks[k].cancel();
  1817.                         }
  1818.                         delete fn.tasks;
  1819.                     }
  1820.                     wf = wrap = f[i][1];
  1821.                     if (E.extAdapter) {
  1822.                         wf = f[i][3];
  1823.                     }
  1824.                     E.un(el, eventName, wf);
  1825.                     f.splice(i,1);
  1826.                     if (f.length === 0) {
  1827.                         delete Ext.elCache[id].events[eventName];
  1828.                     }
  1829.                     for (k in Ext.elCache[id].events) {
  1830.                         return false;
  1831.                     }
  1832.                     Ext.elCache[id].events = {};
  1833.                     return false;
  1834.                 }
  1835.             }
  1836.             
  1837.             if(eventName == "mousewheel" && el.addEventListener && wrap){
  1838.                 el.removeEventListener("DOMMouseScroll", wrap, false);
  1839.             }
  1840.             if(eventName == "mousedown" && el == DOC && wrap){ 
  1841.                 Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
  1842.             }
  1843.         },
  1844.         
  1845.         removeAll : function(el){
  1846.             el = Ext.getDom(el);
  1847.             var id = getId(el),
  1848.                 ec = Ext.elCache[id] || {},
  1849.                 es = ec.events || {},
  1850.                 f, i, len, ename, fn, k;
  1851.             for(ename in es){
  1852.                 if(es.hasOwnProperty(ename)){
  1853.                     f = es[ename];
  1854.                     for (i = 0, len = f.length; i < len; i++) {
  1855.                         fn = f[i][0];
  1856.                         if(fn.task) {
  1857.                             fn.task.cancel();
  1858.                             delete fn.task;
  1859.                         }
  1860.                         if(fn.tasks && (k = fn.tasks.length)) {
  1861.                             while(k--) {
  1862.                                 fn.tasks[k].cancel();
  1863.                             }
  1864.                             delete fn.tasks;
  1865.                         }
  1866.                         E.un(el, ename, E.extAdapter ? f[i][3] : f[i][1]);
  1867.                     }
  1868.                 }
  1869.             }
  1870.             if (Ext.elCache[id]) {
  1871.                 Ext.elCache[id].events = {};
  1872.             }
  1873.         },
  1874.         getListeners : function(el, eventName) {
  1875.             el = Ext.getDom(el);
  1876.             var id = getId(el),
  1877.                 ec = Ext.elCache[id] || {},
  1878.                 es = ec.events || {},
  1879.                 results = [];
  1880.             if (es && es[eventName]) {
  1881.                 return es[eventName];
  1882.             } else {
  1883.                 return null;
  1884.             }
  1885.         },
  1886.         purgeElement : function(el, recurse, eventName) {
  1887.             el = Ext.getDom(el);
  1888.             var id = getId(el),
  1889.                 ec = Ext.elCache[id] || {},
  1890.                 es = ec.events || {},
  1891.                 i, f, len;
  1892.             if (eventName) {
  1893.                 if (es && es.hasOwnProperty(eventName)) {
  1894.                     f = es[eventName];
  1895.                     for (i = 0, len = f.length; i < len; i++) {
  1896.                         Ext.EventManager.removeListener(el, eventName, f[i][0]);
  1897.                     }
  1898.                 }
  1899.             } else {
  1900.                 Ext.EventManager.removeAll(el);
  1901.             }
  1902.             if (recurse && el && el.childNodes) {
  1903.                 for (i = 0, len = el.childNodes.length; i < len; i++) {
  1904.                     Ext.EventManager.purgeElement(el.childNodes[i], recurse, eventName);
  1905.                 }
  1906.             }
  1907.         },
  1908.         _unload : function() {
  1909.             var el;
  1910.             for (el in Ext.elCache) {
  1911.                 Ext.EventManager.removeAll(el);
  1912.             }
  1913.         },
  1914.         
  1915.         onDocumentReady : function(fn, scope, options){
  1916.             if(docReadyState){ 
  1917.                 docReadyEvent.addListener(fn, scope, options);
  1918.                 docReadyEvent.fire();
  1919.                 docReadyEvent.listeners = []; 
  1920.             } else {
  1921.                 if(!docReadyEvent) initDocReady();
  1922.                 options = options || {};
  1923.                 options.delay = options.delay || 1;
  1924.                 docReadyEvent.addListener(fn, scope, options);
  1925.             }
  1926.         }
  1927.     };
  1928.      
  1929.     pub.on = pub.addListener;
  1930.     
  1931.     pub.un = pub.removeListener;
  1932.     pub.stoppedMouseDownEvent = new Ext.util.Event();
  1933.     return pub;
  1934. }();
  1935. Ext.onReady = Ext.EventManager.onDocumentReady;
  1936. (function(){
  1937.     var initExtCss = function(){
  1938.         
  1939.         var bd = document.body || document.getElementsByTagName('body')[0];
  1940.         if(!bd){ return false; }
  1941.         var cls = [' ',
  1942.                 Ext.isIE ? "ext-ie " + (Ext.isIE6 ? 'ext-ie6' : (Ext.isIE7 ? 'ext-ie7' : 'ext-ie8'))
  1943.                 : Ext.isGecko ? "ext-gecko " + (Ext.isGecko2 ? 'ext-gecko2' : 'ext-gecko3')
  1944.                 : Ext.isOpera ? "ext-opera"
  1945.                 : Ext.isWebKit ? "ext-webkit" : ""];
  1946.         if(Ext.isSafari){
  1947.             cls.push("ext-safari " + (Ext.isSafari2 ? 'ext-safari2' : (Ext.isSafari3 ? 'ext-safari3' : 'ext-safari4')));
  1948.         }else if(Ext.isChrome){
  1949.             cls.push("ext-chrome");
  1950.         }
  1951.         if(Ext.isMac){
  1952.             cls.push("ext-mac");
  1953.         }
  1954.         if(Ext.isLinux){
  1955.             cls.push("ext-linux");
  1956.         }
  1957.         if(Ext.isStrict || Ext.isBorderBox){ 
  1958.             var p = bd.parentNode;
  1959.             if(p){
  1960.                 p.className += Ext.isStrict ? ' ext-strict' : ' ext-border-box';
  1961.             }
  1962.         }
  1963.         bd.className += cls.join(' ');
  1964.         return true;
  1965.     }
  1966.     if(!initExtCss()){
  1967.         Ext.onReady(initExtCss);
  1968.     }
  1969. })();
  1970. Ext.EventObject = function(){
  1971.     var E = Ext.lib.Event,
  1972.         
  1973.         safariKeys = {
  1974.             3 : 13, 
  1975.             63234 : 37, 
  1976.             63235 : 39, 
  1977.             63232 : 38, 
  1978.             63233 : 40, 
  1979.             63276 : 33, 
  1980.             63277 : 34, 
  1981.             63272 : 46, 
  1982.             63273 : 36, 
  1983.             63275 : 35  
  1984.         },
  1985.         
  1986.         btnMap = Ext.isIE ? {1:0,4:1,2:2} :
  1987.                 (Ext.isWebKit ? {1:0,2:1,3:2} : {0:0,1:1,2:2});
  1988.     Ext.EventObjectImpl = function(e){
  1989.         if(e){
  1990.             this.setEvent(e.browserEvent || e);
  1991.         }
  1992.     };
  1993.     Ext.EventObjectImpl.prototype = {
  1994.            
  1995.         setEvent : function(e){
  1996.             var me = this;
  1997.             if(e == me || (e && e.browserEvent)){ 
  1998.                 return e;
  1999.             }
  2000.             me.browserEvent = e;
  2001.             if(e){
  2002.                 
  2003.                 me.button = e.button ? btnMap[e.button] : (e.which ? e.which - 1 : -1);
  2004.                 if(e.type == 'click' && me.button == -1){
  2005.                     me.button = 0;
  2006.                 }
  2007.                 me.type = e.type;
  2008.                 me.shiftKey = e.shiftKey;
  2009.                 
  2010.                 me.ctrlKey = e.ctrlKey || e.metaKey || false;
  2011.                 me.altKey = e.altKey;
  2012.                 
  2013.                 me.keyCode = e.keyCode;
  2014.                 me.charCode = e.charCode;
  2015.                 
  2016.                 me.target = E.getTarget(e);
  2017.                 
  2018.                 me.xy = E.getXY(e);
  2019.             }else{
  2020.                 me.button = -1;
  2021.                 me.shiftKey = false;
  2022.                 me.ctrlKey = false;
  2023.                 me.altKey = false;
  2024.                 me.keyCode = 0;
  2025.                 me.charCode = 0;
  2026.                 me.target = null;
  2027.                 me.xy = [0, 0];
  2028.             }
  2029.             return me;
  2030.         },
  2031.         
  2032.         stopEvent : function(){
  2033.             var me = this;
  2034.             if(me.browserEvent){
  2035.                 if(me.browserEvent.type == 'mousedown'){
  2036.                     Ext.EventManager.stoppedMouseDownEvent.fire(me);
  2037.                 }
  2038.                 E.stopEvent(me.browserEvent);
  2039.             }
  2040.         },
  2041.         
  2042.         preventDefault : function(){
  2043.             if(this.browserEvent){
  2044.                 E.preventDefault(this.browserEvent);
  2045.             }
  2046.         },
  2047.         
  2048.         stopPropagation : function(){
  2049.             var me = this;
  2050.             if(me.browserEvent){
  2051.                 if(me.browserEvent.type == 'mousedown'){
  2052.                     Ext.EventManager.stoppedMouseDownEvent.fire(me);
  2053.                 }
  2054.                 E.stopPropagation(me.browserEvent);
  2055.             }
  2056.         },
  2057.         
  2058.         getCharCode : function(){
  2059.             return this.charCode || this.keyCode;
  2060.         },
  2061.         
  2062.         getKey : function(){
  2063.             return this.normalizeKey(this.keyCode || this.charCode)
  2064.         },
  2065.         
  2066.         normalizeKey: function(k){
  2067.             return Ext.isSafari ? (safariKeys[k] || k) : k;
  2068.         },
  2069.         
  2070.         getPageX : function(){
  2071.             return this.xy[0];
  2072.         },
  2073.         
  2074.         getPageY : function(){
  2075.             return this.xy[1];
  2076.         },
  2077.         
  2078.         getXY : function(){
  2079.             return this.xy;
  2080.         },
  2081.         
  2082.         getTarget : function(selector, maxDepth, returnEl){
  2083.             return selector ? Ext.fly(this.target).findParent(selector, maxDepth, returnEl) : (returnEl ? Ext.get(this.target) : this.target);
  2084.         },
  2085.         
  2086.         getRelatedTarget : function(){
  2087.             return this.browserEvent ? E.getRelatedTarget(this.browserEvent) : null;
  2088.         },
  2089.         
  2090.         getWheelDelta : function(){
  2091.             var e = this.browserEvent;
  2092.             var delta = 0;
  2093.             if(e.wheelDelta){ 
  2094.                 delta = e.wheelDelta/120;
  2095.             }else if(e.detail){ 
  2096.                 delta = -e.detail/3;
  2097.             }
  2098.             return delta;
  2099.         },
  2100.         
  2101.         within : function(el, related, allowEl){
  2102.             if(el){
  2103.                 var t = this[related ? "getRelatedTarget" : "getTarget"]();
  2104.                 return t && ((allowEl ? (t == Ext.getDom(el)) : false) || Ext.fly(el).contains(t));
  2105.             }
  2106.             return false;
  2107.         }
  2108.      };
  2109.     return new Ext.EventObjectImpl();
  2110. }();
  2111. Ext.apply(Ext.EventManager, function(){
  2112.    var resizeEvent,
  2113.        resizeTask,
  2114.        textEvent,
  2115.        textSize,
  2116.        D = Ext.lib.Dom,
  2117.        propRe = /^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate)$/,
  2118.        curWidth = 0,
  2119.        curHeight = 0,
  2120.        
  2121.        
  2122.        
  2123.        useKeydown = Ext.isWebKit ?
  2124.                    Ext.num(navigator.userAgent.match(/AppleWebKit/(d+)/)[1]) >= 525 :
  2125.                    !((Ext.isGecko && !Ext.isWindows) || Ext.isOpera);
  2126.    return {
  2127.        
  2128.        doResizeEvent: function(){
  2129.            var h = D.getViewHeight(),
  2130.                w = D.getViewWidth();
  2131.            
  2132.            if(curHeight != h || curWidth != w){
  2133.                resizeEvent.fire(curWidth = w, curHeight = h);
  2134.            }
  2135.        },
  2136.        
  2137.        onWindowResize : function(fn, scope, options){
  2138.            if(!resizeEvent){
  2139.                resizeEvent = new Ext.util.Event();
  2140.                resizeTask = new Ext.util.DelayedTask(this.doResizeEvent);
  2141.                Ext.EventManager.on(window, "resize", this.fireWindowResize, this);
  2142.            }
  2143.            resizeEvent.addListener(fn, scope, options);
  2144.        },
  2145.        
  2146.        fireWindowResize : function(){
  2147.            if(resizeEvent){
  2148.                if((Ext.isIE||Ext.isAir) && resizeTask){
  2149.                    resizeTask.delay(50);
  2150.                }else{
  2151.                    resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
  2152.                }
  2153.            }
  2154.        },
  2155.        
  2156.        onTextResize : function(fn, scope, options){
  2157.            if(!textEvent){
  2158.                textEvent = new Ext.util.Event();
  2159.                var textEl = new Ext.Element(document.createElement('div'));
  2160.                textEl.dom.className = 'x-text-resize';
  2161.                textEl.dom.innerHTML = 'X';
  2162.                textEl.appendTo(document.body);
  2163.                textSize = textEl.dom.offsetHeight;
  2164.                setInterval(function(){
  2165.                    if(textEl.dom.offsetHeight != textSize){
  2166.                        textEvent.fire(textSize, textSize = textEl.dom.offsetHeight);
  2167.                    }
  2168.                }, this.textResizeInterval);
  2169.            }
  2170.            textEvent.addListener(fn, scope, options);
  2171.        },
  2172.        
  2173.        removeResizeListener : function(fn, scope){
  2174.            if(resizeEvent){
  2175.                resizeEvent.removeListener(fn, scope);
  2176.            }
  2177.        },
  2178.        
  2179.        fireResize : function(){
  2180.            if(resizeEvent){
  2181.                resizeEvent.fire(D.getViewWidth(), D.getViewHeight());
  2182.            }
  2183.        },
  2184.         
  2185.        textResizeInterval : 50,
  2186.        
  2187.        ieDeferSrc : false,
  2188.        
  2189.        
  2190.        useKeydown: useKeydown
  2191.    };
  2192. }());
  2193. Ext.EventManager.on = Ext.EventManager.addListener;
  2194. Ext.apply(Ext.EventObjectImpl.prototype, {
  2195.    
  2196.    BACKSPACE: 8,
  2197.    
  2198.    TAB: 9,
  2199.    
  2200.    NUM_CENTER: 12,
  2201.    
  2202.    ENTER: 13,
  2203.    
  2204.    RETURN: 13,
  2205.    
  2206.    SHIFT: 16,
  2207.    
  2208.    CTRL: 17,
  2209.    CONTROL : 17, 
  2210.    
  2211.    ALT: 18,
  2212.    
  2213.    PAUSE: 19,
  2214.    
  2215.    CAPS_LOCK: 20,
  2216.    
  2217.    ESC: 27,
  2218.    
  2219.    SPACE: 32,
  2220.    
  2221.    PAGE_UP: 33,
  2222.    PAGEUP : 33, 
  2223.    
  2224.    PAGE_DOWN: 34,
  2225.    PAGEDOWN : 34, 
  2226.    
  2227.    END: 35,
  2228.    
  2229.    HOME: 36,
  2230.    
  2231.    LEFT: 37,
  2232.    
  2233.    UP: 38,
  2234.    
  2235.    RIGHT: 39,
  2236.    
  2237.    DOWN: 40,
  2238.    
  2239.    PRINT_SCREEN: 44,
  2240.    
  2241.    INSERT: 45,
  2242.    
  2243.    DELETE: 46,
  2244.    
  2245.    ZERO: 48,
  2246.    
  2247.    ONE: 49,
  2248.    
  2249.    TWO: 50,
  2250.    
  2251.    THREE: 51,
  2252.    
  2253.    FOUR: 52,
  2254.    
  2255.    FIVE: 53,
  2256.    
  2257.    SIX: 54,
  2258.    
  2259.    SEVEN: 55,
  2260.    
  2261.    EIGHT: 56,
  2262.    
  2263.    NINE: 57,
  2264.    
  2265.    A: 65,
  2266.    
  2267.    B: 66,
  2268.    
  2269.    C: 67,
  2270.    
  2271.    D: 68,
  2272.    
  2273.    E: 69,
  2274.    
  2275.    F: 70,
  2276.    
  2277.    G: 71,
  2278.    
  2279.    H: 72,
  2280.    
  2281.    I: 73,
  2282.    
  2283.    J: 74,
  2284.    
  2285.    K: 75,
  2286.    
  2287.    L: 76,
  2288.    
  2289.    M: 77,
  2290.    
  2291.    N: 78,
  2292.    
  2293.    O: 79,
  2294.    
  2295.    P: 80,
  2296.    
  2297.    Q: 81,
  2298.    
  2299.    R: 82,
  2300.    
  2301.    S: 83,
  2302.    
  2303.    T: 84,
  2304.    
  2305.    U: 85,
  2306.    
  2307.    V: 86,
  2308.    
  2309.    W: 87,
  2310.    
  2311.    X: 88,
  2312.    
  2313.    Y: 89,
  2314.    
  2315.    Z: 90,
  2316.    
  2317.    CONTEXT_MENU: 93,
  2318.    
  2319.    NUM_ZERO: 96,
  2320.    
  2321.    NUM_ONE: 97,
  2322.    
  2323.    NUM_TWO: 98,
  2324.    
  2325.    NUM_THREE: 99,
  2326.    
  2327.    NUM_FOUR: 100,
  2328.    
  2329.    NUM_FIVE: 101,
  2330.    
  2331.    NUM_SIX: 102,
  2332.    
  2333.    NUM_SEVEN: 103,
  2334.    
  2335.    NUM_EIGHT: 104,
  2336.    
  2337.    NUM_NINE: 105,
  2338.    
  2339.    NUM_MULTIPLY: 106,
  2340.    
  2341.    NUM_PLUS: 107,
  2342.    
  2343.    NUM_MINUS: 109,
  2344.    
  2345.    NUM_PERIOD: 110,
  2346.    
  2347.    NUM_DIVISION: 111,
  2348.    
  2349.    F1: 112,
  2350.    
  2351.    F2: 113,
  2352.    
  2353.    F3: 114,
  2354.    
  2355.    F4: 115,
  2356.    
  2357.    F5: 116,
  2358.    
  2359.    F6: 117,
  2360.    
  2361.    F7: 118,
  2362.    
  2363.    F8: 119,
  2364.    
  2365.    F9: 120,
  2366.    
  2367.    F10: 121,
  2368.    
  2369.    F11: 122,
  2370.    
  2371.    F12: 123,
  2372.    
  2373.    isNavKeyPress : function(){
  2374.        var me = this,
  2375.            k = this.normalizeKey(me.keyCode);
  2376.        return (k >= 33 && k <= 40) ||  
  2377.        k == me.RETURN ||
  2378.        k == me.TAB ||
  2379.        k == me.ESC;
  2380.    },
  2381.    isSpecialKey : function(){
  2382.        var k = this.normalizeKey(this.keyCode);
  2383.        return (this.type == 'keypress' && this.ctrlKey) ||
  2384.        this.isNavKeyPress() ||
  2385.        (k == this.BACKSPACE) || 
  2386.        (k >= 16 && k <= 20) || 
  2387.        (k >= 44 && k <= 45);   
  2388.    },
  2389.    getPoint : function(){
  2390.        return new Ext.lib.Point(this.xy[0], this.xy[1]);
  2391.    },
  2392.    
  2393.    hasModifier : function(){
  2394.        return ((this.ctrlKey || this.altKey) || this.shiftKey);
  2395.    }
  2396. });
  2397. (function(){
  2398. var DOC = document;
  2399. Ext.Element = function(element, forceNew){
  2400.     var dom = typeof element == "string" ?
  2401.               DOC.getElementById(element) : element,
  2402.         id;
  2403.     if(!dom) return null;
  2404.     id = dom.id;
  2405.     if(!forceNew && id && Ext.elCache[id]){ 
  2406.         return Ext.elCache[id].el;
  2407.     }
  2408.     
  2409.     this.dom = dom;
  2410.     
  2411.     this.id = id || Ext.id(dom);
  2412. };
  2413. var D = Ext.lib.Dom,
  2414.     DH = Ext.DomHelper,
  2415.     E = Ext.lib.Event,
  2416.     A = Ext.lib.Anim,
  2417.     El = Ext.Element,
  2418.     EC = Ext.elCache;
  2419. El.prototype = {
  2420.     
  2421.     set : function(o, useSet){
  2422.         var el = this.dom,
  2423.             attr,
  2424.             val,
  2425.             useSet = (useSet !== false) && !!el.setAttribute;
  2426.         for(attr in o){
  2427.             if (o.hasOwnProperty(attr)) {
  2428.                 val = o[attr];
  2429.                 if (attr == 'style') {
  2430.                     DH.applyStyles(el, val);
  2431.                 } else if (attr == 'cls') {
  2432.                     el.className = val;
  2433.                 } else if (useSet) {
  2434.                     el.setAttribute(attr, val);
  2435.                 } else {
  2436.                     el[attr] = val;
  2437.                 }
  2438.             }
  2439.         }
  2440.         return this;
  2441.     },
  2442.     
  2443.     
  2444.     
  2445.     
  2446.     
  2447.     
  2448.     
  2449.     
  2450.     
  2451.     
  2452.     
  2453.     
  2454.     
  2455.     
  2456.     
  2457.     
  2458.     
  2459.     
  2460.     
  2461.     
  2462.     
  2463.     
  2464.     
  2465.     
  2466.     
  2467.     
  2468.     
  2469.     
  2470.     
  2471.     
  2472.     
  2473.     
  2474.     
  2475.     
  2476.     
  2477.     
  2478.     defaultUnit : "px",
  2479.     
  2480.     is : function(simpleSelector){
  2481.         return Ext.DomQuery.is(this.dom, simpleSelector);
  2482.     },
  2483.     
  2484.     focus : function(defer,  dom) {
  2485.         var me = this,
  2486.             dom = dom || me.dom;
  2487.         try{
  2488.             if(Number(defer)){
  2489.                 me.focus.defer(defer, null, [null, dom]);
  2490.             }else{
  2491.                 dom.focus();
  2492.             }
  2493.         }catch(e){}
  2494.         return me;
  2495.     },
  2496.     
  2497.     blur : function() {
  2498.         try{
  2499.             this.dom.blur();
  2500.         }catch(e){}
  2501.         return this;
  2502.     },
  2503.     
  2504.     getValue : function(asNumber){
  2505.         var val = this.dom.value;
  2506.         return asNumber ? parseInt(val, 10) : val;
  2507.     },
  2508.     
  2509.     addListener : function(eventName, fn, scope, options){
  2510.         Ext.EventManager.on(this.dom,  eventName, fn, scope || this, options);
  2511.         return this;
  2512.     },
  2513.     
  2514.     removeListener : function(eventName, fn, scope){
  2515.         Ext.EventManager.removeListener(this.dom,  eventName, fn, scope || this);
  2516.         return this;
  2517.     },
  2518.     
  2519.     removeAllListeners : function(){
  2520.         Ext.EventManager.removeAll(this.dom);
  2521.         return this;
  2522.     },
  2523.     
  2524.     purgeAllListeners : function() {
  2525.         Ext.EventManager.purgeElement(this, true);
  2526.         return this;
  2527.     },
  2528.     
  2529.     addUnits : function(size){
  2530.         if(size === "" || size == "auto" || size === undefined){
  2531.             size = size || '';
  2532.         } else if(!isNaN(size) || !unitPattern.test(size)){
  2533.             size = size + (this.defaultUnit || 'px');
  2534.         }
  2535.         return size;
  2536.     },
  2537.     
  2538.     load : function(url, params, cb){
  2539.         Ext.Ajax.request(Ext.apply({
  2540.             params: params,
  2541.             url: url.url || url,
  2542.             callback: cb,
  2543.             el: this.dom,
  2544.             indicatorText: url.indicatorText || ''
  2545.         }, Ext.isObject(url) ? url : {}));
  2546.         return this;
  2547.     },
  2548.     
  2549.     isBorderBox : function(){
  2550.         return noBoxAdjust[(this.dom.tagName || "").toLowerCase()] || Ext.isBorderBox;
  2551.     },
  2552.     
  2553.     remove : function(){
  2554.         var me = this,
  2555.             dom = me.dom;
  2556.         if (dom) {
  2557.             delete me.dom;
  2558.             Ext.removeNode(dom);
  2559.         }
  2560.     },
  2561.     
  2562.     hover : function(overFn, outFn, scope, options){
  2563.         var me = this;
  2564.         me.on('mouseenter', overFn, scope || me.dom, options);
  2565.         me.on('mouseleave', outFn, scope || me.dom, options);
  2566.         return me;
  2567.     },
  2568.     
  2569.     contains : function(el){
  2570.         return !el ? false : Ext.lib.Dom.isAncestor(this.dom, el.dom ? el.dom : el);
  2571.     },
  2572.     
  2573.     getAttributeNS : function(ns, name){
  2574.         return this.getAttribute(name, ns);
  2575.     },
  2576.     
  2577.     getAttribute : Ext.isIE ? function(name, ns){
  2578.         var d = this.dom,
  2579.             type = typeof d[ns + ":" + name];
  2580.         if(['undefined', 'unknown'].indexOf(type) == -1){
  2581.             return d[ns + ":" + name];
  2582.         }
  2583.         return d[name];
  2584.     } : function(name, ns){
  2585.         var d = this.dom;
  2586.         return d.getAttributeNS(ns, name) || d.getAttribute(ns + ":" + name) || d.getAttribute(name) || d[name];
  2587.     },
  2588.     
  2589.     update : function(html) {
  2590.         if (this.dom) {
  2591.             this.dom.innerHTML = html;
  2592.         }
  2593.         return this;
  2594.     }
  2595. };
  2596. var ep = El.prototype;
  2597. El.addMethods = function(o){
  2598.    Ext.apply(ep, o);
  2599. };
  2600. ep.on = ep.addListener;
  2601. ep.un = ep.removeListener;
  2602. ep.autoBoxAdjust = true;
  2603. var unitPattern = /d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,
  2604.     docEl;
  2605. El.get = function(el){
  2606.     var ex,
  2607.         elm,
  2608.         id;
  2609.     if(!el){ return null; }
  2610.     if (typeof el == "string") { 
  2611.         if (!(elm = DOC.getElementById(el))) {
  2612.             return null;
  2613.         }
  2614.         if (EC[el] && EC[el].el) {
  2615.             ex = EC[el].el;
  2616.             ex.dom = elm;
  2617.         } else {
  2618.             ex = El.addToCache(new El(elm));
  2619.         }
  2620.         return ex;
  2621.     } else if (el.tagName) { 
  2622.         if(!(id = el.id)){
  2623.             id = Ext.id(el);
  2624.         }
  2625.         if (EC[id] && EC[id].el) {
  2626.             ex = EC[id].el;
  2627.             ex.dom = el;
  2628.         } else {
  2629.             ex = El.addToCache(new El(el));
  2630.         }
  2631.         return ex;
  2632.     } else if (el instanceof El) {
  2633.         if(el != docEl){
  2634.             el.dom = DOC.getElementById(el.id) || el.dom; 
  2635.                                                           
  2636.         }
  2637.         return el;
  2638.     } else if(el.isComposite) {
  2639.         return el;
  2640.     } else if(Ext.isArray(el)) {
  2641.         return El.select(el);
  2642.     } else if(el == DOC) {
  2643.         
  2644.         if(!docEl){
  2645.             var f = function(){};
  2646.             f.prototype = El.prototype;
  2647.             docEl = new f();
  2648.             docEl.dom = DOC;
  2649.         }
  2650.         return docEl;
  2651.     }
  2652.     return null;
  2653. };
  2654. El.addToCache = function(el, id){
  2655.     id = id || el.id;    
  2656.     EC[id] = {
  2657.         el:  el,
  2658.         data: {},
  2659.         events: {}
  2660.     };
  2661.     return el;
  2662. };
  2663. El.data = function(el, key, value){
  2664.     el = El.get(el);
  2665.     if (!el) {
  2666.         return null;
  2667.     }
  2668.     var c = EC[el.id].data;
  2669.     if(arguments.length == 2){
  2670.         return c[key];
  2671.     }else{
  2672.         return (c[key] = value);
  2673.     }
  2674. };
  2675. function garbageCollect(){
  2676.     if(!Ext.enableGarbageCollector){
  2677.         clearInterval(El.collectorThreadId);
  2678.     } else {
  2679.         var eid,
  2680.             el,
  2681.             d,
  2682.             o;
  2683.         for(eid in EC){
  2684.             o = EC[eid];
  2685.             if(o.skipGC){
  2686.                 continue;
  2687.             }
  2688.             el = o.el;
  2689.             d = el.dom;
  2690.             
  2691.             
  2692.             
  2693.             
  2694.             
  2695.             
  2696.             
  2697.             
  2698.             
  2699.             
  2700.             
  2701.             
  2702.             
  2703.             
  2704.             
  2705.             
  2706.             
  2707.             if(!d || !d.parentNode || (!d.offsetParent && !DOC.getElementById(eid))){
  2708.                 if(Ext.enableListenerCollection){
  2709.                     Ext.EventManager.removeAll(d);
  2710.                 }
  2711.                 delete EC[eid];
  2712.             }
  2713.         }
  2714.         
  2715.         if (Ext.isIE) {
  2716.             var t = {};
  2717.             for (eid in EC) {
  2718.                 t[eid] = EC[eid];
  2719.             }
  2720.             EC = Ext.elCache = t;
  2721.         }
  2722.     }
  2723. }
  2724. El.collectorThreadId = setInterval(garbageCollect, 30000);
  2725. var flyFn = function(){};
  2726. flyFn.prototype = El.prototype;
  2727. El.Flyweight = function(dom){
  2728.     this.dom = dom;
  2729. };
  2730. El.Flyweight.prototype = new flyFn();
  2731. El.Flyweight.prototype.isFlyweight = true;
  2732. El._flyweights = {};
  2733. El.fly = function(el, named){
  2734.     var ret = null;
  2735.     named = named || '_global';
  2736.     if (el = Ext.getDom(el)) {
  2737.         (El._flyweights[named] = El._flyweights[named] || new El.Flyweight()).dom = el;
  2738.         ret = El._flyweights[named];
  2739.     }
  2740.     return ret;
  2741. };
  2742. Ext.get = El.get;
  2743. Ext.fly = El.fly;
  2744. var noBoxAdjust = Ext.isStrict ? {
  2745.     select:1
  2746. } : {
  2747.     input:1, select:1, textarea:1
  2748. };
  2749. if(Ext.isIE || Ext.isGecko){
  2750.     noBoxAdjust['button'] = 1;
  2751. }
  2752. Ext.EventManager.on(window, 'unload', function(){
  2753.     delete EC;
  2754.     delete El._flyweights;
  2755. });
  2756. })();
  2757. Ext.Element.addMethods({
  2758.     
  2759.     swallowEvent : function(eventName, preventDefault){
  2760.         var me = this;
  2761.         function fn(e){
  2762.             e.stopPropagation();
  2763.             if(preventDefault){
  2764.                 e.preventDefault();
  2765.             }
  2766.         }
  2767.         if(Ext.isArray(eventName)){
  2768.             Ext.each(eventName, function(e) {
  2769.                  me.on(e, fn);
  2770.             });
  2771.             return me;
  2772.         }
  2773.         me.on(eventName, fn);
  2774.         return me;
  2775.     },
  2776.     
  2777.     relayEvent : function(eventName, observable){
  2778.         this.on(eventName, function(e){
  2779.             observable.fireEvent(eventName, e);
  2780.         });
  2781.     },
  2782.     
  2783.     clean : function(forceReclean){
  2784.         var me = this,
  2785.             dom = me.dom,
  2786.             n = dom.firstChild,
  2787.             ni = -1;
  2788.         if(Ext.Element.data(dom, 'isCleaned') && forceReclean !== true){
  2789.             return me;
  2790.         }
  2791.         while(n){
  2792.             var nx = n.nextSibling;
  2793.             if(n.nodeType == 3 && !/S/.test(n.nodeValue)){
  2794.                 dom.removeChild(n);
  2795.             }else{
  2796.                 n.nodeIndex = ++ni;
  2797.             }
  2798.             n = nx;
  2799.         }
  2800.         Ext.Element.data(dom, 'isCleaned', true);
  2801.         return me;
  2802.     },
  2803.     
  2804.     load : function(){
  2805.         var um = this.getUpdater();
  2806.         um.update.apply(um, arguments);
  2807.         return this;
  2808.     },
  2809.     
  2810.     getUpdater : function(){
  2811.         return this.updateManager || (this.updateManager = new Ext.Updater(this));
  2812.     },
  2813.     
  2814.     update : function(html, loadScripts, callback){
  2815.         if (!this.dom) {
  2816.             return this;
  2817.         }
  2818.         html = html || "";
  2819.         if(loadScripts !== true){
  2820.             this.dom.innerHTML = html;
  2821.             if(Ext.isFunction(callback)){
  2822.                 callback();
  2823.             }
  2824.             return this;
  2825.         }
  2826.         var id = Ext.id(),
  2827.             dom = this.dom;
  2828.         html += '<span id="' + id + '"></span>';
  2829.         Ext.lib.Event.onAvailable(id, function(){
  2830.             var DOC = document,
  2831.                 hd = DOC.getElementsByTagName("head")[0],
  2832.                 re = /(?:<script([^>]*)?>)((n|r|.)*?)(?:</script>)/ig,
  2833.                 srcRe = /ssrc=(['"])(.*?)1/i,
  2834.                 typeRe = /stype=(['"])(.*?)1/i,
  2835.                 match,
  2836.                 attrs,
  2837.                 srcMatch,
  2838.                 typeMatch,
  2839.                 el,
  2840.                 s;
  2841.             while((match = re.exec(html))){
  2842.                 attrs = match[1];
  2843.                 srcMatch = attrs ? attrs.match(srcRe) : false;
  2844.                 if(srcMatch && srcMatch[2]){
  2845.                    s = DOC.createElement("script");
  2846.                    s.src = srcMatch[2];
  2847.                    typeMatch = attrs.match(typeRe);
  2848.                    if(typeMatch && typeMatch[2]){
  2849.                        s.type = typeMatch[2];
  2850.                    }
  2851.                    hd.appendChild(s);
  2852.                 }else if(match[2] && match[2].length > 0){
  2853.                     if(window.execScript) {
  2854.                        window.execScript(match[2]);
  2855.                     } else {
  2856.                        window.eval(match[2]);
  2857.                     }
  2858.                 }
  2859.             }
  2860.             el = DOC.getElementById(id);
  2861.             if(el){Ext.removeNode(el);}
  2862.             if(Ext.isFunction(callback)){
  2863.                 callback();
  2864.             }
  2865.         });
  2866.         dom.innerHTML = html.replace(/(?:<script.*?>)((n|r|.)*?)(?:</script>)/ig, "");
  2867.         return this;
  2868.     },
  2869.     
  2870.     removeAllListeners : function(){
  2871.         this.removeAnchor();
  2872.         Ext.EventManager.removeAll(this.dom);
  2873.         return this;
  2874.     },
  2875.     
  2876.     createProxy : function(config, renderTo, matchBox){
  2877.         config = Ext.isObject(config) ? config : {tag : "div", cls: config};
  2878.         var me = this,
  2879.             proxy = renderTo ? Ext.DomHelper.append(renderTo, config, true) :
  2880.                                Ext.DomHelper.insertBefore(me.dom, config, true);
  2881.         if(matchBox && me.setBox && me.getBox){ 
  2882.            proxy.setBox(me.getBox());
  2883.         }
  2884.         return proxy;
  2885.     }
  2886. });
  2887. Ext.Element.prototype.getUpdateManager = Ext.Element.prototype.getUpdater;
  2888. Ext.Element.addMethods({
  2889.     
  2890.     getAnchorXY : function(anchor, local, s){
  2891.         
  2892.         
  2893. anchor = (anchor || "tl").toLowerCase();
  2894.         s = s || {};
  2895.         
  2896.         var me = this,        
  2897.          vp = me.dom == document.body || me.dom == document,
  2898.          w = s.width || vp ? Ext.lib.Dom.getViewWidth() : me.getWidth(),
  2899.          h = s.height || vp ? Ext.lib.Dom.getViewHeight() : me.getHeight(),                  
  2900.          xy,       
  2901.          r = Math.round,
  2902.          o = me.getXY(),
  2903.          scroll = me.getScroll(),
  2904.          extraX = vp ? scroll.left : !local ? o[0] : 0,
  2905.          extraY = vp ? scroll.top : !local ? o[1] : 0,
  2906.          hash = {
  2907.          c  : [r(w * 0.5), r(h * 0.5)],
  2908.          t  : [r(w * 0.5), 0],
  2909.          l  : [0, r(h * 0.5)],
  2910.          r  : [w, r(h * 0.5)],
  2911.          b  : [r(w * 0.5), h],
  2912.          tl : [0, 0],
  2913.          bl : [0, h],
  2914.          br : [w, h],
  2915.          tr : [w, 0]
  2916.          };
  2917.         
  2918.         xy = hash[anchor];
  2919.         return [xy[0] + extraX, xy[1] + extraY]; 
  2920.     },
  2921.     
  2922.     anchorTo : function(el, alignment, offsets, animate, monitorScroll, callback){        
  2923.     var me = this,
  2924.             dom = me.dom,
  2925.             scroll = !Ext.isEmpty(monitorScroll),
  2926.             action = function(){
  2927.                 Ext.fly(dom).alignTo(el, alignment, offsets, animate);
  2928.                 Ext.callback(callback, Ext.fly(dom));
  2929.             },
  2930.             anchor = this.getAnchor();
  2931.             
  2932.         
  2933.         this.removeAnchor();
  2934.         Ext.apply(anchor, {
  2935.             fn: action,
  2936.             scroll: scroll
  2937.         });
  2938.         Ext.EventManager.onWindowResize(action, null);
  2939.         
  2940.         if(scroll){
  2941.             Ext.EventManager.on(window, 'scroll', action, null,
  2942.                 {buffer: !isNaN(monitorScroll) ? monitorScroll : 50});
  2943.         }
  2944.         action.call(me); 
  2945.         return me;
  2946.     },
  2947.     
  2948.     
  2949.     removeAnchor : function(){
  2950.         var me = this,
  2951.             anchor = this.getAnchor();
  2952.             
  2953.         if(anchor && anchor.fn){
  2954.             Ext.EventManager.removeResizeListener(anchor.fn);
  2955.             if(anchor.scroll){
  2956.                 Ext.EventManager.un(window, 'scroll', anchor.fn);
  2957.             }
  2958.             delete anchor.fn;
  2959.         }
  2960.         return me;
  2961.     },
  2962.     
  2963.     
  2964.     getAnchor : function(){
  2965.         var data = Ext.Element.data,
  2966.             dom = this.dom;
  2967.             if (!dom) {
  2968.                 return;
  2969.             }
  2970.             var anchor = data(dom, '_anchor');
  2971.             
  2972.         if(!anchor){
  2973.             anchor = data(dom, '_anchor', {});
  2974.         }
  2975.         return anchor;
  2976.     },
  2977.     
  2978.     getAlignToXY : function(el, p, o){     
  2979.         el = Ext.get(el);
  2980.         
  2981.         if(!el || !el.dom){
  2982.             throw "Element.alignToXY with an element that doesn't exist";
  2983.         }
  2984.         
  2985.         o = o || [0,0];
  2986.         p = (!p || p == "?" ? "tl-bl?" : (!/-/.test(p) && p !== "" ? "tl-" + p : p || "tl-bl")).toLowerCase();       
  2987.                 
  2988.         var me = this,
  2989.          d = me.dom,
  2990.          a1,
  2991.          a2,
  2992.          x,
  2993.          y,
  2994.         
  2995.          w,
  2996.          h,
  2997.          r,
  2998.          dw = Ext.lib.Dom.getViewWidth() -10, 
  2999.          dh = Ext.lib.Dom.getViewHeight()-10, 
  3000.          p1y,
  3001.          p1x,        
  3002.          p2y,
  3003.          p2x,
  3004.          swapY,
  3005.          swapX,
  3006.          doc = document,
  3007.          docElement = doc.documentElement,
  3008.          docBody = doc.body,
  3009.          scrollX = (docElement.scrollLeft || docBody.scrollLeft || 0)+5,
  3010.          scrollY = (docElement.scrollTop || docBody.scrollTop || 0)+5,
  3011.          c = false, 
  3012.          p1 = "", 
  3013.          p2 = "",
  3014.          m = p.match(/^([a-z]+)-([a-z]+)(?)?$/);
  3015.         
  3016.         if(!m){
  3017.            throw "Element.alignTo with an invalid alignment " + p;
  3018.         }
  3019.         
  3020.         p1 = m[1]; 
  3021.         p2 = m[2]; 
  3022.         c = !!m[3];
  3023.         
  3024.         
  3025.         a1 = me.getAnchorXY(p1, true);
  3026.         a2 = el.getAnchorXY(p2, false);
  3027.         x = a2[0] - a1[0] + o[0];
  3028.         y = a2[1] - a1[1] + o[1];
  3029.         if(c){    
  3030.        w = me.getWidth();
  3031.            h = me.getHeight();
  3032.            r = el.getRegion();       
  3033.            
  3034.            
  3035.            
  3036.            p1y = p1.charAt(0);
  3037.            p1x = p1.charAt(p1.length-1);
  3038.            p2y = p2.charAt(0);
  3039.            p2x = p2.charAt(p2.length-1);
  3040.            swapY = ((p1y=="t" && p2y=="b") || (p1y=="b" && p2y=="t"));
  3041.            swapX = ((p1x=="r" && p2x=="l") || (p1x=="l" && p2x=="r"));          
  3042.            
  3043.            if (x + w > dw + scrollX) {
  3044.                 x = swapX ? r.left-w : dw+scrollX-w;
  3045.            }
  3046.            if (x < scrollX) {
  3047.                x = swapX ? r.right : scrollX;
  3048.            }
  3049.            if (y + h > dh + scrollY) {
  3050.                 y = swapY ? r.top-h : dh+scrollY-h;
  3051.             }
  3052.            if (y < scrollY){
  3053.                y = swapY ? r.bottom : scrollY;
  3054.            }
  3055.         }
  3056.         return [x,y];
  3057.     },
  3058.     
  3059.     alignTo : function(element, position, offsets, animate){
  3060.     var me = this;
  3061.         return me.setXY(me.getAlignToXY(element, position, offsets),
  3062.                    me.preanim && !!animate ? me.preanim(arguments, 3) : false);
  3063.     },
  3064.     
  3065.     
  3066.     adjustForConstraints : function(xy, parent, offsets){
  3067.         return this.getConstrainToXY(parent || document, false, offsets, xy) ||  xy;
  3068.     },
  3069.     
  3070.     getConstrainToXY : function(el, local, offsets, proposedXY){   
  3071.     var os = {top:0, left:0, bottom:0, right: 0};
  3072.         return function(el, local, offsets, proposedXY){
  3073.             el = Ext.get(el);
  3074.             offsets = offsets ? Ext.applyIf(offsets, os) : os;
  3075.             var vw, vh, vx = 0, vy = 0;
  3076.             if(el.dom == document.body || el.dom == document){
  3077.                 vw =Ext.lib.Dom.getViewWidth();
  3078.                 vh = Ext.lib.Dom.getViewHeight();
  3079.             }else{
  3080.                 vw = el.dom.clientWidth;
  3081.                 vh = el.dom.clientHeight;
  3082.                 if(!local){
  3083.                     var vxy = el.getXY();
  3084.                     vx = vxy[0];
  3085.                     vy = vxy[1];
  3086.                 }
  3087.             }
  3088.             var s = el.getScroll();
  3089.             vx += offsets.left + s.left;
  3090.             vy += offsets.top + s.top;
  3091.             vw -= offsets.right;
  3092.             vh -= offsets.bottom;
  3093.             var vr = vx+vw;
  3094.             var vb = vy+vh;
  3095.             var xy = proposedXY || (!local ? this.getXY() : [this.getLeft(true), this.getTop(true)]);
  3096.             var x = xy[0], y = xy[1];
  3097.             var w = this.dom.offsetWidth, h = this.dom.offsetHeight;
  3098.             
  3099.             var moved = false;
  3100.             
  3101.             if((x + w) > vr){
  3102.                 x = vr - w;
  3103.                 moved = true;
  3104.             }
  3105.             if((y + h) > vb){
  3106.                 y = vb - h;
  3107.                 moved = true;
  3108.             }
  3109.             
  3110.             if(x < vx){
  3111.                 x = vx;
  3112.                 moved = true;
  3113.             }
  3114.             if(y < vy){
  3115.                 y = vy;
  3116.                 moved = true;
  3117.             }
  3118.             return moved ? [x, y] : false;
  3119.         };
  3120.     }(),
  3121.     
  3122.     
  3123.         
  3124.     
  3125.     
  3126.     getCenterXY : function(){
  3127.         return this.getAlignToXY(document, 'c-c');
  3128.     },
  3129.     
  3130.     center : function(centerIn){
  3131.         return this.alignTo(centerIn || document, 'c-c');        
  3132.     }    
  3133. });
  3134. Ext.Element.addMethods(function(){
  3135. var PARENTNODE = 'parentNode',
  3136. NEXTSIBLING = 'nextSibling',
  3137. PREVIOUSSIBLING = 'previousSibling',
  3138. DQ = Ext.DomQuery,
  3139. GET = Ext.get;
  3140. return {
  3141.     findParent : function(simpleSelector, maxDepth, returnEl){
  3142.         var p = this.dom,
  3143.          b = document.body, 
  3144.          depth = 0,          
  3145.          stopEl;         
  3146.             if(Ext.isGecko && Object.prototype.toString.call(p) == '[object XULElement]') {
  3147.                 return null;
  3148.             }
  3149.         maxDepth = maxDepth || 50;
  3150.         if (isNaN(maxDepth)) {
  3151.             stopEl = Ext.getDom(maxDepth);
  3152.             maxDepth = Number.MAX_VALUE;
  3153.         }
  3154.         while(p && p.nodeType == 1 && depth < maxDepth && p != b && p != stopEl){
  3155.             if(DQ.is(p, simpleSelector)){
  3156.                 return returnEl ? GET(p) : p;
  3157.             }
  3158.             depth++;
  3159.             p = p.parentNode;
  3160.         }
  3161.         return null;
  3162.     },
  3163.     
  3164.     findParentNode : function(simpleSelector, maxDepth, returnEl){
  3165.         var p = Ext.fly(this.dom.parentNode, '_internal');
  3166.         return p ? p.findParent(simpleSelector, maxDepth, returnEl) : null;
  3167.     },
  3168.     
  3169.     up : function(simpleSelector, maxDepth){
  3170.         return this.findParentNode(simpleSelector, maxDepth, true);
  3171.     },
  3172.     
  3173.     select : function(selector){
  3174.         return Ext.Element.select(selector, this.dom);
  3175.     },
  3176.     
  3177.     query : function(selector){
  3178.         return DQ.select(selector, this.dom);
  3179.     },
  3180.     
  3181.     child : function(selector, returnDom){
  3182.         var n = DQ.selectNode(selector, this.dom);
  3183.         return returnDom ? n : GET(n);
  3184.     },
  3185.     
  3186.     down : function(selector, returnDom){
  3187.         var n = DQ.selectNode(" > " + selector, this.dom);
  3188.         return returnDom ? n : GET(n);
  3189.     },
  3190.  
  3191.     parent : function(selector, returnDom){
  3192.         return this.matchNode(PARENTNODE, PARENTNODE, selector, returnDom);
  3193.     },
  3194.      
  3195.     next : function(selector, returnDom){
  3196.         return this.matchNode(NEXTSIBLING, NEXTSIBLING, selector, returnDom);
  3197.     },
  3198.     
  3199.     prev : function(selector, returnDom){
  3200.         return this.matchNode(PREVIOUSSIBLING, PREVIOUSSIBLING, selector, returnDom);
  3201.     },
  3202.     
  3203.     first : function(selector, returnDom){
  3204.         return this.matchNode(NEXTSIBLING, 'firstChild', selector, returnDom);
  3205.     },
  3206.     
  3207.     last : function(selector, returnDom){
  3208.         return this.matchNode(PREVIOUSSIBLING, 'lastChild', selector, returnDom);
  3209.     },
  3210.     
  3211.     matchNode : function(dir, start, selector, returnDom){
  3212.         var n = this.dom[start];
  3213.         while(n){
  3214.             if(n.nodeType == 1 && (!selector || DQ.is(n, selector))){
  3215.                 return !returnDom ? GET(n) : n;
  3216.             }
  3217.             n = n[dir];
  3218.         }
  3219.         return null;
  3220.     }
  3221.     }
  3222. }());
  3223. Ext.Element.addMethods({
  3224.     
  3225.     select : function(selector, unique){
  3226.         return Ext.Element.select(selector, unique, this.dom);
  3227.     }
  3228. });
  3229. Ext.Element.addMethods(
  3230. function() {
  3231. var GETDOM = Ext.getDom,
  3232. GET = Ext.get,
  3233. DH = Ext.DomHelper;
  3234. return {
  3235.     
  3236.     appendChild: function(el){        
  3237.         return GET(el).appendTo(this);        
  3238.     },
  3239.     
  3240.     appendTo: function(el){        
  3241.         GETDOM(el).appendChild(this.dom);        
  3242.         return this;
  3243.     },
  3244.     
  3245.     insertBefore: function(el){             
  3246.         (el = GETDOM(el)).parentNode.insertBefore(this.dom, el);
  3247.         return this;
  3248.     },
  3249.     
  3250.     insertAfter: function(el){
  3251.         (el = GETDOM(el)).parentNode.insertBefore(this.dom, el.nextSibling);
  3252.         return this;
  3253.     },
  3254.     
  3255.     insertFirst: function(el, returnDom){
  3256.             el = el || {};
  3257.             if(el.nodeType || el.dom || typeof el == 'string'){ 
  3258.                 el = GETDOM(el);
  3259.                 this.dom.insertBefore(el, this.dom.firstChild);
  3260.                 return !returnDom ? GET(el) : el;
  3261.             }else{ 
  3262.                 return this.createChild(el, this.dom.firstChild, returnDom);
  3263.             }
  3264.         },
  3265.     
  3266.     replace: function(el){
  3267.         el = GET(el);
  3268.         this.insertBefore(el);
  3269.         el.remove();
  3270.         return this;
  3271.     },
  3272.     
  3273.     replaceWith: function(el){
  3274.     var me = this;
  3275.                 
  3276.             if(el.nodeType || el.dom || typeof el == 'string'){
  3277.                 el = GETDOM(el);
  3278.                 me.dom.parentNode.insertBefore(el, me.dom);
  3279.             }else{
  3280.                 el = DH.insertBefore(me.dom, el);
  3281.             }
  3282.         
  3283.         delete Ext.elCache[me.id];
  3284.         Ext.removeNode(me.dom);      
  3285.         me.id = Ext.id(me.dom = el);
  3286.         Ext.Element.addToCache(me.isFlyweight ? new Ext.Element(me.dom) : me);     
  3287.             return me;
  3288.     },
  3289.     
  3290. createChild: function(config, insertBefore, returnDom){
  3291.     config = config || {tag:'div'};
  3292.     return insertBefore ? 
  3293.         DH.insertBefore(insertBefore, config, returnDom !== true) :
  3294.         DH[!this.dom.firstChild ? 'overwrite' : 'append'](this.dom, config,  returnDom !== true);
  3295. },
  3296. wrap: function(config, returnDom){        
  3297.     var newEl = DH.insertBefore(this.dom, config || {tag: "div"}, !returnDom);
  3298.     newEl.dom ? newEl.dom.appendChild(this.dom) : newEl.appendChild(this.dom);
  3299.     return newEl;
  3300. },
  3301. insertHtml : function(where, html, returnEl){
  3302.     var el = DH.insertHtml(where, this.dom, html);
  3303.     return returnEl ? Ext.get(el) : el;
  3304. }
  3305. }
  3306. }());
  3307. Ext.apply(Ext.Element.prototype, function() {
  3308. var GETDOM = Ext.getDom,
  3309. GET = Ext.get,
  3310. DH = Ext.DomHelper;
  3311. return {
  3312.     insertSibling: function(el, where, returnDom){
  3313.         var me = this,
  3314.          rt,
  3315.                 isAfter = (where || 'before').toLowerCase() == 'after',
  3316.                 insertEl;
  3317.         
  3318.         if(Ext.isArray(el)){
  3319.                 insertEl = me;
  3320.             Ext.each(el, function(e) {
  3321.             rt = Ext.fly(insertEl, '_internal').insertSibling(e, where, returnDom);
  3322.                     if(isAfter){
  3323.                         insertEl = rt;
  3324.                     }
  3325.             });
  3326.             return rt;
  3327.         }
  3328.                 
  3329.         el = el || {};
  3330.        
  3331.             if(el.nodeType || el.dom){
  3332.                 rt = me.dom.parentNode.insertBefore(GETDOM(el), isAfter ? me.dom.nextSibling : me.dom);
  3333.                 if (!returnDom) {
  3334.                     rt = GET(rt);
  3335.                 }
  3336.             }else{
  3337.                 if (isAfter && !me.dom.nextSibling) {
  3338.                     rt = DH.append(me.dom.parentNode, el, !returnDom);
  3339.                 } else {                    
  3340.                     rt = DH[isAfter ? 'insertAfter' : 'insertBefore'](me.dom, el, !returnDom);
  3341.                 }
  3342.             }
  3343.         return rt;
  3344.     }
  3345.     };
  3346. }());
  3347. Ext.Element.addMethods(function(){
  3348.     
  3349.     var propCache = {},
  3350.         camelRe = /(-[a-z])/gi,
  3351.         classReCache = {},
  3352.         view = document.defaultView,
  3353.         propFloat = Ext.isIE ? 'styleFloat' : 'cssFloat',
  3354.         opacityRe = /alpha(opacity=(.*))/i,
  3355.         trimRe = /^s+|s+$/g,
  3356.         EL = Ext.Element,
  3357.         PADDING = "padding",
  3358.         MARGIN = "margin",
  3359.         BORDER = "border",
  3360.         LEFT = "-left",
  3361.         RIGHT = "-right",
  3362.         TOP = "-top",
  3363.         BOTTOM = "-bottom",
  3364.         WIDTH = "-width",
  3365.         MATH = Math,
  3366.         HIDDEN = 'hidden',
  3367.         ISCLIPPED = 'isClipped',
  3368.         OVERFLOW = 'overflow',
  3369.         OVERFLOWX = 'overflow-x',
  3370.         OVERFLOWY = 'overflow-y',
  3371.         ORIGINALCLIP = 'originalClip',
  3372.         
  3373.         borders = {l: BORDER + LEFT + WIDTH, r: BORDER + RIGHT + WIDTH, t: BORDER + TOP + WIDTH, b: BORDER + BOTTOM + WIDTH},
  3374.         paddings = {l: PADDING + LEFT, r: PADDING + RIGHT, t: PADDING + TOP, b: PADDING + BOTTOM},
  3375.         margins = {l: MARGIN + LEFT, r: MARGIN + RIGHT, t: MARGIN + TOP, b: MARGIN + BOTTOM},
  3376.         data = Ext.Element.data;
  3377.     
  3378.     function camelFn(m, a) {
  3379.         return a.charAt(1).toUpperCase();
  3380.     }
  3381.     function chkCache(prop) {
  3382.         return propCache[prop] || (propCache[prop] = prop == 'float' ? propFloat : prop.replace(camelRe, camelFn));
  3383.     }
  3384.     return {
  3385.         
  3386.         adjustWidth : function(width) {
  3387.             var me = this;
  3388.             var isNum = Ext.isNumber(width);
  3389.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  3390.                width -= (me.getBorderWidth("lr") + me.getPadding("lr"));
  3391.             }
  3392.             return (isNum && width < 0) ? 0 : width;
  3393.         },
  3394.         
  3395.         adjustHeight : function(height) {
  3396.             var me = this;
  3397.             var isNum = Ext.isNumber(height);
  3398.             if(isNum && me.autoBoxAdjust && !me.isBorderBox()){
  3399.                height -= (me.getBorderWidth("tb") + me.getPadding("tb"));
  3400.             }
  3401.             return (isNum && height < 0) ? 0 : height;
  3402.         },
  3403.         
  3404.         addClass : function(className){
  3405.             var me = this, i, len, v;
  3406.             className = Ext.isArray(className) ? className : [className];
  3407.             for (i=0, len = className.length; i < len; i++) {
  3408.                 v = className[i];
  3409.                 if (v) {
  3410.                     me.dom.className += (!me.hasClass(v) && v ? " " + v : "");
  3411.                 };
  3412.             };
  3413.             return me;
  3414.         },
  3415.         
  3416.         radioClass : function(className){
  3417.             var cn = this.dom.parentNode.childNodes, v;
  3418.             className = Ext.isArray(className) ? className : [className];
  3419.             for (var i=0, len = cn.length; i < len; i++) {
  3420.                 v = cn[i];
  3421.                 if(v && v.nodeType == 1) {
  3422.                     Ext.fly(v, '_internal').removeClass(className);
  3423.                 }
  3424.             };
  3425.             return this.addClass(className);
  3426.         },
  3427.         
  3428.         removeClass : function(className){
  3429.             var me = this, v;
  3430.             className = Ext.isArray(className) ? className : [className];
  3431.             if (me.dom && me.dom.className) {
  3432.                 for (var i=0, len=className.length; i < len; i++) {
  3433.                     v = className[i];
  3434.                     if(v) {
  3435.                         me.dom.className = me.dom.className.replace(
  3436.                             classReCache[v] = classReCache[v] || new RegExp('(?:^|\s+)' + v + '(?:\s+|$)', "g"), " "
  3437.                         );
  3438.                     }
  3439.                 };
  3440.             }
  3441.             return me;
  3442.         },
  3443.         
  3444.         toggleClass : function(className){
  3445.             return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
  3446.         },
  3447.         
  3448.         hasClass : function(className){
  3449.             return className && (' '+this.dom.className+' ').indexOf(' '+className+' ') != -1;
  3450.         },
  3451.         
  3452.         replaceClass : function(oldClassName, newClassName){
  3453.             return this.removeClass(oldClassName).addClass(newClassName);
  3454.         },
  3455.         isStyle : function(style, val) {
  3456.             return this.getStyle(style) == val;
  3457.         },
  3458.         
  3459.         getStyle : function(){
  3460.             return view && view.getComputedStyle ?
  3461.                 function(prop){
  3462.                     var el = this.dom,
  3463.                         v,
  3464.                         cs,
  3465.                         out,
  3466.                         display,
  3467.                         wk = Ext.isWebKit,
  3468.                         display;
  3469.                         
  3470.                     if(el == document){
  3471.                         return null;
  3472.                     }
  3473.                     prop = chkCache(prop);
  3474.                     
  3475.                     if(wk && /marginRight/.test(prop)){
  3476.                         display = this.getStyle('display');
  3477.                         el.style.display = 'inline-block';
  3478.                     }
  3479.                     out = (v = el.style[prop]) ? v :
  3480.                            (cs = view.getComputedStyle(el, "")) ? cs[prop] : null;
  3481.                     
  3482.                     if(wk){
  3483.                         if(out == 'rgba(0, 0, 0, 0)'){
  3484.                             out = 'transparent';
  3485.                         }else if(display){
  3486.                             el.style.display = display;
  3487.                         }
  3488.                     }
  3489.                     return out;
  3490.                 } :
  3491.                 function(prop){
  3492.                     var el = this.dom,
  3493.                         m,
  3494.                         cs;
  3495.                     if(el == document) return null;
  3496.                     if (prop == 'opacity') {
  3497.                         if (el.style.filter.match) {
  3498.                             if(m = el.style.filter.match(opacityRe)){
  3499.                                 var fv = parseFloat(m[1]);
  3500.                                 if(!isNaN(fv)){
  3501.                                     return fv ? fv / 100 : 0;
  3502.                                 }
  3503.                             }
  3504.                         }
  3505.                         return 1;
  3506.                     }
  3507.                     prop = chkCache(prop);
  3508.                     return el.style[prop] || ((cs = el.currentStyle) ? cs[prop] : null);
  3509.                 };
  3510.         }(),
  3511.         
  3512.         getColor : function(attr, defaultValue, prefix){
  3513.             var v = this.getStyle(attr),
  3514.                 color = Ext.isDefined(prefix) ? prefix : '#',
  3515.                 h;
  3516.             if(!v || /transparent|inherit/.test(v)){
  3517.                 return defaultValue;
  3518.             }
  3519.             if(/^r/.test(v)){
  3520.                 Ext.each(v.slice(4, v.length -1).split(','), function(s){
  3521.                     h = parseInt(s, 10);
  3522.                     color += (h < 16 ? '0' : '') + h.toString(16);
  3523.                 });
  3524.             }else{
  3525.                 v = v.replace('#', '');
  3526.                 color += v.length == 3 ? v.replace(/^(w)(w)(w)$/, '$1$1$2$2$3$3') : v;
  3527.             }
  3528.             return(color.length > 5 ? color.toLowerCase() : defaultValue);
  3529.         },
  3530.         
  3531.         setStyle : function(prop, value){
  3532.             var tmp,
  3533.                 style,
  3534.                 camel;
  3535.             if (!Ext.isObject(prop)) {
  3536.                 tmp = {};
  3537.                 tmp[prop] = value;
  3538.                 prop = tmp;
  3539.             }
  3540.             for (style in prop) {
  3541.                 value = prop[style];
  3542.                 style == 'opacity' ?
  3543.                     this.setOpacity(value) :
  3544.                     this.dom.style[chkCache(style)] = value;
  3545.             }
  3546.             return this;
  3547.         },
  3548.         
  3549.          setOpacity : function(opacity, animate){
  3550.             var me = this,
  3551.                 s = me.dom.style;
  3552.             if(!animate || !me.anim){
  3553.                 if(Ext.isIE){
  3554.                     var opac = opacity < 1 ? 'alpha(opacity=' + opacity * 100 + ')' : '',
  3555.                     val = s.filter.replace(opacityRe, '').replace(trimRe, '');
  3556.                     s.zoom = 1;
  3557.                     s.filter = val + (val.length > 0 ? ' ' : '') + opac;
  3558.                 }else{
  3559.                     s.opacity = opacity;
  3560.                 }
  3561.             }else{
  3562.                 me.anim({opacity: {to: opacity}}, me.preanim(arguments, 1), null, .35, 'easeIn');
  3563.             }
  3564.             return me;
  3565.         },
  3566.         
  3567.         clearOpacity : function(){
  3568.             var style = this.dom.style;
  3569.             if(Ext.isIE){
  3570.                 if(!Ext.isEmpty(style.filter)){
  3571.                     style.filter = style.filter.replace(opacityRe, '').replace(trimRe, '');
  3572.                 }
  3573.             }else{
  3574.                 style.opacity = style['-moz-opacity'] = style['-khtml-opacity'] = '';
  3575.             }
  3576.             return this;
  3577.         },
  3578.         
  3579.         getHeight : function(contentHeight){
  3580.             var me = this,
  3581.                 dom = me.dom,
  3582.                 hidden = Ext.isIE && me.isStyle('display', 'none'),
  3583.                 h = MATH.max(dom.offsetHeight, hidden ? 0 : dom.clientHeight) || 0;
  3584.             h = !contentHeight ? h : h - me.getBorderWidth("tb") - me.getPadding("tb");
  3585.             return h < 0 ? 0 : h;
  3586.         },
  3587.         
  3588.         getWidth : function(contentWidth){
  3589.             var me = this,
  3590.                 dom = me.dom,
  3591.                 hidden = Ext.isIE && me.isStyle('display', 'none'),
  3592.                 w = MATH.max(dom.offsetWidth, hidden ? 0 : dom.clientWidth) || 0;
  3593.             w = !contentWidth ? w : w - me.getBorderWidth("lr") - me.getPadding("lr");
  3594.             return w < 0 ? 0 : w;
  3595.         },
  3596.         
  3597.         setWidth : function(width, animate){
  3598.             var me = this;
  3599.             width = me.adjustWidth(width);
  3600.             !animate || !me.anim ?
  3601.                 me.dom.style.width = me.addUnits(width) :
  3602.                 me.anim({width : {to : width}}, me.preanim(arguments, 1));
  3603.             return me;
  3604.         },
  3605.         
  3606.          setHeight : function(height, animate){
  3607.             var me = this;
  3608.             height = me.adjustHeight(height);
  3609.             !animate || !me.anim ?
  3610.                 me.dom.style.height = me.addUnits(height) :
  3611.                 me.anim({height : {to : height}}, me.preanim(arguments, 1));
  3612.             return me;
  3613.         },
  3614.         
  3615.         getBorderWidth : function(side){
  3616.             return this.addStyles(side, borders);
  3617.         },
  3618.         
  3619.         getPadding : function(side){
  3620.             return this.addStyles(side, paddings);
  3621.         },
  3622.         
  3623.         clip : function(){
  3624.             var me = this,
  3625.                 dom = me.dom;
  3626.             if(!data(dom, ISCLIPPED)){
  3627.                 data(dom, ISCLIPPED, true);
  3628.                 data(dom, ORIGINALCLIP, {
  3629.                     o: me.getStyle(OVERFLOW),
  3630.                     x: me.getStyle(OVERFLOWX),
  3631.                     y: me.getStyle(OVERFLOWY)
  3632.                 });
  3633.                 me.setStyle(OVERFLOW, HIDDEN);
  3634.                 me.setStyle(OVERFLOWX, HIDDEN);
  3635.                 me.setStyle(OVERFLOWY, HIDDEN);
  3636.             }
  3637.             return me;
  3638.         },
  3639.         
  3640.         unclip : function(){
  3641.             var me = this,
  3642.                 dom = me.dom;
  3643.             if(data(dom, ISCLIPPED)){
  3644.                 data(dom, ISCLIPPED, false);
  3645.                 var o = data(dom, ORIGINALCLIP);
  3646.                 if(o.o){
  3647.                     me.setStyle(OVERFLOW, o.o);
  3648.                 }
  3649.                 if(o.x){
  3650.                     me.setStyle(OVERFLOWX, o.x);
  3651.                 }
  3652.                 if(o.y){
  3653.                     me.setStyle(OVERFLOWY, o.y);
  3654.                 }
  3655.             }
  3656.             return me;
  3657.         },
  3658.         
  3659.         addStyles : function(sides, styles){
  3660.             var val = 0,
  3661.                 m = sides.match(/w/g),
  3662.                 s;
  3663.             for (var i=0, len=m.length; i<len; i++) {
  3664.                 s = m[i] && parseInt(this.getStyle(styles[m[i]]), 10);
  3665.                 if (s) {
  3666.                     val += MATH.abs(s);
  3667.                 }
  3668.             }
  3669.             return val;
  3670.         },
  3671.         margins : margins
  3672.     }
  3673. }()
  3674. );
  3675. Ext.Element.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>';
  3676. Ext.Element.addMethods(function(){
  3677.     var INTERNAL = "_internal",
  3678.         pxMatch = /(d+)px/;
  3679.     return {
  3680.         
  3681.         applyStyles : function(style){
  3682.             Ext.DomHelper.applyStyles(this.dom, style);
  3683.             return this;
  3684.         },
  3685.         
  3686.         getStyles : function(){
  3687.             var ret = {};
  3688.             Ext.each(arguments, function(v) {
  3689.                ret[v] = this.getStyle(v);
  3690.             },
  3691.             this);
  3692.             return ret;
  3693.         },
  3694.         
  3695.         getStyleSize : function(){
  3696.             var me = this,
  3697.                 w,
  3698.                 h,
  3699.                 d = this.dom,
  3700.                 s = d.style;
  3701.             if(s.width && s.width != 'auto'){
  3702.                 w = parseInt(s.width, 10);
  3703.                 if(me.isBorderBox()){
  3704.                    w -= me.getFrameWidth('lr');
  3705.                 }
  3706.             }
  3707.             if(s.height && s.height != 'auto'){
  3708.                 h = parseInt(s.height, 10);
  3709.                 if(me.isBorderBox()){
  3710.                    h -= me.getFrameWidth('tb');
  3711.                 }
  3712.             }
  3713.             return {width: w || me.getWidth(true), height: h || me.getHeight(true)};
  3714.         },
  3715.         
  3716.         setOverflow : function(v){
  3717.             var dom = this.dom;
  3718.             if(v=='auto' && Ext.isMac && Ext.isGecko2){ 
  3719.                 dom.style.overflow = 'hidden';
  3720.                 (function(){dom.style.overflow = 'auto';}).defer(1);
  3721.             }else{
  3722.                 dom.style.overflow = v;
  3723.             }
  3724.         },
  3725.        
  3726.         boxWrap : function(cls){
  3727.             cls = cls || 'x-box';
  3728.             var el = Ext.get(this.insertHtml("beforeBegin", "<div class='" + cls + "'>" + String.format(Ext.Element.boxMarkup, cls) + "</div>"));        
  3729.             Ext.DomQuery.selectNode('.' + cls + '-mc', el.dom).appendChild(this.dom);
  3730.             return el;
  3731.         },
  3732.         
  3733.         setSize : function(width, height, animate){
  3734.             var me = this;
  3735.             if(Ext.isObject(width)){ 
  3736.                 height = width.height;
  3737.                 width = width.width;
  3738.             }
  3739.             width = me.adjustWidth(width);
  3740.             height = me.adjustHeight(height);
  3741.             if(!animate || !me.anim){
  3742.                 me.dom.style.width = me.addUnits(width);
  3743.                 me.dom.style.height = me.addUnits(height);
  3744.             }else{
  3745.                 me.anim({width: {to: width}, height: {to: height}}, me.preanim(arguments, 2));
  3746.             }
  3747.             return me;
  3748.         },
  3749.         
  3750.         getComputedHeight : function(){
  3751.             var me = this,
  3752.                 h = Math.max(me.dom.offsetHeight, me.dom.clientHeight);
  3753.             if(!h){
  3754.                 h = parseInt(me.getStyle('height'), 10) || 0;
  3755.                 if(!me.isBorderBox()){
  3756.                     h += me.getFrameWidth('tb');
  3757.                 }
  3758.             }
  3759.             return h;
  3760.         },
  3761.         
  3762.         getComputedWidth : function(){
  3763.             var w = Math.max(this.dom.offsetWidth, this.dom.clientWidth);
  3764.             if(!w){
  3765.                 w = parseInt(this.getStyle('width'), 10) || 0;
  3766.                 if(!this.isBorderBox()){
  3767.                     w += this.getFrameWidth('lr');
  3768.                 }
  3769.             }
  3770.             return w;
  3771.         },
  3772.         
  3773.         getFrameWidth : function(sides, onlyContentBox){
  3774.             return onlyContentBox && this.isBorderBox() ? 0 : (this.getPadding(sides) + this.getBorderWidth(sides));
  3775.         },
  3776.         
  3777.         addClassOnOver : function(className){
  3778.             this.hover(
  3779.                 function(){
  3780.                     Ext.fly(this, INTERNAL).addClass(className);
  3781.                 },
  3782.                 function(){
  3783.                     Ext.fly(this, INTERNAL).removeClass(className);
  3784.                 }
  3785.             );
  3786.             return this;
  3787.         },
  3788.         
  3789.         addClassOnFocus : function(className){
  3790.             this.on("focus", function(){
  3791.                 Ext.fly(this, INTERNAL).addClass(className);
  3792.             }, this.dom);
  3793.             this.on("blur", function(){
  3794.                 Ext.fly(this, INTERNAL).removeClass(className);
  3795.             }, this.dom);
  3796.             return this;
  3797.         },
  3798.         
  3799.         addClassOnClick : function(className){
  3800.             var dom = this.dom;
  3801.             this.on("mousedown", function(){
  3802.                 Ext.fly(dom, INTERNAL).addClass(className);
  3803.                 var d = Ext.getDoc(),
  3804.                     fn = function(){
  3805.                         Ext.fly(dom, INTERNAL).removeClass(className);
  3806.                         d.removeListener("mouseup", fn);
  3807.                     };
  3808.                 d.on("mouseup", fn);
  3809.             });
  3810.             return this;
  3811.         },
  3812.         
  3813.         getViewSize : function(contentBox){
  3814.             var doc = document,
  3815.                 me = this,
  3816.                 d = me.dom,
  3817.                 extdom = Ext.lib.Dom,
  3818.                 isDoc = (d == doc || d == doc.body),
  3819.                 isBB, w, h, tbBorder = 0, lrBorder = 0,
  3820.                 tbPadding = 0, lrPadding = 0;
  3821.             if (isDoc) {
  3822.                 return { width: extdom.getViewWidth(), height: extdom.getViewHeight() };
  3823.             }
  3824.             isBB = me.isBorderBox();
  3825.             tbBorder = me.getBorderWidth('tb');
  3826.             lrBorder = me.getBorderWidth('lr');
  3827.             tbPadding = me.getPadding('tb');
  3828.             lrPadding = me.getPadding('lr');
  3829.             
  3830.             
  3831.             if (w = me.getStyle('width').match(pxMatch)){
  3832.                 if ((w = parseInt(w[1], 10)) && isBB){
  3833.                     
  3834.                     w -= (lrBorder + lrPadding);
  3835.                 }
  3836.                 if (!contentBox){
  3837.                     w += lrPadding;
  3838.                 }
  3839.             } else {
  3840.                 if (!(w = d.clientWidth) && (w = d.offsetWidth)){
  3841.                     w -= lrBorder;
  3842.                 }
  3843.                 if (w && contentBox){
  3844.                     w -= lrPadding;
  3845.                 }
  3846.             }
  3847.             
  3848.             
  3849.             if (h = me.getStyle('height').match(pxMatch)){
  3850.                 if ((h = parseInt(h[1], 10)) && isBB){
  3851.                     
  3852.                     h -= (tbBorder + tbPadding);
  3853.                 }
  3854.                 if (!contentBox){
  3855.                     h += tbPadding;
  3856.                 }
  3857.             } else {
  3858.                 if (!(h = d.clientHeight) && (h = d.offsetHeight)){
  3859.                     h -= tbBorder;
  3860.                 }
  3861.                 if (h && contentBox){
  3862.                     h -= tbPadding;
  3863.                 }
  3864.             }
  3865.             return {
  3866.                 width : w,
  3867.                 height : h
  3868.             };
  3869.         },
  3870.         
  3871.         getSize : function(contentSize){
  3872.             return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
  3873.         },
  3874.         
  3875.         repaint : function(){
  3876.             var dom = this.dom;
  3877.             this.addClass("x-repaint");
  3878.             setTimeout(function(){
  3879.                 Ext.fly(dom).removeClass("x-repaint");
  3880.             }, 1);
  3881.             return this;
  3882.         },
  3883.         
  3884.         unselectable : function(){
  3885.             this.dom.unselectable = "on";
  3886.             return this.swallowEvent("selectstart", true).
  3887.                         applyStyles("-moz-user-select:none;-khtml-user-select:none;").
  3888.                         addClass("x-unselectable");
  3889.         },
  3890.         
  3891.         getMargins : function(side){
  3892.             var me = this,
  3893.                 key,
  3894.                 hash = {t:"top", l:"left", r:"right", b: "bottom"},
  3895.                 o = {};
  3896.             if (!side) {
  3897.                 for (key in me.margins){
  3898.                     o[hash[key]] = parseInt(me.getStyle(me.margins[key]), 10) || 0;
  3899.                 }
  3900.                 return o;
  3901.             } else {
  3902.                 return me.addStyles.call(me, side, me.margins);
  3903.             }
  3904.         }
  3905.     };
  3906. }());
  3907. (function(){
  3908. var D = Ext.lib.Dom,
  3909.         LEFT = "left",
  3910.         RIGHT = "right",
  3911.         TOP = "top",
  3912.         BOTTOM = "bottom",
  3913.         POSITION = "position",
  3914.         STATIC = "static",
  3915.         RELATIVE = "relative",
  3916.         AUTO = "auto",
  3917.         ZINDEX = "z-index";
  3918. Ext.Element.addMethods({
  3919.     getX : function(){
  3920.         return D.getX(this.dom);
  3921.     },
  3922.     
  3923.     getY : function(){
  3924.         return D.getY(this.dom);
  3925.     },
  3926.     
  3927.     getXY : function(){
  3928.         return D.getXY(this.dom);
  3929.     },
  3930.     
  3931.     getOffsetsTo : function(el){
  3932.         var o = this.getXY(),
  3933.          e = Ext.fly(el, '_internal').getXY();
  3934.         return [o[0]-e[0],o[1]-e[1]];
  3935.     },
  3936.     
  3937.     setX : function(x, animate){     
  3938.     return this.setXY([x, this.getY()], this.animTest(arguments, animate, 1));
  3939.     },
  3940.     
  3941.     setY : function(y, animate){     
  3942.     return this.setXY([this.getX(), y], this.animTest(arguments, animate, 1));
  3943.     },
  3944.     
  3945.     setLeft : function(left){
  3946.         this.setStyle(LEFT, this.addUnits(left));
  3947.         return this;
  3948.     },
  3949.     
  3950.     setTop : function(top){
  3951.         this.setStyle(TOP, this.addUnits(top));
  3952.         return this;
  3953.     },
  3954.     
  3955.     setRight : function(right){
  3956.         this.setStyle(RIGHT, this.addUnits(right));
  3957.         return this;
  3958.     },
  3959.     
  3960.     setBottom : function(bottom){
  3961.         this.setStyle(BOTTOM, this.addUnits(bottom));
  3962.         return this;
  3963.     },
  3964.     
  3965.     setXY : function(pos, animate){
  3966.     var me = this;
  3967.         if(!animate || !me.anim){
  3968.             D.setXY(me.dom, pos);
  3969.         }else{
  3970.             me.anim({points: {to: pos}}, me.preanim(arguments, 1), 'motion');
  3971.         }
  3972.         return me;
  3973.     },
  3974.     
  3975.     setLocation : function(x, y, animate){
  3976.         return this.setXY([x, y], this.animTest(arguments, animate, 2));
  3977.     },
  3978.     
  3979.     moveTo : function(x, y, animate){
  3980.         return this.setXY([x, y], this.animTest(arguments, animate, 2));        
  3981.     },    
  3982.     
  3983.     
  3984.     getLeft : function(local){
  3985.     return !local ? this.getX() : parseInt(this.getStyle(LEFT), 10) || 0;
  3986.     },
  3987.     
  3988.     getRight : function(local){