ext-all-debug.js
上传用户:zaktkj
上传日期:2022-08-08
资源大小:5770k
文件大小:910k
源码类别:

JavaScript

开发平台:

JavaScript

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