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

JavaScript

开发平台:

JavaScript

  1.     each : function(fn, scope){
  2.         Ext.each(this.items, fn, scope);
  3.     },
  4.     callEach : function(fnName, args){
  5.         var cs = this.items;
  6.         for(var i = 0, len = cs.length; i < len; i++){
  7.             cs[i][fnName].apply(cs[i], args);
  8.         }
  9.     },
  10.     addComponent : function(comp){
  11.         this.items.push(comp);
  12.         comp.on('destroy', this.removeComponent, this);
  13.     },
  14.     removeComponent : function(comp){
  15.         this.items.remove(comp);
  16.     },
  17.     execute : function(){
  18.         this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
  19.     }
  20. };
  21. (function(){
  22. Ext.Layer = function(config, existingEl){
  23.     config = config || {};
  24.     var dh = Ext.DomHelper;
  25.     var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;
  26.     if(existingEl){
  27.         this.dom = Ext.getDom(existingEl);
  28.     }
  29.     if(!this.dom){
  30.         var o = config.dh || {tag: "div", cls: "x-layer"};
  31.         this.dom = dh.append(pel, o);
  32.     }
  33.     if(config.cls){
  34.         this.addClass(config.cls);
  35.     }
  36.     this.constrain = config.constrain !== false;
  37.     this.visibilityMode = Ext.Element.VISIBILITY;
  38.     if(config.id){
  39.         this.id = this.dom.id = config.id;
  40.     }else{
  41.         this.id = Ext.id(this.dom);
  42.     }
  43.     this.zindex = config.zindex || this.getZIndex();
  44.     this.position("absolute", this.zindex);
  45.     if(config.shadow){
  46.         this.shadowOffset = config.shadowOffset || 4;
  47.         this.shadow = new Ext.Shadow({
  48.             offset : this.shadowOffset,
  49.             mode : config.shadow
  50.         });
  51.     }else{
  52.         this.shadowOffset = 0;
  53.     }
  54.     this.useShim = config.shim !== false && Ext.useShims;
  55.     this.useDisplay = config.useDisplay;
  56.     this.hide();
  57. };
  58. var supr = Ext.Element.prototype;
  59. var shims = [];
  60. Ext.extend(Ext.Layer, Ext.Element, {
  61.     getZIndex : function(){
  62.         return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;
  63.     },
  64.     getShim : function(){
  65.         if(!this.useShim){
  66.             return null;
  67.         }
  68.         if(this.shim){
  69.             return this.shim;
  70.         }
  71.         var shim = shims.shift();
  72.         if(!shim){
  73.             shim = this.createShim();
  74.             shim.enableDisplayMode('block');
  75.             shim.dom.style.display = 'none';
  76.             shim.dom.style.visibility = 'visible';
  77.         }
  78.         var pn = this.dom.parentNode;
  79.         if(shim.dom.parentNode != pn){
  80.             pn.insertBefore(shim.dom, this.dom);
  81.         }
  82.         shim.setStyle('z-index', this.getZIndex()-2);
  83.         this.shim = shim;
  84.         return shim;
  85.     },
  86.     hideShim : function(){
  87.         if(this.shim){
  88.             this.shim.setDisplayed(false);
  89.             shims.push(this.shim);
  90.             delete this.shim;
  91.         }
  92.     },
  93.     disableShadow : function(){
  94.         if(this.shadow){
  95.             this.shadowDisabled = true;
  96.             this.shadow.hide();
  97.             this.lastShadowOffset = this.shadowOffset;
  98.             this.shadowOffset = 0;
  99.         }
  100.     },
  101.     enableShadow : function(show){
  102.         if(this.shadow){
  103.             this.shadowDisabled = false;
  104.             this.shadowOffset = this.lastShadowOffset;
  105.             delete this.lastShadowOffset;
  106.             if(show){
  107.                 this.sync(true);
  108.             }
  109.         }
  110.     },
  111.     sync : function(doShow){
  112.         var sw = this.shadow;
  113.         if(!this.updating && this.isVisible() && (sw || this.useShim)){
  114.             var sh = this.getShim();
  115.             var w = this.getWidth(),
  116.                 h = this.getHeight();
  117.             var l = this.getLeft(true),
  118.                 t = this.getTop(true);
  119.             if(sw && !this.shadowDisabled){
  120.                 if(doShow && !sw.isVisible()){
  121.                     sw.show(this);
  122.                 }else{
  123.                     sw.realign(l, t, w, h);
  124.                 }
  125.                 if(sh){
  126.                     if(doShow){
  127.                        sh.show();
  128.                     }
  129.                     var a = sw.adjusts, s = sh.dom.style;
  130.                     s.left = (Math.min(l, l+a.l))+"px";
  131.                     s.top = (Math.min(t, t+a.t))+"px";
  132.                     s.width = (w+a.w)+"px";
  133.                     s.height = (h+a.h)+"px";
  134.                 }
  135.             }else if(sh){
  136.                 if(doShow){
  137.                    sh.show();
  138.                 }
  139.                 sh.setSize(w, h);
  140.                 sh.setLeftTop(l, t);
  141.             }
  142.         }
  143.     },
  144.     destroy : function(){
  145.         this.hideShim();
  146.         if(this.shadow){
  147.             this.shadow.hide();
  148.         }
  149.         this.removeAllListeners();
  150.         Ext.removeNode(this.dom);
  151.         Ext.Element.uncache(this.id);
  152.     },
  153.     remove : function(){
  154.         this.destroy();
  155.     },
  156.     beginUpdate : function(){
  157.         this.updating = true;
  158.     },
  159.     endUpdate : function(){
  160.         this.updating = false;
  161.         this.sync(true);
  162.     },
  163.     hideUnders : function(negOffset){
  164.         if(this.shadow){
  165.             this.shadow.hide();
  166.         }
  167.         this.hideShim();
  168.     },
  169.     constrainXY : function(){
  170.         if(this.constrain){
  171.             var vw = Ext.lib.Dom.getViewWidth(),
  172.                 vh = Ext.lib.Dom.getViewHeight();
  173.             var s = Ext.getDoc().getScroll();
  174.             var xy = this.getXY();
  175.             var x = xy[0], y = xy[1];
  176.             var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset;
  177.             var moved = false;
  178.             if((x + w) > vw+s.left){
  179.                 x = vw - w - this.shadowOffset;
  180.                 moved = true;
  181.             }
  182.             if((y + h) > vh+s.top){
  183.                 y = vh - h - this.shadowOffset;
  184.                 moved = true;
  185.             }
  186.             if(x < s.left){
  187.                 x = s.left;
  188.                 moved = true;
  189.             }
  190.             if(y < s.top){
  191.                 y = s.top;
  192.                 moved = true;
  193.             }
  194.             if(moved){
  195.                 if(this.avoidY){
  196.                     var ay = this.avoidY;
  197.                     if(y <= ay && (y+h) >= ay){
  198.                         y = ay-h-5;
  199.                     }
  200.                 }
  201.                 xy = [x, y];
  202.                 this.storeXY(xy);
  203.                 supr.setXY.call(this, xy);
  204.                 this.sync();
  205.             }
  206.         }
  207.     },
  208.     isVisible : function(){
  209.         return this.visible;
  210.     },
  211.     showAction : function(){
  212.         this.visible = true;
  213.         if(this.useDisplay === true){
  214.             this.setDisplayed("");
  215.         }else if(this.lastXY){
  216.             supr.setXY.call(this, this.lastXY);
  217.         }else if(this.lastLT){
  218.             supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);
  219.         }
  220.     },
  221.     hideAction : function(){
  222.         this.visible = false;
  223.         if(this.useDisplay === true){
  224.             this.setDisplayed(false);
  225.         }else{
  226.             this.setLeftTop(-10000,-10000);
  227.         }
  228.     },
  229.     setVisible : function(v, a, d, c, e){
  230.         if(v){
  231.             this.showAction();
  232.         }
  233.         if(a && v){
  234.             var cb = function(){
  235.                 this.sync(true);
  236.                 if(c){
  237.                     c();
  238.                 }
  239.             }.createDelegate(this);
  240.             supr.setVisible.call(this, true, true, d, cb, e);
  241.         }else{
  242.             if(!v){
  243.                 this.hideUnders(true);
  244.             }
  245.             var cb = c;
  246.             if(a){
  247.                 cb = function(){
  248.                     this.hideAction();
  249.                     if(c){
  250.                         c();
  251.                     }
  252.                 }.createDelegate(this);
  253.             }
  254.             supr.setVisible.call(this, v, a, d, cb, e);
  255.             if(v){
  256.                 this.sync(true);
  257.             }else if(!a){
  258.                 this.hideAction();
  259.             }
  260.         }
  261.     },
  262.     storeXY : function(xy){
  263.         delete this.lastLT;
  264.         this.lastXY = xy;
  265.     },
  266.     storeLeftTop : function(left, top){
  267.         delete this.lastXY;
  268.         this.lastLT = [left, top];
  269.     },
  270.     beforeFx : function(){
  271.         this.beforeAction();
  272.         return Ext.Layer.superclass.beforeFx.apply(this, arguments);
  273.     },
  274.     afterFx : function(){
  275.         Ext.Layer.superclass.afterFx.apply(this, arguments);
  276.         this.sync(this.isVisible());
  277.     },
  278.     beforeAction : function(){
  279.         if(!this.updating && this.shadow){
  280.             this.shadow.hide();
  281.         }
  282.     },
  283.     setLeft : function(left){
  284.         this.storeLeftTop(left, this.getTop(true));
  285.         supr.setLeft.apply(this, arguments);
  286.         this.sync();
  287.     },
  288.     setTop : function(top){
  289.         this.storeLeftTop(this.getLeft(true), top);
  290.         supr.setTop.apply(this, arguments);
  291.         this.sync();
  292.     },
  293.     setLeftTop : function(left, top){
  294.         this.storeLeftTop(left, top);
  295.         supr.setLeftTop.apply(this, arguments);
  296.         this.sync();
  297.     },
  298.     setXY : function(xy, a, d, c, e){
  299.         this.fixDisplay();
  300.         this.beforeAction();
  301.         this.storeXY(xy);
  302.         var cb = this.createCB(c);
  303.         supr.setXY.call(this, xy, a, d, cb, e);
  304.         if(!a){
  305.             cb();
  306.         }
  307.     },
  308.     createCB : function(c){
  309.         var el = this;
  310.         return function(){
  311.             el.constrainXY();
  312.             el.sync(true);
  313.             if(c){
  314.                 c();
  315.             }
  316.         };
  317.     },
  318.     setX : function(x, a, d, c, e){
  319.         this.setXY([x, this.getY()], a, d, c, e);
  320.     },
  321.     setY : function(y, a, d, c, e){
  322.         this.setXY([this.getX(), y], a, d, c, e);
  323.     },
  324.     setSize : function(w, h, a, d, c, e){
  325.         this.beforeAction();
  326.         var cb = this.createCB(c);
  327.         supr.setSize.call(this, w, h, a, d, cb, e);
  328.         if(!a){
  329.             cb();
  330.         }
  331.     },
  332.     setWidth : function(w, a, d, c, e){
  333.         this.beforeAction();
  334.         var cb = this.createCB(c);
  335.         supr.setWidth.call(this, w, a, d, cb, e);
  336.         if(!a){
  337.             cb();
  338.         }
  339.     },
  340.     setHeight : function(h, a, d, c, e){
  341.         this.beforeAction();
  342.         var cb = this.createCB(c);
  343.         supr.setHeight.call(this, h, a, d, cb, e);
  344.         if(!a){
  345.             cb();
  346.         }
  347.     },
  348.     setBounds : function(x, y, w, h, a, d, c, e){
  349.         this.beforeAction();
  350.         var cb = this.createCB(c);
  351.         if(!a){
  352.             this.storeXY([x, y]);
  353.             supr.setXY.call(this, [x, y]);
  354.             supr.setSize.call(this, w, h, a, d, cb, e);
  355.             cb();
  356.         }else{
  357.             supr.setBounds.call(this, x, y, w, h, a, d, cb, e);
  358.         }
  359.         return this;
  360.     },
  361.     setZIndex : function(zindex){
  362.         this.zindex = zindex;
  363.         this.setStyle("z-index", zindex + 2);
  364.         if(this.shadow){
  365.             this.shadow.setZIndex(zindex + 1);
  366.         }
  367.         if(this.shim){
  368.             this.shim.setStyle("z-index", zindex);
  369.         }
  370.     }
  371. });
  372. })();
  373. Ext.Shadow = function(config){
  374.     Ext.apply(this, config);
  375.     if(typeof this.mode != "string"){
  376.         this.mode = this.defaultMode;
  377.     }
  378.     var o = this.offset, a = {h: 0};
  379.     var rad = Math.floor(this.offset/2);
  380.     switch(this.mode.toLowerCase()){         case "drop":
  381.             a.w = 0;
  382.             a.l = a.t = o;
  383.             a.t -= 1;
  384.             if(Ext.isIE){
  385.                 a.l -= this.offset + rad;
  386.                 a.t -= this.offset + rad;
  387.                 a.w -= rad;
  388.                 a.h -= rad;
  389.                 a.t += 1;
  390.             }
  391.         break;
  392.         case "sides":
  393.             a.w = (o*2);
  394.             a.l = -o;
  395.             a.t = o-1;
  396.             if(Ext.isIE){
  397.                 a.l -= (this.offset - rad);
  398.                 a.t -= this.offset + rad;
  399.                 a.l += 1;
  400.                 a.w -= (this.offset - rad)*2;
  401.                 a.w -= rad + 1;
  402.                 a.h -= 1;
  403.             }
  404.         break;
  405.         case "frame":
  406.             a.w = a.h = (o*2);
  407.             a.l = a.t = -o;
  408.             a.t += 1;
  409.             a.h -= 2;
  410.             if(Ext.isIE){
  411.                 a.l -= (this.offset - rad);
  412.                 a.t -= (this.offset - rad);
  413.                 a.l += 1;
  414.                 a.w -= (this.offset + rad + 1);
  415.                 a.h -= (this.offset + rad);
  416.                 a.h += 1;
  417.             }
  418.         break;
  419.     };
  420.     this.adjusts = a;
  421. };
  422. Ext.Shadow.prototype = {
  423.     offset: 4,
  424.         defaultMode: "drop",
  425.     show : function(target){
  426.         target = Ext.get(target);
  427.         if(!this.el){
  428.             this.el = Ext.Shadow.Pool.pull();
  429.             if(this.el.dom.nextSibling != target.dom){
  430.                 this.el.insertBefore(target);
  431.             }
  432.         }
  433.         this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1);
  434.         if(Ext.isIE){
  435.             this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")";
  436.         }
  437.         this.realign(
  438.             target.getLeft(true),
  439.             target.getTop(true),
  440.             target.getWidth(),
  441.             target.getHeight()
  442.         );
  443.         this.el.dom.style.display = "block";
  444.     },
  445.     isVisible : function(){
  446.         return this.el ? true : false;
  447.     },
  448.     realign : function(l, t, w, h){
  449.         if(!this.el){
  450.             return;
  451.         }
  452.         var a = this.adjusts, d = this.el.dom, s = d.style;
  453.         var iea = 0;
  454.         s.left = (l+a.l)+"px";
  455.         s.top = (t+a.t)+"px";
  456.         var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px";
  457.         if(s.width != sws || s.height != shs){
  458.             s.width = sws;
  459.             s.height = shs;
  460.             if(!Ext.isIE){
  461.                 var cn = d.childNodes;
  462.                 var sww = Math.max(0, (sw-12))+"px";
  463.                 cn[0].childNodes[1].style.width = sww;
  464.                 cn[1].childNodes[1].style.width = sww;
  465.                 cn[2].childNodes[1].style.width = sww;
  466.                 cn[1].style.height = Math.max(0, (sh-12))+"px";
  467.             }
  468.         }
  469.     },
  470.     hide : function(){
  471.         if(this.el){
  472.             this.el.dom.style.display = "none";
  473.             Ext.Shadow.Pool.push(this.el);
  474.             delete this.el;
  475.         }
  476.     },
  477.     setZIndex : function(z){
  478.         this.zIndex = z;
  479.         if(this.el){
  480.             this.el.setStyle("z-index", z);
  481.         }
  482.     }
  483. };
  484. Ext.Shadow.Pool = function(){
  485.     var p = [];
  486.     var markup = Ext.isIE ?
  487.                  '<div class="x-ie-shadow"></div>' :
  488.                  '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';
  489.     return {
  490.         pull : function(){
  491.             var sh = p.shift();
  492.             if(!sh){
  493.                 sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));
  494.                 sh.autoBoxAdjust = false;
  495.             }
  496.             return sh;
  497.         },
  498.         push : function(sh){
  499.             p.push(sh);
  500.         }
  501.     };
  502. }();
  503. Ext.BoxComponent = Ext.extend(Ext.Component, {
  504.     initComponent : function(){
  505.         Ext.BoxComponent.superclass.initComponent.call(this);
  506.         this.addEvents(
  507.             'resize',
  508.             'move'
  509.         );
  510.     },
  511.         boxReady : false,
  512.         deferHeight: false,
  513.     setSize : function(w, h){
  514.                 if(typeof w == 'object'){
  515.             h = w.height;
  516.             w = w.width;
  517.         }
  518.                 if(!this.boxReady){
  519.             this.width = w;
  520.             this.height = h;
  521.             return this;
  522.         }
  523.                 if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){
  524.             return this;
  525.         }
  526.         this.lastSize = {width: w, height: h};
  527.         var adj = this.adjustSize(w, h);
  528.         var aw = adj.width, ah = adj.height;
  529.         if(aw !== undefined || ah !== undefined){             var rz = this.getResizeEl();
  530.             if(!this.deferHeight && aw !== undefined && ah !== undefined){
  531.                 rz.setSize(aw, ah);
  532.             }else if(!this.deferHeight && ah !== undefined){
  533.                 rz.setHeight(ah);
  534.             }else if(aw !== undefined){
  535.                 rz.setWidth(aw);
  536.             }
  537.             this.onResize(aw, ah, w, h);
  538.             this.fireEvent('resize', this, aw, ah, w, h);
  539.         }
  540.         return this;
  541.     },
  542.     setWidth : function(width){
  543.         return this.setSize(width);
  544.     },
  545.     setHeight : function(height){
  546.         return this.setSize(undefined, height);
  547.     },
  548.     getSize : function(){
  549.         return this.el.getSize();
  550.     },
  551.     getPosition : function(local){
  552.         if(local === true){
  553.             return [this.el.getLeft(true), this.el.getTop(true)];
  554.         }
  555.         return this.xy || this.el.getXY();
  556.     },
  557.     getBox : function(local){
  558.         var s = this.el.getSize();
  559.         if(local === true){
  560.             s.x = this.el.getLeft(true);
  561.             s.y = this.el.getTop(true);
  562.         }else{
  563.             var xy = this.xy || this.el.getXY();
  564.             s.x = xy[0];
  565.             s.y = xy[1];
  566.         }
  567.         return s;
  568.     },
  569.     updateBox : function(box){
  570.         this.setSize(box.width, box.height);
  571.         this.setPagePosition(box.x, box.y);
  572.         return this;
  573.     },
  574.         getResizeEl : function(){
  575.         return this.resizeEl || this.el;
  576.     },
  577.         getPositionEl : function(){
  578.         return this.positionEl || this.el;
  579.     },
  580.     setPosition : function(x, y){
  581.         if(x && typeof x[1] == 'number'){
  582.             y = x[1];
  583.             x = x[0];
  584.         }
  585.         this.x = x;
  586.         this.y = y;
  587.         if(!this.boxReady){
  588.             return this;
  589.         }
  590.         var adj = this.adjustPosition(x, y);
  591.         var ax = adj.x, ay = adj.y;
  592.         var el = this.getPositionEl();
  593.         if(ax !== undefined || ay !== undefined){
  594.             if(ax !== undefined && ay !== undefined){
  595.                 el.setLeftTop(ax, ay);
  596.             }else if(ax !== undefined){
  597.                 el.setLeft(ax);
  598.             }else if(ay !== undefined){
  599.                 el.setTop(ay);
  600.             }
  601.             this.onPosition(ax, ay);
  602.             this.fireEvent('move', this, ax, ay);
  603.         }
  604.         return this;
  605.     },
  606.     setPagePosition : function(x, y){
  607.         if(x && typeof x[1] == 'number'){
  608.             y = x[1];
  609.             x = x[0];
  610.         }
  611.         this.pageX = x;
  612.         this.pageY = y;
  613.         if(!this.boxReady){
  614.             return;
  615.         }
  616.         if(x === undefined || y === undefined){             return;
  617.         }
  618.         var p = this.el.translatePoints(x, y);
  619.         this.setPosition(p.left, p.top);
  620.         return this;
  621.     },
  622.         onRender : function(ct, position){
  623.         Ext.BoxComponent.superclass.onRender.call(this, ct, position);
  624.         if(this.resizeEl){
  625.             this.resizeEl = Ext.get(this.resizeEl);
  626.         }
  627.         if(this.positionEl){
  628.             this.positionEl = Ext.get(this.positionEl);
  629.         }
  630.     },
  631.         afterRender : function(){
  632.         Ext.BoxComponent.superclass.afterRender.call(this);
  633.         this.boxReady = true;
  634.         this.setSize(this.width, this.height);
  635.         if(this.x || this.y){
  636.             this.setPosition(this.x, this.y);
  637.         }else if(this.pageX || this.pageY){
  638.             this.setPagePosition(this.pageX, this.pageY);
  639.         }
  640.     },
  641.     syncSize : function(){
  642.         delete this.lastSize;
  643.         this.setSize(this.autoWidth ? undefined : this.el.getWidth(), this.autoHeight ? undefined : this.el.getHeight());
  644.         return this;
  645.     },
  646.     onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){
  647.     },
  648.     onPosition : function(x, y){
  649.     },
  650.         adjustSize : function(w, h){
  651.         if(this.autoWidth){
  652.             w = 'auto';
  653.         }
  654.         if(this.autoHeight){
  655.             h = 'auto';
  656.         }
  657.         return {width : w, height: h};
  658.     },
  659.         adjustPosition : function(x, y){
  660.         return {x : x, y: y};
  661.     }
  662. });
  663. Ext.reg('box', Ext.BoxComponent);
  664. Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){
  665.     this.el = Ext.get(dragElement, true);
  666.     this.el.dom.unselectable = "on";
  667.     this.resizingEl = Ext.get(resizingElement, true);
  668.     this.orientation = orientation || Ext.SplitBar.HORIZONTAL;
  669.     this.minSize = 0;
  670.     this.maxSize = 2000;
  671.     this.animate = false;
  672.     this.useShim = false;
  673.     this.shim = null;
  674.     if(!existingProxy){
  675.         this.proxy = Ext.SplitBar.createProxy(this.orientation);
  676.     }else{
  677.         this.proxy = Ext.get(existingProxy).dom;
  678.     }
  679.     this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});
  680.     this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
  681.     this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
  682.     this.dragSpecs = {};
  683.     this.adapter = new Ext.SplitBar.BasicLayoutAdapter();
  684.     this.adapter.init(this);
  685.     if(this.orientation == Ext.SplitBar.HORIZONTAL){
  686.         this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);
  687.         this.el.addClass("x-splitbar-h");
  688.     }else{
  689.         this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);
  690.         this.el.addClass("x-splitbar-v");
  691.     }
  692.     this.addEvents(
  693.         "resize",
  694.         "moved",
  695.         "beforeresize",
  696.         "beforeapply"
  697.     );
  698.     Ext.SplitBar.superclass.constructor.call(this);
  699. };
  700. Ext.extend(Ext.SplitBar, Ext.util.Observable, {
  701.     onStartProxyDrag : function(x, y){
  702.         this.fireEvent("beforeresize", this);
  703.         this.overlay =  Ext.DomHelper.append(document.body,  {cls: "x-drag-overlay", html: "&#160;"}, true);
  704.         this.overlay.unselectable();
  705.         this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  706.         this.overlay.show();
  707.         Ext.get(this.proxy).setDisplayed("block");
  708.         var size = this.adapter.getElementSize(this);
  709.         this.activeMinSize = this.getMinimumSize();;
  710.         this.activeMaxSize = this.getMaximumSize();;
  711.         var c1 = size - this.activeMinSize;
  712.         var c2 = Math.max(this.activeMaxSize - size, 0);
  713.         if(this.orientation == Ext.SplitBar.HORIZONTAL){
  714.             this.dd.resetConstraints();
  715.             this.dd.setXConstraint(
  716.                 this.placement == Ext.SplitBar.LEFT ? c1 : c2,
  717.                 this.placement == Ext.SplitBar.LEFT ? c2 : c1
  718.             );
  719.             this.dd.setYConstraint(0, 0);
  720.         }else{
  721.             this.dd.resetConstraints();
  722.             this.dd.setXConstraint(0, 0);
  723.             this.dd.setYConstraint(
  724.                 this.placement == Ext.SplitBar.TOP ? c1 : c2,
  725.                 this.placement == Ext.SplitBar.TOP ? c2 : c1
  726.             );
  727.          }
  728.         this.dragSpecs.startSize = size;
  729.         this.dragSpecs.startPoint = [x, y];
  730.         Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
  731.     },
  732.     onEndProxyDrag : function(e){
  733.         Ext.get(this.proxy).setDisplayed(false);
  734.         var endPoint = Ext.lib.Event.getXY(e);
  735.         if(this.overlay){
  736.             this.overlay.remove();
  737.             delete this.overlay;
  738.         }
  739.         var newSize;
  740.         if(this.orientation == Ext.SplitBar.HORIZONTAL){
  741.             newSize = this.dragSpecs.startSize +
  742.                 (this.placement == Ext.SplitBar.LEFT ?
  743.                     endPoint[0] - this.dragSpecs.startPoint[0] :
  744.                     this.dragSpecs.startPoint[0] - endPoint[0]
  745.                 );
  746.         }else{
  747.             newSize = this.dragSpecs.startSize +
  748.                 (this.placement == Ext.SplitBar.TOP ?
  749.                     endPoint[1] - this.dragSpecs.startPoint[1] :
  750.                     this.dragSpecs.startPoint[1] - endPoint[1]
  751.                 );
  752.         }
  753.         newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
  754.         if(newSize != this.dragSpecs.startSize){
  755.             if(this.fireEvent('beforeapply', this, newSize) !== false){
  756.                 this.adapter.setElementSize(this, newSize);
  757.                 this.fireEvent("moved", this, newSize);
  758.                 this.fireEvent("resize", this, newSize);
  759.             }
  760.         }
  761.     },
  762.     getAdapter : function(){
  763.         return this.adapter;
  764.     },
  765.     setAdapter : function(adapter){
  766.         this.adapter = adapter;
  767.         this.adapter.init(this);
  768.     },
  769.     getMinimumSize : function(){
  770.         return this.minSize;
  771.     },
  772.     setMinimumSize : function(minSize){
  773.         this.minSize = minSize;
  774.     },
  775.     getMaximumSize : function(){
  776.         return this.maxSize;
  777.     },
  778.     setMaximumSize : function(maxSize){
  779.         this.maxSize = maxSize;
  780.     },
  781.     setCurrentSize : function(size){
  782.         var oldAnimate = this.animate;
  783.         this.animate = false;
  784.         this.adapter.setElementSize(this, size);
  785.         this.animate = oldAnimate;
  786.     },
  787.     destroy : function(removeEl){
  788.         if(this.shim){
  789.             this.shim.remove();
  790.         }
  791.         this.dd.unreg();
  792.         Ext.removeNode(this.proxy);
  793.         if(removeEl){
  794.             this.el.remove();
  795.         }
  796.     }
  797. });
  798. Ext.SplitBar.createProxy = function(dir){
  799.     var proxy = new Ext.Element(document.createElement("div"));
  800.     proxy.unselectable();
  801.     var cls = 'x-splitbar-proxy';
  802.     proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));
  803.     document.body.appendChild(proxy.dom);
  804.     return proxy.dom;
  805. };
  806. Ext.SplitBar.BasicLayoutAdapter = function(){
  807. };
  808. Ext.SplitBar.BasicLayoutAdapter.prototype = {
  809.     init : function(s){
  810.     },
  811.      getElementSize : function(s){
  812.         if(s.orientation == Ext.SplitBar.HORIZONTAL){
  813.             return s.resizingEl.getWidth();
  814.         }else{
  815.             return s.resizingEl.getHeight();
  816.         }
  817.     },
  818.     setElementSize : function(s, newSize, onComplete){
  819.         if(s.orientation == Ext.SplitBar.HORIZONTAL){
  820.             if(!s.animate){
  821.                 s.resizingEl.setWidth(newSize);
  822.                 if(onComplete){
  823.                     onComplete(s, newSize);
  824.                 }
  825.             }else{
  826.                 s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');
  827.             }
  828.         }else{
  829.             if(!s.animate){
  830.                 s.resizingEl.setHeight(newSize);
  831.                 if(onComplete){
  832.                     onComplete(s, newSize);
  833.                 }
  834.             }else{
  835.                 s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');
  836.             }
  837.         }
  838.     }
  839. };
  840. Ext.SplitBar.AbsoluteLayoutAdapter = function(container){
  841.     this.basic = new Ext.SplitBar.BasicLayoutAdapter();
  842.     this.container = Ext.get(container);
  843. };
  844. Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
  845.     init : function(s){
  846.         this.basic.init(s);
  847.     },
  848.     getElementSize : function(s){
  849.         return this.basic.getElementSize(s);
  850.     },
  851.     setElementSize : function(s, newSize, onComplete){
  852.         this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
  853.     },
  854.     moveSplitter : function(s){
  855.         var yes = Ext.SplitBar;
  856.         switch(s.placement){
  857.             case yes.LEFT:
  858.                 s.el.setX(s.resizingEl.getRight());
  859.                 break;
  860.             case yes.RIGHT:
  861.                 s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");
  862.                 break;
  863.             case yes.TOP:
  864.                 s.el.setY(s.resizingEl.getBottom());
  865.                 break;
  866.             case yes.BOTTOM:
  867.                 s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
  868.                 break;
  869.         }
  870.     }
  871. };
  872. Ext.SplitBar.VERTICAL = 1;
  873. Ext.SplitBar.HORIZONTAL = 2;
  874. Ext.SplitBar.LEFT = 1;
  875. Ext.SplitBar.RIGHT = 2;
  876. Ext.SplitBar.TOP = 3;
  877. Ext.SplitBar.BOTTOM = 4;
  878. Ext.Container = Ext.extend(Ext.BoxComponent, {
  879.     autoDestroy: true,
  880.     defaultType: 'panel',
  881.         initComponent : function(){
  882.         Ext.Container.superclass.initComponent.call(this);
  883.         this.addEvents(
  884.             'afterlayout',
  885.             'beforeadd',
  886.             'beforeremove',
  887.             'add',
  888.             'remove'
  889.         );
  890.         var items = this.items;
  891.         if(items){
  892.             delete this.items;
  893.             if(Ext.isArray(items)){
  894.                 this.add.apply(this, items);
  895.             }else{
  896.                 this.add(items);
  897.             }
  898.         }
  899.     },
  900.         initItems : function(){
  901.         if(!this.items){
  902.             this.items = new Ext.util.MixedCollection(false, this.getComponentId);
  903.             this.getLayout();         }
  904.     },
  905.         setLayout : function(layout){
  906.         if(this.layout && this.layout != layout){
  907.             this.layout.setContainer(null);
  908.         }
  909.         this.initItems();
  910.         this.layout = layout;
  911.         layout.setContainer(this);
  912.     },
  913.         render : function(){
  914.         Ext.Container.superclass.render.apply(this, arguments);
  915.         if(this.layout){
  916.             if(typeof this.layout == 'string'){
  917.                 this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);
  918.             }
  919.             this.setLayout(this.layout);
  920.             if(this.activeItem !== undefined){
  921.                 var item = this.activeItem;
  922.                 delete this.activeItem;
  923.                 this.layout.setActiveItem(item);
  924.                 return;
  925.             }
  926.         }
  927.         if(!this.ownerCt){
  928.             this.doLayout();
  929.         }
  930.         if(this.monitorResize === true){
  931.             Ext.EventManager.onWindowResize(this.doLayout, this, [false]);
  932.         }
  933.     },
  934.         getLayoutTarget : function(){
  935.         return this.el;
  936.     },
  937.         getComponentId : function(comp){
  938.         return comp.itemId || comp.id;
  939.     },
  940.     add : function(comp){
  941.         if(!this.items){
  942.             this.initItems();
  943.         }
  944.         var a = arguments, len = a.length;
  945.         if(len > 1){
  946.             for(var i = 0; i < len; i++) {
  947.                 this.add(a[i]);
  948.             }
  949.             return;
  950.         }
  951.         var c = this.lookupComponent(this.applyDefaults(comp));
  952.         var pos = this.items.length;
  953.         if(this.fireEvent('beforeadd', this, c, pos) !== false && this.onBeforeAdd(c) !== false){
  954.             this.items.add(c);
  955.             c.ownerCt = this;
  956.             this.fireEvent('add', this, c, pos);
  957.         }
  958.         return c;
  959.     },
  960.     insert : function(index, comp){
  961.         if(!this.items){
  962.             this.initItems();
  963.         }
  964.         var a = arguments, len = a.length;
  965.         if(len > 2){
  966.             for(var i = len-1; i >= 1; --i) {
  967.                 this.insert(index, a[i]);
  968.             }
  969.             return;
  970.         }
  971.         var c = this.lookupComponent(this.applyDefaults(comp));
  972.         if(c.ownerCt == this && this.items.indexOf(c) < index){
  973.             --index;
  974.         }
  975.         if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){
  976.             this.items.insert(index, c);
  977.             c.ownerCt = this;
  978.             this.fireEvent('add', this, c, index);
  979.         }
  980.         return c;
  981.     },
  982.         applyDefaults : function(c){
  983.         if(this.defaults){
  984.             if(typeof c == 'string'){
  985.                 c = Ext.ComponentMgr.get(c);
  986.                 Ext.apply(c, this.defaults);
  987.             }else if(!c.events){
  988.                 Ext.applyIf(c, this.defaults);
  989.             }else{
  990.                 Ext.apply(c, this.defaults);
  991.             }
  992.         }
  993.         return c;
  994.     },
  995.         onBeforeAdd : function(item){
  996.         if(item.ownerCt){
  997.             item.ownerCt.remove(item, false);
  998.         }
  999.         if(this.hideBorders === true){
  1000.             item.border = (item.border === true);
  1001.         }
  1002.     },
  1003.     remove : function(comp, autoDestroy){
  1004.         var c = this.getComponent(comp);
  1005.         if(c && this.fireEvent('beforeremove', this, c) !== false){
  1006.             this.items.remove(c);
  1007.             delete c.ownerCt;
  1008.             if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){
  1009.                 c.destroy();
  1010.             }
  1011.             if(this.layout && this.layout.activeItem == c){
  1012.                 delete this.layout.activeItem;
  1013.             }
  1014.             this.fireEvent('remove', this, c);
  1015.         }
  1016.         return c;
  1017.     },
  1018.     getComponent : function(comp){
  1019.         if(typeof comp == 'object'){
  1020.             return comp;
  1021.         }
  1022.         return this.items.get(comp);
  1023.     },
  1024.         lookupComponent : function(comp){
  1025.         if(typeof comp == 'string'){
  1026.             return Ext.ComponentMgr.get(comp);
  1027.         }else if(!comp.events){
  1028.             return this.createComponent(comp);
  1029.         }
  1030.         return comp;
  1031.     },
  1032.         createComponent : function(config){
  1033.         return Ext.ComponentMgr.create(config, this.defaultType);
  1034.     },
  1035.     doLayout : function(shallow){
  1036.         if(this.rendered && this.layout){
  1037.             this.layout.layout();
  1038.         }
  1039.         if(shallow !== false && this.items){
  1040.             var cs = this.items.items;
  1041.             for(var i = 0, len = cs.length; i < len; i++) {
  1042.                 var c  = cs[i];
  1043.                 if(c.doLayout){
  1044.                     c.doLayout();
  1045.                 }
  1046.             }
  1047.         }
  1048.     },
  1049.     getLayout : function(){
  1050.         if(!this.layout){
  1051.             var layout = new Ext.layout.ContainerLayout(this.layoutConfig);
  1052.             this.setLayout(layout);
  1053.         }
  1054.         return this.layout;
  1055.     },
  1056.         onDestroy : function(){
  1057.         if(this.items){
  1058.             var cs = this.items.items;
  1059.             for(var i = 0, len = cs.length; i < len; i++) {
  1060.                 Ext.destroy(cs[i]);
  1061.             }
  1062.         }
  1063.         if(this.monitorResize){
  1064.             Ext.EventManager.removeResizeListener(this.doLayout, this);
  1065.         }
  1066.         Ext.Container.superclass.onDestroy.call(this);
  1067.     },
  1068.     bubble : function(fn, scope, args){
  1069.         var p = this;
  1070.         while(p){
  1071.             if(fn.apply(scope || p, args || [p]) === false){
  1072.                 break;
  1073.             }
  1074.             p = p.ownerCt;
  1075.         }
  1076.     },
  1077.     cascade : function(fn, scope, args){
  1078.         if(fn.apply(scope || this, args || [this]) !== false){
  1079.             if(this.items){
  1080.                 var cs = this.items.items;
  1081.                 for(var i = 0, len = cs.length; i < len; i++){
  1082.                     if(cs[i].cascade){
  1083.                         cs[i].cascade(fn, scope, args);
  1084.                     }else{
  1085.                         fn.apply(scope || this, args || [cs[i]]);
  1086.                     }
  1087.                 }
  1088.             }
  1089.         }
  1090.     },
  1091.     findById : function(id){
  1092.         var m, ct = this;
  1093.         this.cascade(function(c){
  1094.             if(ct != c && c.id === id){
  1095.                 m = c;
  1096.                 return false;
  1097.             }
  1098.         });
  1099.         return m || null;
  1100.     },
  1101.     findByType : function(xtype){
  1102.         return typeof xtype == 'function' ?
  1103.             this.findBy(function(c){
  1104.                 return c.constructor === xtype;
  1105.             }) :
  1106.             this.findBy(function(c){
  1107.                 return c.constructor.xtype === xtype;
  1108.             });
  1109.     },
  1110.     find : function(prop, value){
  1111.         return this.findBy(function(c){
  1112.             return c[prop] === value;
  1113.         });
  1114.     },
  1115.     findBy : function(fn, scope){
  1116.         var m = [], ct = this;
  1117.         this.cascade(function(c){
  1118.             if(ct != c && fn.call(scope || c, c, ct) === true){
  1119.                 m.push(c);
  1120.             }
  1121.         });
  1122.         return m;
  1123.     }
  1124. });
  1125. Ext.Container.LAYOUTS = {};
  1126. Ext.reg('container', Ext.Container);
  1127. Ext.layout.ContainerLayout = function(config){
  1128.     Ext.apply(this, config);
  1129. };
  1130. Ext.layout.ContainerLayout.prototype = {
  1131.         monitorResize:false,
  1132.         activeItem : null,
  1133.         layout : function(){
  1134.         var target = this.container.getLayoutTarget();
  1135.         this.onLayout(this.container, target);
  1136.         this.container.fireEvent('afterlayout', this.container, this);
  1137.     },
  1138.         onLayout : function(ct, target){
  1139.         this.renderAll(ct, target);
  1140.     },
  1141.         isValidParent : function(c, target){
  1142.         var el = c.getPositionEl ? c.getPositionEl() : c.getEl();
  1143.         return el.dom.parentNode == target.dom;
  1144.     },
  1145.         renderAll : function(ct, target){
  1146.         var items = ct.items.items;
  1147.         for(var i = 0, len = items.length; i < len; i++) {
  1148.             var c = items[i];
  1149.             if(c && (!c.rendered || !this.isValidParent(c, target))){
  1150.                 this.renderItem(c, i, target);
  1151.             }
  1152.         }
  1153.     },
  1154.         renderItem : function(c, position, target){
  1155.         if(c && !c.rendered){
  1156.             c.render(target, position);
  1157.             if(this.extraCls){
  1158.                 var t = c.getPositionEl ? c.getPositionEl() : c;
  1159.                 t.addClass(this.extraCls);
  1160.             }
  1161.             if (this.renderHidden && c != this.activeItem) {
  1162.                 c.hide();
  1163.             }
  1164.         }else if(c && !this.isValidParent(c, target)){
  1165.             if(this.extraCls){
  1166.                 c.addClass(this.extraCls);
  1167.             }
  1168.             if(typeof position == 'number'){
  1169.                 position = target.dom.childNodes[position];
  1170.             }
  1171.             target.dom.insertBefore(c.getEl().dom, position || null);
  1172.             if (this.renderHidden && c != this.activeItem) {
  1173.                 c.hide();
  1174.             }
  1175.         }
  1176.     },
  1177.         onResize: function(){
  1178.         if(this.container.collapsed){
  1179.             return;
  1180.         }
  1181.         var b = this.container.bufferResize;
  1182.         if(b){
  1183.             if(!this.resizeTask){
  1184.                 this.resizeTask = new Ext.util.DelayedTask(this.layout, this);
  1185.                 this.resizeBuffer = typeof b == 'number' ? b : 100;
  1186.             }
  1187.             this.resizeTask.delay(this.resizeBuffer);
  1188.         }else{
  1189.             this.layout();
  1190.         }
  1191.     },
  1192.         setContainer : function(ct){
  1193.         if(this.monitorResize && ct != this.container){
  1194.             if(this.container){
  1195.                 this.container.un('resize', this.onResize, this);
  1196.             }
  1197.             if(ct){
  1198.                 ct.on('resize', this.onResize, this);
  1199.             }
  1200.         }
  1201.         this.container = ct;
  1202.     },
  1203.         parseMargins : function(v){
  1204.         var ms = v.split(' ');
  1205.         var len = ms.length;
  1206.         if(len == 1){
  1207.             ms[1] = ms[0];
  1208.             ms[2] = ms[0];
  1209.             ms[3] = ms[0];
  1210.         }
  1211.         if(len == 2){
  1212.             ms[2] = ms[0];
  1213.             ms[3] = ms[1];
  1214.         }
  1215.         return {
  1216.             top:parseInt(ms[0], 10) || 0,
  1217.             right:parseInt(ms[1], 10) || 0,
  1218.             bottom:parseInt(ms[2], 10) || 0,
  1219.             left:parseInt(ms[3], 10) || 0
  1220.         };
  1221.     }
  1222. };
  1223. Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout;
  1224. Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {
  1225.     monitorResize:true,
  1226.     onLayout : function(ct, target){
  1227.         Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);
  1228.         if(!this.container.collapsed){
  1229.             this.setItemSize(this.activeItem || ct.items.itemAt(0), target.getStyleSize());
  1230.         }
  1231.     },
  1232.     setItemSize : function(item, size){
  1233.         if(item && size.height > 0){
  1234.             item.setSize(size);
  1235.         }
  1236.     }
  1237. });
  1238. Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;
  1239. Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {
  1240.     deferredRender : false,
  1241.     renderHidden : true,
  1242.     setActiveItem : function(item){
  1243.         item = this.container.getComponent(item);
  1244.         if(this.activeItem != item){
  1245.             if(this.activeItem){
  1246.                 this.activeItem.hide();
  1247.             }
  1248.             this.activeItem = item;
  1249.             item.show();
  1250.             this.layout();
  1251.         }
  1252.     },
  1253.     renderAll : function(ct, target){
  1254.         if(this.deferredRender){
  1255.             this.renderItem(this.activeItem, undefined, target);
  1256.         }else{
  1257.             Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);
  1258.         }
  1259.     }
  1260. });
  1261. Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;
  1262. Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {
  1263.     monitorResize:true,
  1264.     getAnchorViewSize : function(ct, target){
  1265.         return target.dom == document.body ?
  1266.                    target.getViewSize() : target.getStyleSize();
  1267.     },
  1268.     onLayout : function(ct, target){
  1269.         Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);
  1270.         var size = this.getAnchorViewSize(ct, target);
  1271.         var w = size.width, h = size.height;
  1272.         if(w < 20 || h < 20){
  1273.             return;
  1274.         }
  1275.         var aw, ah;
  1276.         if(ct.anchorSize){
  1277.             if(typeof ct.anchorSize == 'number'){
  1278.                 aw = ct.anchorSize;
  1279.             }else{
  1280.                 aw = ct.anchorSize.width;
  1281.                 ah = ct.anchorSize.height;
  1282.             }
  1283.         }else{
  1284.             aw = ct.initialConfig.width;
  1285.             ah = ct.initialConfig.height;
  1286.         }
  1287.         var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;
  1288.         for(i = 0; i < len; i++){
  1289.             c = cs[i];
  1290.             if(c.anchor){
  1291.                 a = c.anchorSpec;
  1292.                 if(!a){
  1293.                     var vs = c.anchor.split(' ');
  1294.                     c.anchorSpec = a = {
  1295.                         right: this.parseAnchor(vs[0], c.initialConfig.width, aw),
  1296.                         bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)
  1297.                     };
  1298.                 }
  1299.                 cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;
  1300.                 ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;
  1301.                 if(cw || ch){
  1302.                     c.setSize(cw || undefined, ch || undefined);
  1303.                 }
  1304.             }
  1305.         }
  1306.     },
  1307.     parseAnchor : function(a, start, cstart){
  1308.         if(a && a != 'none'){
  1309.             var last;
  1310.             if(/^(r|right|b|bottom)$/i.test(a)){
  1311.                 var diff = cstart - start;
  1312.                 return function(v){
  1313.                     if(v !== last){
  1314.                         last = v;
  1315.                         return v - diff;
  1316.                     }
  1317.                 }
  1318.             }else if(a.indexOf('%') != -1){
  1319.                 var ratio = parseFloat(a.replace('%', ''))*.01;
  1320.                 return function(v){
  1321.                     if(v !== last){
  1322.                         last = v;
  1323.                         return Math.floor(v*ratio);
  1324.                     }
  1325.                 }
  1326.             }else{
  1327.                 a = parseInt(a, 10);
  1328.                 if(!isNaN(a)){
  1329.                     return function(v){
  1330.                         if(v !== last){
  1331.                             last = v;
  1332.                             return v + a;
  1333.                         }
  1334.                     }
  1335.                 }
  1336.             }
  1337.         }
  1338.         return false;
  1339.     },
  1340.     adjustWidthAnchor : function(value, comp){
  1341.         return value;
  1342.     },
  1343.     adjustHeightAnchor : function(value, comp){
  1344.         return value;
  1345.     }
  1346. });
  1347. Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;
  1348. Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
  1349.     monitorResize:true,
  1350.     extraCls: 'x-column',
  1351.     scrollOffset : 0,
  1352.     isValidParent : function(c, target){
  1353.         return c.getEl().dom.parentNode == this.innerCt.dom;
  1354.     },
  1355.     onLayout : function(ct, target){
  1356.         var cs = ct.items.items, len = cs.length, c, i;
  1357.         if(!this.innerCt){
  1358.             target.addClass('x-column-layout-ct');
  1359.             this.innerCt = target.createChild({cls:'x-column-inner'});
  1360.             this.innerCt.createChild({cls:'x-clear'});
  1361.         }
  1362.         this.renderAll(ct, this.innerCt);
  1363.         var size = target.getViewSize();
  1364.         if(size.width < 1 && size.height < 1){
  1365.             return;
  1366.         }
  1367.         var w = size.width - target.getPadding('lr') - this.scrollOffset,
  1368.             h = size.height - target.getPadding('tb'),
  1369.             pw = w;
  1370.         this.innerCt.setWidth(w);
  1371.         for(i = 0; i < len; i++){
  1372.             c = cs[i];
  1373.             if(!c.columnWidth){
  1374.                 pw -= (c.getSize().width + c.getEl().getMargins('lr'));
  1375.             }
  1376.         }
  1377.         pw = pw < 0 ? 0 : pw;
  1378.         for(i = 0; i < len; i++){
  1379.             c = cs[i];
  1380.             if(c.columnWidth){
  1381.                 c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));
  1382.             }
  1383.         }
  1384.     }
  1385. });
  1386. Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;
  1387. Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {
  1388.         monitorResize:true,
  1389.         rendered : false,
  1390.         onLayout : function(ct, target){
  1391.         var collapsed;
  1392.         if(!this.rendered){
  1393.             target.position();
  1394.             target.addClass('x-border-layout-ct');
  1395.             var items = ct.items.items;
  1396.             collapsed = [];
  1397.             for(var i = 0, len = items.length; i < len; i++) {
  1398.                 var c = items[i];
  1399.                 var pos = c.region;
  1400.                 if(c.collapsed){
  1401.                     collapsed.push(c);
  1402.                 }
  1403.                 c.collapsed = false;
  1404.                 if(!c.rendered){
  1405.                     c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';
  1406.                     c.render(target, i);
  1407.                 }
  1408.                 this[pos] = pos != 'center' && c.split ?
  1409.                     new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
  1410.                     new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
  1411.                 this[pos].render(target, c);
  1412.             }
  1413.             this.rendered = true;
  1414.         }
  1415.         var size = target.getViewSize();
  1416.         if(size.width < 20 || size.height < 20){             if(collapsed){
  1417.                 this.restoreCollapsed = collapsed;
  1418.             }
  1419.             return;
  1420.         }else if(this.restoreCollapsed){
  1421.             collapsed = this.restoreCollapsed;
  1422.             delete this.restoreCollapsed;
  1423.         }
  1424.         var w = size.width, h = size.height;
  1425.         var centerW = w, centerH = h, centerY = 0, centerX = 0;
  1426.         var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
  1427.         if(!c){
  1428.             throw 'No center region defined in BorderLayout ' + ct.id;
  1429.         }
  1430.         if(n && n.isVisible()){
  1431.             var b = n.getSize();
  1432.             var m = n.getMargins();
  1433.             b.width = w - (m.left+m.right);
  1434.             b.x = m.left;
  1435.             b.y = m.top;
  1436.             centerY = b.height + b.y + m.bottom;
  1437.             centerH -= centerY;
  1438.             n.applyLayout(b);
  1439.         }
  1440.         if(s && s.isVisible()){
  1441.             var b = s.getSize();
  1442.             var m = s.getMargins();
  1443.             b.width = w - (m.left+m.right);
  1444.             b.x = m.left;
  1445.             var totalHeight = (b.height + m.top + m.bottom);
  1446.             b.y = h - totalHeight + m.top;
  1447.             centerH -= totalHeight;
  1448.             s.applyLayout(b);
  1449.         }
  1450.         if(west && west.isVisible()){
  1451.             var b = west.getSize();
  1452.             var m = west.getMargins();
  1453.             b.height = centerH - (m.top+m.bottom);
  1454.             b.x = m.left;
  1455.             b.y = centerY + m.top;
  1456.             var totalWidth = (b.width + m.left + m.right);
  1457.             centerX += totalWidth;
  1458.             centerW -= totalWidth;
  1459.             west.applyLayout(b);
  1460.         }
  1461.         if(e && e.isVisible()){
  1462.             var b = e.getSize();
  1463.             var m = e.getMargins();
  1464.             b.height = centerH - (m.top+m.bottom);
  1465.             var totalWidth = (b.width + m.left + m.right);
  1466.             b.x = w - totalWidth + m.left;
  1467.             b.y = centerY + m.top;
  1468.             centerW -= totalWidth;
  1469.             e.applyLayout(b);
  1470.         }
  1471.         var m = c.getMargins();
  1472.         var centerBox = {
  1473.             x: centerX + m.left,
  1474.             y: centerY + m.top,
  1475.             width: centerW - (m.left+m.right),
  1476.             height: centerH - (m.top+m.bottom)
  1477.         };
  1478.         c.applyLayout(centerBox);
  1479.         if(collapsed){
  1480.             for(var i = 0, len = collapsed.length; i < len; i++){
  1481.                 collapsed[i].collapse(false);
  1482.             }
  1483.         }
  1484.         if(Ext.isIE && Ext.isStrict){             target.repaint();
  1485.         }
  1486.     }
  1487. });
  1488. Ext.layout.BorderLayout.Region = function(layout, config, pos){
  1489.     Ext.apply(this, config);
  1490.     this.layout = layout;
  1491.     this.position = pos;
  1492.     this.state = {};
  1493.     if(typeof this.margins == 'string'){
  1494.         this.margins = this.layout.parseMargins(this.margins);
  1495.     }
  1496.     this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);
  1497.     if(this.collapsible){
  1498.         if(typeof this.cmargins == 'string'){
  1499.             this.cmargins = this.layout.parseMargins(this.cmargins);
  1500.         }
  1501.         if(this.collapseMode == 'mini' && !this.cmargins){
  1502.             this.cmargins = {left:0,top:0,right:0,bottom:0};
  1503.         }else{
  1504.             this.cmargins = Ext.applyIf(this.cmargins || {},
  1505.                 pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);
  1506.         }
  1507.     }
  1508. };
  1509. Ext.layout.BorderLayout.Region.prototype = {
  1510.     collapsible : false,
  1511.     split:false,
  1512.     floatable: true,
  1513.     minWidth:50,
  1514.     minHeight:50,
  1515.         defaultMargins : {left:0,top:0,right:0,bottom:0},
  1516.         defaultNSCMargins : {left:5,top:5,right:5,bottom:5},
  1517.         defaultEWCMargins : {left:5,top:0,right:5,bottom:0},
  1518.     isCollapsed : false,
  1519.         render : function(ct, p){
  1520.         this.panel = p;
  1521.         p.el.enableDisplayMode();
  1522.         this.targetEl = ct;
  1523.         this.el = p.el;
  1524.         var gs = p.getState, ps = this.position;
  1525.         p.getState = function(){
  1526.             return Ext.apply(gs.call(p) || {}, this.state);
  1527.         }.createDelegate(this);
  1528.         if(ps != 'center'){
  1529.             p.allowQueuedExpand = false;
  1530.             p.on({
  1531.                 beforecollapse: this.beforeCollapse,
  1532.                 collapse: this.onCollapse,
  1533.                 beforeexpand: this.beforeExpand,
  1534.                 expand: this.onExpand,
  1535.                 hide: this.onHide,
  1536.                 show: this.onShow,
  1537.                 scope: this
  1538.             });
  1539.             if(this.collapsible){
  1540.                 p.collapseEl = 'el';
  1541.                 p.slideAnchor = this.getSlideAnchor();
  1542.             }
  1543.             if(p.tools && p.tools.toggle){
  1544.                 p.tools.toggle.addClass('x-tool-collapse-'+ps);
  1545.                 p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');
  1546.             }
  1547.         }
  1548.     },
  1549.         getCollapsedEl : function(){
  1550.         if(!this.collapsedEl){
  1551.             if(!this.toolTemplate){
  1552.                 var tt = new Ext.Template(
  1553.                      '<div class="x-tool x-tool-{id}">&#160;</div>'
  1554.                 );
  1555.                 tt.disableFormats = true;
  1556.                 tt.compile();
  1557.                 Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;
  1558.             }
  1559.             this.collapsedEl = this.targetEl.createChild({
  1560.                 cls: "x-layout-collapsed x-layout-collapsed-"+this.position,
  1561.                 id: this.panel.id + '-xcollapsed'
  1562.             });
  1563.             this.collapsedEl.enableDisplayMode('block');
  1564.             if(this.collapseMode == 'mini'){
  1565.                 this.collapsedEl.addClass('x-layout-cmini-'+this.position);
  1566.                 this.miniCollapsedEl = this.collapsedEl.createChild({
  1567.                     cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"
  1568.                 });
  1569.                 this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');
  1570.                 this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
  1571.                 this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});
  1572.             }else {
  1573.                 var t = this.toolTemplate.append(
  1574.                         this.collapsedEl.dom,
  1575.                         {id:'expand-'+this.position}, true);
  1576.                 t.addClassOnOver('x-tool-expand-'+this.position+'-over');
  1577.                 t.on('click', this.onExpandClick, this, {stopEvent:true});
  1578.                 if(this.floatable !== false){
  1579.                    this.collapsedEl.addClassOnOver("x-layout-collapsed-over");
  1580.                    this.collapsedEl.on("click", this.collapseClick, this);
  1581.                 }
  1582.             }
  1583.         }
  1584.         return this.collapsedEl;
  1585.     },
  1586.         onExpandClick : function(e){
  1587.         if(this.isSlid){
  1588.             this.afterSlideIn();
  1589.             this.panel.expand(false);
  1590.         }else{
  1591.             this.panel.expand();
  1592.         }
  1593.     },
  1594.         onCollapseClick : function(e){
  1595.         this.panel.collapse();
  1596.     },
  1597.         beforeCollapse : function(p, animate){
  1598.         this.lastAnim = animate;
  1599.         if(this.splitEl){
  1600.             this.splitEl.hide();
  1601.         }
  1602.         this.getCollapsedEl().show();
  1603.         this.panel.el.setStyle('z-index', 100);
  1604.         this.isCollapsed = true;
  1605.         this.layout.layout();
  1606.     },
  1607.         onCollapse : function(animate){
  1608.         this.panel.el.setStyle('z-index', 1);
  1609.         if(this.lastAnim === false || this.panel.animCollapse === false){
  1610.             this.getCollapsedEl().dom.style.visibility = 'visible';
  1611.         }else{
  1612.             this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});
  1613.         }
  1614.         this.state.collapsed = true;
  1615.         this.panel.saveState();
  1616.     },
  1617.         beforeExpand : function(animate){
  1618.         var c = this.getCollapsedEl();
  1619.         this.el.show();
  1620.         if(this.position == 'east' || this.position == 'west'){
  1621.             this.panel.setSize(undefined, c.getHeight());
  1622.         }else{
  1623.             this.panel.setSize(c.getWidth(), undefined);
  1624.         }
  1625.         c.hide();
  1626.         c.dom.style.visibility = 'hidden';
  1627.         this.panel.el.setStyle('z-index', 100);
  1628.     },
  1629.         onExpand : function(){
  1630.         this.isCollapsed = false;
  1631.         if(this.splitEl){
  1632.             this.splitEl.show();
  1633.         }
  1634.         this.layout.layout();
  1635.         this.panel.el.setStyle('z-index', 1);
  1636.         this.state.collapsed = false;
  1637.         this.panel.saveState();
  1638.     },
  1639.         collapseClick : function(e){
  1640.         if(this.isSlid){
  1641.            e.stopPropagation();
  1642.            this.slideIn();
  1643.         }else{
  1644.            e.stopPropagation();
  1645.            this.slideOut();
  1646.         }
  1647.     },
  1648.         onHide : function(){
  1649.         if(this.isCollapsed){
  1650.             this.getCollapsedEl().hide();
  1651.         }else if(this.splitEl){
  1652.             this.splitEl.hide();
  1653.         }
  1654.     },
  1655.         onShow : function(){
  1656.         if(this.isCollapsed){
  1657.             this.getCollapsedEl().show();
  1658.         }else if(this.splitEl){
  1659.             this.splitEl.show();
  1660.         }
  1661.     },
  1662.     isVisible : function(){
  1663.         return !this.panel.hidden;
  1664.     },
  1665.     getMargins : function(){
  1666.         return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;
  1667.     },
  1668.     getSize : function(){
  1669.         return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();
  1670.     },
  1671.     setPanel : function(panel){
  1672.         this.panel = panel;
  1673.     },
  1674.     getMinWidth: function(){
  1675.         return this.minWidth;
  1676.     },
  1677.     getMinHeight: function(){
  1678.         return this.minHeight;
  1679.     },
  1680.         applyLayoutCollapsed : function(box){
  1681.         var ce = this.getCollapsedEl();
  1682.         ce.setLeftTop(box.x, box.y);
  1683.         ce.setSize(box.width, box.height);
  1684.     },
  1685.         applyLayout : function(box){
  1686.         if(this.isCollapsed){
  1687.             this.applyLayoutCollapsed(box);
  1688.         }else{
  1689.             this.panel.setPosition(box.x, box.y);
  1690.             this.panel.setSize(box.width, box.height);
  1691.         }
  1692.     },
  1693.         beforeSlide: function(){
  1694.         this.panel.beforeEffect();
  1695.     },
  1696.         afterSlide : function(){
  1697.         this.panel.afterEffect();
  1698.     },
  1699.         initAutoHide : function(){
  1700.         if(this.autoHide !== false){
  1701.             if(!this.autoHideHd){
  1702.                 var st = new Ext.util.DelayedTask(this.slideIn, this);
  1703.                 this.autoHideHd = {
  1704.                     "mouseout": function(e){
  1705.                         if(!e.within(this.el, true)){
  1706.                             st.delay(500);
  1707.                         }
  1708.                     },
  1709.                     "mouseover" : function(e){
  1710.                         st.cancel();
  1711.                     },
  1712.                     scope : this
  1713.                 };
  1714.             }
  1715.             this.el.on(this.autoHideHd);
  1716.         }
  1717.     },
  1718.         clearAutoHide : function(){
  1719.         if(this.autoHide !== false){
  1720.             this.el.un("mouseout", this.autoHideHd.mouseout);
  1721.             this.el.un("mouseover", this.autoHideHd.mouseover);
  1722.         }
  1723.     },
  1724.         clearMonitor : function(){
  1725.         Ext.getDoc().un("click", this.slideInIf, this);
  1726.     },
  1727.             slideOut : function(){
  1728.         if(this.isSlid || this.el.hasActiveFx()){
  1729.             return;
  1730.         }
  1731.         this.isSlid = true;
  1732.         var ts = this.panel.tools;
  1733.         if(ts && ts.toggle){
  1734.             ts.toggle.hide();
  1735.         }
  1736.         this.el.show();
  1737.         if(this.position == 'east' || this.position == 'west'){
  1738.             this.panel.setSize(undefined, this.collapsedEl.getHeight());
  1739.         }else{
  1740.             this.panel.setSize(this.collapsedEl.getWidth(), undefined);
  1741.         }
  1742.         this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];
  1743.         this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());
  1744.         this.el.setStyle("z-index", 102);
  1745.         if(this.animFloat !== false){
  1746.             this.beforeSlide();
  1747.             this.el.slideIn(this.getSlideAnchor(), {
  1748.                 callback: function(){
  1749.                     this.afterSlide();
  1750.                     this.initAutoHide();
  1751.                     Ext.getDoc().on("click", this.slideInIf, this);
  1752.                 },
  1753.                 scope: this,
  1754.                 block: true
  1755.             });
  1756.         }else{
  1757.             this.initAutoHide();
  1758.              Ext.getDoc().on("click", this.slideInIf, this);
  1759.         }
  1760.     },
  1761.         afterSlideIn : function(){
  1762.         this.clearAutoHide();
  1763.         this.isSlid = false;
  1764.         this.clearMonitor();
  1765.         this.el.setStyle("z-index", "");
  1766.         this.el.dom.style.left = this.restoreLT[0];
  1767.         this.el.dom.style.top = this.restoreLT[1];
  1768.         var ts = this.panel.tools;
  1769.         if(ts && ts.toggle){
  1770.             ts.toggle.show();
  1771.         }
  1772.     },
  1773.         slideIn : function(cb){
  1774.         if(!this.isSlid || this.el.hasActiveFx()){
  1775.             Ext.callback(cb);
  1776.             return;
  1777.         }
  1778.         this.isSlid = false;
  1779.         if(this.animFloat !== false){
  1780.             this.beforeSlide();
  1781.             this.el.slideOut(this.getSlideAnchor(), {
  1782.                 callback: function(){
  1783.                     this.el.hide();
  1784.                     this.afterSlide();
  1785.                     this.afterSlideIn();
  1786.                     Ext.callback(cb);
  1787.                 },
  1788.                 scope: this,
  1789.                 block: true
  1790.             });
  1791.         }else{
  1792.             this.el.hide();
  1793.             this.afterSlideIn();
  1794.         }
  1795.     },
  1796.         slideInIf : function(e){
  1797.         if(!e.within(this.el)){
  1798.             this.slideIn();
  1799.         }
  1800.     },
  1801.         anchors : {
  1802.         "west" : "left",
  1803.         "east" : "right",
  1804.         "north" : "top",
  1805.         "south" : "bottom"
  1806.     },
  1807.         sanchors : {
  1808.         "west" : "l",
  1809.         "east" : "r",
  1810.         "north" : "t",
  1811.         "south" : "b"
  1812.     },
  1813.         canchors : {
  1814.         "west" : "tl-tr",
  1815.         "east" : "tr-tl",
  1816.         "north" : "tl-bl",
  1817.         "south" : "bl-tl"
  1818.     },
  1819.         getAnchor : function(){
  1820.         return this.anchors[this.position];
  1821.     },
  1822.         getCollapseAnchor : function(){
  1823.         return this.canchors[this.position];
  1824.     },
  1825.         getSlideAnchor : function(){
  1826.         return this.sanchors[this.position];
  1827.     },
  1828.         getAlignAdj : function(){
  1829.         var cm = this.cmargins;
  1830.         switch(this.position){
  1831.             case "west":
  1832.                 return [0, 0];
  1833.             break;
  1834.             case "east":
  1835.                 return [0, 0];
  1836.             break;
  1837.             case "north":
  1838.                 return [0, 0];
  1839.             break;
  1840.             case "south":
  1841.                 return [0, 0];
  1842.             break;
  1843.         }
  1844.     },
  1845.         getExpandAdj : function(){
  1846.         var c = this.collapsedEl, cm = this.cmargins;
  1847.         switch(this.position){
  1848.             case "west":
  1849.                 return [-(cm.right+c.getWidth()+cm.left), 0];
  1850.             break;
  1851.             case "east":
  1852.                 return [cm.right+c.getWidth()+cm.left, 0];
  1853.             break;
  1854.             case "north":
  1855.                 return [0, -(cm.top+cm.bottom+c.getHeight())];
  1856.             break;
  1857.             case "south":
  1858.                 return [0, cm.top+cm.bottom+c.getHeight()];
  1859.             break;
  1860.         }
  1861.     }
  1862. };
  1863. Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){
  1864.     Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);
  1865.         this.applyLayout = this.applyFns[pos];
  1866. };
  1867. Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {
  1868.     splitTip : "Drag to resize.",
  1869.     collapsibleSplitTip : "Drag to resize. Double click to hide.",
  1870.     useSplitTips : false,
  1871.         splitSettings : {
  1872.         north : {
  1873.             orientation: Ext.SplitBar.VERTICAL,
  1874.             placement: Ext.SplitBar.TOP,
  1875.             maxFn : 'getVMaxSize',
  1876.             minProp: 'minHeight',
  1877.             maxProp: 'maxHeight'
  1878.         },
  1879.         south : {
  1880.             orientation: Ext.SplitBar.VERTICAL,
  1881.             placement: Ext.SplitBar.BOTTOM,
  1882.             maxFn : 'getVMaxSize',
  1883.             minProp: 'minHeight',
  1884.             maxProp: 'maxHeight'
  1885.         },
  1886.         east : {
  1887.             orientation: Ext.SplitBar.HORIZONTAL,
  1888.             placement: Ext.SplitBar.RIGHT,
  1889.             maxFn : 'getHMaxSize',
  1890.             minProp: 'minWidth',
  1891.             maxProp: 'maxWidth'
  1892.         },
  1893.         west : {
  1894.             orientation: Ext.SplitBar.HORIZONTAL,
  1895.             placement: Ext.SplitBar.LEFT,
  1896.             maxFn : 'getHMaxSize',
  1897.             minProp: 'minWidth',
  1898.             maxProp: 'maxWidth'
  1899.         }
  1900.     },
  1901.         applyFns : {
  1902.         west : function(box){
  1903.             if(this.isCollapsed){
  1904.                 return this.applyLayoutCollapsed(box);
  1905.             }
  1906.             var sd = this.splitEl.dom, s = sd.style;
  1907.             this.panel.setPosition(box.x, box.y);
  1908.             var sw = sd.offsetWidth;
  1909.             s.left = (box.x+box.width-sw)+'px';
  1910.             s.top = (box.y)+'px';
  1911.             s.height = Math.max(0, box.height)+'px';
  1912.             this.panel.setSize(box.width-sw, box.height);
  1913.         },
  1914.         east : function(box){
  1915.             if(this.isCollapsed){
  1916.                 return this.applyLayoutCollapsed(box);
  1917.             }
  1918.             var sd = this.splitEl.dom, s = sd.style;
  1919.             var sw = sd.offsetWidth;
  1920.             this.panel.setPosition(box.x+sw, box.y);
  1921.             s.left = (box.x)+'px';
  1922.             s.top = (box.y)+'px';
  1923.             s.height = Math.max(0, box.height)+'px';
  1924.             this.panel.setSize(box.width-sw, box.height);
  1925.         },
  1926.         north : function(box){
  1927.             if(this.isCollapsed){
  1928.                 return this.applyLayoutCollapsed(box);
  1929.             }
  1930.             var sd = this.splitEl.dom, s = sd.style;
  1931.             var sh = sd.offsetHeight;
  1932.             this.panel.setPosition(box.x, box.y);
  1933.             s.left = (box.x)+'px';
  1934.             s.top = (box.y+box.height-sh)+'px';
  1935.             s.width = Math.max(0, box.width)+'px';
  1936.             this.panel.setSize(box.width, box.height-sh);
  1937.         },
  1938.         south : function(box){
  1939.             if(this.isCollapsed){
  1940.                 return this.applyLayoutCollapsed(box);
  1941.             }
  1942.             var sd = this.splitEl.dom, s = sd.style;
  1943.             var sh = sd.offsetHeight;
  1944.             this.panel.setPosition(box.x, box.y+sh);
  1945.             s.left = (box.x)+'px';
  1946.             s.top = (box.y)+'px';
  1947.             s.width = Math.max(0, box.width)+'px';
  1948.             this.panel.setSize(box.width, box.height-sh);
  1949.         }
  1950.     },
  1951.         render : function(ct, p){
  1952.         Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);
  1953.         var ps = this.position;
  1954.         this.splitEl = ct.createChild({
  1955.             cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",
  1956.             id: this.panel.id + '-xsplit'
  1957.         });
  1958.         if(this.collapseMode == 'mini'){
  1959.             this.miniSplitEl = this.splitEl.createChild({
  1960.                 cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"
  1961.             });
  1962.             this.miniSplitEl.addClassOnOver('x-layout-mini-over');
  1963.             this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});
  1964.         }
  1965.         var s = this.splitSettings[ps];
  1966.         this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);
  1967.         this.split.placement = s.placement;
  1968.         this.split.getMaximumSize = this[s.maxFn].createDelegate(this);
  1969.         this.split.minSize = this.minSize || this[s.minProp];
  1970.         this.split.on("beforeapply", this.onSplitMove, this);
  1971.         this.split.useShim = this.useShim === true;
  1972.         this.maxSize = this.maxSize || this[s.maxProp];
  1973.         if(p.hidden){
  1974.             this.splitEl.hide();
  1975.         }
  1976.         if(this.useSplitTips){
  1977.             this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;
  1978.         }
  1979.         if(this.collapsible){
  1980.             this.splitEl.on("dblclick", this.onCollapseClick,  this);
  1981.         }
  1982.     },
  1983.         getSize : function(){
  1984.         if(this.isCollapsed){
  1985.             return this.collapsedEl.getSize();
  1986.         }
  1987.         var s = this.panel.getSize();
  1988.         if(this.position == 'north' || this.position == 'south'){
  1989.             s.height += this.splitEl.dom.offsetHeight;
  1990.         }else{
  1991.             s.width += this.splitEl.dom.offsetWidth;
  1992.         }
  1993.         return s;
  1994.     },
  1995.         getHMaxSize : function(){
  1996.          var cmax = this.maxSize || 10000;
  1997.          var center = this.layout.center;
  1998.          return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());
  1999.     },
  2000.         getVMaxSize : function(){
  2001.         var cmax = this.maxSize || 10000;
  2002.         var center = this.layout.center;
  2003.         return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());
  2004.     },
  2005.         onSplitMove : function(split, newSize){
  2006.         var s = this.panel.getSize();
  2007.         this.lastSplitSize = newSize;
  2008.         if(this.position == 'north' || this.position == 'south'){
  2009.             this.panel.setSize(s.width, newSize);
  2010.             this.state.height = newSize;
  2011.         }else{
  2012.             this.panel.setSize(newSize, s.height);
  2013.             this.state.width = newSize;
  2014.         }
  2015.         this.layout.layout();
  2016.         this.panel.saveState();
  2017.         return false;
  2018.     },
  2019.     getSplitBar : function(){
  2020.         return this.split;
  2021.     }
  2022. });
  2023. Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;
  2024. Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {
  2025.     labelSeparator : ':',
  2026.         getAnchorViewSize : function(ct, target){
  2027.         return ct.body.getStyleSize();
  2028.     },
  2029.         setContainer : function(ct){
  2030.         Ext.layout.FormLayout.superclass.setContainer.call(this, ct);
  2031.         if(ct.labelAlign){
  2032.             ct.addClass('x-form-label-'+ct.labelAlign);
  2033.         }
  2034.         if(ct.hideLabels){
  2035.             this.labelStyle = "display:none";
  2036.             this.elementStyle = "padding-left:0;";
  2037.             this.labelAdjust = 0;
  2038.         }else{
  2039.             this.labelSeparator = ct.labelSeparator || this.labelSeparator;
  2040.             ct.labelWidth = ct.labelWidth || 100;
  2041.             if(typeof ct.labelWidth == 'number'){
  2042.                 var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);
  2043.                 this.labelAdjust = ct.labelWidth+pad;
  2044.                 this.labelStyle = "width:"+ct.labelWidth+"px;";
  2045.                 this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';
  2046.             }
  2047.             if(ct.labelAlign == 'top'){
  2048.                 this.labelStyle = "width:auto;";
  2049.                 this.labelAdjust = 0;
  2050.                 this.elementStyle = "padding-left:0;";
  2051.             }
  2052.         }
  2053.         if(!this.fieldTpl){
  2054.                         var t = new Ext.Template(
  2055.                 '<div class="x-form-item {5}" tabIndex="-1">',
  2056.                     '<label for="{0}" style="{2}" class="x-form-item-label">{1}{4}</label>',
  2057.                     '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',
  2058.                     '</div><div class="{6}"></div>',
  2059.                 '</div>'
  2060.             );
  2061.             t.disableFormats = true;
  2062.             t.compile();
  2063.             Ext.layout.FormLayout.prototype.fieldTpl = t;
  2064.         }
  2065.     },
  2066.         renderItem : function(c, position, target){
  2067.         if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){
  2068.             var args = [
  2069.                    c.id, c.fieldLabel,
  2070.                    c.labelStyle||this.labelStyle||'',
  2071.                    this.elementStyle||'',
  2072.                    typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,
  2073.                    (c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''),
  2074.                    c.clearCls || 'x-form-clear-left'
  2075.             ];
  2076.             if(typeof position == 'number'){
  2077.                 position = target.dom.childNodes[position] || null;
  2078.             }
  2079.             if(position){
  2080.                 this.fieldTpl.insertBefore(position, args);
  2081.             }else{
  2082.                 this.fieldTpl.append(target, args);
  2083.             }
  2084.             c.render('x-form-el-'+c.id);
  2085.         }else {
  2086.             Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
  2087.         }
  2088.     },
  2089.         adjustWidthAnchor : function(value, comp){
  2090.         return value - (comp.isFormField  ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);
  2091.     },
  2092.         isValidParent : function(c, target){
  2093.         return true;
  2094.     }
  2095. });
  2096. Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;
  2097. Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {
  2098.     fill : true,
  2099.     autoWidth : true,
  2100.     titleCollapse : true,
  2101.     hideCollapseTool : false,
  2102.     collapseFirst : false,
  2103.     animate : false,
  2104.     sequence : false,
  2105.     activeOnTop : false,
  2106.     renderItem : function(c){
  2107.         if(this.animate === false){
  2108.             c.animCollapse = false;
  2109.         }
  2110.         c.collapsible = true;
  2111.         if(this.autoWidth){
  2112.             c.autoWidth = true;
  2113.         }
  2114.         if(this.titleCollapse){
  2115.             c.titleCollapse = true;
  2116.         }
  2117.         if(this.hideCollapseTool){
  2118.             c.hideCollapseTool = true;
  2119.         }
  2120.         if(this.collapseFirst !== undefined){
  2121.             c.collapseFirst = this.collapseFirst;
  2122.         }
  2123.         if(!this.activeItem && !c.collapsed){
  2124.             this.activeItem = c;
  2125.         }else if(this.activeItem){
  2126.             c.collapsed = true;
  2127.         }
  2128.         Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);
  2129.         c.header.addClass('x-accordion-hd');
  2130.         c.on('beforeexpand', this.beforeExpand, this);
  2131.     },
  2132.     beforeExpand : function(p, anim){
  2133.         var ai = this.activeItem;
  2134.         if(ai){
  2135.             if(this.sequence){
  2136.                 delete this.activeItem;
  2137.                 ai.collapse({callback:function(){
  2138.                     p.expand(anim || true);
  2139.                 }, scope: this});
  2140.                 return false;
  2141.             }else{
  2142.                 ai.collapse(this.animate);
  2143.             }
  2144.         }
  2145.         this.activeItem = p;
  2146.         if(this.activeOnTop){
  2147.             p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
  2148.         }
  2149.         this.layout();
  2150.     },
  2151.     setItemSize : function(item, size){
  2152.         if(this.fill && item){
  2153.             var items = this.container.items.items;
  2154.             var hh = 0;
  2155.             for(var i = 0, len = items.length; i < len; i++){
  2156.                 var p = items[i];
  2157.                 if(p != item){
  2158.                     hh += (p.getSize().height - p.bwrap.getHeight());
  2159.                 }
  2160.             }
  2161.             size.height -= hh;
  2162.             item.setSize(size);
  2163.         }
  2164.     }
  2165. });
  2166. Ext.Container.LAYOUTS['accordion'] = Ext.layout.Accordion;
  2167. Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
  2168.     monitorResize:false,
  2169.     setContainer : function(ct){
  2170.         Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
  2171.         this.currentRow = 0;
  2172.         this.currentColumn = 0;
  2173.         this.cells = [];
  2174.     },
  2175.     onLayout : function(ct, target){
  2176.         var cs = ct.items.items, len = cs.length, c, i;
  2177.         if(!this.table){
  2178.             target.addClass('x-table-layout-ct');
  2179.             this.table = target.createChild(
  2180.                 {tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, null, true);
  2181.             this.renderAll(ct, target);
  2182.         }
  2183.     },
  2184.     getRow : function(index){
  2185.         var row = this.table.tBodies[0].childNodes[index];
  2186.         if(!row){
  2187.             row = document.createElement('tr');
  2188.             this.table.tBodies[0].appendChild(row);
  2189.         }
  2190.         return row;
  2191.     },
  2192.     getNextCell : function(c){
  2193.         var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
  2194.         var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
  2195.         for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
  2196.             if(!this.cells[rowIndex]){
  2197.                 this.cells[rowIndex] = [];
  2198.             }
  2199.             for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
  2200.                 this.cells[rowIndex][colIndex] = true;
  2201.             }
  2202.         }
  2203.         var td = document.createElement('td');
  2204.         if(c.cellId){
  2205.             td.id = c.cellId;
  2206.         }
  2207.         var cls = 'x-table-layout-cell';
  2208.         if(c.cellCls){
  2209.             cls += ' ' + c.cellCls;
  2210.         }
  2211.         td.className = cls;
  2212.         if(c.colspan){
  2213.             td.colSpan = c.colspan;
  2214.         }
  2215.         if(c.rowspan){
  2216.             td.rowSpan = c.rowspan;
  2217.         }
  2218.         this.getRow(curRow).appendChild(td);
  2219.         return td;
  2220.     },
  2221.     getNextNonSpan: function(colIndex, rowIndex){
  2222.         var cols = this.columns;
  2223.         while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
  2224.             if(cols && colIndex >= cols){
  2225.                 rowIndex++;
  2226.                 colIndex = 0;
  2227.             }else{
  2228.                 colIndex++;
  2229.             }
  2230.         }
  2231.         return [colIndex, rowIndex];
  2232.     },
  2233.     renderItem : function(c, position, target){
  2234.         if(c && !c.rendered){
  2235.             c.render(this.getNextCell(c));
  2236.         }
  2237.     },
  2238.     isValidParent : function(c, target){
  2239.         return true;
  2240.     }
  2241. });
  2242. Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;
  2243. Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
  2244.     extraCls: 'x-abs-layout-item',
  2245.     isForm: false,
  2246.     setContainer : function(ct){
  2247.         Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, ct);
  2248.         if(ct.isXType('form')){
  2249.             this.isForm = true;
  2250.         }
  2251.     },
  2252.     onLayout : function(ct, target){
  2253.         if(this.isForm){ ct.body.position(); } else { target.position(); }
  2254.         Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
  2255.     },
  2256.     getAnchorViewSize : function(ct, target){
  2257.         return this.isForm ? ct.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, ct, target);
  2258.     },
  2259.     isValidParent : function(c, target){
  2260.         return this.isForm ? true : Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, c, target);
  2261.     },
  2262.     adjustWidthAnchor : function(value, comp){
  2263.         return value ? value - comp.getPosition(true)[0] : value;
  2264.     },
  2265.     adjustHeightAnchor : function(value, comp){
  2266.         return  value ? value - comp.getPosition(true)[1] : value;
  2267.     }
  2268. });
  2269. Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;
  2270. Ext.Viewport = Ext.extend(Ext.Container, {
  2271.     initComponent : function() {
  2272.         Ext.Viewport.superclass.initComponent.call(this);
  2273.         document.getElementsByTagName('html')[0].className += ' x-viewport';
  2274.         this.el = Ext.getBody();
  2275.         this.el.setHeight = Ext.emptyFn;
  2276.         this.el.setWidth = Ext.emptyFn;
  2277.         this.el.setSize = Ext.emptyFn;
  2278.         this.el.dom.scroll = 'no';
  2279.         this.allowDomMove = false;
  2280.         this.autoWidth = true;
  2281.         this.autoHeight = true;
  2282.         Ext.EventManager.onWindowResize(this.fireResize, this);
  2283.         this.renderTo = this.el;
  2284.     },
  2285.     fireResize : function(w, h){
  2286.         this.fireEvent('resize', this, w, h, w, h);
  2287.     }
  2288. });
  2289. Ext.reg('viewport', Ext.Viewport);
  2290. Ext.Panel = Ext.extend(Ext.Container, {
  2291.     baseCls : 'x-panel',
  2292.     collapsedCls : 'x-panel-collapsed',
  2293.     maskDisabled: true,
  2294.     animCollapse: Ext.enableFx,
  2295.     headerAsText: true,
  2296.     buttonAlign: 'right',
  2297.     collapsed : false,
  2298.     collapseFirst: true,
  2299.     minButtonWidth:75,
  2300.     elements : 'body',
  2301.                 toolTarget : 'header',
  2302.     collapseEl : 'bwrap',
  2303.     slideAnchor : 't',
  2304.         deferHeight: true,
  2305.         expandDefaults: {
  2306.         duration:.25
  2307.     },
  2308.         collapseDefaults: {
  2309.         duration:.25
  2310.     },
  2311.         initComponent : function(){
  2312.         Ext.Panel.superclass.initComponent.call(this);
  2313.         this.addEvents(
  2314.             'bodyresize',
  2315.             'titlechange',
  2316.             'collapse',
  2317.             'expand',
  2318.             'beforecollapse',
  2319.             'beforeexpand',
  2320.             'beforeclose',
  2321.             'close',
  2322.             'activate',
  2323.             'deactivate'
  2324.         );
  2325.                 if(this.tbar){
  2326.             this.elements += ',tbar';
  2327.             if(typeof this.tbar == 'object'){
  2328.                 this.topToolbar = this.tbar;
  2329.             }
  2330.             delete this.tbar;
  2331.         }
  2332.         if(this.bbar){
  2333.             this.elements += ',bbar';
  2334.             if(typeof this.bbar == 'object'){
  2335.                 this.bottomToolbar = this.bbar;
  2336.             }
  2337.             delete this.bbar;
  2338.         }
  2339.         if(this.header === true){
  2340.             this.elements += ',header';
  2341.             delete this.header;
  2342.         }else if(this.title && this.header !== false){
  2343.             this.elements += ',header';
  2344.         }
  2345.         if(this.footer === true){
  2346.             this.elements += ',footer';
  2347.             delete this.footer;
  2348.         }
  2349.         if(this.buttons){
  2350.             var btns = this.buttons;
  2351.             this.buttons = [];
  2352.             for(var i = 0, len = btns.length; i < len; i++) {
  2353.                 if(btns[i].render){                     this.buttons.push(btns[i]);
  2354.                 }else{
  2355.                     this.addButton(btns[i]);
  2356.                 }
  2357.             }
  2358.         }
  2359.         if(this.autoLoad){
  2360.             this.on('render', this.doAutoLoad, this, {delay:10});
  2361.         }
  2362.     },
  2363.         createElement : function(name, pnode){
  2364.         if(this[name]){
  2365.             pnode.appendChild(this[name].dom);
  2366.             return;
  2367.         }
  2368.         if(name === 'bwrap' || this.elements.indexOf(name) != -1){
  2369.             if(this[name+'Cfg']){
  2370.                 this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);
  2371.             }else{
  2372.                 var el = document.createElement('div');
  2373.                 el.className = this[name+'Cls'];
  2374.                 this[name] = Ext.get(pnode.appendChild(el));
  2375.             }
  2376.         }
  2377.     },
  2378.         onRender : function(ct, position){
  2379.         Ext.Panel.superclass.onRender.call(this, ct, position);
  2380.         this.createClasses();
  2381.         if(this.el){             this.el.addClass(this.baseCls);
  2382.             this.header = this.el.down('.'+this.headerCls);
  2383.             this.bwrap = this.el.down('.'+this.bwrapCls);
  2384.             var cp = this.bwrap ? this.bwrap : this.el;
  2385.             this.tbar = cp.down('.'+this.tbarCls);
  2386.             this.body = cp.down('.'+this.bodyCls);
  2387.             this.bbar = cp.down('.'+this.bbarCls);
  2388.             this.footer = cp.down('.'+this.footerCls);
  2389.             this.fromMarkup = true;
  2390.         }else{
  2391.             this.el = ct.createChild({
  2392.                 id: this.id,
  2393.                 cls: this.baseCls
  2394.             }, position);
  2395.         }
  2396.         var el = this.el, d = el.dom;
  2397.         if(this.cls){
  2398.             this.el.addClass(this.cls);
  2399.         }
  2400.         if(this.buttons){
  2401.             this.elements += ',footer';
  2402.         }
  2403.                 if(this.frame){
  2404.             el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));
  2405.             this.createElement('header', d.firstChild.firstChild.firstChild);
  2406.             this.createElement('bwrap', d);
  2407.                         var bw = this.bwrap.dom;
  2408.             var ml = d.childNodes[1], bl = d.childNodes[2];
  2409.             bw.appendChild(ml);
  2410.             bw.appendChild(bl);
  2411.             var mc = bw.firstChild.firstChild.firstChild;
  2412.             this.createElement('tbar', mc);
  2413.             this.createElement('body', mc);
  2414.             this.createElement('bbar', mc);
  2415.             this.createElement('footer', bw.lastChild.firstChild.firstChild);
  2416.             if(!this.footer){
  2417.                 this.bwrap.dom.lastChild.className += ' x-panel-nofooter';
  2418.             }
  2419.         }else{
  2420.             this.createElement('header', d);
  2421.             this.createElement('bwrap', d);
  2422.                         var bw = this.bwrap.dom;
  2423.             this.createElement('tbar', bw);
  2424.             this.createElement('body', bw);
  2425.             this.createElement('bbar', bw);
  2426.             this.createElement('footer', bw);
  2427.             if(!this.header){
  2428.                 this.body.addClass(this.bodyCls + '-noheader');
  2429.                 if(this.tbar){
  2430.                     this.tbar.addClass(this.tbarCls + '-noheader');
  2431.                 }
  2432.             }
  2433.         }
  2434.         if(this.border === false){
  2435.             this.el.addClass(this.baseCls + '-noborder');
  2436.             this.body.addClass(this.bodyCls + '-noborder');
  2437.             if(this.header){
  2438.                 this.header.addClass(this.headerCls + '-noborder');
  2439.             }
  2440.             if(this.footer){
  2441.                 this.footer.addClass(this.footerCls + '-noborder');
  2442.             }
  2443.             if(this.tbar){
  2444.                 this.tbar.addClass(this.tbarCls + '-noborder');
  2445.             }
  2446.             if(this.bbar){
  2447.                 this.bbar.addClass(this.bbarCls + '-noborder');
  2448.             }
  2449.         }
  2450.         if(this.bodyBorder === false){
  2451.            this.body.addClass(this.bodyCls + '-noborder');
  2452.         }
  2453.         if(this.bodyStyle){
  2454.            this.body.applyStyles(this.bodyStyle);
  2455.         }
  2456.         this.bwrap.enableDisplayMode('block');
  2457.         if(this.header){
  2458.             this.header.unselectable();
  2459.                         if(this.headerAsText){
  2460.                 this.header.dom.innerHTML =
  2461.                     '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';
  2462.                 if(this.iconCls){
  2463.                     this.setIconClass(this.iconCls);
  2464.                 }
  2465.             }
  2466.         }
  2467.         if(this.floating){
  2468.             this.makeFloating(this.floating);
  2469.         }
  2470.         if(this.collapsible){
  2471.             this.tools = this.tools ? this.tools.slice(0) : [];
  2472.             if(!this.hideCollapseTool){
  2473.                 this.tools[this.collapseFirst?'unshift':'push']({
  2474.                     id: 'toggle',
  2475.                     handler : this.toggleCollapse,
  2476.                     scope: this
  2477.                 });
  2478.             }
  2479.             if(this.titleCollapse && this.header){
  2480.                 this.header.on('click', this.toggleCollapse, this);
  2481.                 this.header.setStyle('cursor', 'pointer');
  2482.             }
  2483.         }
  2484.         if(this.tools){
  2485.             var ts = this.tools;
  2486.             this.tools = {};
  2487.             this.addTool.apply(this, ts);
  2488.         }else{
  2489.             this.tools = {};
  2490.         }
  2491.         if(this.buttons && this.buttons.length > 0){
  2492.                         var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: {
  2493.                 cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,
  2494.                 html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'
  2495.             }}, null, true);
  2496.             var tr = tb.getElementsByTagName('tr')[0];
  2497.             for(var i = 0, len = this.buttons.length; i < len; i++) {
  2498.                 var b = this.buttons[i];
  2499.                 var td = document.createElement('td');
  2500.                 td.className = 'x-panel-btn-td';
  2501.                 b.render(tr.appendChild(td));
  2502.             }
  2503.         }
  2504.         if(this.tbar && this.topToolbar){
  2505.             if(Ext.isArray(this.topToolbar)){
  2506.                 this.topToolbar = new Ext.Toolbar(this.topToolbar);
  2507.             }
  2508.             this.topToolbar.render(this.tbar);
  2509.         }
  2510.         if(this.bbar && this.bottomToolbar){
  2511.             if(Ext.isArray(this.bottomToolbar)){
  2512.                 this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);
  2513.             }
  2514.             this.bottomToolbar.render(this.bbar);
  2515.         }
  2516.     },
  2517.     setIconClass : function(cls){
  2518.         var old = this.iconCls;
  2519.         this.iconCls = cls;
  2520.         if(this.rendered && this.header){
  2521.             if(this.frame){
  2522.                 this.header.addClass('x-panel-icon');
  2523.                 this.header.replaceClass(old, this.iconCls);
  2524.             }else{
  2525.                 var hd = this.header.dom;
  2526.                 var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null;
  2527.                 if(img){
  2528.                     Ext.fly(img).replaceClass(old, this.iconCls);
  2529.                 }else{
  2530.                     Ext.DomHelper.insertBefore(hd.firstChild, {
  2531.                         tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls
  2532.                     });
  2533.                  }
  2534.             }
  2535.         }
  2536.     },
  2537.         makeFloating : function(cfg){
  2538.         this.floating = true;
  2539.         this.el = new Ext.Layer(
  2540.             typeof cfg == 'object' ? cfg : {
  2541.                 shadow: this.shadow !== undefined ? this.shadow : 'sides',
  2542.                 shadowOffset: this.shadowOffset,
  2543.                 constrain:false,
  2544.                 shim: this.shim === false ? false : undefined
  2545.             }, this.el
  2546.         );
  2547.     },
  2548.     getTopToolbar : function(){
  2549.         return this.topToolbar;
  2550.     },
  2551.     getBottomToolbar : function(){
  2552.         return this.bottomToolbar;
  2553.     },
  2554.     addButton : function(config, handler, scope){
  2555.         var bc = {
  2556.             handler: handler,
  2557.             scope: scope,
  2558.             minWidth: this.minButtonWidth,
  2559.             hideParent:true
  2560.         };
  2561.         if(typeof config == "string"){
  2562.             bc.text = config;
  2563.         }else{
  2564.             Ext.apply(bc, config);
  2565.         }
  2566.         var btn = new Ext.Button(bc);
  2567.         btn.ownerCt = this;
  2568.         if(!this.buttons){
  2569.             this.buttons = [];
  2570.         }
  2571.         this.buttons.push(btn);
  2572.         return btn;
  2573.     },
  2574.         addTool : function(){
  2575.         if(!this[this.toolTarget]) {             return;
  2576.         }
  2577.         if(!this.toolTemplate){
  2578.                         var tt = new Ext.Template(
  2579.                  '<div class="x-tool x-tool-{id}">&#160;</div>'
  2580.             );
  2581.             tt.disableFormats = true;
  2582.             tt.compile();
  2583.             Ext.Panel.prototype.toolTemplate = tt;
  2584.         }
  2585.         for(var i = 0, a = arguments, len = a.length; i < len; i++) {
  2586.             var tc = a[i], overCls = 'x-tool-'+tc.id+'-over';
  2587.             var t = this.toolTemplate.insertFirst(this[this.toolTarget], tc, true);
  2588.             this.tools[tc.id] = t;
  2589.             t.enableDisplayMode('block');
  2590.             t.on('click', this.createToolHandler(t, tc, overCls, this));
  2591.             if(tc.on){
  2592.                 t.on(tc.on);
  2593.             }
  2594.             if(tc.hidden){
  2595.                 t.hide();
  2596.             }
  2597.             if(tc.qtip){
  2598.                 if(typeof tc.qtip == 'object'){
  2599.                     Ext.QuickTips.register(Ext.apply({
  2600.                           target: t.id
  2601.                     }, tc.qtip));
  2602.                 } else {
  2603.                     t.dom.qtip = tc.qtip;
  2604.                 }
  2605.             }
  2606.             t.addClassOnOver(overCls);
  2607.         }
  2608.     },
  2609.         onShow : function(){
  2610.         if(this.floating){
  2611.             return this.el.show();
  2612.         }
  2613.         Ext.Panel.superclass.onShow.call(this);
  2614.     },
  2615.         onHide : function(){
  2616.         if(this.floating){
  2617.             return this.el.hide();
  2618.         }
  2619.         Ext.Panel.superclass.onHide.call(this);
  2620.     },
  2621.         createToolHandler : function(t, tc, overCls, panel){
  2622.         return function(e){
  2623.             t.removeClass(overCls);
  2624.             e.stopEvent();
  2625.             if(tc.handler){
  2626.                 tc.handler.call(tc.scope || t, e, t, panel);
  2627.             }
  2628.         };
  2629.     },
  2630.         afterRender : function(){
  2631.         if(this.fromMarkup && this.height === undefined && !this.autoHeight){
  2632.             this.height = this.el.getHeight();
  2633.         }
  2634.         if(this.floating && !this.hidden && !this.initHidden){
  2635.             this.el.show();
  2636.         }
  2637.         if(this.title){
  2638.             this.setTitle(this.title);
  2639.         }
  2640.         this.setAutoScroll();
  2641.         if(this.html){
  2642.             this.body.update(typeof this.html == 'object' ?
  2643.                              Ext.DomHelper.markup(this.html) :
  2644.                              this.html);
  2645.             delete this.html;
  2646.         }
  2647.         if(this.contentEl){
  2648.             var ce = Ext.getDom(this.contentEl);
  2649.             Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);
  2650.             this.body.dom.appendChild(ce);
  2651.         }
  2652.         if(this.collapsed){
  2653.             this.collapsed = false;
  2654.             this.collapse(false);
  2655.         }
  2656.         Ext.Panel.superclass.afterRender.call(this);         this.initEvents();
  2657.     },
  2658.         setAutoScroll : function(){
  2659.         if(this.rendered && this.autoScroll){
  2660.             this.body.setOverflow('auto');
  2661.         }
  2662.     },
  2663.         getKeyMap : function(){
  2664.         if(!this.keyMap){
  2665.             this.keyMap = new Ext.KeyMap(this.el, this.keys);
  2666.         }
  2667.         return this.keyMap;
  2668.     },
  2669.         initEvents : function(){
  2670.         if(this.keys){
  2671.             this.getKeyMap();
  2672.         }
  2673.         if(this.draggable){
  2674.             this.initDraggable();
  2675.         }
  2676.     },
  2677.         initDraggable : function(){
  2678.         this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);
  2679.     },
  2680.         beforeEffect : function(){
  2681.         if(this.floating){
  2682.             this.el.beforeAction();
  2683.         }
  2684.         this.el.addClass('x-panel-animated');
  2685.     },
  2686.         afterEffect : function(){
  2687.         this.syncShadow();
  2688.         this.el.removeClass('x-panel-animated');
  2689.     },
  2690.         createEffect : function(a, cb, scope){
  2691.         var o = {
  2692.             scope:scope,
  2693.             block:true
  2694.         };
  2695.         if(a === true){
  2696.             o.callback = cb;
  2697.             return o;
  2698.         }else if(!a.callback){
  2699.             o.callback = cb;
  2700.         }else {             o.callback = function(){
  2701.                 cb.call(scope);
  2702.                 Ext.callback(a.callback, a.scope);
  2703.             };
  2704.         }
  2705.         return Ext.applyIf(o, a);
  2706.     },
  2707.     collapse : function(animate){
  2708.         if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){
  2709.             return;
  2710.         }
  2711.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  2712.         this.beforeEffect();
  2713.         this.onCollapse(doAnim, animate);
  2714.         return this;
  2715.     },
  2716.         onCollapse : function(doAnim, animArg){
  2717.         if(doAnim){
  2718.             this[this.collapseEl].slideOut(this.slideAnchor,
  2719.                     Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),
  2720.                         this.collapseDefaults));
  2721.         }else{
  2722.             this[this.collapseEl].hide();
  2723.             this.afterCollapse();
  2724.         }
  2725.     },
  2726.         afterCollapse : function(){
  2727.         this.collapsed = true;
  2728.         this.el.addClass(this.collapsedCls);
  2729.         this.afterEffect();
  2730.         this.fireEvent('collapse', this);
  2731.     },
  2732.     expand : function(animate){
  2733.         if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){
  2734.             return;
  2735.         }
  2736.         var doAnim = animate === true || (animate !== false && this.animCollapse);
  2737.         this.el.removeClass(this.collapsedCls);
  2738.         this.beforeEffect();
  2739.         this.onExpand(doAnim, animate);
  2740.         return this;
  2741.     },
  2742.         onExpand : function(doAnim, animArg){
  2743.         if(doAnim){
  2744.             this[this.collapseEl].slideIn(this.slideAnchor,
  2745.                     Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),
  2746.                         this.expandDefaults));
  2747.         }else{
  2748.             this[this.collapseEl].show();
  2749.             this.afterExpand();
  2750.         }
  2751.     },
  2752.         afterExpand : function(){
  2753.         this.collapsed = false;
  2754.         this.afterEffect();
  2755.         this.fireEvent('expand', this);
  2756.     },
  2757.     toggleCollapse : function(animate){
  2758.         this[this.collapsed ? 'expand' : 'collapse'](animate);
  2759.         return this;
  2760.     },
  2761.         onDisable : function(){
  2762.         if(this.rendered && this.maskDisabled){
  2763.             this.el.mask();
  2764.         }
  2765.         Ext.Panel.superclass.onDisable.call(this);
  2766.     },
  2767.         onEnable : function(){
  2768.         if(this.rendered && this.maskDisabled){
  2769.             this.el.unmask();
  2770.         }
  2771.         Ext.Panel.superclass.onEnable.call(this);
  2772.     },
  2773.         onResize : function(w, h){
  2774.         if(w !== undefined || h !== undefined){
  2775.             if(!this.collapsed){
  2776.                 if(typeof w == 'number'){
  2777.                     this.body.setWidth(
  2778.                             this.adjustBodyWidth(w - this.getFrameWidth()));
  2779.                 }else if(w == 'auto'){
  2780.                     this.body.setWidth(w);
  2781.                 }
  2782.                 if(typeof h == 'number'){
  2783.                     this.body.setHeight(
  2784.                             this.adjustBodyHeight(h - this.getFrameHeight()));
  2785.                 }else if(h == 'auto'){
  2786.                     this.body.setHeight(h);
  2787.                 }
  2788.             }else{
  2789.                 this.queuedBodySize = {width: w, height: h};
  2790.                 if(!this.queuedExpand && this.allowQueuedExpand !== false){
  2791.                     this.queuedExpand = true;
  2792.                     this.on('expand', function(){
  2793.                         delete this.queuedExpand;
  2794.                         this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);
  2795.                         this.doLayout();
  2796.                     }, this, {single:true});
  2797.                 }
  2798.             }
  2799.             this.fireEvent('bodyresize', this, w, h);
  2800.         }
  2801.         this.syncShadow();
  2802.     },
  2803.         adjustBodyHeight : function(h){
  2804.         return h;
  2805.     },
  2806.         adjustBodyWidth : function(w){
  2807.         return w;
  2808.     },
  2809.         onPosition : function(){
  2810.         this.syncShadow();
  2811.     },
  2812.         onDestroy : function(){
  2813.         if(this.tools){
  2814.             for(var k in this.tools){
  2815.                 Ext.destroy(this.tools[k]);
  2816.             }
  2817.         }
  2818.         if(this.buttons){
  2819.             for(var b in this.buttons){
  2820.                 Ext.destroy(this.buttons[b]);
  2821.             }
  2822.         }
  2823.         Ext.destroy(
  2824.             this.topToolbar,
  2825.             this.bottomToolbar
  2826.         );
  2827.         Ext.Panel.superclass.onDestroy.call(this);
  2828.     },
  2829.     getFrameWidth : function(){
  2830.         var w = this.el.getFrameWidth('lr');
  2831.         if(this.frame){
  2832.             var l = this.bwrap.dom.firstChild;
  2833.             w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));
  2834.             var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
  2835.             w += Ext.fly(mc).getFrameWidth('lr');
  2836.         }
  2837.         return w;
  2838.     },
  2839.     getFrameHeight : function(){
  2840.         var h  = this.el.getFrameWidth('tb');
  2841.         h += (this.tbar ? this.tbar.getHeight() : 0) +
  2842.              (this.bbar ? this.bbar.getHeight() : 0);
  2843.         if(this.frame){
  2844.             var hd = this.el.dom.firstChild;
  2845.             var ft = this.bwrap.dom.lastChild;
  2846.             h += (hd.offsetHeight + ft.offsetHeight);
  2847.             var mc = this.bwrap.dom.firstChild.firstChild.firstChild;
  2848.             h += Ext.fly(mc).getFrameWidth('tb');
  2849.         }else{
  2850.             h += (this.header ? this.header.getHeight() : 0) +
  2851.                 (this.footer ? this.footer.getHeight() : 0);
  2852.         }
  2853.         return h;
  2854.     },
  2855.     getInnerWidth : function(){
  2856.         return this.getSize().width - this.getFrameWidth();
  2857.     },
  2858.     getInnerHeight : function(){
  2859.         return this.getSize().height - this.getFrameHeight();
  2860.     },
  2861.         syncShadow : function(){
  2862.         if(this.floating){
  2863.             this.el.sync(true);
  2864.         }
  2865.     },
  2866.         getLayoutTarget : function(){
  2867.         return this.body;
  2868.     },
  2869.     setTitle : function(title, iconCls){
  2870.         this.title = title;
  2871.         if(this.header && this.headerAsText){
  2872.             this.header.child('span').update(title);
  2873.         }
  2874.         if(iconCls){
  2875.             this.setIconClass(iconCls);
  2876.         }
  2877.         this.fireEvent('titlechange', this, title);
  2878.         return this;
  2879.     },
  2880.     getUpdater : function(){
  2881.         return this.body.getUpdater();
  2882.     },
  2883.     load : function(){
  2884.         var um = this.body.getUpdater();
  2885.         um.update.apply(um, arguments);
  2886.         return this;
  2887.     },
  2888.         beforeDestroy : function(){
  2889.         Ext.Element.uncache(
  2890.             this.header,
  2891.             this.tbar,
  2892.             this.bbar,
  2893.             this.footer,
  2894.             this.body
  2895.         );
  2896.     },
  2897.         createClasses : function(){
  2898.         this.headerCls = this.baseCls + '-header';
  2899.         this.headerTextCls = this.baseCls + '-header-text';
  2900.         this.bwrapCls = this.baseCls + '-bwrap';
  2901.         this.tbarCls = this.baseCls + '-tbar';
  2902.         this.bodyCls = this.baseCls + '-body';
  2903.         this.bbarCls = this.baseCls + '-bbar';
  2904.         this.footerCls = this.baseCls + '-footer';
  2905.     },
  2906.         createGhost : function(cls, useShim, appendTo){
  2907.         var el = document.createElement('div');
  2908.         el.className = 'x-panel-ghost ' + (cls ? cls : '');
  2909.         if(this.header){
  2910.             el.appendChild(this.el.dom.firstChild.cloneNode(true));
  2911.         }
  2912.         Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());
  2913.         el.style.width = this.el.dom.offsetWidth + 'px';;
  2914.         if(!appendTo){
  2915.             this.container.dom.appendChild(el);
  2916.         }else{
  2917.             Ext.getDom(appendTo).appendChild(el);
  2918.         }
  2919.         if(useShim !== false && this.el.useShim !== false){
  2920.             var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);
  2921.             layer.show();
  2922.             return layer;
  2923.         }else{
  2924.             return new Ext.Element(el);
  2925.         }
  2926.     },
  2927.         doAutoLoad : function(){
  2928.         this.body.load(
  2929.             typeof this.autoLoad == 'object' ?
  2930.                 this.autoLoad : {url: this.autoLoad});
  2931.     }
  2932. });
  2933. Ext.reg('panel', Ext.Panel);
  2934. Ext.Window = Ext.extend(Ext.Panel, {
  2935.     baseCls : 'x-window',
  2936.     resizable:true,
  2937.     draggable:true,
  2938.     closable : true,
  2939.     constrain:false,
  2940.     constrainHeader:false,
  2941.     plain:false,
  2942.     minimizable : false,
  2943.     maximizable : false,
  2944.     minHeight: 100,
  2945.     minWidth: 200,
  2946.     expandOnShow: true,
  2947.     closeAction: 'close',
  2948.         collapsible:false,
  2949.         initHidden : true,
  2950.     monitorResize : true,
  2951.     elements: 'header,body',
  2952.     frame:true,
  2953.     floating:true,
  2954.         initComponent : function(){
  2955.         Ext.Window.superclass.initComponent.call(this);
  2956.         this.addEvents(
  2957.             'resize',
  2958.             'maximize',
  2959.             'minimize',
  2960.             'restore'
  2961.         );
  2962.     },
  2963.         getState : function(){
  2964.         return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox());
  2965.     },
  2966.         onRender : function(ct, position){
  2967.         Ext.Window.superclass.onRender.call(this, ct, position);
  2968.         if(this.plain){
  2969.             this.el.addClass('x-window-plain');
  2970.         }
  2971.                 this.focusEl = this.el.createChild({
  2972.                     tag: "a", href:"#", cls:"x-dlg-focus",
  2973.                     tabIndex:"-1", html: "&#160;"});
  2974.         this.focusEl.swallowEvent('click', true);
  2975.         this.proxy = this.el.createProxy("x-window-proxy");
  2976.         this.proxy.enableDisplayMode('block');
  2977.         if(this.modal){
  2978.             this.mask = this.container.createChild({cls:"ext-el-mask"}, this.el.dom);
  2979.             this.mask.enableDisplayMode("block");
  2980.             this.mask.hide();
  2981.         }
  2982.     },
  2983.         initEvents : function(){
  2984.         Ext.Window.superclass.initEvents.call(this);
  2985.         if(this.animateTarget){
  2986.             this.setAnimateTarget(this.animateTarget);
  2987.         }
  2988.         if(this.resizable){
  2989.             this.resizer = new Ext.Resizable(this.el, {
  2990.                 minWidth: this.minWidth,
  2991.                 minHeight:this.minHeight,
  2992.                 handles: this.resizeHandles || "all",
  2993.                 pinned: true,
  2994.                 resizeElement : this.resizerAction
  2995.             });
  2996.             this.resizer.window = this;
  2997.             this.resizer.on("beforeresize", this.beforeResize, this);
  2998.         }
  2999.         if(this.draggable){
  3000.             this.header.addClass("x-window-draggable");
  3001.         }
  3002.         this.initTools();
  3003.         this.el.on("mousedown", this.toFront, this);
  3004.         this.manager = this.manager || Ext.WindowMgr;
  3005.         this.manager.register(this);
  3006.         this.hidden = true;
  3007.         if(this.maximized){
  3008.             this.maximized = false;
  3009.             this.maximize();
  3010.         }
  3011.         if(this.closable){
  3012.             var km = this.getKeyMap();
  3013.             km.on(27, this.onEsc, this);
  3014.             km.disable();
  3015.         }
  3016.     },
  3017.     initDraggable : function(){
  3018.         this.dd = new Ext.Window.DD(this);
  3019.     },
  3020.        onEsc : function(){
  3021.         this[this.closeAction]();
  3022.     },
  3023.         beforeDestroy : function(){
  3024.         Ext.destroy(
  3025.             this.resizer,
  3026.             this.dd,
  3027.             this.proxy,
  3028.             this.mask
  3029.         );
  3030.         Ext.Window.superclass.beforeDestroy.call(this);
  3031.     },
  3032.         onDestroy : function(){
  3033.         if(this.manager){
  3034.             this.manager.unregister(this);
  3035.         }
  3036.         Ext.Window.superclass.onDestroy.call(this);
  3037.     },
  3038.         initTools : function(){
  3039.         if(this.minimizable){
  3040.             this.addTool({
  3041.                 id: 'minimize',
  3042.                 handler: this.minimize.createDelegate(this, [])
  3043.             });
  3044.         }
  3045.         if(this.maximizable){
  3046.             this.addTool({
  3047.                 id: 'maximize',
  3048.                 handler: this.maximize.createDelegate(this, [])
  3049.             });
  3050.             this.addTool({
  3051.                 id: 'restore',
  3052.                 handler: this.restore.createDelegate(this, []),
  3053.                 hidden:true
  3054.             });
  3055.             this.header.on('dblclick', this.toggleMaximize, this);
  3056.         }
  3057.         if(this.closable){
  3058.             this.addTool({
  3059.                 id: 'close',
  3060.                 handler: this[this.closeAction].createDelegate(this, [])
  3061.             });
  3062.         }
  3063.     },
  3064.         resizerAction : function(){
  3065.         var box = this.proxy.getBox();
  3066.         this.proxy.hide();
  3067.         this.window.handleResize(box);
  3068.         return box;
  3069.     },
  3070.         beforeResize : function(){
  3071.         this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40);         this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);
  3072.         this.resizeBox = this.el.getBox();
  3073.     },
  3074.         updateHandles : function(){
  3075.         if(Ext.isIE && this.resizer){
  3076.             this.resizer.syncHandleHeight();
  3077.             this.el.repaint();
  3078.         }
  3079.     },
  3080.         handleResize : function(box){
  3081.         var rz = this.resizeBox;
  3082.         if(rz.x != box.x || rz.y != box.y){
  3083.             this.updateBox(box);
  3084.         }else{
  3085.             this.setSize(box);
  3086.         }
  3087.         this.focus();
  3088.         this.updateHandles();
  3089.         this.saveState();
  3090.         this.fireEvent("resize", this, box.width, box.height);
  3091.     },
  3092.     focus : function(){
  3093.         var f = this.focusEl, db = this.defaultButton, t = typeof db;
  3094.         if(t != 'undefined'){
  3095.             if(t == 'number'){
  3096.                 f = this.buttons[db];
  3097.             }else if(t == 'string'){
  3098.                 f = Ext.getCmp(db);
  3099.             }else{
  3100.                 f = db;
  3101.             }
  3102.         }
  3103.         f.focus.defer(10, f);
  3104.     },
  3105.     setAnimateTarget : function(el){
  3106.         el = Ext.get(el);
  3107.         this.animateTarget = el;
  3108.     },
  3109.         beforeShow : function(){
  3110.         delete this.el.lastXY;
  3111.         delete this.el.lastLT;
  3112.         if(this.x === undefined || this.y === undefined){
  3113.             var xy = this.el.getAlignToXY(this.container, 'c-c');
  3114.             var pos = this.el.translatePoints(xy[0], xy[1]);
  3115.             this.x = this.x === undefined? pos.left : this.x;
  3116.             this.y = this.y === undefined? pos.top : this.y;
  3117.         }
  3118.         this.el.setLeftTop(this.x, this.y);
  3119.         if(this.expandOnShow){
  3120.             this.expand(false);
  3121.         }
  3122.         if(this.modal){
  3123.             Ext.getBody().addClass("x-body-masked");
  3124.             this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  3125.             this.mask.show();
  3126.         }
  3127.     },
  3128.     show : function(animateTarget, cb, scope){
  3129.         if(!this.rendered){
  3130.             this.render(Ext.getBody());
  3131.         }
  3132.         if(this.hidden === false){
  3133.             this.toFront();
  3134.             return;
  3135.         }
  3136.         if(this.fireEvent("beforeshow", this) === false){
  3137.             return;
  3138.         }
  3139.         if(cb){
  3140.             this.on('show', cb, scope, {single:true});
  3141.         }
  3142.         this.hidden = false;
  3143.         if(animateTarget !== undefined){
  3144.             this.setAnimateTarget(animateTarget);
  3145.         }
  3146.         this.beforeShow();
  3147.         if(this.animateTarget){
  3148.             this.animShow();
  3149.         }else{
  3150.             this.afterShow();
  3151.         }
  3152.     },
  3153.         afterShow : function(){
  3154.         this.proxy.hide();
  3155.         this.el.setStyle('display', 'block');
  3156.         this.el.show();
  3157.         if(this.maximized){
  3158.             this.fitContainer();
  3159.         }
  3160.         if(Ext.isMac && Ext.isGecko){           this.cascade(this.setAutoScroll);
  3161.         }
  3162.         if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
  3163.             Ext.EventManager.onWindowResize(this.onWindowResize, this);
  3164.         }
  3165.         this.doConstrain();
  3166.         if(this.layout){
  3167.             this.doLayout();
  3168.         }
  3169.         if(this.keyMap){
  3170.             this.keyMap.enable();
  3171.         }
  3172.         this.toFront();
  3173.         this.updateHandles();
  3174.         this.fireEvent("show", this);
  3175.     },
  3176.         animShow : function(){
  3177.         this.proxy.show();
  3178.         this.proxy.setBox(this.animateTarget.getBox());
  3179.         this.proxy.setOpacity(0);
  3180.         var b = this.getBox(false);
  3181.         b.callback = this.afterShow;
  3182.         b.scope = this;
  3183.         b.duration = .25;
  3184.         b.easing = 'easeNone';
  3185.         b.opacity = .5;
  3186.         b.block = true;
  3187.         this.el.setStyle('display', 'none');
  3188.         this.proxy.shift(b);
  3189.     },
  3190.     hide : function(animateTarget, cb, scope){
  3191.         if(this.hidden || this.fireEvent("beforehide", this) === false){
  3192.             return;
  3193.         }
  3194.         if(cb){
  3195.             this.on('hide', cb, scope, {single:true});
  3196.         }
  3197.         this.hidden = true;
  3198.         if(animateTarget !== undefined){
  3199.             this.setAnimateTarget(animateTarget);
  3200.         }
  3201.         if(this.animateTarget){
  3202.             this.animHide();
  3203.         }else{
  3204.             this.el.hide();
  3205.             this.afterHide();
  3206.         }
  3207.     },
  3208.         afterHide : function(){
  3209.         this.proxy.hide();
  3210.         if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){
  3211.             Ext.EventManager.removeResizeListener(this.onWindowResize, this);
  3212.         }
  3213.         if(this.modal){
  3214.             this.mask.hide();
  3215.             Ext.getBody().removeClass("x-body-masked");
  3216.         }
  3217.         if(this.keyMap){
  3218.             this.keyMap.disable();
  3219.         }
  3220.         this.fireEvent("hide", this);
  3221.     },
  3222.         animHide : function(){
  3223.         this.proxy.setOpacity(.5);
  3224.         this.proxy.show();
  3225.         var tb = this.getBox(false);
  3226.         this.proxy.setBox(tb);
  3227.         this.el.hide();
  3228.         var b = this.animateTarget.getBox();
  3229.         b.callback = this.afterHide;
  3230.         b.scope = this;
  3231.         b.duration = .25;
  3232.         b.easing = 'easeNone';
  3233.         b.block = true;
  3234.         b.opacity = 0;
  3235.         this.proxy.shift(b);
  3236.     },
  3237.         onWindowResize : function(){
  3238.         if(this.maximized){
  3239.             this.fitContainer();
  3240.         }
  3241.         if(this.modal){
  3242.             this.mask.setSize('100%', '100%');
  3243.             var force = this.mask.dom.offsetHeight;
  3244.             this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));
  3245.         }
  3246.         this.doConstrain();
  3247.     },
  3248.         doConstrain : function(){
  3249.         if(this.constrain || this.constrainHeader){
  3250.             var offsets;
  3251.             if(this.constrain){
  3252.                 offsets = {
  3253.                     right:this.el.shadowOffset,
  3254.                     left:this.el.shadowOffset,
  3255.                     bottom:this.el.shadowOffset
  3256.                 };
  3257.             }else {
  3258.                 var s = this.getSize();
  3259.                 offsets = {
  3260.                     right:-(s.width - 100),
  3261.                     bottom:-(s.height - 25)
  3262.                 };
  3263.             }
  3264.             var xy = this.el.getConstrainToXY(this.container, true, offsets);
  3265.             if(xy){
  3266.                 this.setPosition(xy[0], xy[1]);
  3267.             }
  3268.         }
  3269.     },
  3270.         ghost : function(cls){
  3271.         var ghost = this.createGhost(cls);
  3272.         var box = this.getBox(true);
  3273.         ghost.setLeftTop(box.x, box.y);
  3274.         ghost.setWidth(box.width);
  3275.         this.el.hide();
  3276.         this.activeGhost = ghost;
  3277.         return ghost;
  3278.     },
  3279.         unghost : function(show, matchPosition){
  3280.         if(show !== false){
  3281.             this.el.show();
  3282.             this.focus();
  3283.             if(Ext.isMac && Ext.isGecko){               this.cascade(this.setAutoScroll);
  3284.             }
  3285.         }
  3286.         if(matchPosition !== false){
  3287.             this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));
  3288.         }
  3289.         this.activeGhost.hide();
  3290.         this.activeGhost.remove();
  3291.         delete this.activeGhost;
  3292.     },
  3293.     minimize : function(){
  3294.         this.fireEvent('minimize', this);
  3295.     },
  3296.     close : function(){
  3297.         if(this.fireEvent("beforeclose", this) !== false){
  3298.             this.hide(null, function(){
  3299.                 this.fireEvent('close', this);
  3300.                 this.destroy();
  3301.             }, this);
  3302.         }
  3303.     },
  3304.     maximize : function(){
  3305.         if(!this.maximized){
  3306.             this.expand(false);
  3307.             this.restoreSize = this.getSize();
  3308.             this.restorePos = this.getPosition(true);
  3309.             this.tools.maximize.hide();
  3310.             this.tools.restore.show();
  3311.             this.maximized = true;
  3312.             this.el.disableShadow();
  3313.             if(this.dd){
  3314.                 this.dd.lock();
  3315.             }
  3316.             if(this.collapsible){
  3317.                 this.tools.toggle.hide();
  3318.             }
  3319.             this.el.addClass('x-window-maximized');
  3320.             this.container.addClass('x-window-maximized-ct');
  3321.             this.setPosition(0, 0);
  3322.             this.fitContainer();
  3323.             this.fireEvent('maximize', this);
  3324.         }
  3325.     },
  3326.     restore : function(){
  3327.         if(this.maximized){
  3328.             this.el.removeClass('x-window-maximized');
  3329.             this.tools.restore.hide();
  3330.             this.tools.maximize.show();
  3331.             this.setPosition(this.restorePos[0], this.restorePos[1]);
  3332.             this.setSize(this.restoreSize.width, this.restoreSize.height);
  3333.             delete this.restorePos;
  3334.             delete this.restoreSize;
  3335.             this.maximized = false;
  3336.             this.el.enableShadow(true);
  3337.             if(this.dd){
  3338.                 this.dd.unlock();
  3339.             }
  3340.             if(this.collapsible){
  3341.                 this.tools.toggle.show();
  3342.             }
  3343.             this.container.removeClass('x-window-maximized-ct');
  3344.             this.doConstrain();
  3345.             this.fireEvent('restore', this);
  3346.         }
  3347.     },
  3348.     toggleMaximize : function(){
  3349.         this[this.maximized ? 'restore' : 'maximize']();
  3350.     },
  3351.         fitContainer : function(){
  3352.         var vs = this.container.getViewSize();
  3353.         this.setSize(vs.width, vs.height);
  3354.     },
  3355.             setZIndex : function(index){
  3356.         if(this.modal){
  3357.             this.mask.setStyle("z-index", index);
  3358.         }
  3359.         this.el.setZIndex(++index);
  3360.         index += 5;
  3361.         if(this.resizer){
  3362.             this.resizer.proxy.setStyle("z-index", ++index);
  3363.         }
  3364.         this.lastZIndex = index;
  3365.     },
  3366.     alignTo : function(element, position, offsets){
  3367.         var xy = this.el.getAlignToXY(element, position, offsets);
  3368.         this.setPagePosition(xy[0], xy[1]);
  3369.         return this;
  3370.     },
  3371.     anchorTo : function(el, alignment, offsets, monitorScroll, _pname){
  3372.         var action = function(){
  3373.             this.alignTo(el, alignment, offsets);
  3374.         };
  3375.         Ext.EventManager.onWindowResize(action, this);
  3376.         var tm = typeof monitorScroll;
  3377.         if(tm != 'undefined'){
  3378.             Ext.EventManager.on(window, 'scroll', action, this,
  3379.                 {buffer: tm == 'number' ? monitorScroll : 50});
  3380.         }
  3381.         action.call(this);
  3382.         this[_pname] = action;
  3383.         return this;
  3384.     },
  3385.     toFront : function(){
  3386.         if(this.manager.bringToFront(this)){
  3387.             this.focus();
  3388.         }
  3389.         return this;
  3390.     },
  3391.     setActive : function(active){
  3392.         if(active){
  3393.             if(!this.maximized){
  3394.                 this.el.enableShadow(true);
  3395.             }
  3396.             this.fireEvent('activate', this);
  3397.         }else{
  3398.             this.el.disableShadow();
  3399.             this.fireEvent('deactivate', this);
  3400.         }
  3401.     },
  3402.     toBack : function(){
  3403.         this.manager.sendToBack(this);
  3404.         return this;
  3405.     },
  3406.     center : function(){
  3407.         var xy = this.el.getAlignToXY(this.container, 'c-c');
  3408.         this.setPagePosition(xy[0], xy[1]);
  3409.         return this;
  3410.     }
  3411. });
  3412. Ext.reg('window', Ext.Window);
  3413. Ext.Window.DD = function(win){
  3414.     this.win = win;
  3415.     Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);
  3416.     this.setHandleElId(win.header.id);
  3417.     this.scroll = false;
  3418. };
  3419. Ext.extend(Ext.Window.DD, Ext.dd.DD, {
  3420.     moveOnly:true,
  3421.     headerOffsets:[100, 25],
  3422.     startDrag : function(){