ext-all-debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:2341k
源码类别:

中间件编程

开发平台:

JavaScript

  1.     items: [{
  2.         title: 'Column 1',
  3.         width: 120
  4.     },{
  5.         title: 'Column 2',
  6.         columnWidth: .8
  7.     },{
  8.         title: 'Column 3',
  9.         columnWidth: .2
  10.     }]
  11. });
  12. </code></pre>
  13.  */
  14. Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
  15.     // private
  16.     monitorResize:true,
  17.     
  18.     extraCls: 'x-column',
  19.     scrollOffset : 0,
  20.     // private
  21.     isValidParent : function(c, target){
  22.         return (c.getPositionEl ? c.getPositionEl() : c.getEl()).dom.parentNode == this.innerCt.dom;
  23.     },
  24.     // private
  25.     onLayout : function(ct, target){
  26.         var cs = ct.items.items, len = cs.length, c, i;
  27.         if(!this.innerCt){
  28.             target.addClass('x-column-layout-ct');
  29.             // the innerCt prevents wrapping and shuffling while
  30.             // the container is resizing
  31.             this.innerCt = target.createChild({cls:'x-column-inner'});
  32.             this.innerCt.createChild({cls:'x-clear'});
  33.         }
  34.         this.renderAll(ct, this.innerCt);
  35.         var size = Ext.isIE && target.dom != Ext.getBody().dom ? target.getStyleSize() : target.getViewSize();
  36.         if(size.width < 1 && size.height < 1){ // display none?
  37.             return;
  38.         }
  39.         var w = size.width - target.getPadding('lr') - this.scrollOffset,
  40.             h = size.height - target.getPadding('tb'),
  41.             pw = w;
  42.         this.innerCt.setWidth(w);
  43.         
  44.         // some columns can be percentages while others are fixed
  45.         // so we need to make 2 passes
  46.         for(i = 0; i < len; i++){
  47.             c = cs[i];
  48.             if(!c.columnWidth){
  49.                 pw -= (c.getSize().width + c.getEl().getMargins('lr'));
  50.             }
  51.         }
  52.         pw = pw < 0 ? 0 : pw;
  53.         for(i = 0; i < len; i++){
  54.             c = cs[i];
  55.             if(c.columnWidth){
  56.                 c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));
  57.             }
  58.         }
  59.     }
  60.     
  61.     /**
  62.      * @property activeItem
  63.      * @hide
  64.      */
  65. });
  66. Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;/**  * @class Ext.layout.BorderLayout  * @extends Ext.layout.ContainerLayout  * <p>This is a multi-pane, application-oriented UI layout style that supports multiple  * nested panels, automatic {@link Ext.layout.BorderLayout.Region#split split} bars between  * {@link Ext.layout.BorderLayout.Region#BorderLayout.Region regions} and built-in  * {@link Ext.layout.BorderLayout.Region#collapsible expanding and collapsing} of regions.</p>  * <p>This class is intended to be extended or created via the <tt>layout:'border'</tt>  * {@link Ext.Container#layout} config, and should generally not need to be created directly  * via the new keyword.</p>  * <p>BorderLayout does not have any direct config options (other than inherited ones).  * All configuration options available for customizing the BorderLayout are at the  * {@link Ext.layout.BorderLayout.Region} and {@link Ext.layout.BorderLayout.SplitRegion}  * levels.</p>  * <p>Example usage:</p>  * <pre><code> var myBorderPanel = new Ext.Panel({     {@link Ext.Component#renderTo renderTo}: document.body,     {@link Ext.BoxComponent#width width}: 700,     {@link Ext.BoxComponent#height height}: 500,     {@link Ext.Panel#title title}: 'Border Layout',     {@link Ext.Container#layout layout}: 'border',     {@link Ext.Container#items items}: [{         {@link Ext.Panel#title title}: 'South Region is resizable',         {@link Ext.layout.BorderLayout.Region#BorderLayout.Region region}: 'south',     // position for region         {@link Ext.BoxComponent#height height}: 100,         {@link Ext.layout.BorderLayout.Region#split split}: true,         // enable resizing         {@link Ext.SplitBar#minSize minSize}: 75,         // defaults to {@link Ext.layout.BorderLayout.Region#minHeight 50}          {@link Ext.SplitBar#maxSize maxSize}: 150,         {@link Ext.layout.BorderLayout.Region#margins margins}: '0 5 5 5'     },{         // xtype: 'panel' implied by default         {@link Ext.Panel#title title}: 'West Region is collapsible',         {@link Ext.layout.BorderLayout.Region#BorderLayout.Region region}:'west',         {@link Ext.layout.BorderLayout.Region#margins margins}: '5 0 0 5',         {@link Ext.BoxComponent#width width}: 200,         {@link Ext.layout.BorderLayout.Region#collapsible collapsible}: true,   // make collapsible         {@link Ext.layout.BorderLayout.Region#cmargins cmargins}: '5 5 0 5', // adjust top margin when collapsed         {@link Ext.Component#id id}: 'west-region-container',         {@link Ext.Container#layout layout}: 'fit',         {@link Ext.Panel#unstyled unstyled}: true     },{         {@link Ext.Panel#title title}: 'Center Region',         {@link Ext.layout.BorderLayout.Region#BorderLayout.Region region}: 'center',     // center region is required, no width/height specified         {@link Ext.Component#xtype xtype}: 'container',         {@link Ext.Container#layout layout}: 'fit',         {@link Ext.layout.BorderLayout.Region#margins margins}: '5 5 0 0'     }] }); </code></pre>  * <p><b><u>Notes</u></b>:</p><div class="mdetail-params"><ul>  * <li>Any container using the BorderLayout <b>must</b> have a child item with <tt>region:'center'</tt>.  * The child item in the center region will always be resized to fill the remaining space not used by  * the other regions in the layout.</li>  * <li>Any child items with a region of <tt>west</tt> or <tt>east</tt> must have <tt>width</tt> defined  * (an integer representing the number of pixels that the region should take up).</li>  * <li>Any child items with a region of <tt>north</tt> or <tt>south</tt> must have <tt>height</tt> defined.</li>  * <li>The regions of a BorderLayout are <b>fixed at render time</b> and thereafter, its child Components may not be removed or added</b>.  To add/remove  * Components within a BorderLayout, have them wrapped by an additional Container which is directly  * managed by the BorderLayout.  If the region is to be collapsible, the Container used directly  * by the BorderLayout manager should be a Panel.  In the following example a Container (an Ext.Panel)  * is added to the west region:  * <div style="margin-left:16px"><pre><code> wrc = {@link Ext#getCmp Ext.getCmp}('west-region-container'); wrc.{@link Ext.Panel#removeAll removeAll}(); wrc.{@link Ext.Container#add add}({     title: 'Added Panel',     html: 'Some content' }); wrc.{@link Ext.Container#doLayout doLayout}();  * </code></pre></div>  * </li>  * <li> To reference a {@link Ext.layout.BorderLayout.Region Region}:  * <div style="margin-left:16px"><pre><code> wr = myBorderPanel.layout.west;  * </code></pre></div>  * </li>  * </ul></div>  */ Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {     // private     monitorResize:true,     // private     rendered : false,     // private     onLayout : function(ct, target){         var collapsed;         if(!this.rendered){             target.addClass('x-border-layout-ct');             var items = ct.items.items;             collapsed = [];             for(var i = 0, len = items.length; i < len; i++) {                 var c = items[i];                 var pos = c.region;                 if(c.collapsed){                     collapsed.push(c);                 }                 c.collapsed = false;                 if(!c.rendered){                     c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';                     c.render(target, i);                 }                 this[pos] = pos != 'center' && c.split ?                     new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :                     new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);                 this[pos].render(target, c);             }             this.rendered = true;         }         var size = target.getViewSize();         if(size.width < 20 || size.height < 20){ // display none?             if(collapsed){                 this.restoreCollapsed = collapsed;             }             return;         }else if(this.restoreCollapsed){             collapsed = this.restoreCollapsed;             delete this.restoreCollapsed;         }         var w = size.width, h = size.height;         var centerW = w, centerH = h, centerY = 0, centerX = 0;         var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;         if(!c && Ext.layout.BorderLayout.WARN !== false){             throw 'No center region defined in BorderLayout ' + ct.id;         }         if(n && n.isVisible()){             var b = n.getSize();             var m = n.getMargins();             b.width = w - (m.left+m.right);             b.x = m.left;             b.y = m.top;             centerY = b.height + b.y + m.bottom;             centerH -= centerY;             n.applyLayout(b);         }         if(s && s.isVisible()){             var b = s.getSize();             var m = s.getMargins();             b.width = w - (m.left+m.right);             b.x = m.left;             var totalHeight = (b.height + m.top + m.bottom);             b.y = h - totalHeight + m.top;             centerH -= totalHeight;             s.applyLayout(b);         }         if(west && west.isVisible()){             var b = west.getSize();             var m = west.getMargins();             b.height = centerH - (m.top+m.bottom);             b.x = m.left;             b.y = centerY + m.top;             var totalWidth = (b.width + m.left + m.right);             centerX += totalWidth;             centerW -= totalWidth;             west.applyLayout(b);         }         if(e && e.isVisible()){             var b = e.getSize();             var m = e.getMargins();             b.height = centerH - (m.top+m.bottom);             var totalWidth = (b.width + m.left + m.right);             b.x = w - totalWidth + m.left;             b.y = centerY + m.top;             centerW -= totalWidth;             e.applyLayout(b);         }         if(c){             var m = c.getMargins();             var centerBox = {                 x: centerX + m.left,                 y: centerY + m.top,                 width: centerW - (m.left+m.right),                 height: centerH - (m.top+m.bottom)             };             c.applyLayout(centerBox);         }         if(collapsed){             for(var i = 0, len = collapsed.length; i < len; i++){                 collapsed[i].collapse(false);             }         }         if(Ext.isIE && Ext.isStrict){ // workaround IE strict repainting issue             target.repaint();         }     },     destroy: function() {         var r = ['north', 'south', 'east', 'west'];         for (var i = 0; i < r.length; i++) {             var region = this[r[i]];             if(region){                 if(region.destroy){                     region.destroy();                 }else if (region.split){                     region.split.destroy(true);                 }             }         }         Ext.layout.BorderLayout.superclass.destroy.call(this);     }     /**      * @property activeItem      * @hide      */ }); /**  * @class Ext.layout.BorderLayout.Region  * <p>This is a region of a {@link Ext.layout.BorderLayout BorderLayout} that acts as a subcontainer  * within the layout.  Each region has its own {@link Ext.layout.ContainerLayout layout} that is  * independent of other regions and the containing BorderLayout, and can be any of the  * {@link Ext.layout.ContainerLayout valid Ext layout types}.</p>  * <p>Region size is managed automatically and cannot be changed by the user -- for  * {@link #split resizable regions}, see {@link Ext.layout.BorderLayout.SplitRegion}.</p>  * @constructor  * Create a new Region.  * @param {Layout} layout The {@link Ext.layout.BorderLayout BorderLayout} instance that is managing this Region.  * @param {Object} config The configuration options  * @param {String} position The region position.  Valid values are: <tt>north</tt>, <tt>south</tt>,  * <tt>east</tt>, <tt>west</tt> and <tt>center</tt>.  Every {@link Ext.layout.BorderLayout BorderLayout}  * <b>must have a center region</b> for the primary content -- all other regions are optional.  */ Ext.layout.BorderLayout.Region = function(layout, config, pos){     Ext.apply(this, config);     this.layout = layout;     this.position = pos;     this.state = {};     if(typeof this.margins == 'string'){         this.margins = this.layout.parseMargins(this.margins);     }     this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);     if(this.collapsible){         if(typeof this.cmargins == 'string'){             this.cmargins = this.layout.parseMargins(this.cmargins);         }         if(this.collapseMode == 'mini' && !this.cmargins){             this.cmargins = {left:0,top:0,right:0,bottom:0};         }else{             this.cmargins = Ext.applyIf(this.cmargins || {},                 pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);         }     } }; Ext.layout.BorderLayout.Region.prototype = {     /**      * @cfg {Boolean} animFloat      * When a collapsed region's bar is clicked, the region's panel will be displayed as a floated      * panel that will close again once the user mouses out of that panel (or clicks out if      * <tt>{@link #autoHide} = false</tt>).  Setting <tt>{@link #animFloat} = false</tt> will      * prevent the open and close of these floated panels from being animated (defaults to <tt>true</tt>).      */     /**      * @cfg {Boolean} autoHide      * When a collapsed region's bar is clicked, the region's panel will be displayed as a floated      * panel.  If <tt>autoHide = true</tt>, the panel will automatically hide after the user mouses      * out of the panel.  If <tt>autoHide = false</tt>, the panel will continue to display until the      * user clicks outside of the panel (defaults to <tt>true</tt>).      */     /**      * @cfg {String} collapseMode      * <tt>collapseMode</tt> supports two configuration values:<div class="mdetail-params"><ul>      * <li><b><tt>undefined</tt></b> (default)<div class="sub-desc">By default, {@link #collapsible}      * regions are collapsed by clicking the expand/collapse tool button that renders into the region's      * title bar.</div></li>      * <li><b><tt>'mini'</tt></b><div class="sub-desc">Optionally, when <tt>collapseMode</tt> is set to      * <tt>'mini'</tt> the region's split bar will also display a small collapse button in the center of      * the bar. In <tt>'mini'</tt> mode the region will collapse to a thinner bar than in normal mode.      * </div></li>      * </ul></div></p>      * <p><b>Note</b>: if a collapsible region does not have a title bar, then set <tt>collapseMode =      * 'mini'</tt> and <tt>{@link #split} = true</tt> in order for the region to be {@link #collapsible}      * by the user as the expand/collapse tool button (that would go in the title bar) will not be rendered.</p>      * <p>See also <tt>{@link #cmargins}</tt>.</p>      */     /**      * @cfg {Object} margins      * An object containing margins to apply to the region when in the expanded state in the      * format:<pre><code> {     top: (top margin),     right: (right margin),     bottom: (bottom margin),     left: (left margin) }</code></pre>      * <p>May also be a string containing space-separated, numeric margin values. The order of the      * sides associated with each value matches the way CSS processes margin values:</p>      * <p><div class="mdetail-params"><ul>      * <li>If there is only one value, it applies to all sides.</li>      * <li>If there are two values, the top and bottom borders are set to the first value and the      * right and left are set to the second.</li>      * <li>If there are three values, the top is set to the first value, the left and right are set      * to the second, and the bottom is set to the third.</li>      * <li>If there are four values, they apply to the top, right, bottom, and left, respectively.</li>      * </ul></div></p>      * <p>Defaults to:</p><pre><code>      * {top:0, right:0, bottom:0, left:0}      * </code></pre>      */     /**      * @cfg {Object} cmargins      * An object containing margins to apply to the region when in the collapsed state in the      * format:<pre><code> {     top: (top margin),     right: (right margin),     bottom: (bottom margin),     left: (left margin) }</code></pre>      * <p>May also be a string containing space-separated, numeric margin values. The order of the      * sides associated with each value matches the way CSS processes margin values.</p>      * <p><ul>      * <li>If there is only one value, it applies to all sides.</li>      * <li>If there are two values, the top and bottom borders are set to the first value and the      * right and left are set to the second.</li>      * <li>If there are three values, the top is set to the first value, the left and right are set      * to the second, and the bottom is set to the third.</li>      * <li>If there are four values, they apply to the top, right, bottom, and left, respectively.</li>      * </ul></p>      */     /**      * @cfg {Boolean} collapsible      * <p><tt>true</tt> to allow the user to collapse this region (defaults to <tt>false</tt>).  If      * <tt>true</tt>, an expand/collapse tool button will automatically be rendered into the title      * bar of the region, otherwise the button will not be shown.</p>      * <p><b>Note</b>: that a title bar is required to display the collapse/expand toggle button -- if      * no <tt>title</tt> is specified for the region's panel, the region will only be collapsible if      * <tt>{@link #collapseMode} = 'mini'</tt> and <tt>{@link #split} = true</tt>.      */     collapsible : false,     /**      * @cfg {Boolean} split      * <p><tt>true</tt> to create a {@link Ext.layout.BorderLayout.SplitRegion SplitRegion} and       * display a 5px wide {@link Ext.SplitBar} between this region and its neighbor, allowing the user to      * resize the regions dynamically.  Defaults to <tt>false</tt> creating a      * {@link Ext.layout.BorderLayout.Region Region}.</p><br>      * <p><b>Notes</b>:</p><div class="mdetail-params"><ul>      * <li>this configuration option is ignored if <tt>region='center'</tt></li>       * <li>when <tt>split == true</tt>, it is common to specify a      * <tt>{@link Ext.SplitBar#minSize minSize}</tt> and <tt>{@link Ext.SplitBar#maxSize maxSize}</tt>      * for the {@link Ext.BoxComponent BoxComponent} representing the region. These are not native      * configs of {@link Ext.BoxComponent BoxComponent}, and are used only by this class.</li>      * <li>if <tt>{@link #collapseMode} = 'mini'</tt> requires <tt>split = true</tt> to reserve space      * for the collapse tool</tt></li>       * </ul></div>       */     split:false,     /**      * @cfg {Boolean} floatable      * <tt>true</tt> to allow clicking a collapsed region's bar to display the region's panel floated      * above the layout, <tt>false</tt> to force the user to fully expand a collapsed region by      * clicking the expand button to see it again (defaults to <tt>true</tt>).      */     floatable: true,     /**      * @cfg {Number} minWidth      * <p>The minimum allowable width in pixels for this region (defaults to <tt>50</tt>).      * <tt>maxWidth</tt> may also be specified.</p><br>      * <p><b>Note</b>: setting the <tt>{@link Ext.SplitBar#minSize minSize}</tt> /       * <tt>{@link Ext.SplitBar#maxSize maxSize}</tt> supersedes any specified       * <tt>minWidth</tt> / <tt>maxWidth</tt>.</p>      */     minWidth:50,     /**      * @cfg {Number} minHeight      * The minimum allowable height in pixels for this region (defaults to <tt>50</tt>)      * <tt>maxHeight</tt> may also be specified.</p><br>      * <p><b>Note</b>: setting the <tt>{@link Ext.SplitBar#minSize minSize}</tt> /       * <tt>{@link Ext.SplitBar#maxSize maxSize}</tt> supersedes any specified       * <tt>minHeight</tt> / <tt>maxHeight</tt>.</p>      */     minHeight:50,     // private     defaultMargins : {left:0,top:0,right:0,bottom:0},     // private     defaultNSCMargins : {left:5,top:5,right:5,bottom:5},     // private     defaultEWCMargins : {left:5,top:0,right:5,bottom:0},     floatingZIndex: 100,     /**      * True if this region is collapsed. Read-only.      * @type Boolean      * @property      */     isCollapsed : false,     /**      * This region's panel.  Read-only.      * @type Ext.Panel      * @property panel      */     /**      * This region's layout.  Read-only.      * @type Layout      * @property layout      */     /**      * This region's layout position (north, south, east, west or center).  Read-only.      * @type String      * @property position      */     // private     render : function(ct, p){         this.panel = p;         p.el.enableDisplayMode();         this.targetEl = ct;         this.el = p.el;         var gs = p.getState, ps = this.position;         p.getState = function(){             return Ext.apply(gs.call(p) || {}, this.state);         }.createDelegate(this);         if(ps != 'center'){             p.allowQueuedExpand = false;             p.on({                 beforecollapse: this.beforeCollapse,                 collapse: this.onCollapse,                 beforeexpand: this.beforeExpand,                 expand: this.onExpand,                 hide: this.onHide,                 show: this.onShow,                 scope: this             });             if(this.collapsible || this.floatable){                 p.collapseEl = 'el';                 p.slideAnchor = this.getSlideAnchor();             }             if(p.tools && p.tools.toggle){                 p.tools.toggle.addClass('x-tool-collapse-'+ps);                 p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');             }         }     },     // private     getCollapsedEl : function(){         if(!this.collapsedEl){             if(!this.toolTemplate){                 var tt = new Ext.Template(                      '<div class="x-tool x-tool-{id}">&#160;</div>'                 );                 tt.disableFormats = true;                 tt.compile();                 Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;             }             this.collapsedEl = this.targetEl.createChild({                 cls: "x-layout-collapsed x-layout-collapsed-"+this.position,                 id: this.panel.id + '-xcollapsed'             });             this.collapsedEl.enableDisplayMode('block');             if(this.collapseMode == 'mini'){                 this.collapsedEl.addClass('x-layout-cmini-'+this.position);                 this.miniCollapsedEl = this.collapsedEl.createChild({                     cls: "x-layout-mini x-layout-mini-"+this.position, html: "&#160;"                 });                 this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');                 this.collapsedEl.addClassOnOver("x-layout-collapsed-over");                 this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});             }else {                 if(this.collapsible !== false && !this.hideCollapseTool) {                     var t = this.toolTemplate.append(                             this.collapsedEl.dom,                             {id:'expand-'+this.position}, true);                     t.addClassOnOver('x-tool-expand-'+this.position+'-over');                     t.on('click', this.onExpandClick, this, {stopEvent:true});                 }                 if(this.floatable !== false || this.titleCollapse){                    this.collapsedEl.addClassOnOver("x-layout-collapsed-over");                    this.collapsedEl.on("click", this[this.floatable ? 'collapseClick' : 'onExpandClick'], this);                 }             }         }         return this.collapsedEl;     },     // private     onExpandClick : function(e){         if(this.isSlid){             this.afterSlideIn();             this.panel.expand(false);         }else{             this.panel.expand();         }     },     // private     onCollapseClick : function(e){         this.panel.collapse();     },     // private     beforeCollapse : function(p, animate){         this.lastAnim = animate;         if(this.splitEl){             this.splitEl.hide();         }         this.getCollapsedEl().show();         this.panel.el.setStyle('z-index', 100);         this.isCollapsed = true;         this.layout.layout();     },     // private     onCollapse : function(animate){         this.panel.el.setStyle('z-index', 1);         if(this.lastAnim === false || this.panel.animCollapse === false){             this.getCollapsedEl().dom.style.visibility = 'visible';         }else{             this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});         }         this.state.collapsed = true;         this.panel.saveState();     },     // private     beforeExpand : function(animate){         var c = this.getCollapsedEl();         this.el.show();         if(this.position == 'east' || this.position == 'west'){             this.panel.setSize(undefined, c.getHeight());         }else{             this.panel.setSize(c.getWidth(), undefined);         }         c.hide();         c.dom.style.visibility = 'hidden';         this.panel.el.setStyle('z-index', this.floatingZIndex);     },     // private     onExpand : function(){         this.isCollapsed = false;         if(this.splitEl){             this.splitEl.show();         }         this.layout.layout();         this.panel.el.setStyle('z-index', 1);         this.state.collapsed = false;         this.panel.saveState();     },     // private     collapseClick : function(e){         if(this.isSlid){            e.stopPropagation();            this.slideIn();         }else{            e.stopPropagation();            this.slideOut();         }     },     // private     onHide : function(){         if(this.isCollapsed){             this.getCollapsedEl().hide();         }else if(this.splitEl){             this.splitEl.hide();         }     },     // private     onShow : function(){         if(this.isCollapsed){             this.getCollapsedEl().show();         }else if(this.splitEl){             this.splitEl.show();         }     },     /**      * True if this region is currently visible, else false.      * @return {Boolean}      */     isVisible : function(){         return !this.panel.hidden;     },     /**      * Returns the current margins for this region.  If the region is collapsed, the      * {@link #cmargins} (collapsed margins) value will be returned, otherwise the      * {@link #margins} value will be returned.      * @return {Object} An object containing the element's margins: <tt>{left: (left      * margin), top: (top margin), right: (right margin), bottom: (bottom margin)}</tt>      */     getMargins : function(){         return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;     },     /**      * Returns the current size of this region.  If the region is collapsed, the size of the      * collapsedEl will be returned, otherwise the size of the region's panel will be returned.      * @return {Object} An object containing the element's size: <tt>{width: (element width),      * height: (element height)}</tt>      */     getSize : function(){         return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();     },     /**      * Sets the specified panel as the container element for this region.      * @param {Ext.Panel} panel The new panel      */     setPanel : function(panel){         this.panel = panel;     },     /**      * Returns the minimum allowable width for this region.      * @return {Number} The minimum width      */     getMinWidth: function(){         return this.minWidth;     },     /**      * Returns the minimum allowable height for this region.      * @return {Number} The minimum height      */     getMinHeight: function(){         return this.minHeight;     },     // private     applyLayoutCollapsed : function(box){         var ce = this.getCollapsedEl();         ce.setLeftTop(box.x, box.y);         ce.setSize(box.width, box.height);     },     // private     applyLayout : function(box){         if(this.isCollapsed){             this.applyLayoutCollapsed(box);         }else{             this.panel.setPosition(box.x, box.y);             this.panel.setSize(box.width, box.height);         }     },     // private     beforeSlide: function(){         this.panel.beforeEffect();     },     // private     afterSlide : function(){         this.panel.afterEffect();     },     // private     initAutoHide : function(){         if(this.autoHide !== false){             if(!this.autoHideHd){                 var st = new Ext.util.DelayedTask(this.slideIn, this);                 this.autoHideHd = {                     "mouseout": function(e){                         if(!e.within(this.el, true)){                             st.delay(500);                         }                     },                     "mouseover" : function(e){                         st.cancel();                     },                     scope : this                 };             }             this.el.on(this.autoHideHd);         }     },     // private     clearAutoHide : function(){         if(this.autoHide !== false){             this.el.un("mouseout", this.autoHideHd.mouseout);             this.el.un("mouseover", this.autoHideHd.mouseover);         }     },     // private     clearMonitor : function(){         Ext.getDoc().un("click", this.slideInIf, this);     },     /**      * If this Region is {@link #floatable}, this method slides this Region into full visibility <i>over the top      * of the center Region</i> where it floats until either {@link #slideIn} is called, or other regions of the layout      * are clicked, or the mouse exits the Region.      */     slideOut : function(){         if(this.isSlid || this.el.hasActiveFx()){             return;         }         this.isSlid = true;         var ts = this.panel.tools;         if(ts && ts.toggle){             ts.toggle.hide();         }         this.el.show();         if(this.position == 'east' || this.position == 'west'){             this.panel.setSize(undefined, this.collapsedEl.getHeight());         }else{             this.panel.setSize(this.collapsedEl.getWidth(), undefined);         }         this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];         this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());         this.el.setStyle("z-index", this.floatingZIndex+2);         this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating');         if(this.animFloat !== false){             this.beforeSlide();             this.el.slideIn(this.getSlideAnchor(), {                 callback: function(){                     this.afterSlide();                     this.initAutoHide();                     Ext.getDoc().on("click", this.slideInIf, this);                 },                 scope: this,                 block: true             });         }else{             this.initAutoHide();              Ext.getDoc().on("click", this.slideInIf, this);         }     },     // private     afterSlideIn : function(){         this.clearAutoHide();         this.isSlid = false;         this.clearMonitor();         this.el.setStyle("z-index", "");         this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed');         this.el.dom.style.left = this.restoreLT[0];         this.el.dom.style.top = this.restoreLT[1];         var ts = this.panel.tools;         if(ts && ts.toggle){             ts.toggle.show();         }     },     /**      * If this Region is {@link #floatable}, and this Region has been slid into floating visibility, then this method slides      * this region back into its collapsed state.      */     slideIn : function(cb){         if(!this.isSlid || this.el.hasActiveFx()){             Ext.callback(cb);             return;         }         this.isSlid = false;         if(this.animFloat !== false){             this.beforeSlide();             this.el.slideOut(this.getSlideAnchor(), {                 callback: function(){                     this.el.hide();                     this.afterSlide();                     this.afterSlideIn();                     Ext.callback(cb);                 },                 scope: this,                 block: true             });         }else{             this.el.hide();             this.afterSlideIn();         }     },     // private     slideInIf : function(e){         if(!e.within(this.el)){             this.slideIn();         }     },     // private     anchors : {         "west" : "left",         "east" : "right",         "north" : "top",         "south" : "bottom"     },     // private     sanchors : {         "west" : "l",         "east" : "r",         "north" : "t",         "south" : "b"     },     // private     canchors : {         "west" : "tl-tr",         "east" : "tr-tl",         "north" : "tl-bl",         "south" : "bl-tl"     },     // private     getAnchor : function(){         return this.anchors[this.position];     },     // private     getCollapseAnchor : function(){         return this.canchors[this.position];     },     // private     getSlideAnchor : function(){         return this.sanchors[this.position];     },     // private     getAlignAdj : function(){         var cm = this.cmargins;         switch(this.position){             case "west":                 return [0, 0];             break;             case "east":                 return [0, 0];             break;             case "north":                 return [0, 0];             break;             case "south":                 return [0, 0];             break;         }     },     // private     getExpandAdj : function(){         var c = this.collapsedEl, cm = this.cmargins;         switch(this.position){             case "west":                 return [-(cm.right+c.getWidth()+cm.left), 0];             break;             case "east":                 return [cm.right+c.getWidth()+cm.left, 0];             break;             case "north":                 return [0, -(cm.top+cm.bottom+c.getHeight())];             break;             case "south":                 return [0, cm.top+cm.bottom+c.getHeight()];             break;         }     } }; /**  * @class Ext.layout.BorderLayout.SplitRegion  * @extends Ext.layout.BorderLayout.Region  * <p>This is a specialized type of {@link Ext.layout.BorderLayout.Region BorderLayout region} that  * has a built-in {@link Ext.SplitBar} for user resizing of regions.  The movement of the split bar  * is configurable to move either {@link #tickSize smooth or incrementally}.</p>  * @constructor  * Create a new SplitRegion.  * @param {Layout} layout The {@link Ext.layout.BorderLayout BorderLayout} instance that is managing this Region.  * @param {Object} config The configuration options  * @param {String} position The region position.  Valid values are: north, south, east, west and center.  Every  * BorderLayout must have a center region for the primary content -- all other regions are optional.  */ Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){     Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);     // prevent switch     this.applyLayout = this.applyFns[pos]; }; Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {     /**      * @cfg {Number} tickSize      * The increment, in pixels by which to move this Region's {@link Ext.SplitBar SplitBar}.      * By default, the {@link Ext.SplitBar SplitBar} moves smoothly.      */     /**      * @cfg {String} splitTip      * The tooltip to display when the user hovers over a      * {@link Ext.layout.BorderLayout.Region#collapsible non-collapsible} region's split bar      * (defaults to <tt>"Drag to resize."</tt>).  Only applies if      * <tt>{@link #useSplitTips} = true</tt>.      */     splitTip : "Drag to resize.",     /**      * @cfg {String} collapsibleSplitTip      * The tooltip to display when the user hovers over a      * {@link Ext.layout.BorderLayout.Region#collapsible collapsible} region's split bar      * (defaults to "Drag to resize. Double click to hide."). Only applies if      * <tt>{@link #useSplitTips} = true</tt>.      */     collapsibleSplitTip : "Drag to resize. Double click to hide.",     /**      * @cfg {Boolean} useSplitTips      * <tt>true</tt> to display a tooltip when the user hovers over a region's split bar      * (defaults to <tt>false</tt>).  The tooltip text will be the value of either      * <tt>{@link #splitTip}</tt> or <tt>{@link #collapsibleSplitTip}</tt> as appropriate.      */     useSplitTips : false,     // private     splitSettings : {         north : {             orientation: Ext.SplitBar.VERTICAL,             placement: Ext.SplitBar.TOP,             maxFn : 'getVMaxSize',             minProp: 'minHeight',             maxProp: 'maxHeight'         },         south : {             orientation: Ext.SplitBar.VERTICAL,             placement: Ext.SplitBar.BOTTOM,             maxFn : 'getVMaxSize',             minProp: 'minHeight',             maxProp: 'maxHeight'         },         east : {             orientation: Ext.SplitBar.HORIZONTAL,             placement: Ext.SplitBar.RIGHT,             maxFn : 'getHMaxSize',             minProp: 'minWidth',             maxProp: 'maxWidth'         },         west : {             orientation: Ext.SplitBar.HORIZONTAL,             placement: Ext.SplitBar.LEFT,             maxFn : 'getHMaxSize',             minProp: 'minWidth',             maxProp: 'maxWidth'         }     },     // private     applyFns : {         west : function(box){             if(this.isCollapsed){                 return this.applyLayoutCollapsed(box);             }             var sd = this.splitEl.dom, s = sd.style;             this.panel.setPosition(box.x, box.y);             var sw = sd.offsetWidth;             s.left = (box.x+box.width-sw)+'px';             s.top = (box.y)+'px';             s.height = Math.max(0, box.height)+'px';             this.panel.setSize(box.width-sw, box.height);         },         east : function(box){             if(this.isCollapsed){                 return this.applyLayoutCollapsed(box);             }             var sd = this.splitEl.dom, s = sd.style;             var sw = sd.offsetWidth;             this.panel.setPosition(box.x+sw, box.y);             s.left = (box.x)+'px';             s.top = (box.y)+'px';             s.height = Math.max(0, box.height)+'px';             this.panel.setSize(box.width-sw, box.height);         },         north : function(box){             if(this.isCollapsed){                 return this.applyLayoutCollapsed(box);             }             var sd = this.splitEl.dom, s = sd.style;             var sh = sd.offsetHeight;             this.panel.setPosition(box.x, box.y);             s.left = (box.x)+'px';             s.top = (box.y+box.height-sh)+'px';             s.width = Math.max(0, box.width)+'px';             this.panel.setSize(box.width, box.height-sh);         },         south : function(box){             if(this.isCollapsed){                 return this.applyLayoutCollapsed(box);             }             var sd = this.splitEl.dom, s = sd.style;             var sh = sd.offsetHeight;             this.panel.setPosition(box.x, box.y+sh);             s.left = (box.x)+'px';             s.top = (box.y)+'px';             s.width = Math.max(0, box.width)+'px';             this.panel.setSize(box.width, box.height-sh);         }     },     // private     render : function(ct, p){         Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);         var ps = this.position;         this.splitEl = ct.createChild({             cls: "x-layout-split x-layout-split-"+ps, html: "&#160;",             id: this.panel.id + '-xsplit'         });         if(this.collapseMode == 'mini'){             this.miniSplitEl = this.splitEl.createChild({                 cls: "x-layout-mini x-layout-mini-"+ps, html: "&#160;"             });             this.miniSplitEl.addClassOnOver('x-layout-mini-over');             this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});         }         var s = this.splitSettings[ps];         this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);         this.split.tickSize = this.tickSize;         this.split.placement = s.placement;         this.split.getMaximumSize = this[s.maxFn].createDelegate(this);         this.split.minSize = this.minSize || this[s.minProp];         this.split.on("beforeapply", this.onSplitMove, this);         this.split.useShim = this.useShim === true;         this.maxSize = this.maxSize || this[s.maxProp];         if(p.hidden){             this.splitEl.hide();         }         if(this.useSplitTips){             this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;         }         if(this.collapsible){             this.splitEl.on("dblclick", this.onCollapseClick,  this);         }     },     //docs inherit from superclass     getSize : function(){         if(this.isCollapsed){             return this.collapsedEl.getSize();         }         var s = this.panel.getSize();         if(this.position == 'north' || this.position == 'south'){             s.height += this.splitEl.dom.offsetHeight;         }else{             s.width += this.splitEl.dom.offsetWidth;         }         return s;     },     // private     getHMaxSize : function(){          var cmax = this.maxSize || 10000;          var center = this.layout.center;          return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());     },     // private     getVMaxSize : function(){         var cmax = this.maxSize || 10000;         var center = this.layout.center;         return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());     },     // private     onSplitMove : function(split, newSize){         var s = this.panel.getSize();         this.lastSplitSize = newSize;         if(this.position == 'north' || this.position == 'south'){             this.panel.setSize(s.width, newSize);             this.state.height = newSize;         }else{             this.panel.setSize(newSize, s.height);             this.state.width = newSize;         }         this.layout.layout();         this.panel.saveState();         return false;     },     /**      * Returns a reference to the split bar in use by this region.      * @return {Ext.SplitBar} The split bar      */     getSplitBar : function(){         return this.split;     },     // inherit docs     destroy : function() {         Ext.destroy(             this.miniSplitEl,             this.split,             this.splitEl         );     } }); Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;/**  * @class Ext.layout.FormLayout  * @extends Ext.layout.AnchorLayout  * <p>This layout manager is specifically designed for rendering and managing child Components of  * {@link Ext.form.FormPanel forms}. It is responsible for rendering the labels of  * {@link Ext.form.Field Field}s.</p>  *  * <p>This layout manager is used when a Container is configured with the <tt>layout:'form'</tt>  * {@link Ext.Container#layout layout} config option, and should generally not need to be created directly  * via the new keyword. See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>  *  * <p>In an application, it will usually be preferrable to use a {@link Ext.form.FormPanel FormPanel}  * (which is configured with FormLayout as its layout class by default) since it also provides built-in  * functionality for {@link Ext.form.BasicForm#doAction loading, validating and submitting} the form.</p>  *  * <p>A {@link Ext.Container Container} <i>using</i> the FormLayout layout manager (e.g.  * {@link Ext.form.FormPanel} or specifying <tt>layout:'form'</tt>) can also accept the following  * layout-specific config properties:<div class="mdetail-params"><ul>  * <li><b><tt>{@link Ext.form.FormPanel#hideLabels hideLabels}</tt></b></li>  * <li><b><tt>{@link Ext.form.FormPanel#labelAlign labelAlign}</tt></b></li>  * <li><b><tt>{@link Ext.form.FormPanel#labelPad labelPad}</tt></b></li>  * <li><b><tt>{@link Ext.form.FormPanel#labelSeparator labelSeparator}</tt></b></li>  * <li><b><tt>{@link Ext.form.FormPanel#labelWidth labelWidth}</tt></b></li>  * </ul></div></p>  *  * <p>Any Component (including Fields) managed by FormLayout accepts the following as a config option:  * <div class="mdetail-params"><ul>  * <li><b><tt>{@link Ext.Component#anchor anchor}</tt></b></li>  * </ul></div></p>  *  * <p>Any Component managed by FormLayout may be rendered as a form field (with an associated label) by  * configuring it with a non-null <b><tt>{@link Ext.Component#fieldLabel fieldLabel}</tt></b>. Components configured  * in this way may be configured with the following options which affect the way the FormLayout renders them:  * <div class="mdetail-params"><ul>  * <li><b><tt>{@link Ext.Component#clearCls clearCls}</tt></b></li>  * <li><b><tt>{@link Ext.Component#fieldLabel fieldLabel}</tt></b></li>  * <li><b><tt>{@link Ext.Component#hideLabel hideLabel}</tt></b></li>  * <li><b><tt>{@link Ext.Component#itemCls itemCls}</tt></b></li>  * <li><b><tt>{@link Ext.Component#labelSeparator labelSeparator}</tt></b></li>  * <li><b><tt>{@link Ext.Component#labelStyle labelStyle}</tt></b></li>  * </ul></div></p>  *  * <p>Example usage:</p>  * <pre><code> // Required if showing validation messages Ext.QuickTips.init(); // While you can create a basic Panel with layout:'form', practically // you should usually use a FormPanel to also get its form functionality // since it already creates a FormLayout internally. var form = new Ext.form.FormPanel({     title: 'Form Layout',     bodyStyle: 'padding:15px',     width: 350,     defaultType: 'textfield',     defaults: {         // applied to each contained item         width: 230,         msgTarget: 'side'     },     items: [{             fieldLabel: 'First Name',             name: 'first',             allowBlank: false,             {@link Ext.Component#labelSeparator labelSeparator}: ':' // override labelSeparator layout config         },{             fieldLabel: 'Last Name',             name: 'last'         },{             fieldLabel: 'Email',             name: 'email',             vtype:'email'         }, {             xtype: 'textarea',             hideLabel: true,     // override hideLabels layout config             name: 'msg',             anchor: '100% -53'         }     ],     buttons: [         {text: 'Save'},         {text: 'Cancel'}     ],     layoutConfig: {         {@link #labelSeparator}: '~' // superseded by assignment below     },     // config options applicable to container when layout='form':     hideLabels: false,     labelAlign: 'left',   // or 'right' or 'top'     {@link Ext.form.FormPanel#labelSeparator labelSeparator}: '>>', // takes precedence over layoutConfig value     labelWidth: 65,       // defaults to 100     labelPad: 8           // defaults to 5, must specify labelWidth to be honored }); </code></pre>  */ Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {     /**      * @cfg {String} labelSeparator      * See {@link Ext.form.FormPanel}.{@link Ext.form.FormPanel#labelSeparator labelSeparator}.  Configuration      * of this property at the <b>container</b> level takes precedence.      */     labelSeparator : ':',     /**      * Read only. The CSS style specification string added to field labels in this layout if not      * otherwise {@link Ext.Component#labelStyle specified by each contained field}.      * @type String      * @property labelStyle      */     // private     setContainer : function(ct){         Ext.layout.FormLayout.superclass.setContainer.call(this, ct);         if(ct.labelAlign){             ct.addClass('x-form-label-'+ct.labelAlign);         }         if(ct.hideLabels){             this.labelStyle = "display:none";             this.elementStyle = "padding-left:0;";             this.labelAdjust = 0;         }else{             this.labelSeparator = ct.labelSeparator || this.labelSeparator;             ct.labelWidth = ct.labelWidth || 100;             if(typeof ct.labelWidth == 'number'){                 var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);                 this.labelAdjust = ct.labelWidth+pad;                 this.labelStyle = "width:"+ct.labelWidth+"px;";                 this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';             }             if(ct.labelAlign == 'top'){                 this.labelStyle = "width:auto;";                 this.labelAdjust = 0;                 this.elementStyle = "padding-left:0;";             }         }     },     //private     getLabelStyle: function(s){         var ls = '', items = [this.labelStyle, s];         for (var i = 0, len = items.length; i < len; ++i){             if (items[i]){                 ls += items[i];                 if (ls.substr(-1, 1) != ';'){                     ls += ';'                 }             }         }         return ls;     },     /**      * @cfg {Ext.Template} fieldTpl      * A {@link Ext.Template#compile compile}d {@link Ext.Template} for rendering      * the fully wrapped, labeled and styled form Field. Defaults to:</p><pre><code> new Ext.Template(     &#39;&lt;div class="x-form-item {itemCls}" tabIndex="-1">&#39;,         &#39;&lt;&#108;abel for="{id}" style="{labelStyle}" class="x-form-item-&#108;abel">{&#108;abel}{labelSeparator}&lt;/&#108;abel>&#39;,         &#39;&lt;div class="x-form-element" id="x-form-el-{id}" style="{elementStyle}">&#39;,         &#39;&lt;/div>&lt;div class="{clearCls}">&lt;/div>&#39;,     '&lt;/div>' ); </code></pre>      * <p>This may be specified to produce a different DOM structure when rendering form Fields.</p>      * <p>A description of the properties within the template follows:</p><div class="mdetail-params"><ul>      * <li><b><tt>itemCls</tt></b> : String<div class="sub-desc">The CSS class applied to the outermost div wrapper      * that contains this field label and field element (the default class is <tt>'x-form-item'</tt> and <tt>itemCls</tt>      * will be added to that). If supplied, <tt>itemCls</tt> at the field level will override the default <tt>itemCls</tt>      * supplied at the container level.</div></li>      * <li><b><tt>id</tt></b> : String<div class="sub-desc">The id of the Field</div></li>      * <li><b><tt>{@link #labelStyle}</tt></b> : String<div class="sub-desc">      * A CSS style specification string to add to the field label for this field (defaults to <tt>''</tt> or the      * {@link #labelStyle layout's value for <tt>labelStyle</tt>}).</div></li>      * <li><b><tt>label</tt></b> : String<div class="sub-desc">The text to display as the label for this      * field (defaults to <tt>''</tt>)</div></li>      * <li><b><tt>{@link #labelSeparator}</tt></b> : String<div class="sub-desc">The separator to display after      * the text of the label for this field (defaults to a colon <tt>':'</tt> or the      * {@link #labelSeparator layout's value for labelSeparator}). To hide the separator use empty string ''.</div></li>      * <li><b><tt>elementStyle</tt></b> : String<div class="sub-desc">The styles text for the input element's wrapper.</div></li>      * <li><b><tt>clearCls</tt></b> : String<div class="sub-desc">The CSS class to apply to the special clearing div      * rendered directly after each form field wrapper (defaults to <tt>'x-form-clear-left'</tt>)</div></li>      * </ul></div>      * <p>Also see <tt>{@link #getTemplateArgs}</tt></p>      */     // private     renderItem : function(c, position, target){         if(c && !c.rendered && (c.isFormField || c.fieldLabel) && c.inputType != 'hidden'){             var args = this.getTemplateArgs(c);             if(typeof position == 'number'){                 position = target.dom.childNodes[position] || null;             }             if(position){                 this.fieldTpl.insertBefore(position, args);             }else{                 this.fieldTpl.append(target, args);             }             c.render('x-form-el-'+c.id);         }else {             Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);         }     },     /**      * <p>Provides template arguments for rendering the fully wrapped, labeled and styled form Field.</p>      * <p>This method returns an object hash containing properties used by the layout's {@link #fieldTpl}      * to create a correctly wrapped, labeled and styled form Field. This may be overriden to      * create custom layouts. The properties which must be returned are:</p><div class="mdetail-params"><ul>      * <li><b><tt>itemCls</tt></b> : String<div class="sub-desc">The CSS class applied to the outermost div wrapper      * that contains this field label and field element (the default class is <tt>'x-form-item'</tt> and <tt>itemCls</tt>      * will be added to that). If supplied, <tt>itemCls</tt> at the field level will override the default <tt>itemCls</tt>      * supplied at the container level.</div></li>      * <li><b><tt>id</tt></b> : String<div class="sub-desc">The id of the Field</div></li>      * <li><b><tt>{@link #labelStyle}</tt></b> : String<div class="sub-desc">      * A CSS style specification string to add to the field label for this field (defaults to <tt>''</tt> or the      * {@link #labelStyle layout's value for <tt>labelStyle</tt>}).</div></li>      * <li><b><tt>label</tt></b> : String<div class="sub-desc">The text to display as the label for this      * field (defaults to <tt>''</tt>)</div></li>      * <li><b><tt>{@link #labelSeparator}</tt></b> : String<div class="sub-desc">The separator to display after      * the text of the label for this field (defaults to a colon <tt>':'</tt> or the      * {@link #labelSeparator layout's value for labelSeparator}). To hide the separator use empty string ''.</div></li>      * <li><b><tt>elementStyle</tt></b> : String<div class="sub-desc">The styles text for the input element's wrapper.</div></li>      * <li><b><tt>clearCls</tt></b> : String<div class="sub-desc">The CSS class to apply to the special clearing div      * rendered directly after each form field wrapper (defaults to <tt>'x-form-clear-left'</tt>)</div></li>      * </ul></div>      * @param field The {@link Field Ext.form.Field} being rendered.      * @return An object hash containing the properties required to render the Field.      */     getTemplateArgs: function(field) {         var noLabelSep = !field.fieldLabel || field.hideLabel;         return {             id: field.id,             label: field.fieldLabel,             labelStyle: field.labelStyle||this.labelStyle||'',             elementStyle: this.elementStyle||'',             labelSeparator: noLabelSep ? '' : (typeof field.labelSeparator == 'undefined' ? this.labelSeparator : field.labelSeparator),             itemCls: (field.itemCls||this.container.itemCls||'') + (field.hideLabel ? ' x-hide-label' : ''),             clearCls: field.clearCls || 'x-form-clear-left'         };     },     // private     adjustWidthAnchor : function(value, comp){         return value - (comp.isFormField || comp.fieldLabel  ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);     },     // private     isValidParent : function(c, target){         return true;     }     /**      * @property activeItem      * @hide      */ }); Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;/**
  67.  * @class Ext.layout.AccordionLayout
  68.  * @extends Ext.layout.FitLayout
  69.  * <p>This is a layout that contains multiple panels in an expandable accordion style such that only
  70.  * <b>one panel can be open at any given time</b>.  Each panel has built-in support for expanding and collapsing.
  71.  * <p>This class is intended to be extended or created via the <tt><b>{@link Ext.Container#layout layout}</b></tt>
  72.  * configuration property.  See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>
  73.  * <p>Example usage:</p>
  74.  * <pre><code>
  75. var accordion = new Ext.Panel({
  76.     title: 'Accordion Layout',
  77.     layout:'accordion',
  78.     defaults: {
  79.         // applied to each contained panel
  80.         bodyStyle: 'padding:15px'
  81.     },
  82.     layoutConfig: {
  83.         // layout-specific configs go here
  84.         titleCollapse: false,
  85.         animate: true,
  86.         activeOnTop: true
  87.     },
  88.     items: [{
  89.         title: 'Panel 1',
  90.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  91.     },{
  92.         title: 'Panel 2',
  93.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  94.     },{
  95.         title: 'Panel 3',
  96.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  97.     }]
  98. });
  99. </code></pre>
  100.  */
  101. Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, {
  102.     /**
  103.      * @cfg {Boolean} fill
  104.      * True to adjust the active item's height to fill the available space in the container, false to use the
  105.      * item's current height, or auto height if not explicitly set (defaults to true).
  106.      */
  107.     fill : true,
  108.     /**
  109.      * @cfg {Boolean} autoWidth
  110.      * True to set each contained item's width to 'auto', false to use the item's current width (defaults to true).
  111.      * Note that some components, in particular the {@link Ext.grid.GridPanel grid}, will not function properly within
  112.      * layouts if they have auto width, so in such cases this config should be set to false.
  113.      */
  114.     autoWidth : true,
  115.     /**
  116.      * @cfg {Boolean} titleCollapse
  117.      * True to allow expand/collapse of each contained panel by clicking anywhere on the title bar, false to allow
  118.      * expand/collapse only when the toggle tool button is clicked (defaults to true).  When set to false,
  119.      * {@link #hideCollapseTool} should be false also.
  120.      */
  121.     titleCollapse : true,
  122.     /**
  123.      * @cfg {Boolean} hideCollapseTool
  124.      * True to hide the contained panels' collapse/expand toggle buttons, false to display them (defaults to false).
  125.      * When set to true, {@link #titleCollapse} should be true also.
  126.      */
  127.     hideCollapseTool : false,
  128.     /**
  129.      * @cfg {Boolean} collapseFirst
  130.      * True to make sure the collapse/expand toggle button always renders first (to the left of) any other tools
  131.      * in the contained panels' title bars, false to render it last (defaults to false).
  132.      */
  133.     collapseFirst : false,
  134.     /**
  135.      * @cfg {Boolean} animate
  136.      * True to slide the contained panels open and closed during expand/collapse using animation, false to open and
  137.      * close directly with no animation (defaults to false).  Note: to defer to the specific config setting of each
  138.      * contained panel for this property, set this to undefined at the layout level.
  139.      */
  140.     animate : false,
  141.     /**
  142.      * @cfg {Boolean} sequence
  143.      * <b>Experimental</b>. If animate is set to true, this will result in each animation running in sequence.
  144.      */
  145.     sequence : false,
  146.     /**
  147.      * @cfg {Boolean} activeOnTop
  148.      * True to swap the position of each panel as it is expanded so that it becomes the first item in the container,
  149.      * false to keep the panels in the rendered order. <b>This is NOT compatible with "animate:true"</b> (defaults to false).
  150.      */
  151.     activeOnTop : false,
  152.     renderItem : function(c){
  153.         if(this.animate === false){
  154.             c.animCollapse = false;
  155.         }
  156.         c.collapsible = true;
  157.         if(this.autoWidth){
  158.             c.autoWidth = true;
  159.         }
  160.         if(this.titleCollapse){
  161.             c.titleCollapse = true;
  162.         }
  163.         if(this.hideCollapseTool){
  164.             c.hideCollapseTool = true;
  165.         }
  166.         if(this.collapseFirst !== undefined){
  167.             c.collapseFirst = this.collapseFirst;
  168.         }
  169.         if(!this.activeItem && !c.collapsed){
  170.             this.activeItem = c;
  171.         }else if(this.activeItem && this.activeItem != c){
  172.             c.collapsed = true;
  173.         }
  174.         Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments);
  175.         c.header.addClass('x-accordion-hd');
  176.         c.on('beforeexpand', this.beforeExpand, this);
  177.     },
  178.     // private
  179.     beforeExpand : function(p, anim){
  180.         var ai = this.activeItem;
  181.         if(ai){
  182.             if(this.sequence){
  183.                 delete this.activeItem;
  184.                 if (!ai.collapsed){
  185.                     ai.collapse({callback:function(){
  186.                         p.expand(anim || true);
  187.                     }, scope: this});
  188.                     return false;
  189.                 }
  190.             }else{
  191.                 ai.collapse(this.animate);
  192.             }
  193.         }
  194.         this.activeItem = p;
  195.         if(this.activeOnTop){
  196.             p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
  197.         }
  198.         this.layout();
  199.     },
  200.     // private
  201.     setItemSize : function(item, size){
  202.         if(this.fill && item){
  203.             var hh = 0;
  204.             this.container.items.each(function(p){
  205.                 if(p != item){
  206.                     hh += p.header.getHeight();
  207.                 }    
  208.             });
  209.             size.height -= hh;
  210.             item.setSize(size);
  211.         }
  212.     },
  213.     /**
  214.      * Sets the active (expanded) item in the layout.
  215.      * @param {String/Number} item The string component id or numeric index of the item to activate
  216.      */
  217.     setActiveItem : function(item){
  218.         item = this.container.getComponent(item);
  219.         if(this.activeItem != item){
  220.             if(item.rendered && item.collapsed){
  221.                 item.expand();
  222.             }else{
  223.                 this.activeItem = item;
  224.             }
  225.         }
  226.     }
  227. });
  228. Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout;
  229. //backwards compat
  230. Ext.layout.Accordion = Ext.layout.AccordionLayout;/**
  231.  * @class Ext.layout.TableLayout
  232.  * @extends Ext.layout.ContainerLayout
  233.  * <p>This layout allows you to easily render content into an HTML table.  The total number of columns can be
  234.  * specified, and rowspan and colspan can be used to create complex layouts within the table.
  235.  * This class is intended to be extended or created via the layout:'table' {@link Ext.Container#layout} config,
  236.  * and should generally not need to be created directly via the new keyword.</p>
  237.  * <p>Note that when creating a layout via config, the layout-specific config properties must be passed in via
  238.  * the {@link Ext.Container#layoutConfig} object which will then be applied internally to the layout.  In the
  239.  * case of TableLayout, the only valid layout config property is {@link #columns}.  However, the items added to a
  240.  * TableLayout can supply the following table-specific config properties:</p>
  241.  * <ul>
  242.  * <li><b>rowspan</b> Applied to the table cell containing the item.</li>
  243.  * <li><b>colspan</b> Applied to the table cell containing the item.</li>
  244.  * <li><b>cellId</b> An id applied to the table cell containing the item.</li>
  245.  * <li><b>cellCls</b> A CSS class name added to the table cell containing the item.</li>
  246.  * </ul>
  247.  * <p>The basic concept of building up a TableLayout is conceptually very similar to building up a standard
  248.  * HTML table.  You simply add each panel (or "cell") that you want to include along with any span attributes
  249.  * specified as the special config properties of rowspan and colspan which work exactly like their HTML counterparts.
  250.  * Rather than explicitly creating and nesting rows and columns as you would in HTML, you simply specify the
  251.  * total column count in the layoutConfig and start adding panels in their natural order from left to right,
  252.  * top to bottom.  The layout will automatically figure out, based on the column count, rowspans and colspans,
  253.  * how to position each panel within the table.  Just like with HTML tables, your rowspans and colspans must add
  254.  * up correctly in your overall layout or you'll end up with missing and/or extra cells!  Example usage:</p>
  255.  * <pre><code>
  256. // This code will generate a layout table that is 3 columns by 2 rows
  257. // with some spanning included.  The basic layout will be:
  258. // +--------+-----------------+
  259. // |   A    |   B             |
  260. // |        |--------+--------|
  261. // |        |   C    |   D    |
  262. // +--------+--------+--------+
  263. var table = new Ext.Panel({
  264.     title: 'Table Layout',
  265.     layout:'table',
  266.     defaults: {
  267.         // applied to each contained panel
  268.         bodyStyle:'padding:20px'
  269.     },
  270.     layoutConfig: {
  271.         // The total column count must be specified here
  272.         columns: 3
  273.     },
  274.     items: [{
  275.         html: '&lt;p&gt;Cell A content&lt;/p&gt;',
  276.         rowspan: 2
  277.     },{
  278.         html: '&lt;p&gt;Cell B content&lt;/p&gt;',
  279.         colspan: 2
  280.     },{
  281.         html: '&lt;p&gt;Cell C content&lt;/p&gt;',
  282.         cellCls: 'highlight'
  283.     },{
  284.         html: '&lt;p&gt;Cell D content&lt;/p&gt;'
  285.     }]
  286. });
  287. </code></pre>
  288.  */
  289. Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
  290.     /**
  291.      * @cfg {Number} columns
  292.      * The total number of columns to create in the table for this layout.  If not specified, all Components added to
  293.      * this layout will be rendered into a single row using one column per Component.
  294.      */
  295.     // private
  296.     monitorResize:false,
  297.     /**
  298.      * @cfg {Object} tableAttrs
  299.      * <p>An object containing properties which are added to the {@link Ext.DomHelper DomHelper} specification
  300.      * used to create the layout's <tt>&lt;table&gt;</tt> element. Example:</p><pre><code>
  301. {
  302.     xtype: 'panel',
  303.     layout: 'table',
  304.     layoutConfig: {
  305.         tableAttrs: {
  306.          style: {
  307.          width: '100%'
  308.          }
  309.         },
  310.         columns: 3
  311.     }
  312. }</code></pre>
  313.      */
  314.     tableAttrs:null,
  315.     
  316.     // private
  317.     setContainer : function(ct){
  318.         Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
  319.         this.currentRow = 0;
  320.         this.currentColumn = 0;
  321.         this.cells = [];
  322.     },
  323.     // private
  324.     onLayout : function(ct, target){
  325.         var cs = ct.items.items, len = cs.length, c, i;
  326.         if(!this.table){
  327.             target.addClass('x-table-layout-ct');
  328.             this.table = target.createChild(
  329.                 Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
  330.         }
  331.         this.renderAll(ct, target);
  332.     },
  333.     // private
  334.     getRow : function(index){
  335.         var row = this.table.tBodies[0].childNodes[index];
  336.         if(!row){
  337.             row = document.createElement('tr');
  338.             this.table.tBodies[0].appendChild(row);
  339.         }
  340.         return row;
  341.     },
  342.     // private
  343.     getNextCell : function(c){
  344.         var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
  345.         var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
  346.         for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
  347.             if(!this.cells[rowIndex]){
  348.                 this.cells[rowIndex] = [];
  349.             }
  350.             for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
  351.                 this.cells[rowIndex][colIndex] = true;
  352.             }
  353.         }
  354.         var td = document.createElement('td');
  355.         if(c.cellId){
  356.             td.id = c.cellId;
  357.         }
  358.         var cls = 'x-table-layout-cell';
  359.         if(c.cellCls){
  360.             cls += ' ' + c.cellCls;
  361.         }
  362.         td.className = cls;
  363.         if(c.colspan){
  364.             td.colSpan = c.colspan;
  365.         }
  366.         if(c.rowspan){
  367.             td.rowSpan = c.rowspan;
  368.         }
  369.         this.getRow(curRow).appendChild(td);
  370.         return td;
  371.     },
  372.     
  373.     // private
  374.     getNextNonSpan: function(colIndex, rowIndex){
  375.         var cols = this.columns;
  376.         while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
  377.             if(cols && colIndex >= cols){
  378.                 rowIndex++;
  379.                 colIndex = 0;
  380.             }else{
  381.                 colIndex++;
  382.             }
  383.         }
  384.         return [colIndex, rowIndex];
  385.     },
  386.     // private
  387.     renderItem : function(c, position, target){
  388.         if(c && !c.rendered){
  389.             c.render(this.getNextCell(c));
  390.             if(this.extraCls){
  391.                 var t = c.getPositionEl ? c.getPositionEl() : c;
  392.                 t.addClass(this.extraCls);
  393.             }
  394.         }
  395.     },
  396.     // private
  397.     isValidParent : function(c, target){
  398.         return true;
  399.     }
  400.     /**
  401.      * @property activeItem
  402.      * @hide
  403.      */
  404. });
  405. Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;/**
  406.  * @class Ext.layout.AbsoluteLayout
  407.  * @extends Ext.layout.AnchorLayout
  408.  * <p>This is a layout that inherits the anchoring of <b>{@link Ext.layout.AnchorLayout}</b> and adds the
  409.  * ability for x/y positioning using the standard x and y component config options.</p>
  410.  * <p>This class is intended to be extended or created via the <tt><b>{@link Ext.Container#layout layout}</b></tt>
  411.  * configuration property.  See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>
  412.  * <p>Example usage:</p>
  413.  * <pre><code>
  414. var form = new Ext.form.FormPanel({
  415.     title: 'Absolute Layout',
  416.     layout:'absolute',
  417.     layoutConfig: {
  418.         // layout-specific configs go here
  419.         extraCls: 'x-abs-layout-item',
  420.     },
  421.     baseCls: 'x-plain',
  422.     url:'save-form.php',
  423.     defaultType: 'textfield',
  424.     items: [{
  425.         x: 0,
  426.         y: 5,
  427.         xtype:'label',
  428.         text: 'Send To:'
  429.     },{
  430.         x: 60,
  431.         y: 0,
  432.         name: 'to',
  433.         anchor:'100%'  // anchor width by percentage
  434.     },{
  435.         x: 0,
  436.         y: 35,
  437.         xtype:'label',
  438.         text: 'Subject:'
  439.     },{
  440.         x: 60,
  441.         y: 30,
  442.         name: 'subject',
  443.         anchor: '100%'  // anchor width by percentage
  444.     },{
  445.         x:0,
  446.         y: 60,
  447.         xtype: 'textarea',
  448.         name: 'msg',
  449.         anchor: '100% 100%'  // anchor width and height
  450.     }]
  451. });
  452. </code></pre>
  453.  */
  454. Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
  455.     extraCls: 'x-abs-layout-item',
  456.     onLayout : function(ct, target){
  457.         target.position();
  458.         this.paddingLeft = target.getPadding('l');
  459.         this.paddingTop = target.getPadding('t');
  460.         Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
  461.     },
  462.     // private
  463.     adjustWidthAnchor : function(value, comp){
  464.         return value ? value - comp.getPosition(true)[0] + this.paddingLeft : value;
  465.     },
  466.     // private
  467.     adjustHeightAnchor : function(value, comp){
  468.         return  value ? value - comp.getPosition(true)[1] + this.paddingTop : value;
  469.     }
  470.     /**
  471.      * @property activeItem
  472.      * @hide
  473.      */
  474. });
  475. Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout; /**
  476.  * @class Ext.layout.BoxLayout
  477.  * @extends Ext.layout.ContainerLayout
  478.  * <p>Base Class for HBoxLayout and VBoxLayout Classes. Generally it should not need to be used directly.</p>
  479.  */
  480. Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
  481.     /**
  482.      * @cfg {Object} defaultMargins
  483.      * <p>If the individual contained items do not have a <tt>margins</tt>
  484.      * property specified, the default margins from this property will be
  485.      * applied to each item.</p>
  486.      * <br><p>This property may be specified as an object containing margins
  487.      * to apply in the format:</p><pre><code>
  488. {
  489.     top: (top margin),
  490.     right: (right margin),
  491.     bottom: (bottom margin),
  492.     left: (left margin)
  493. }</code></pre>
  494.      * <p>This property may also be specified as a string containing
  495.      * space-separated, numeric margin values. The order of the sides associated
  496.      * with each value matches the way CSS processes margin values:</p>
  497.      * <div class="mdetail-params"><ul>
  498.      * <li>If there is only one value, it applies to all sides.</li>
  499.      * <li>If there are two values, the top and bottom borders are set to the
  500.      * first value and the right and left are set to the second.</li>
  501.      * <li>If there are three values, the top is set to the first value, the left
  502.      * and right are set to the second, and the bottom is set to the third.</li>
  503.      * <li>If there are four values, they apply to the top, right, bottom, and
  504.      * left, respectively.</li>
  505.      * </ul></div>
  506.      * <p>Defaults to:</p><pre><code>
  507.      * {top:0, right:0, bottom:0, left:0}
  508.      * </code></pre>
  509.      */
  510.     defaultMargins : {left:0,top:0,right:0,bottom:0},
  511.     /**
  512.      * @cfg {String} padding
  513.      * Defaults to <tt>'0'</tt>. Sets the padding to be applied to all child items managed by this
  514.      * container's layout. 
  515.      */
  516.     padding : '0',
  517.     // documented in subclasses
  518.     pack : 'start',
  519.     // private
  520.     monitorResize : true,
  521.     scrollOffset : 0,
  522.     extraCls : 'x-box-item',
  523.     ctCls : 'x-box-layout-ct',
  524.     innerCls : 'x-box-inner',
  525.     // private
  526.     isValidParent : function(c, target){
  527.         return c.getEl().dom.parentNode == this.innerCt.dom;
  528.     },
  529.     // private
  530.     onLayout : function(ct, target){
  531.         var cs = ct.items.items, len = cs.length, c, i, last = len-1, cm;
  532.         if(!this.innerCt){
  533.             target.addClass(this.ctCls);
  534.             // the innerCt prevents wrapping and shuffling while
  535.             // the container is resizing
  536.             this.innerCt = target.createChild({cls:this.innerCls});
  537.             this.padding = this.parseMargins(this.padding); 
  538.         }
  539.         this.renderAll(ct, this.innerCt);
  540.     },
  541.     // private
  542.     renderItem : function(c){
  543.         if(typeof c.margins == 'string'){
  544.             c.margins = this.parseMargins(c.margins);
  545.         }else if(!c.margins){
  546.             c.margins = this.defaultMargins;
  547.         }
  548.         Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
  549.     },
  550.     getTargetSize : function(target){         return (Ext.isIE6 && Ext.isStrict && target.dom == document.body) ? target.getStyleSize() : target.getViewSize();
  551.     },
  552.     
  553.     getItems: function(ct){
  554.         var items = [];
  555.         ct.items.each(function(c){
  556.             if(c.isVisible()){
  557.                 items.push(c);
  558.             }
  559.         });
  560.         return items;
  561.     }
  562.     /**
  563.      * @property activeItem
  564.      * @hide
  565.      */
  566. });
  567. /**
  568.  * @class Ext.layout.VBoxLayout
  569.  * @extends Ext.layout.BoxLayout
  570.  * A layout that arranges items vertically
  571.  */
  572. Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  573.     /**
  574.      * @cfg {String} align
  575.      * Controls how the child items of the container are aligned. Acceptable configuration values for this
  576.      * property are:
  577.      * <div class="mdetail-params"><ul>
  578.      * <li><b><tt>left</tt></b> : <b>Default</b><div class="sub-desc">child items are aligned horizontally
  579.      * at the <b>left</b> side of the container</div></li>
  580.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are aligned horizontally at the
  581.      * <b>mid-width</b> of the container</div></li>
  582.      * <li><b><tt>stretch</tt></b> : <div class="sub-desc">child items are stretched horizontally to fill
  583.      * the width of the container</div></li>
  584.      * <li><b><tt>stretchmax</tt></b> : <div class="sub-desc">child items are stretched horizontally to
  585.      * the size of the largest item.</div></li>
  586.      * </ul></div>
  587.      */
  588.     align : 'left', // left, center, stretch, strechmax
  589.     /**
  590.      * @cfg {String} pack
  591.      * Controls how the child items of the container are packed together. Acceptable configuration values
  592.      * for this property are:
  593.      * <div class="mdetail-params"><ul>
  594.      * <li><b><tt>start</tt></b> : <b>Default</b><div class="sub-desc">child items are packed together at
  595.      * <b>top</b> side of container</div></li>
  596.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are packed together at
  597.      * <b>mid-height</b> of container</div></li>
  598.      * <li><b><tt>end</tt></b> : <div class="sub-desc">child items are packed together at <b>bottom</b>
  599.      * side of container</div></li>
  600.      * </ul></div>
  601.      */
  602.     /**
  603.      * @cfg {Number} flex
  604.      * This configuation option is to be applied to <b>child <tt>items</tt></b> of the container managed
  605.      * by this layout. Each child item with a <tt>flex</tt> property will be flexed <b>vertically</b>
  606.      * according to each item's <b>relative</b> <tt>flex</tt> value compared to the sum of all items with
  607.      * a <tt>flex</tt> value specified.  Any child items that have either a <tt>flex = 0</tt> or
  608.      * <tt>flex = undefined</tt> will not be 'flexed' (the initial size will not be changed).
  609.      */
  610.     // private
  611.     onLayout : function(ct, target){
  612.         Ext.layout.VBoxLayout.superclass.onLayout.call(this, ct, target);
  613.                     
  614.         
  615.         var cs = this.getItems(ct), cm, ch, margin,
  616.             size = this.getTargetSize(target),
  617.             w = size.width - target.getPadding('lr') - this.scrollOffset,
  618.             h = size.height - target.getPadding('tb'),
  619.             l = this.padding.left, t = this.padding.top,
  620.             isStart = this.pack == 'start',
  621.             isRestore = ['stretch', 'stretchmax'].indexOf(this.align) == -1,
  622.             stretchWidth = w - (this.padding.left + this.padding.right),
  623.             extraHeight = 0,
  624.             maxWidth = 0,
  625.             totalFlex = 0,
  626.             flexHeight = 0,
  627.             usedHeight = 0;
  628.             
  629.         Ext.each(cs, function(c){
  630.             cm = c.margins;
  631.             totalFlex += c.flex || 0;
  632.             ch = c.getHeight();
  633.             margin = cm.top + cm.bottom;
  634.             extraHeight += ch + margin;
  635.             flexHeight += margin + (c.flex ? 0 : ch);
  636.             maxWidth = Math.max(maxWidth, c.getWidth() + cm.left + cm.right);
  637.         });
  638.         extraHeight = h - extraHeight - this.padding.top - this.padding.bottom;
  639.         
  640.         var innerCtWidth = maxWidth + this.padding.left + this.padding.right;
  641.         switch(this.align){
  642.             case 'stretch':
  643.                 this.innerCt.setSize(w, h);
  644.                 break;
  645.             case 'stretchmax':
  646.             case 'left':
  647.                 this.innerCt.setSize(innerCtWidth, h);
  648.                 break;
  649.             case 'center':
  650.                 this.innerCt.setSize(w = Math.max(w, innerCtWidth), h);
  651.                 break;
  652.         }
  653.         var availHeight = Math.max(0, h - this.padding.top - this.padding.bottom - flexHeight),
  654.             leftOver = availHeight,
  655.             heights = [],
  656.             restore = [],
  657.             idx = 0,
  658.             availableWidth = Math.max(0, w - this.padding.left - this.padding.right);
  659.             
  660.         Ext.each(cs, function(c){
  661.             if(isStart && c.flex){
  662.                 ch = Math.floor(availHeight * (c.flex / totalFlex));
  663.                 leftOver -= ch;
  664.                 heights.push(ch);
  665.             }
  666.         }); 
  667.         
  668.         if(this.pack == 'center'){
  669.             t += extraHeight ? extraHeight / 2 : 0;
  670.         }else if(this.pack == 'end'){
  671.             t += extraHeight;
  672.         }
  673.         Ext.each(cs, function(c){
  674.             cm = c.margins;
  675.             t += cm.top;
  676.             c.setPosition(l + cm.left, t);
  677.             if(isStart && c.flex){
  678.                 ch = Math.max(0, heights[idx++] + (leftOver-- > 0 ? 1 : 0));
  679.                 if(isRestore){
  680.                     restore.push(c.getWidth());
  681.                 }
  682.                 c.setSize(availableWidth, ch);
  683.             }else{
  684.                 ch = c.getHeight();
  685.             }
  686.             t += ch + cm.bottom;
  687.         });
  688.         
  689.         idx = 0;
  690.         Ext.each(cs, function(c){
  691.             cm = c.margins;
  692.             if(this.align == 'stretch'){
  693.                 c.setWidth((stretchWidth - (cm.left + cm.right)).constrain(
  694.                     c.minWidth || 0, c.maxWidth || 1000000));
  695.             }else if(this.align == 'stretchmax'){
  696.                 c.setWidth((maxWidth - (cm.left + cm.right)).constrain(
  697.                     c.minWidth || 0, c.maxWidth || 1000000));
  698.             }else{
  699.                 if(this.align == 'center'){
  700.                     var diff = availableWidth - (c.getWidth() + cm.left + cm.right);
  701.                     if(diff > 0){
  702.                         c.setPosition(l + cm.left + (diff/2), c.y);
  703.                     }
  704.                 }
  705.                 if(isStart && c.flex){
  706.                     c.setWidth(restore[idx++]);
  707.                 }
  708.             }
  709.         }, this);
  710.     }
  711.     /**
  712.      * @property activeItem
  713.      * @hide
  714.      */
  715. });
  716. Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;
  717. /**
  718.  * @class Ext.layout.HBoxLayout
  719.  * @extends Ext.layout.BoxLayout
  720.  * A layout that arranges items horizontally
  721.  */
  722. Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  723.     /**
  724.      * @cfg {String} align
  725.      * Controls how the child items of the container are aligned. Acceptable configuration values for this
  726.      * property are:
  727.      * <div class="mdetail-params"><ul>
  728.      * <li><b><tt>top</tt></b> : <b>Default</b><div class="sub-desc">child items are aligned vertically
  729.      * at the <b>left</b> side of the container</div></li>
  730.      * <li><b><tt>middle</tt></b> : <div class="sub-desc">child items are aligned vertically at the
  731.      * <b>mid-height</b> of the container</div></li>
  732.      * <li><b><tt>stretch</tt></b> : <div class="sub-desc">child items are stretched vertically to fill
  733.      * the height of the container</div></li>
  734.      * <li><b><tt>stretchmax</tt></b> : <div class="sub-desc">child items are stretched vertically to
  735.      * the size of the largest item.</div></li>
  736.      */
  737.     align : 'top', // top, middle, stretch, strechmax
  738.     /**
  739.      * @cfg {String} pack
  740.      * Controls how the child items of the container are packed together. Acceptable configuration values
  741.      * for this property are:
  742.      * <div class="mdetail-params"><ul>
  743.      * <li><b><tt>start</tt></b> : <b>Default</b><div class="sub-desc">child items are packed together at
  744.      * <b>left</b> side of container</div></li>
  745.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are packed together at
  746.      * <b>mid-width</b> of container</div></li>
  747.      * <li><b><tt>end</tt></b> : <div class="sub-desc">child items are packed together at <b>right</b>
  748.      * side of container</div></li>
  749.      * </ul></div>
  750.      */
  751.     /**
  752.      * @cfg {Number} flex
  753.      * This configuation option is to be applied to <b>child <tt>items</tt></b> of the container managed
  754.      * by this layout. Each child item with a <tt>flex</tt> property will be flexed <b>horizontally</b>
  755.      * according to each item's <b>relative</b> <tt>flex</tt> value compared to the sum of all items with
  756.      * a <tt>flex</tt> value specified.  Any child items that have either a <tt>flex = 0</tt> or
  757.      * <tt>flex = undefined</tt> will not be 'flexed' (the initial size will not be changed).
  758.      */
  759.     // private
  760.     onLayout : function(ct, target){
  761.         Ext.layout.HBoxLayout.superclass.onLayout.call(this, ct, target);
  762.         
  763.         var cs = this.getItems(ct), cm, cw, margin,
  764.             size = this.getTargetSize(target),
  765.             w = size.width - target.getPadding('lr') - this.scrollOffset,
  766.             h = size.height - target.getPadding('tb'),
  767.             l = this.padding.left, t = this.padding.top,
  768.             isStart = this.pack == 'start',
  769.             isRestore = ['stretch', 'stretchmax'].indexOf(this.align) == -1,
  770.             stretchHeight = h - (this.padding.top + this.padding.bottom),
  771.             extraWidth = 0,
  772.             maxHeight = 0,
  773.             totalFlex = 0,
  774.             flexWidth = 0,
  775.             usedWidth = 0;
  776.         
  777.         Ext.each(cs, function(c){
  778.             cm = c.margins;
  779.             totalFlex += c.flex || 0;
  780.             cw = c.getWidth();
  781.             margin = cm.left + cm.right;
  782.             extraWidth += cw + margin;
  783.             flexWidth += margin + (c.flex ? 0 : cw);
  784.             maxHeight = Math.max(maxHeight, c.getHeight() + cm.top + cm.bottom);
  785.         });
  786.         extraWidth = w - extraWidth - this.padding.left - this.padding.right;
  787.         
  788.         var innerCtHeight = maxHeight + this.padding.top + this.padding.bottom;
  789.         switch(this.align){
  790.             case 'stretch':
  791.                 this.innerCt.setSize(w, h);
  792.                 break;
  793.             case 'stretchmax':
  794.             case 'top':
  795.                 this.innerCt.setSize(w, innerCtHeight);
  796.                 break;
  797.             case 'middle':
  798.                 this.innerCt.setSize(w, h = Math.max(h, innerCtHeight));
  799.                 break;
  800.         }
  801.         
  802.         var availWidth = Math.max(0, w - this.padding.left - this.padding.right - flexWidth),
  803.             leftOver = availWidth,
  804.             widths = [],
  805.             restore = [],
  806.             idx = 0,
  807.             availableHeight = Math.max(0, h - this.padding.top - this.padding.bottom);
  808.             
  809.         Ext.each(cs, function(c){
  810.             if(isStart && c.flex){
  811.                 cw = Math.floor(availWidth * (c.flex / totalFlex));
  812.                 leftOver -= cw;
  813.                 widths.push(cw);
  814.             }
  815.         }); 
  816.         
  817.         if(this.pack == 'center'){
  818.             l += extraWidth ? extraWidth / 2 : 0;
  819.         }else if(this.pack == 'end'){
  820.             l += extraWidth;
  821.         }
  822.         Ext.each(cs, function(c){
  823.             cm = c.margins;
  824.             l += cm.left;
  825.             c.setPosition(l, t + cm.top);
  826.             if(isStart && c.flex){
  827.                 cw = Math.max(0, widths[idx++] + (leftOver-- > 0 ? 1 : 0));
  828.                 if(isRestore){
  829.                     restore.push(c.getHeight());
  830.                 }
  831.                 c.setSize(cw, availableHeight);
  832.             }else{
  833.                 cw = c.getWidth();
  834.             }
  835.             l += cw + cm.right;
  836.         });
  837.         
  838.         idx = 0;
  839.         Ext.each(cs, function(c){
  840.             var cm = c.margins;
  841.             if(this.align == 'stretch'){
  842.                 c.setHeight((stretchHeight - (cm.top + cm.bottom)).constrain(
  843.                     c.minHeight || 0, c.maxHeight || 1000000));
  844.             }else if(this.align == 'stretchmax'){
  845.                 c.setHeight((maxHeight - (cm.top + cm.bottom)).constrain(
  846.                     c.minHeight || 0, c.maxHeight || 1000000));
  847.             }else{
  848.                 if(this.align == 'middle'){
  849.                     var diff = availableHeight - (c.getHeight() + cm.top + cm.bottom);
  850.                     if(diff > 0){
  851.                         c.setPosition(c.x, t + cm.top + (diff/2));
  852.                     }
  853.                 }
  854.                 if(isStart && c.flex){
  855.                     c.setHeight(restore[idx++]);
  856.                 }
  857.             }
  858.         }, this);
  859.     }
  860.     /**
  861.      * @property activeItem
  862.      * @hide
  863.      */
  864. });
  865. Ext.Container.LAYOUTS.hbox = Ext.layout.HBoxLayout; /**
  866.  * @class Ext.Viewport
  867.  * @extends Ext.Container
  868.  * <p>A specialized container representing the viewable application area (the browser viewport).</p>
  869.  * <p>The Viewport renders itself to the document body, and automatically sizes itself to the size of
  870.  * the browser viewport and manages window resizing. There may only be one Viewport created
  871.  * in a page. Inner layouts are available by virtue of the fact that all {@link Ext.Panel Panel}s
  872.  * added to the Viewport, either through its {@link #items}, or through the items, or the {@link #add}
  873.  * method of any of its child Panels may themselves have a layout.</p>
  874.  * <p>The Viewport does not provide scrolling, so child Panels within the Viewport should provide
  875.  * for scrolling if needed using the {@link #autoScroll} config.</p>
  876.  * <p>An example showing a classic application border layout:</p><pre><code>
  877. new Ext.Viewport({
  878.     layout: 'border',
  879.     items: [{
  880.         region: 'north',
  881.         html: '&lt;h1 class="x-panel-header">Page Title&lt;/h1>',
  882.         autoHeight: true,
  883.         border: false,
  884.         margins: '0 0 5 0'
  885.     }, {
  886.         region: 'west',
  887.         collapsible: true,
  888.         title: 'Navigation',
  889.         width: 200
  890.         // the west region might typically utilize a {@link Ext.tree.TreePanel TreePanel} or a Panel with {@link Ext.layout.AccordionLayout Accordion layout} 
  891.     }, {
  892.         region: 'south',
  893.         title: 'Title for Panel',
  894.         collapsible: true,
  895.         html: 'Information goes here',
  896.         split: true,
  897.         height: 100,
  898.         minHeight: 100
  899.     }, {
  900.         region: 'east',
  901.         title: 'Title for the Grid Panel',
  902.         collapsible: true,
  903.         split: true,
  904.         width: 200,
  905.         xtype: 'grid',
  906.         // remaining grid configuration not shown ...
  907.         // notice that the GridPanel is added directly as the region
  908.         // it is not "overnested" inside another Panel
  909.     }, {
  910.         region: 'center',
  911.         xtype: 'tabpanel', // TabPanel itself has no title
  912.         items: {
  913.             title: 'Default Tab',
  914.             html: 'The first tab's content. Others may be added dynamically'
  915.         }
  916.     }]
  917. });
  918. </code></pre>
  919.  * @constructor
  920.  * Create a new Viewport
  921.  * @param {Object} config The config object
  922.  * @xtype viewport
  923.  */
  924. Ext.Viewport = Ext.extend(Ext.Container, {
  925. /*
  926.  * Privatize config options which, if used, would interfere with the
  927.  * correct operation of the Viewport as the sole manager of the
  928.  * layout of the document body.
  929.  */
  930.     /**
  931.      * @cfg {Mixed} applyTo @hide
  932.  */
  933.     /**
  934.      * @cfg {Boolean} allowDomMove @hide
  935.  */
  936.     /**
  937.      * @cfg {Boolean} hideParent @hide
  938.  */
  939.     /**
  940.      * @cfg {Mixed} renderTo @hide
  941.  */
  942.     /**
  943.      * @cfg {Boolean} hideParent @hide
  944.  */
  945.     /**
  946.      * @cfg {Number} height @hide
  947.  */
  948.     /**
  949.      * @cfg {Number} width @hide
  950.  */
  951.     /**
  952.      * @cfg {Boolean} autoHeight @hide
  953.  */
  954.     /**
  955.      * @cfg {Boolean} autoWidth @hide
  956.  */
  957.     /**
  958.      * @cfg {Boolean} deferHeight @hide
  959.  */
  960.     /**
  961.      * @cfg {Boolean} monitorResize @hide
  962.  */
  963.     initComponent : function() {
  964.         Ext.Viewport.superclass.initComponent.call(this);
  965.         document.getElementsByTagName('html')[0].className += ' x-viewport';
  966.         this.el = Ext.getBody();
  967.         this.el.setHeight = Ext.emptyFn;
  968.         this.el.setWidth = Ext.emptyFn;
  969.         this.el.setSize = Ext.emptyFn;
  970.         this.el.dom.scroll = 'no';
  971.         this.allowDomMove = false;
  972.         this.autoWidth = true;
  973.         this.autoHeight = true;
  974.         Ext.EventManager.onWindowResize(this.fireResize, this);
  975.         this.renderTo = this.el;
  976.     },
  977.     fireResize : function(w, h){
  978.         this.fireEvent('resize', this, w, h, w, h);
  979.     }
  980. });
  981. Ext.reg('viewport', Ext.Viewport);/**  * @class Ext.Panel  * @extends Ext.Container  * <p>Panel is a container that has specific functionality and structural components that make  * it the perfect building block for application-oriented user interfaces.</p>  * <p>Panels are, by virtue of their inheritance from {@link Ext.Container}, capable  * of being configured with a {@link Ext.Container#layout layout}, and containing child Components.</p>  * <p>When either specifying child {@link Ext.Component#items items} of a Panel, or dynamically {@link Ext.Container#add adding} Components  * to a Panel, remember to consider how you wish the Panel to arrange those child elements, and whether  * those child elements need to be sized using one of Ext's built-in <tt><b>{@link Ext.Container#layout layout}</b></tt> schemes. By  * default, Panels use the {@link Ext.layout.ContainerLayout ContainerLayout} scheme. This simply renders  * child components, appending them one after the other inside the Container, and <b>does not apply any sizing</b>  * at all.</p>  * <p>A Panel may also contain {@link #bbar bottom} and {@link #tbar top} toolbars, along with separate  * {@link #header}, {@link #footer} and {@link #body} sections (see {@link #frame} for additional  * information).</p>  * <p>Panel also provides built-in {@link #collapsible expandable and collapsible behavior}, along with  * a variety of {@link #tools prebuilt tool buttons} that can be wired up to provide other customized  * behavior.  Panels can be easily dropped into any {@link Ext.Container Container} or layout, and the  * layout and rendering pipeline is {@link Ext.Container#add completely managed by the framework}.</p>  * @constructor  * @param {Object} config The config object  * @xtype panel  */ Ext.Panel = Ext.extend(Ext.Container, {     /**      * The Panel's header {@link Ext.Element Element}. Read-only.      * <p>This Element is used to house the {@link #title} and {@link #tools}</p>      * <br><p><b>Note</b>: see the Note for <tt>{@link Ext.Component#el el} also.</p>      * @type Ext.Element      * @property header      */     /**      * The Panel's body {@link Ext.Element Element} which may be used to contain HTML content.      * The content may be specified in the {@link #html} config, or it may be loaded using the      * {@link autoLoad} config, or through the Panel's {@link #getUpdater Updater}. Read-only.      * <p>If this is used to load visible HTML elements in either way, then      * the Panel may not be used as a Layout for hosting nested Panels.</p>      * <p>If this Panel is intended to be used as the host of a Layout (See {@link #layout}      * then the body Element must not be loaded or changed - it is under the control      * of the Panel's Layout.      * <br><p><b>Note</b>: see the Note for <tt>{@link Ext.Component#el el} also.</p>      * @type Ext.Element      * @property body      */     /**      * The Panel's bwrap {@link Ext.Element Element} used to contain other Panel elements      * (tbar, body, bbar, footer). See {@link #bodyCfg}. Read-only.      * @type Ext.Element      * @property bwrap      */     /**      * True if this panel is collapsed. Read-only.      * @type Boolean      * @property collapsed      */     /**      * @cfg {Object} bodyCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object may be specified for any      * Panel Element.</p>      * <p>By default, the Default element in the table below will be used for the html markup to      * create a child element with the commensurate Default class name (<tt>baseCls</tt> will be      * replaced by <tt>{@link #baseCls}</tt>):</p>      * <pre>      * Panel      Default  Default             Custom      Additional       Additional      * Element    element  class               element     class            style      * ========   ==========================   =========   ==============   ===========      * {@link #header}     div      {@link #baseCls}+'-header'   {@link #headerCfg}   headerCssClass   headerStyle      * {@link #bwrap}      div      {@link #baseCls}+'-bwrap'     {@link #bwrapCfg}    bwrapCssClass    bwrapStyle      * + tbar     div      {@link #baseCls}+'-tbar'       {@link #tbarCfg}     tbarCssClass     tbarStyle      * + {@link #body}     div      {@link #baseCls}+'-body'       {@link #bodyCfg}     {@link #bodyCssClass}     {@link #bodyStyle}      * + bbar     div      {@link #baseCls}+'-bbar'       {@link #bbarCfg}     bbarCssClass     bbarStyle      * + {@link #footer}   div      {@link #baseCls}+'-footer'   {@link #footerCfg}   footerCssClass   footerStyle      * </pre>      * <p>Configuring a Custom element may be used, for example, to force the {@link #body} Element      * to use a different form of markup than is created by default. An example of this might be      * to {@link Ext.Element#createChild create a child} Panel containing a custom content, such as      * a header, or forcing centering of all Panel content by having the body be a &lt;center&gt;      * element:</p>      * <pre><code> new Ext.Panel({     title: 'Message Title',     renderTo: Ext.getBody(),     width: 200, height: 130,     <b>bodyCfg</b>: {         tag: 'center',         cls: 'x-panel-body',  // Default class not applied if Custom element specified         html: 'Message'     },     footerCfg: {         tag: 'h2',         cls: 'x-panel-footer'        // same as the Default class         html: 'footer html'     },     footerCssClass: 'custom-footer', // additional css class, see {@link Ext.element#addClass addClass}     footerStyle:    'background-color:red' // see {@link #bodyStyle} });      * </code></pre>      * <p>The example above also explicitly creates a <tt>{@link #footer}</tt> with custom markup and      * styling applied.</p>      */     /**      * @cfg {Object} headerCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure      * of this Panel's {@link #header} Element.  See <tt>{@link #bodyCfg}</tt> also.</p>      */     /**      * @cfg {Object} bwrapCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure      * of this Panel's {@link #bwrap} Element.  See <tt>{@link #bodyCfg}</tt> also.</p>      */     /**      * @cfg {Object} tbarCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure      * of this Panel's {@link #tbar} Element.  See <tt>{@link #bodyCfg}</tt> also.</p>      */     /**      * @cfg {Object} bbarCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure      * of this Panel's {@link #bbar} Element.  See <tt>{@link #bodyCfg}</tt> also.</p>      */     /**      * @cfg {Object} footerCfg      * <p>A {@link Ext.DomHelper DomHelper} element specification object specifying the element structure      * of this Panel's {@link #footer} Element.  See <tt>{@link #bodyCfg}</tt> also.</p>      */     /**      * @cfg {Boolean} closable      * Panels themselves do not directly support being closed, but some Panel subclasses do (like      * {@link Ext.Window}) or a Panel Class within an {@link Ext.TabPanel}.  Specify <tt>true</tt>      * to enable closing in such situations. Defaults to <tt>false</tt>.      */     /**      * The Panel's footer {@link Ext.Element Element}. Read-only.      * <p>This Element is used to house the Panel's <tt>{@link #buttons}</tt> or <tt>{@link #fbar}</tt>.</p>      * <br><p><b>Note</b>: see the Note for <tt>{@link Ext.Component#el el} also.</p>      * @type Ext.Element      * @property footer      */     /**      * @cfg {Mixed} applyTo      * <p>The id of the node, a DOM node or an existing Element corresponding to a DIV that is already present in      * the document that specifies some panel-specific structural markup.  When <tt>applyTo</tt> is used,      * constituent parts of the panel can be specified by CSS class name within the main element, and the panel      * will automatically create those components from that markup. Any required components not specified in the      * markup will be autogenerated if necessary.</p>      * <p>The following class names are supported (baseCls will be replaced by {@link #baseCls}):</p>      * <ul><li>baseCls + '-header'</li>      * <li>baseCls + '-header-text'</li>      * <li>baseCls + '-bwrap'</li>      * <li>baseCls + '-tbar'</li>      * <li>baseCls + '-body'</li>      * <li>baseCls + '-bbar'</li>      * <li>baseCls + '-footer'</li></ul>      * <p>Using this config, a call to render() is not required.  If applyTo is specified, any value passed for      * {@link #renderTo} will be ignored and the target element's parent node will automatically be used as the      * panel's container.</p>      */     /**      * @cfg {Object/Array} tbar      * <p>The top toolbar of the panel. This can be a {@link Ext.Toolbar} object, a toolbar config, or an array of      * buttons/button configs to be added to the toolbar.  Note that this is not available as a property after render.      * To access the top toolbar after render, use {@link #getTopToolbar}.</p>      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not</b> be updated by a load      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form      * submission parameters are collected from the DOM tree.</p>      */     /**      * @cfg {Object/Array} bbar      * <p>The bottom toolbar of the panel. This can be a {@link Ext.Toolbar} object, a toolbar config, or an array of      * buttons/button configs to be added to the toolbar.  Note that this is not available as a property after render.      * To access the bottom toolbar after render, use {@link #getBottomToolbar}.</p>      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not<b> be updated by a load      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form      * submission parameters are collected from the DOM tree.</p>      */     /** @cfg {Object/Array} fbar      * <p>A {@link Ext.Toolbar Toolbar} object, a Toolbar config, or an array of      * {@link Ext.Button Button}s/{@link Ext.Button Button} configs, describing a {@link Ext.Toolbar Toolbar} to be rendered into this Panel's footer element.</p>      * <p>After render, the <code>fbar</code> property will be an {@link Ext.Toolbar Toolbar} instance.</p>      * <p>If <tt>{@link #buttons}</tt> are specified, they will supersede the <tt>fbar</tt> configuration property.</p>      * The Panel's <tt>{@link #buttonAlign}</tt> configuration affects the layout of these items, for example:      * <pre><code> var w = new Ext.Window({     height: 250,     width: 500,     bbar: new Ext.Toolbar({         items: [{             text: 'bbar Left'         },'->',{             text: 'bbar Right'         }]     }),     {@link #buttonAlign}: 'left', // anything but 'center' or 'right' and you can use "-", and "->"                                   // to control the alignment of fbar items     fbar: [{         text: 'fbar Left'     },'->',{         text: 'fbar Right'     }] }).show();      * </code></pre>      * <p><b>Note:</b> Although a Toolbar may contain Field components, these will <b>not<b> be updated by a load      * of an ancestor FormPanel. A Panel's toolbars are not part of the standard Container->Component hierarchy, and      * so are not scanned to collect form items. However, the values <b>will</b> be submitted because form      * submission parameters are collected from the DOM tree.</p>      */     /**      * @cfg {Boolean} header      * <tt>true</tt> to create the Panel's header element explicitly, <tt>false</tt> to skip creating      * it.  If a <tt>{@link #title}</tt> is set the header will be created automatically, otherwise it will not.      * If a <tt>{@link #title}</tt> is set but <tt>header</tt> is explicitly set to <tt>false</tt>, the header      * will not be rendered.      */     /**      * @cfg {Boolean} footer      * <tt>true</tt> to create the footer element explicitly, false to skip creating it. The footer      * will be created automatically if <tt>{@link #buttons}</tt> or a <tt>{@link #fbar}</tt> have      * been configured.  See <tt>{@link #bodyCfg}</tt> for an example.      */     /**      * @cfg {String} title      * The title text to be used as innerHTML (html tags are accepted) to display in the panel      * <tt>{@link #header}</tt> (defaults to ''). When a <tt>title</tt> is specified the      * <tt>{@link #header}</tt> element will automatically be created and displayed unless      * {@link #header} is explicitly set to <tt>false</tt>.  If you do not want to specify a      * <tt>title</tt> at config time, but you may want one later, you must either specify a non-empty      * <tt>title</tt> (a blank space ' ' will do) or <tt>header:true</tt> so that the container      * element will get created.      */     /**      * @cfg {Array} buttons      * <tt>buttons</tt> will be used as <tt>{@link Ext.Container#items items}</tt> for the toolbar in      * the footer (<tt>{@link #fbar}</tt>). Typically the value of this configuration property will be      * an array of {@link Ext.Button}s or {@link Ext.Button} configuration objects.      * If an item is configured with <tt>minWidth</tt> or the Panel is configured with <tt>minButtonWidth</tt>,      * that width will be applied to the item.      */     /**      * @cfg {Object/String/Function} autoLoad      * A valid url spec according to the Updater {@link Ext.Updater#update} method.      * If autoLoad is not null, the panel will attempt to load its contents      * immediately upon render.<p>      * The URL will become the default URL for this panel's {@link #body} element,      * so it may be {@link Ext.Element#refresh refresh}ed at any time.</p>      */     /**      * @cfg {Boolean} frame      * <tt>false</tt> by default to render with plain 1px square borders. <tt>true</tt> to render with      * 9 elements, complete with custom rounded corners (also see {@link Ext.Element#boxWrap}).      * <p>The template generated for each condition is depicted below:</p><pre><code>      * // frame = false &lt;div id="developer-specified-id-goes-here" class="x-panel">     &lt;div class="x-panel-header">&lt;span class="x-panel-header-text">Title: (frame:false)&lt;/span>&lt;/div>     &lt;div class="x-panel-bwrap">         &lt;div class="x-panel-body">&lt;p>html value goes here&lt;/p>&lt;/div>     &lt;/div> &lt;/div> // frame = true (create 9 elements) &lt;div id="developer-specified-id-goes-here" class="x-panel">     &lt;div class="x-panel-tl">&lt;div class="x-panel-tr">&lt;div class="x-panel-tc">         &lt;div class="x-panel-header">&lt;span class="x-panel-header-text">Title: (frame:true)&lt;/span>&lt;/div>     &lt;/div>&lt;/div>&lt;/div>     &lt;div class="x-panel-bwrap">         &lt;div class="x-panel-ml">&lt;div class="x-panel-mr">&lt;div class="x-panel-mc">             &lt;div class="x-panel-body">&lt;p>html value goes here&lt;/p>&lt;/div>         &lt;/div>&lt;/div>&lt;/div>         &lt;div class="x-panel-bl">&lt;div class="x-panel-br">&lt;div class="x-panel-bc"/>         &lt;/div>&lt;/div>&lt;/div> &lt;/div>      * </code></pre>      */     /**      * @cfg {Boolean} border      * True to display the borders of the panel's body element, false to hide them (defaults to true).  By default,      * the border is a 2px wide inset border, but this can be further altered by setting {@link #bodyBorder} to false.      */     /**      * @cfg {Boolean} bodyBorder      * True to display an interior border on the body element of the panel, false to hide it (defaults to true).      * This only applies when {@link #border} == true.  If border == true and bodyBorder == false, the border will display      * as a 1px wide inset border, giving the entire body element an inset appearance.      */     /**      * @cfg {String/Object/Function} bodyCssClass      * Additional css class selector to be applied to the {@link #body} element in the format expected by      * {@link Ext.Element#addClass} (defaults to null). See {@link #bodyCfg}.      */     /**      * @cfg {String/Object/Function} bodyStyle      * Custom CSS styles to be applied to the {@link #body} element in the format expected by      * {@link Ext.Element#applyStyles} (defaults to null). See {@link #bodyCfg}.      */     /**      * @cfg {String} iconCls      * The CSS class selector that specifies a background image to be used as the header icon (defaults to '').      * <p>An example of specifying a custom icon class would be something like:      * </p><pre><code> // specify the property in the config for the class:      ...      iconCls: 'my-icon' // css class that specifies background image to be used as the icon image: .my-icon { background-image: url(../images/my-icon.gif) 0 6px no-repeat !important; } </code></pre>      */     /**      * @cfg {Boolean} collapsible      * True to make the panel collapsible and have the expand/collapse toggle button automatically rendered into      * the header tool button area, false to keep the panel statically sized with no button (defaults to false).      */     /**      * @cfg {Array} tools      * An array of tool button configs to be added to the header tool area. When rendered, each tool is      * stored as an {@link Ext.Element Element} referenced by a public property called <tt><b></b>tools.<i>&lt;tool-type&gt;</i></tt>      * <p>Each tool config may contain the following properties:      * <div class="mdetail-params"><ul>      * <li><b>id</b> : String<div class="sub-desc"><b>Required.</b> The type      * of tool to create. By default, this assigns a CSS class of the form <tt>x-tool-<i>&lt;tool-type&gt;</i></tt> to the      * resulting tool Element. Ext provides CSS rules, and an icon sprite containing images for the tool types listed below.      * The developer may implement custom tools by supplying alternate CSS rules and background images:      * <ul>      * <div class="x-tool x-tool-toggle" style="float:left; margin-right:5;"> </div><div><tt> toggle</tt> (Created by default when {@link #collapsible} is <tt>true</tt>)</div>      * <div class="x-tool x-tool-close" style="float:left; margin-right:5;"> </div><div><tt> close</tt></div>      * <div class="x-tool x-tool-minimize" style="float:left; margin-right:5;"> </div><div><tt> minimize</tt></div>      * <div class="x-tool x-tool-maximize" style="float:left; margin-right:5;"> </div><div><tt> maximize</tt></div>      * <div class="x-tool x-tool-restore" style="float:left; margin-right:5;"> </div><div><tt> restore</tt></div>      * <div class="x-tool x-tool-gear" style="float:left; margin-right:5;"> </div><div><tt> gear</tt></div>      * <div class="x-tool x-tool-pin" style="float:left; margin-right:5;"> </div><div><tt> pin</tt></div>      * <div class="x-tool x-tool-unpin" style="float:left; margin-right:5;"> </div><div><tt> unpin</tt></div>      * <div class="x-tool x-tool-right" style="float:left; margin-right:5;"> </div><div><tt> right</tt></div>      * <div class="x-tool x-tool-left" style="float:left; margin-right:5;"> </div><div><tt> left</tt></div>      * <div class="x-tool x-tool-up" style="float:left; margin-right:5;"> </div><div><tt> up</tt></div>      * <div class="x-tool x-tool-down" style="float:left; margin-right:5;"> </div><div><tt> down</tt></div>      * <div class="x-tool x-tool-refresh" style="float:left; margin-right:5;"> </div><div><tt> refresh</tt></div>      * <div class="x-tool x-tool-minus" style="float:left; margin-right:5;"> </div><div><tt> minus</tt></div>      * <div class="x-tool x-tool-plus" style="float:left; margin-right:5;"> </div><div><tt> plus</tt></div>      * <div class="x-tool x-tool-help" style="float:left; margin-right:5;"> </div><div><tt> help</tt></div>      * <div class="x-tool x-tool-search" style="float:left; margin-right:5;"> </div><div><tt> search</tt></div>      * <div class="x-tool x-tool-save" style="float:left; margin-right:5;"> </div><div><tt> save</tt></div>      * <div class="x-tool x-tool-print" style="float:left; margin-right:5;"> </div><div><tt> print</tt></div>      * </ul></div></li>      * <li><b>handler</b> : Function<div class="sub-desc"><b>Required.</b> The function to      * call when clicked. Arguments passed are:<ul>      * <li><b>event</b> : Ext.EventObject<div class="sub-desc">The click event.</div></li>      * <li><b>toolEl</b> : Ext.Element<div class="sub-desc">The tool Element.</div></li>      * <li><b>panel</b> : Ext.Panel<div class="sub-desc">The host Panel</div></li>      * <li><b>tc</b> : Ext.Panel<div class="sub-desc">The tool configuration object</div></li>      * </ul></div></li>      * <li><b>stopEvent</b> : Boolean<div class="sub-desc">Defaults to true. Specify as false to allow click event to propagate.</div></li>      * <li><b>scope</b> : Object<div class="sub-desc">The scope in which to call the handler.</div></li>      * <li><b>qtip</b> : String/Object<div class="sub-desc">A tip string, or      * a config argument to {@link Ext.QuickTip#register}</div></li>      * <li><b>hidden</b> : Boolean<div class="sub-desc">True to initially render hidden.</div></li>      * <li><b>on</b> : Object<div class="sub-desc">A listener config object specifiying      * event listeners in the format of an argument to {@link #addListener}</div></li>      * </ul></div>      * <p>Note that, apart from the toggle tool which is provided when a panel is collapsible, these      * tools only provide the visual button. Any required functionality must be provided by adding      * handlers that implement the necessary behavior.</p>      * <p>Example usage:</p>      * <pre><code> tools:[{     id:'refresh',     qtip: 'Refresh form Data',     // hidden:true,     handler: function(event, toolEl, panel){         // refresh logic     } }, {     id:'help',     qtip: 'Get Help',     handler: function(event, toolEl, panel){         // whatever     } }] </code></pre>      * <p>For the custom id of <tt>'help'</tt> define two relevant css classes with a link to      * a 15x15 image:</p>      * <pre><code> .x-tool-help {background-image: url(images/help.png);} .x-tool-help-over {background-image: url(images/help_over.png);} // if using an image sprite: .x-tool-help {background-image: url(images/help.png) no-repeat 0 0;} .x-tool-help-over {background-position:-15px 0;} </code></pre>      */     /**      * @cfg {Ext.Template/Ext.XTemplate} toolTemplate      * <p>A Template used to create {@link #tools} in the {@link #header} Element. Defaults to:</p><pre><code> new Ext.Template('&lt;div class="x-tool x-tool-{id}">&amp;#160;&lt;/div>')</code></pre>      * <p>This may may be overridden to provide a custom DOM structure for tools based upon a more      * complex XTemplate. The template's data is a single tool configuration object (Not the entire Array)      * as specified in {@link #tools}.  In the following example an &lt;a> tag is used to provide a      * visual indication when hovering over the tool:</p><pre><code> var win = new Ext.Window({     tools: [{         id: 'download',         href: '/MyPdfDoc.pdf'     }],     toolTemplate: new Ext.XTemplate(         '&lt;tpl if="id=='download'">',             '&lt;a class="x-tool x-tool-pdf" href="{href}">&lt;/a>',         '&lt;/tpl>',         '&lt;tpl if="id!='download'">',             '&lt;div class="x-tool x-tool-{id}">&amp;#160;&lt;/div>',         '&lt;/tpl>'     ),     width:500,     height:300,     closeAction:'hide' });</code></pre>      * <p>Note that the CSS class "x-tool-pdf" should have an associated style rule which provides an      * appropriate background image, something like:</p>     <pre><code>     a.x-tool-pdf {background-image: url(../shared/extjs/images/pdf.gif)!important;}     </code></pre>      */     /**      * @cfg {Boolean} hideCollapseTool      * <tt>true</tt> to hide the expand/collapse toggle button when <code>{@link #collapsible} == true</code>,      * <tt>false</tt> to display it (defaults to <tt>false</tt>).      */     /**      * @cfg {Boolean} titleCollapse      * <tt>true</tt> to allow expanding and collapsing the panel (when <tt>{@link #collapsible} = true</tt>)      * by clicking anywhere in the header bar, <tt>false</tt>) to allow it only by clicking to tool button      * (defaults to <tt>false</tt>)). If this panel is a child item of a border layout also see the      * {@link Ext.layout.BorderLayout.Region BorderLayout.Region}      * <tt>{@link Ext.layout.BorderLayout.Region#floatable floatable}</tt> config option.      */     /**      * @cfg {Boolean} autoScroll      * <tt>true</tt> to use overflow:'auto' on the panel's body element and show scroll bars automatically when      * necessary, <tt>false</tt> to clip any overflowing content (defaults to <tt>false</tt>).      */     /**      * @cfg {Mixed} floating      * <p>This property is used to configure the underlying {@link Ext.Layer}. Acceptable values for this      * configuration property are:</p><div class="mdetail-params"><ul>      * <li><b><tt>false</tt></b> : <b>Default.</b><div class="sub-desc">Display the panel inline where it is      * rendered.</div></li>      * <li><b><tt>true</tt></b> : <div class="sub-desc">Float the panel (absolute position it with automatic      * shimming and shadow).<ul>      * <div class="sub-desc">Setting floating to true will create an Ext.Layer for this panel and display the      * panel at negative offsets so that it is hidden.</div>      * <div class="sub-desc">Since the panel will be absolute positioned, the position must be set explicitly      * <i>after</i> render (e.g., <tt>myPanel.setPosition(100,100);</tt>).</div>      * <div class="sub-desc"><b>Note</b>: when floating a panel you should always assign a fixed width,      * otherwise it will be auto width and will expand to fill to the right edge of the viewport.</div>      * </ul></div></li>      * <li><b><tt>{@link Ext.Layer object}</tt></b> : <div class="sub-desc">The specified object will be used      * as the configuration object for the {@link Ext.Layer} that will be created.</div></li>      * </ul></div>      */     /**      * @cfg {Boolean/String} shadow      * <tt>true</tt> (or a valid Ext.Shadow {@link Ext.Shadow#mode} value) to display a shadow behind the      * panel, <tt>false</tt> to display no shadow (defaults to <tt>'sides'</tt>).  Note that this option      * only applies when <tt>{@link #floating} = true</tt>.      */     /**      * @cfg {Number} shadowOffset      * The number of pixels to offset the shadow if displayed (defaults to <tt>4</tt>). Note that this      * option only applies when <tt>{@link #floating} = true</tt>.      */     /**      * @cfg {Boolean} shim      * <tt>false</tt> to disable the iframe shim in browsers which need one (defaults to <tt>true</tt>).      * Note that this option only applies when <tt>{@link #floating} = true</tt>.      */     /**      * @cfg {String/Object} html      * An HTML fragment, or a {@link Ext.DomHelper DomHelper} specification to use as the panel's body      * content (defaults to ''). The HTML content is added by the Panel's {@link #afterRender} method,      * and so the document will not contain this HTML at the time the {@link #render} event is fired.      * This content is inserted into the body <i>before</i> any configured {@link #contentEl} is appended.      */     /**      * @cfg {String} contentEl      * <p>Specify the <tt>id</tt> of an existing HTML node to use as the panel's body content      * (defaults to '').</p><div><ul>      * <li><b>Description</b> : <ul>      * <div class="sub-desc">This config option is used to take an existing HTML element and place it in the body      * of a new panel (it simply moves the specified DOM element into the body element of the Panel      * <i>when the Panel is rendered</i> to use as the content (it is not going to be the      * actual panel itself).</div>      * </ul></li>      * <li><b>Notes</b> : <ul>      * <div class="sub-desc">The specified HTML Element is appended to the Panel's {@link #body} Element by the      * Panel's {@link #afterRender} method <i>after any configured {@link #html HTML} has      * been inserted</i>, and so the document will not contain this HTML at the time the      * {@link #render} event is fired.</div>      * <div class="sub-desc">The specified HTML element used will not participate in any layout scheme that the      * Panel may use. It's just HTML. Layouts operate on child items.</div>      * <div class="sub-desc">Add either the <tt>x-hidden</tt> or the <tt>x-hide-display</tt> CSS class to      * prevent a brief flicker of the content before it is rendered to the panel.</div>      * </ul></li>      * </ul></div>      */     /**      * @cfg {Object/Array} keys      * A {@link Ext.KeyMap} config object (in the format expected by {@link Ext.KeyMap#addBinding}      * used to assign custom key handling to this panel (defaults to <tt>null</tt>).      */     /**      * @cfg {Boolean/Object} draggable      * <p><tt>true</tt> to enable dragging of this Panel (defaults to <tt>false</tt>).</p>      * <p>For custom drag/drop implementations, an <b>Ext.Panel.DD</b> config could also be passed      * in this config instead of <tt>true</tt>. Ext.Panel.DD is an internal, undocumented class which      * moves a proxy Element around in place of the Panel's element, but provides no other behaviour      * during dragging or on drop. It is a subclass of {@link Ext.dd.DragSource}, so behaviour may be      * added by implementing the interface methods of {@link Ext.dd.DragDrop} e.g.:      * <pre><code> new Ext.Panel({     title: 'Drag me',     x: 100,     y: 100,     renderTo: Ext.getBody(),     floating: true,     frame: true,     width: 400,     height: 200,     draggable: { //      Config option of Ext.Panel.DD class. //      It&#39;s a floating Panel, so do not show a placeholder proxy in the original position.         insertProxy: false, //      Called for each mousemove event while dragging the DD object.         onDrag : function(e){ //          Record the x,y position of the drag proxy so that we can //          position the Panel at end of drag.             var pel = this.proxy.getEl();             this.x = pel.getLeft(true);             this.y = pel.getTop(true); //          Keep the Shadow aligned if there is one.             var s = this.panel.getEl().shadow;             if (s) {                 s.realign(this.x, this.y, pel.getWidth(), pel.getHeight());             }         }, //      Called on the mouseup event.         endDrag : function(e){             this.panel.setPosition(this.x, this.y);         }     } }).show(); </code></pre>      */     /**      * @cfg {String} tabTip      * A string to be used as innerHTML (html tags are accepted) to show in a tooltip when mousing over      * the tab of a Ext.Panel which is an item of a {@link Ext.TabPanel}. {@link Ext.QuickTips}.init()      * must be called in order for the tips to render.      */     /**      * @cfg {Boolean} disabled      * Render this panel disabled (default is <tt>false</tt>). An important note when using the disabled      * config on panels is that IE will often fail to initialize the disabled mask element correectly if      * the panel's layout has not yet completed by the time the Panel is disabled during the render process.      * If you experience this issue, you may need to instead use the {@link #afterlayout} event to initialize      * the disabled state:      * <pre><code> new Ext.Panel({     ...     listeners: {         'afterlayout': {             fn: function(p){                 p.disable();             },             single: true // important, as many layouts can occur         }     } }); </code></pre>      */     /**      * @cfg {Boolean} autoHeight      * <tt>true</tt> to use height:'auto', <tt>false</tt> to use fixed height (defaults to <tt>false</tt>).      * <b>Note</b>: Setting <tt>autoHeight:true</tt> means that the browser will manage the panel's height      * based on its contents, and that Ext will not manage it at all. If the panel is within a layout that      * manages dimensions (<tt>fit</tt>, <tt>border</tt>, etc.) then setting <tt>autoHeight:true</tt>      * can cause issues with scrolling and will not generally work as expected since the panel will take      * on the height of its contents rather than the height required by the Ext layout.      */     /**      * @cfg {String} baseCls      * The base CSS class to apply to this panel's element (defaults to <tt>'x-panel'</tt>).      * <p>Another option available by default is to specify <tt>'x-plain'</tt> which strips all styling      * except for required attributes for Ext layouts to function (e.g. overflow:hidden).      * See <tt>{@link #unstyled}</tt> also.</p>      */     baseCls : 'x-panel',     /**      * @cfg {String} collapsedCls      * A CSS class to add to the panel's element after it has been collapsed (defaults to      * <tt>'x-panel-collapsed'</tt>).      */     collapsedCls : 'x-panel-collapsed',     /**      * @cfg {Boolean} maskDisabled      * <tt>true</tt> to mask the panel when it is {@link #disabled}, <tt>false</tt> to not mask it (defaults      * to <tt>true</tt>).  Either way, the panel will always tell its contained elements to disable themselves      * when it is disabled, but masking the panel can provide an additional visual cue that the panel is      * disabled.      */     maskDisabled : true,     /**      * @cfg {Boolean} animCollapse      * <tt>true</tt> to animate the transition when the panel is collapsed, <tt>false</tt> to skip the      * animation (defaults to <tt>true</tt> if the {@link Ext.Fx} class is available, otherwise <tt>false</tt>).      */     animCollapse : Ext.enableFx,     /**      * @cfg {Boolean} headerAsText      * <tt>true</tt> to display the panel <tt>{@link #title}</tt> in the <tt>{@link #header}</tt>,      * <tt>false</tt> to hide it (defaults to <tt>true</tt>).      */     headerAsText : true,     /**      * @cfg {String} buttonAlign      * The alignment of any {@link #buttons} added to this panel.  Valid values are <tt>'right'</tt>,      * <tt>'left'</tt> and <tt>'center'</tt> (defaults to <tt>'right'</tt>).      */     buttonAlign : 'right',     /**      * @cfg {Boolean} collapsed      * <tt>true</tt> to render the panel collapsed, <tt>false</tt> to render it expanded (defaults to      * <tt>false</tt>).      */     collapsed : false,     /**      * @cfg {Boolean} collapseFirst      * <tt>true</tt> to make sure the collapse/expand toggle button always renders first (to the left of)      * any other tools in the panel's title bar, <tt>false</tt> to render it last (defaults to <tt>true</tt>).      */     collapseFirst : true,     /**      * @cfg {Number} minButtonWidth      * Minimum width in pixels of all {@link #buttons} in this panel (defaults to <tt>75</tt>)      */     minButtonWidth : 75,     /**      * @cfg {Boolean} unstyled      * Overrides the <tt>{@link #baseCls}</tt> setting to <tt>{@link #baseCls} = 'x-plain'</tt> which renders      * the panel unstyled except for required attributes for Ext layouts to function (e.g. overflow:hidden).      */     /**      * @cfg {String} elements      * A comma-delimited list of panel elements to initialize when the panel is rendered.  Normally, this list will be      * generated automatically based on the items added to the panel at config time, but sometimes it might be useful to      * make sure a structural element is rendered even if not specified at config time (for example, you may want      * to add a button or toolbar dynamically after the panel has been rendered).  Adding those elements to this      * list will allocate the required placeholders in the panel when it is rendered.  Valid values are<div class="mdetail-params"><ul>      * <li><tt>header</tt></li>      * <li><tt>tbar</tt> (top bar)</li>      * <li><tt>body</tt></li>      * <li><tt>bbar</tt> (bottom bar)</li>      * <li><tt>footer</tt></li>      * </ul></div>      * Defaults to '<tt>body</tt>'.      */     elements : 'body',     /**      * @cfg {Boolean} preventBodyReset      * Defaults to <tt>false</tt>.  When set to <tt>true</tt>, an extra css class <tt>'x-panel-normal'</tt>      * will be added to the panel's element, effectively applying css styles suggested by the W3C      * (see http://www.w3.org/TR/CSS21/sample.html) to the Panel's <b>body</b> element (not the header,      * footer, etc.).      */     preventBodyReset : false,     // protected - these could be used to customize the behavior of the window,     // but changing them would not be useful without further mofifications and     // could lead to unexpected or undesirable results.     toolTarget : 'header',     collapseEl : 'bwrap',     slideAnchor : 't',     disabledClass : '',     // private, notify box this class will handle heights     deferHeight : true,     // private     expandDefaults: {         duration : 0.25     },     // private     collapseDefaults : {         duration : 0.25     },     // private     initComponent : function(){         Ext.Panel.superclass.initComponent.call(this);         this.addEvents(             /**              * @event bodyresize              * Fires after the Panel has been resized.              * @param {Ext.Panel} p the Panel which has been resized.              * @param {Number} width The Panel's new width.              * @param {Number} height The Panel's new height.              */             'bodyresize',             /**              * @event titlechange              * Fires after the Panel title has been {@link #title set} or {@link #setTitle changed}.              * @param {Ext.Panel} p the Panel which has had its title changed.              * @param {String} The new title.              */             'titlechange',             /**              * @event iconchange              * Fires after the Panel icon class has been {@link #iconCls set} or {@link #setIconClass changed}.              * @param {Ext.Panel} p the Panel which has had its {@link #iconCls icon class} changed.              * @param {String} The new icon class.              * @param {String} The old icon class.              */             'iconchange',             /**              * @event collapse              * Fires after the Panel has been collapsed.              * @param {Ext.Panel} p the Panel that has been collapsed.              */             'collapse',             /**              * @event expand              * Fires after the Panel has been expanded.              * @param {Ext.Panel} p The Panel that has been expanded.              */             'expand',             /**              * @event beforecollapse              * Fires before the Panel is collapsed.  A handler can return false to cancel the collapse.              * @param {Ext.Panel} p the Panel being collapsed.              * @param {Boolean} animate True if the collapse is animated, else false.              */             'beforecollapse',             /**              * @event beforeexpand              * Fires before the Panel is expanded.  A handler can return false to cancel the expand.              * @param {Ext.Panel} p The Panel being expanded.              * @param {Boolean} animate True if the expand is animated, else false.              */             'beforeexpand',             /**              * @event beforeclose              * Fires before the Panel is closed.  Note that Panels do not directly support being closed, but some              * Panel subclasses do (like {@link Ext.Window}) or a Panel within a Ext.TabPanel.  This event only              * applies to such subclasses.              * A handler can return false to cancel the close.              * @param {Ext.Panel} p The Panel being closed.              */             'beforeclose',             /**              * @event close              * Fires after the Panel is closed.  Note that Panels do not directly support being closed, but some              * Panel subclasses do (like {@link Ext.Window}) or a Panel within a Ext.TabPanel.              * @param {Ext.Panel} p The Panel that has been closed.              */             'close',             /**              * @event activate              * Fires after the Panel has been visually activated.              * Note that Panels do not directly support being activated, but some Panel subclasses              * do (like {@link Ext.Window}). Panels which are child Components of a TabPanel fire the              * activate and deactivate events under the control of the TabPanel.              * @param {Ext.Panel} p The Panel that has been activated.              */             'activate',             /**              * @event deactivate              * Fires after the Panel has been visually deactivated.              * Note that Panels do not directly support being deactivated, but some Panel subclasses              * do (like {@link Ext.Window}). Panels which are child Components of a TabPanel fire the              * activate and deactivate events under the control of the TabPanel.              * @param {Ext.Panel} p The Panel that has been deactivated.              */             'deactivate'         );         if(this.unstyled){             this.baseCls = 'x-plain';         }         // shortcuts         if(this.tbar){             this.elements += ',tbar';             if(Ext.isObject(this.tbar)){                 this.topToolbar = this.tbar;             }             delete this.tbar;         }         if(this.bbar){             this.elements += ',bbar';             if(Ext.isObject(this.bbar)){                 this.bottomToolbar = this.bbar;             }             delete this.bbar;         }         if(this.header === true){             this.elements += ',header';             delete this.header;         }else if(this.headerCfg || (this.title && this.header !== false)){             this.elements += ',header';         }         if(this.footerCfg || this.footer === true){             this.elements += ',footer';             delete this.footer;         }         if(this.buttons){             this.elements += ',footer';             var btns = this.buttons;             /**              * This Panel's Array of buttons as created from the <tt>{@link #buttons}</tt>              * config property. Read only.              * @type Array              * @property buttons              */             this.buttons = [];             for(var i = 0, len = btns.length; i < len; i++) {                 if(btns[i].render){ // button instance                     this.buttons.push(btns[i]);                 }else if(btns[i].xtype){                     this.buttons.push(Ext.create(btns[i], 'button'));                 }else{                     this.addButton(btns[i]);                 }             }         }         if(this.fbar){             this.elements += ',footer';         }         if(this.autoLoad){             this.on('render', this.doAutoLoad, this, {delay:10});         }     },     // private     createElement : function(name, pnode){         if(this[name]){             pnode.appendChild(this[name].dom);             return;         }         if(name === 'bwrap' || this.elements.indexOf(name) != -1){             if(this[name+'Cfg']){                 this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);             }else{                 var el = document.createElement('div');                 el.className = this[name+'Cls'];                 this[name] = Ext.get(pnode.appendChild(el));             }             if(this[name+'CssClass']){                 this[name].addClass(this[name+'CssClass']);             }             if(this[name+'Style']){                 this[name].applyStyles(this[name+'Style']);             }         }     },     // private     onRender : function(ct, position){         Ext.Panel.superclass.onRender.call(this, ct, position);         this.createClasses();         var el = this.el,             d = el.dom,             bw;         el.addClass(this.baseCls);         if(d.firstChild){ // existing markup             this.header = el.down('.'+this.headerCls);             this.bwrap = el.down('.'+this.bwrapCls);             var cp = this.bwrap ? this.bwrap : el;             this.tbar = cp.down('.'+this.tbarCls);             this.body = cp.down('.'+this.bodyCls);             this.bbar = cp.down('.'+this.bbarCls);             this.footer = cp.down('.'+this.footerCls);             this.fromMarkup = true;         }         if (this.preventBodyReset === true) {             el.addClass('x-panel-reset');         }         if(this.cls){             el.addClass(this.cls);         }         if(this.buttons){             this.elements += ',footer';         }         // This block allows for maximum flexibility and performance when using existing markup         // framing requires special markup         if(this.frame){             el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));             this.createElement('header', d.firstChild.firstChild.firstChild);             this.createElement('bwrap', d);             // append the mid and bottom frame to the bwrap             bw = this.bwrap.dom;             var ml = d.childNodes[1], bl = d.childNodes[2];             bw.appendChild(ml);             bw.appendChild(bl);             var mc = bw.firstChild.firstChild.firstChild;             this.createElement('tbar', mc);             this.createElement('body', mc);             this.createElement('bbar', mc);             this.createElement('footer', bw.lastChild.firstChild.firstChild);             if(!this.footer){                 this.bwrap.dom.lastChild.className += ' x-panel-nofooter';             }         }else{             this.createElement('header', d);             this.createElement('bwrap', d);             // append the mid and bottom frame to the bwrap             bw = this.bwrap.dom;             this.createElement('tbar', bw);             this.createElement('body', bw);             this.createElement('bbar', bw);             this.createElement('footer', bw);             if(!this.header){                 this.body.addClass(this.bodyCls + '-noheader');                 if(this.tbar){                     this.tbar.addClass(this.tbarCls + '-noheader');                 }             }         }         if(this.padding !== undefined) {             this.body.setStyle('padding', this.body.addUnits(this.padding));         }         if(this.border === false){             this.el.addClass(this.baseCls + '-noborder');             this.body.addClass(this.bodyCls + '-noborder');             if(this.header){                 this.header.addClass(this.headerCls + '-noborder');             }             if(this.footer){                 this.footer.addClass(this.footerCls + '-noborder');             }             if(this.tbar){                 this.tbar.addClass(this.tbarCls + '-noborder');             }             if(this.bbar){                 this.bbar.addClass(this.bbarCls + '-noborder');             }         }         if(this.bodyBorder === false){            this.body.addClass(this.bodyCls + '-noborder');         }         this.bwrap.enableDisplayMode('block');         if(this.header){             this.header.unselectable();             // for tools, we need to wrap any existing header markup             if(this.headerAsText){                 this.header.dom.innerHTML =                     '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';                 if(this.iconCls){                     this.setIconClass(this.iconCls);                 }             }         }         if(this.floating){             this.makeFloating(this.floating);         }         if(this.collapsible){             this.tools = this.tools ? this.tools.slice(0) : [];             if(!this.hideCollapseTool){                 this.tools[this.collapseFirst?'unshift':'push']({                     id: 'toggle',                     handler : this.toggleCollapse,                     scope: this                 });             }             if(this.titleCollapse && this.header){                 this.mon(this.header, 'click', this.toggleCollapse, this);                 this.header.setStyle('cursor', 'pointer');             }         }         if(this.tools){             var ts = this.tools;             this.tools = {};             this.addTool.apply(this, ts);         }else{             this.tools = {};         }         if(this.buttons && this.buttons.length > 0){             this.fbar = new Ext.Toolbar({                 items: this.buttons,                 toolbarCls: 'x-panel-fbar'             });         }         this.toolbars = [];         if(this.fbar){             this.fbar = Ext.create(this.fbar, 'toolbar');             this.fbar.enableOverflow = false;             if(this.fbar.items){                 this.fbar.items.each(function(c){                     c.minWidth = c.minWidth || this.minButtonWidth;                 }, this);             }             this.fbar.toolbarCls = 'x-panel-fbar';             var bct = this.footer.createChild({cls: 'x-panel-btns x-panel-btns-'+this.buttonAlign});             this.fbar.ownerCt = this;             this.fbar.render(bct);             bct.createChild({cls:'x-clear'});             this.toolbars.push(this.fbar);         }         if(this.tbar && this.topToolbar){             if(Ext.isArray(this.topToolbar)){                 this.topToolbar = new Ext.Toolbar(this.topToolbar);             }else if(!this.topToolbar.events){                 this.topToolbar = Ext.create(this.topToolbar, 'toolbar');             }             this.topToolbar.ownerCt = this;             this.topToolbar.render(this.tbar);             this.toolbars.push(this.topToolbar);         }         if(this.bbar && this.bottomToolbar){             if(Ext.isArray(this.bottomToolbar)){                 this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);             }else if(!this.bottomToolbar.events){                 this.bottomToolbar = Ext.create(this.bottomToolbar, 'toolbar');             }             this.bottomToolbar.ownerCt = this;             this.bottomToolbar.render(this.bbar);             this.toolbars.push(this.bottomToolbar);         }         Ext.each(this.toolbars, function(tb){             tb.on({                 scope: this,                 afterlayout: this.syncHeight,                 remove: this.syncHeight             });         }, this);     },     /**      * Sets the CSS class that provides the icon image for this panel.  This method will replace any existing      * icon class if one has already been set and fire the {@link #iconchange} event after completion.      * @param {String} cls The new CSS class name      */     setIconClass : function(cls){         var old = this.iconCls;         this.iconCls = cls;         if(this.rendered && this.header){             if(this.frame){                 this.header.addClass('x-panel-icon');                 this.header.replaceClass(old, this.iconCls);             }else{                 var hd = this.header.dom;                 var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null;                 if(img){                     Ext.fly(img).replaceClass(old, this.iconCls);                 }else{                     Ext.DomHelper.insertBefore(hd.firstChild, {                         tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls                     });                  }             }         }         this.fireEvent('iconchange', this, cls, old);     },     // private     makeFloating : function(cfg){         this.floating = true;         this.el = new Ext.Layer(             Ext.isObject(cfg) ? cfg : {                 shadow: this.shadow !== undefined ? this.shadow : 'sides',                 shadowOffset: this.shadowOffset,                 constrain:false,                 shim: this.shim === false ? false : undefined             }, this.el         );     },     /**      * Returns the {@link Ext.Toolbar toolbar} from the top (<tt>{@link #tbar}</tt>) section of the panel.      * @return {Ext.Toolbar} The toolbar      */     getTopToolbar : function(){         return this.topToolbar;     },     /**      * Returns the {@link Ext.Toolbar toolbar} from the bottom (<tt>{@link #bbar}</tt>) section of the panel.      * @return {Ext.Toolbar} The toolbar      */     getBottomToolbar : function(){         return this.bottomToolbar;     },     /**      * Adds a button to this panel.  Note that this method must be called prior to rendering.  The preferred      * approach is to add buttons via the {@link #buttons} config.      * @param {String/Object} config A valid {@link Ext.Button} config.  A string will become the text for a default      * button config, an object will be treated as a button config object.      * @param {Function} handler The function to be called on button {@link Ext.Button#click}      * @param {Object} scope The scope to use for the button handler function      * @return {Ext.Button} The button that was added      */     addButton : function(config, handler, scope){         var bc = {             handler: handler,             scope: scope,             minWidth: this.minButtonWidth,             hideParent:true         };         if(typeof config == "string"){             bc.text = config;         }else{             Ext.apply(bc, config);         }         var btn = new Ext.Button(bc);         if(!this.buttons){             this.buttons = [];         }         this.buttons.push(btn);         return btn;     },     // private     addTool : function(){         if(!this[this.toolTarget]) { // no where to render tools!             return;         }         if(!this.toolTemplate){             // initialize the global tool template on first use             var tt = new Ext.Template(                  '<div class="x-tool x-tool-{id}">&#160;</div>'             );             tt.disableFormats = true;             tt.compile();             Ext.Panel.prototype.toolTemplate = tt;         }         for(var i = 0, a = arguments, len = a.length; i < len; i++) {             var tc = a[i];             if(!this.tools[tc.id]){                 var overCls = 'x-tool-'+tc.id+'-over';                 var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);                 this.tools[tc.id] = t;                 t.enableDisplayMode('block');                 this.mon(t, 'click',  this.createToolHandler(t, tc, overCls, this));                 if(tc.on){                     this.mon(t, tc.on);                 }                 if(tc.hidden){                     t.hide();                 }                 if(tc.qtip){                     if(Ext.isObject(tc.qtip)){                         Ext.QuickTips.register(Ext.apply({                               target: t.id                         }, tc.qtip));                     } else {                         t.dom.qtip = tc.qtip;                     }                 }                 t.addClassOnOver(overCls);             }         }     },     onLayout : function(){         if(this.toolbars.length > 0){             this.duringLayout = true;             Ext.each(this.toolbars, function(tb){                 tb.doLayout();             });             delete this.duringLayout;             this.syncHeight();         }     },     syncHeight : function(){         if(!(this.autoHeight || this.duringLayout)){             var last = this.lastSize;             if(last && !Ext.isEmpty(last.height)){                 var old = last.height, h = this.el.getHeight();                 if(old != 'auto' && old != h){                     var bd = this.body, bdh = bd.getHeight();                     h = Math.max(bdh + old - h, 0);                     if(bdh > 0 && bdh != h){                         bd.setHeight(h);                         if(Ext.isIE && h <= 0){                             return;                         }                         var sz = bd.getSize();                         this.fireEvent('bodyresize', sz.width, sz.height);                     }                 }             }         }     },     // private     onShow : function(){         if(this.floating){             return this.el.show();         }         Ext.Panel.superclass.onShow.call(this);     },     // private     onHide : function(){         if(this.floating){             return this.el.hide();         }         Ext.Panel.superclass.onHide.call(this);     },     // private     createToolHandler : function(t, tc, overCls, panel){         return function(e){             t.removeClass(overCls);             if(tc.stopEvent !== false){                 e.stopEvent();             }             if(tc.handler){                 tc.handler.call(tc.scope || t, e, t, panel, tc);             }         };     },     // private     afterRender : function(){         if(this.floating && !this.hidden){             this.el.show();         }         if(this.title){             this.setTitle(this.title);         }         this.setAutoScroll();         if(this.html){             this.body.update(Ext.isObject(this.html) ?                              Ext.DomHelper.markup(this.html) :                              this.html);             delete this.html;         }         if(this.contentEl){             var ce = Ext.getDom(this.contentEl);             Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);             this.body.dom.appendChild(ce);         }         if(this.collapsed){             this.collapsed = false;             this.collapse(false);         }         Ext.Panel.superclass.afterRender.call(this); // do sizing calcs last         this.initEvents();     },     // private     setAutoScroll : function(){         if(this.rendered && this.autoScroll){             var el = this.body || this.el;             if(el){                 el.setOverflow('auto');             }         }     },     // private     getKeyMap : function(){         if(!this.keyMap){             this.keyMap = new Ext.KeyMap(this.el, this.keys);         }         return this.keyMap;     },     // private     initEvents : function(){         if(this.keys){             this.getKeyMap();         }         if(this.draggable){             this.initDraggable();         }     },     // private     initDraggable : function(){         /**          * <p>If this Panel is configured {@link #draggable}, this property will contain          * an instance of {@link Ext.dd.DragSource} which handles dragging the Panel.</p>          * The developer must provide implementations of the abstract methods of {@link Ext.dd.DragSource}          * in order to supply behaviour for each stage of the drag/drop process. See {@link #draggable}.          * @type Ext.dd.DragSource.          * @property dd          */         this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);     },     // private     beforeEffect : function(){         if(this.floating){             this.el.beforeAction();         }         this.el.addClass('x-panel-animated');     },     // private     afterEffect : function(){         this.syncShadow();         this.el.removeClass('x-panel-animated');     },     // private - wraps up an animation param with internal callbacks     createEffect : function(a, cb, scope){         var o = {             scope:scope,             block:true         };         if(a === true){             o.callback = cb;             return o;         }else if(!a.callback){             o.callback = cb;         }else { // wrap it up             o.callback = function(){                 cb.call(scope);                 Ext.callback(a.callback, a.scope);             };         }         return Ext.applyIf(o, a);     },     /**      * Collapses the panel body so that it becomes hidden.  Fires the {@link #beforecollapse} event which will      * cancel the collapse action if it returns false.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the      * {@link #animCollapse} panel config)      * @return {Ext.Panel} this      */     collapse : function(animate){         if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){             return;         }         var doAnim = animate === true || (animate !== false && this.animCollapse);         this.beforeEffect();         this.onCollapse(doAnim, animate);         return this;     },     // private     onCollapse : function(doAnim, animArg){         if(doAnim){             this[this.collapseEl].slideOut(this.slideAnchor,                     Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),                         this.collapseDefaults));         }else{             this[this.collapseEl].hide();             this.afterCollapse();         }     },     // private     afterCollapse : function(){         this.collapsed = true;         this.el.addClass(this.collapsedCls);         this.afterEffect();         this.fireEvent('collapse', this);     },     /**      * Expands the panel body so that it becomes visible.  Fires the {@link #beforeexpand} event which will      * cancel the expand action if it returns false.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the      * {@link #animCollapse} panel config)      * @return {Ext.Panel} this      */     expand : function(animate){         if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){             return;         }         var doAnim = animate === true || (animate !== false && this.animCollapse);         this.el.removeClass(this.collapsedCls);         this.beforeEffect();         this.onExpand(doAnim, animate);         return this;     },     // private     onExpand : function(doAnim, animArg){         if(doAnim){             this[this.collapseEl].slideIn(this.slideAnchor,                     Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),                         this.expandDefaults));         }else{             this[this.collapseEl].show();             this.afterExpand();         }     },     // private     afterExpand : function(){         this.collapsed = false;         this.afterEffect();         if(this.deferLayout !== undefined){             this.doLayout(true);         }         this.fireEvent('expand', this);     },     /**      * Shortcut for performing an {@link #expand} or {@link #collapse} based on the current state of the panel.      * @param {Boolean} animate True to animate the transition, else false (defaults to the value of the      * {@link #animCollapse} panel config)      * @return {Ext.Panel} this      */     toggleCollapse : function(animate){         this[this.collapsed ? 'expand' : 'collapse'](animate);         return this;     },     // private     onDisable : function(){         if(this.rendered && this.maskDisabled){             this.el.mask();         }         Ext.Panel.superclass.onDisable.call(this);     },     // private     onEnable : function(){         if(this.rendered && this.maskDisabled){             this.el.unmask();         }         Ext.Panel.superclass.onEnable.call(this);     },     // private     onResize : function(w, h){         if(w !== undefined || h !== undefined){             if(!this.collapsed){                 if(typeof w == 'number'){                     w = this.adjustBodyWidth(w - this.getFrameWidth());                     if(this.tbar){                         this.tbar.setWidth(w);                         if(this.topToolbar){                             this.topToolbar.setSize(w);                         }                     }                     if(this.bbar){                         this.bbar.setWidth(w);                         if(this.bottomToolbar){                             this.bottomToolbar.setSize(w);                         }                     }                     if(this.fbar){                         var f = this.fbar,                             fWidth = 1,                             strict = Ext.isStrict;                         if(this.buttonAlign == 'left'){                            fWidth = w - f.container.getFrameWidth('lr');                         }else{                             //center/right alignment off in webkit                             if(Ext.isIE || Ext.isWebKit){                                 //center alignment ok on webkit.                                 //right broken in both, center on IE                                 if(!(this.buttonAlign == 'center' && Ext.isWebKit) && (!strict || (!Ext.isIE8 && strict))){                                     (function(){                                         f.setWidth(f.getEl().child('.x-toolbar-ct').getWidth());                                     }).defer(1);                                 }else{                                     fWidth = 'auto';                                 }                             }else{                                 fWidth = 'auto';                             }                         }                         f.setWidth(fWidth);                     }                     this.body.setWidth(w);                 }else if(w == 'auto'){                     this.body.setWidth(w);                 }                 if(typeof h == 'number'){                     h = Math.max(0, this.adjustBodyHeight(h - this.getFrameHeight()));                     this.body.setHeight(h);                 }else if(h == 'auto'){                     this.body.setHeight(h);                 }                 if(this.disabled && this.el._mask){                     this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());                 }             }else{                 this.queuedBodySize = {width: w, height: h};                 if(!this.queuedExpand && this.allowQueuedExpand !== false){                     this.queuedExpand = true;                     this.on('expand', function(){                         delete this.queuedExpand;                         this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);                         this.doLayout();                     }, this, {single:true});                 }             }             this.fireEvent('bodyresize', this, w, h);         }         this.syncShadow();     },     // private     adjustBodyHeight : function(h){         return h;     },     // private     adjustBodyWidth : function(w){         return w;     },     // private     onPosition : function(){         this.syncShadow();     },     /**      * Returns the width in pixels of the framing elements of this panel (not including the body width).  To      * retrieve the body width see {@link #getInnerWidth}.      * @return {Number} The frame width      */     getFrameWidth : function(){         var w = this.el.getFrameWidth('lr')+this.bwrap.getFrameWidth('lr');         if(this.frame){             var l = this.bwrap.dom.firstChild;             w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));             var mc = this.bwrap.dom.firstChild.firstChild.firstChild;             w += Ext.fly(mc).getFrameWidth('lr');         }         return w;     },     /**      * Returns the height in pixels of the framing elements of this panel (including any top and bottom bars and      * header and footer elements, but not including the body height).  To retrieve the body height see {@link #getInnerHeight}.      * @return {Number} The frame height      */     getFrameHeight : function(){         var h  = this.el.getFrameWidth('tb')+this.bwrap.getFrameWidth('tb');         h += (this.tbar ? this.tbar.getHeight() : 0) +              (this.bbar ? this.bbar.getHeight() : 0);         if(this.frame){             var hd = this.el.dom.firstChild;             var ft = this.bwrap.dom.lastChild;             h += (hd.offsetHeight + ft.offsetHeight);             var mc = this.bwrap.dom.firstChild.firstChild.firstChild;             h += Ext.fly(mc).getFrameWidth('tb');         }else{             h += (this.header ? this.header.getHeight() : 0) +                 (this.footer ? this.footer.getHeight() : 0);         }         return h;     },     /**      * Returns the width in pixels of the body element (not including the width of any framing elements).      * For the frame width see {@link #getFrameWidth}.      * @return {Number} The body width      */     getInnerWidth : function(){         return this.getSize().width - this.getFrameWidth();     },     /**      * Returns the height in pixels of the body element (not including the height of any framing elements).      * For the frame height see {@link #getFrameHeight}.      * @return {Number} The body height      */     getInnerHeight : function(){         return this.getSize().height - this.getFrameHeight();     },     // private     syncShadow : function(){         if(this.floating){             this.el.sync(true);         }     },     // private     getLayoutTarget : function(){         return this.body;     },     /**      * <p>Sets the title text for the panel and optionally the {@link #iconCls icon class}.</p>      * <p>In order to be able to set the title, a header element must have been created      * for the Panel. This is triggered either by configuring the Panel with a non-blank <tt>{@link #title}</tt>,      * or configuring it with <tt><b>{@link #header}: true</b></tt>.</p>      * @param {String} title The title text to set      * @param {String} iconCls (optional) {@link #iconCls iconCls} A user-defined CSS class that provides the icon image for this panel      */     setTitle : function(title, iconCls){         this.title = title;         if(this.header && this.headerAsText){             this.header.child('span').update(title);         }         if(iconCls){             this.setIconClass(iconCls);         }         this.fireEvent('titlechange', this, title);         return this;     },     /**      * Get the {@link Ext.Updater} for this panel. Enables you to perform Ajax updates of this panel's body.      * @return {Ext.Updater} The Updater      */     getUpdater : function(){         return this.body.getUpdater();     },      /**      * Loads this content panel immediately with content returned from an XHR call.      * @param {Object/String/Function} config A config object containing any of the following options: <pre><code> panel.load({     url: "your-url.php",     params: {param1: "foo", param2: "bar"}, // or a URL encoded string     callback: yourFunction,     scope: yourObject, // optional scope for the callback     discardUrl: false,     nocache: false,     text: "Loading...",     timeout: 30,     scripts: false }); </code></pre>      * The only required property is url. The optional properties nocache, text and scripts      * are shorthand for disableCaching, indicatorText and loadScripts and are used to set their      * associated property on this panel Updater instance.      * @return {Ext.Panel} this      */     load : function(){         var um = this.body.getUpdater();         um.update.apply(um, arguments);         return this;     },     // private     beforeDestroy : function(){         if(this.header){             this.header.removeAllListeners();             if(this.headerAsText){                 Ext.Element.uncache(this.header.child('span'));             }         }         Ext.Element.uncache(             this.header,             this.tbar,             this.bbar,             this.footer,             this.body,             this.bwrap         );         if(this.tools){             for(var k in this.tools){                 Ext.destroy(this.tools[k]);             }         }         if(this.buttons){             for(var b in this.buttons){                 Ext.destroy(this.buttons[b]);             }         }         Ext.destroy(this.toolbars);         Ext.Panel.superclass.beforeDestroy.call(this);     },     // private     createClasses : function(){         this.headerCls = this.baseCls + '-header';         this.headerTextCls = this.baseCls + '-header-text';         this.bwrapCls = this.baseCls + '-bwrap';         this.tbarCls = this.baseCls + '-tbar';         this.bodyCls = this.baseCls + '-body';         this.bbarCls = this.baseCls + '-bbar';         this.footerCls = this.baseCls + '-footer';     },     // private     createGhost : function(cls, useShim, appendTo){         var el = document.createElement('div');         el.className = 'x-panel-ghost ' + (cls ? cls : '');         if(this.header){             el.appendChild(this.el.dom.firstChild.cloneNode(true));         }         Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());         el.style.width = this.el.dom.offsetWidth + 'px';;         if(!appendTo){             this.container.dom.appendChild(el);         }else{             Ext.getDom(appendTo).appendChild(el);         }         if(useShim !== false && this.el.useShim !== false){             var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);             layer.show();             return layer;         }else{             return new Ext.Element(el);         }     },     // private     doAutoLoad : function(){         var u = this.body.getUpdater();         if(this.renderer){             u.setRenderer(this.renderer);         }         u.update(Ext.isObject(this.autoLoad) ? this.autoLoad : {url: this.autoLoad});     },     /**      * Retrieve a tool by id.      * @param {String} id      * @return {Object} tool      */     getTool : function(id) {         return this.tools[id];     } /**  * @cfg {String} autoEl @hide  */ }); Ext.reg('panel', Ext.Panel); /**  * @class Ext.Editor  * @extends Ext.Component  * A base editor field that handles displaying/hiding on demand and has some built-in sizing and event handling logic.  * @constructor  * Create a new Editor  * @param {Object} config The config object  * @xtype editor  */ Ext.Editor = function(field, config){     if(field.field){         this.field = Ext.create(field.field, 'textfield');         config = Ext.apply({}, field); // copy so we don't disturb original config         delete config.field;     }else{         this.field = field;     }     Ext.Editor.superclass.constructor.call(this, config); }; Ext.extend(Ext.Editor, Ext.Component, {     /**     * @cfg {Ext.form.Field} field     * The Field object (or descendant) or config object for field     */     /**      * @cfg {Boolean} allowBlur      * True to {@link #completeEdit complete the editing process} if in edit mode when the      * field is blurred. Defaults to <tt>false</tt>.      */     /**      * @cfg {Boolean/String} autoSize      * True for the editor to automatically adopt the size of the element being edited, "width" to adopt the width only,      * or "height" to adopt the height only (defaults to false)      */     /**      * @cfg {Boolean} revertInvalid      * True to automatically revert the field value and cancel the edit when the user completes an edit and the field      * validation fails (defaults to true)      */     /**      * @cfg {Boolean} ignoreNoChange      * True to skip the edit completion process (no save, no events fired) if the user completes an edit and      * the value has not changed (defaults to false).  Applies only to string values - edits for other data types      * will never be ignored.      */     /**      * @cfg {Boolean} hideEl      * False to keep the bound element visible while the editor is displayed (defaults to true)      */     /**      * @cfg {Mixed} value      * The data value of the underlying field (defaults to "")      */     value : "",     /**      * @cfg {String} alignment      * The position to align to (see {@link Ext.Element#alignTo} for more details, defaults to "c-c?").      */     alignment: "c-c?",     /**      * @cfg {Boolean/String} shadow "sides" for sides/bottom only, "frame" for 4-way shadow, and "drop"      * for bottom-right shadow (defaults to "frame")      */     shadow : "frame",     /**      * @cfg {Boolean} constrain True to constrain the editor to the viewport      */     constrain : false,     /**      * @cfg {Boolean} swallowKeys Handle the keydown/keypress events so they don't propagate (defaults to true)      */     swallowKeys : true,     /**      * @cfg {Boolean} completeOnEnter True to complete the edit when the enter key is pressed (defaults to false)      */     completeOnEnter : false,     /**      * @cfg {Boolean} cancelOnEsc True to cancel the edit when the escape key is pressed (defaults to false)      */     cancelOnEsc : false,     /**      * @cfg {Boolean} updateEl True to update the innerHTML of the bound element when the update completes (defaults to false)      */     updateEl : false,     initComponent : function(){         Ext.Editor.superclass.initComponent.call(this);         this.addEvents(             /**              * @event beforestartedit              * Fires when editing is initiated, but before the value changes.  Editing can be canceled by returning              * false from the handler of this event.              * @param {Editor} this              * @param {Ext.Element} boundEl The underlying element bound to this editor              * @param {Mixed} value The field value being set              */             "beforestartedit",             /**              * @event startedit              * Fires when this editor is displayed              * @param {Ext.Element} boundEl The underlying element bound to this editor              * @param {Mixed} value The starting field value              */             "startedit",             /**              * @event beforecomplete              * Fires after a change has been made to the field, but before the change is reflected in the underlying              * field.  Saving the change to the field can be canceled by returning false from the handler of this event.              * Note that if the value has not changed and ignoreNoChange = true, the editing will still end but this              * event will not fire since no edit actually occurred.              * @param {Editor} this              * @param {Mixed} value The current field value              * @param {Mixed} startValue The original field value              */             "beforecomplete",             /**              * @event complete              * Fires after editing is complete and any changed value has been written to the underlying field.              * @param {Editor} this              * @param {Mixed} value The current field value              * @param {Mixed} startValue The original field value              */             "complete",             /**              * @event canceledit              * Fires after editing has been canceled and the editor's value has been reset.              * @param {Editor} this              * @param {Mixed} value The user-entered field value that was discarded              * @param {Mixed} startValue The original field value that was set back into the editor after cancel              */             "canceledit",             /**              * @event specialkey              * Fires when any key related to navigation (arrows, tab, enter, esc, etc.) is pressed.  You can check              * {@link Ext.EventObject#getKey} to determine which key was pressed.              * @param {Ext.form.Field} this              * @param {Ext.EventObject} e The event object              */             "specialkey"         );     },     // private     onRender : function(ct, position){         this.el = new Ext.Layer({             shadow: this.shadow,             cls: "x-editor",             parentEl : ct,             shim : this.shim,             shadowOffset: this.shadowOffset || 4,             id: this.id,             constrain: this.constrain         });         if(this.zIndex){             this.el.setZIndex(this.zIndex);         }         this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");         if(this.field.msgTarget != 'title'){             this.field.msgTarget = 'qtip';         }         this.field.inEditor = true;         this.field.render(this.el);         if(Ext.isGecko){             this.field.el.dom.setAttribute('autocomplete', 'off');         }         this.mon(this.field, "specialkey", this.onSpecialKey, this);         if(this.swallowKeys){             this.field.el.swallowEvent(['keydown','keypress']);         }         this.field.show();         this.mon(this.field, "blur", this.onBlur, this);         if(this.field.grow){          this.mon(this.field, "autosize", this.el.sync,  this.el, {delay:1});         }     },     // private     onSpecialKey : function(field, e){         var key = e.getKey();         if(this.completeOnEnter && key == e.ENTER){             e.stopEvent();             this.completeEdit();         }else if(this.cancelOnEsc && key == e.ESC){             this.cancelEdit();         }else{             this.fireEvent('specialkey', field, e);         }         if(this.field.triggerBlur && (key == e.ENTER || key == e.ESC || key == e.TAB)){             this.field.triggerBlur();         }     },     /**      * Starts the editing process and shows the editor.      * @param {Mixed} el The element to edit      * @param {String} value (optional) A value to initialize the editor with. If a value is not provided, it defaults       * to the innerHTML of el.      */     startEdit : function(el, value){         if(this.editing){             this.completeEdit();         }         this.boundEl = Ext.get(el);         var v = value !== undefined ? value : this.boundEl.dom.innerHTML;         if(!this.rendered){             this.render(this.parentEl || document.body);         }         if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){             return;         }         this.startValue = v;         this.field.setValue(v);         this.doAutoSize();         this.el.alignTo(this.boundEl, this.alignment);         this.editing = true;         this.show();     },     // private     doAutoSize : function(){         if(this.autoSize){             var sz = this.boundEl.getSize();             switch(this.autoSize){                 case "width":                     this.setSize(sz.width,  "");                 break;                 case "height":                     this.setSize("",  sz.height);                 break;                 default:                     this.setSize(sz.width,  sz.height);             }         }     },     /**      * Sets the height and width of this editor.      * @param {Number} width The new width      * @param {Number} height The new height      */     setSize : function(w, h){         delete this.field.lastSize;         this.field.setSize(w, h);         if(this.el){             if(Ext.isGecko2 || Ext.isOpera){                 // prevent layer scrollbars                 this.el.setSize(w, h);             }             this.el.sync();         }     },     /**      * Realigns the editor to the bound field based on the current alignment config value.      */     realign : function(){         this.el.alignTo(this.boundEl, this.alignment);     },     /**      * Ends the editing process, persists the changed value to the underlying field, and hides the editor.      * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after edit (defaults to false)      */     completeEdit : function(remainVisible){         if(!this.editing){             return;         }         var v = this.getValue();         if(!this.field.isValid()){             if(this.revertInvalid !== false){                 this.cancelEdit(remainVisible);             }             return;         }         if(String(v) === String(this.startValue) && this.ignoreNoChange){             this.hideEdit(remainVisible);             return;         }         if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){             v = this.getValue();             if(this.updateEl && this.boundEl){                 this.boundEl.update(v);             }             this.hideEdit(remainVisible);             this.fireEvent("complete", this, v, this.startValue);         }     },     // private     onShow : function(){         this.el.show();         if(this.hideEl !== false){             this.boundEl.hide();         }         this.field.show();         if(Ext.isIE && !this.fixIEFocus){ // IE has problems with focusing the first time             this.fixIEFocus = true;             this.deferredFocus.defer(50, this);         }else{             this.field.focus();         }         this.fireEvent("startedit", this.boundEl, this.startValue);     },     deferredFocus : function(){         if(this.editing){             this.field.focus();         }     },     /**      * Cancels the editing process and hides the editor without persisting any changes.  The field value will be      * reverted to the original starting value.      * @param {Boolean} remainVisible Override the default behavior and keep the editor visible after      * cancel (defaults to false)      */     cancelEdit : function(remainVisible){         if(this.editing){             var v = this.getValue();             this.setValue(this.startValue);             this.hideEdit(remainVisible);             this.fireEvent("canceledit", this, v, this.startValue);         }     },          // private     hideEdit: function(remainVisible){         if(remainVisible !== true){             this.editing = false;             this.hide();         }     },     // private     onBlur : function(){         if(this.allowBlur !== true && this.editing){             this.completeEdit();         }     },     // private     onHide : function(){         if(this.editing){             this.completeEdit();             return;         }         this.field.blur();         if(this.field.collapse){             this.field.collapse();         }         this.el.hide();         if(this.hideEl !== false){             this.boundEl.show();         }     },     /**      * Sets the data value of the editor      * @param {Mixed} value Any valid value supported by the underlying field      */     setValue : function(v){         this.field.setValue(v);     },     /**      * Gets the data value of the editor      * @return {Mixed} The data value      */     getValue : function(){         return this.field.getValue();     },     beforeDestroy : function(){         Ext.destroy(this.field);         this.field = null;     } }); Ext.reg('editor', Ext.Editor);/**  * @class Ext.ColorPalette  * @extends Ext.Component  * Simple color palette class for choosing colors.  The palette can be rendered to any container.<br />  * Here's an example of typical usage:  * <pre><code> var cp = new Ext.ColorPalette({value:'993300'});  // initial selected color cp.render('my-div'); cp.on('select', function(palette, selColor){     // do something with selColor }); </code></pre>  * @constructor  * Create a new ColorPalette  * @param {Object} config The config object  * @xtype colorpalette  */ Ext.ColorPalette = function(config){     Ext.ColorPalette.superclass.constructor.call(this, config);     this.addEvents(         /**      * @event select      * Fires when a color is selected      * @param {ColorPalette} this      * @param {String} color The 6-digit color hex code (without the # symbol)      */         'select'     );     if(this.handler){         this.on("select", this.handler, this.scope, true);     } }; Ext.extend(Ext.ColorPalette, Ext.Component, { /**  * @cfg {String} tpl An existing XTemplate instance to be used in place of the default template for rendering the component.  */     /**      * @cfg {String} itemCls      * The CSS class to apply to the containing element (defaults to "x-color-palette")      */     itemCls : "x-color-palette",     /**      * @cfg {String} value      * The initial color to highlight (should be a valid 6-digit color hex code without the # symbol).  Note that      * the hex codes are case-sensitive.      */     value : null,     clickEvent:'click',     // private     ctype: "Ext.ColorPalette",     /**      * @cfg {Boolean} allowReselect If set to true then reselecting a color that is already selected fires the {@link #select} event      */     allowReselect : false,     /**      * <p>An array of 6-digit color hex code strings (without the # symbol).  This array can contain any number      * of colors, and each hex code should be unique.  The width of the palette is controlled via CSS by adjusting      * the width property of the 'x-color-palette' class (or assigning a custom class), so you can balance the number      * of colors with the width setting until the box is symmetrical.</p>      * <p>You can override individual colors if needed:</p>      * <pre><code> var cp = new Ext.ColorPalette(); cp.colors[0] = "FF0000";  // change the first box to red </code></pre> Or you can provide a custom array of your own for complete control: <pre><code> var cp = new Ext.ColorPalette(); cp.colors = ["000000", "993300", "333300"]; </code></pre>      * @type Array      */     colors : [         "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333",         "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080",         "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696",         "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0",         "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"     ],     // private     onRender : function(container, position){         var t = this.tpl || new Ext.XTemplate(             '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on">&#160;</span></em></a></tpl>'         );         var el = document.createElement("div");         el.id = this.getId();         el.className = this.itemCls;         t.overwrite(el, this.colors);         container.dom.insertBefore(el, position);         this.el = Ext.get(el);         this.mon(this.el, this.clickEvent, this.handleClick, this, {delegate: 'a'});         if(this.clickEvent != 'click'){          this.mon(this.el, 'click', Ext.emptyFn, this, {delegate: 'a', preventDefault: true});         }     },     // private     afterRender : function(){         Ext.ColorPalette.superclass.afterRender.call(this);         if(this.value){             var s = this.value;             this.value = null;             this.select(s);         }     },     // private     handleClick : function(e, t){         e.preventDefault();         if(!this.disabled){             var c = t.className.match(/(?:^|s)color-(.{6})(?:s|$)/)[1];             this.select(c.toUpperCase());         }     },     /**      * Selects the specified color in the palette (fires the {@link #select} event)      * @param {String} color A valid 6-digit color hex code (# will be stripped if included)      */     select : function(color){         color = color.replace("#", "");         if(color != this.value || this.allowReselect){             var el = this.el;             if(this.value){                 el.child("a.color-"+this.value).removeClass("x-color-palette-sel");             }             el.child("a.color-"+color).addClass("x-color-palette-sel");             this.value = color;             this.fireEvent("select", this, color);         }     }     /**      * @cfg {String} autoEl @hide      */ }); Ext.reg('colorpalette', Ext.ColorPalette);/**
  982.  * @class Ext.DatePicker
  983.  * @extends Ext.Component
  984.  * Simple date picker class.
  985.  * @constructor
  986.  * Create a new DatePicker
  987.  * @param {Object} config The config object
  988.  * @xtype datepicker
  989.  */
  990. Ext.DatePicker = Ext.extend(Ext.BoxComponent, {
  991.     /**
  992.      * @cfg {String} todayText
  993.      * The text to display on the button that selects the current date (defaults to <tt>'Today'</tt>)
  994.      */
  995.     todayText : 'Today',
  996.     /**
  997.      * @cfg {String} okText
  998.      * The text to display on the ok button (defaults to <tt>'&#160;OK&#160;'</tt> to give the user extra clicking room)
  999.      */
  1000.     okText : '&#160;OK&#160;',
  1001.     /**
  1002.      * @cfg {String} cancelText
  1003.      * The text to display on the cancel button (defaults to <tt>'Cancel'</tt>)
  1004.      */
  1005.     cancelText : 'Cancel',
  1006.     /**
  1007.      * @cfg {String} todayTip
  1008.      * The tooltip to display for the button that selects the current date (defaults to <tt>'{current date} (Spacebar)'</tt>)
  1009.      */
  1010.     todayTip : '{0} (Spacebar)',
  1011.     /**
  1012.      * @cfg {String} minText
  1013.      * The error text to display if the minDate validation fails (defaults to <tt>'This date is before the minimum date'</tt>)
  1014.      */
  1015.     minText : 'This date is before the minimum date',
  1016.     /**
  1017.      * @cfg {String} maxText
  1018.      * The error text to display if the maxDate validation fails (defaults to <tt>'This date is after the maximum date'</tt>)
  1019.      */
  1020.     maxText : 'This date is after the maximum date',
  1021.     /**
  1022.      * @cfg {String} format
  1023.      * The default date format string which can be overriden for localization support.  The format must be
  1024.      * valid according to {@link Date#parseDate} (defaults to <tt>'m/d/y'</tt>).
  1025.      */
  1026.     format : 'm/d/y',
  1027.     /**
  1028.      * @cfg {String} disabledDaysText
  1029.      * The tooltip to display when the date falls on a disabled day (defaults to <tt>'Disabled'</tt>)
  1030.      */
  1031.     disabledDaysText : 'Disabled',
  1032.     /**
  1033.      * @cfg {String} disabledDatesText
  1034.      * The tooltip text to display when the date falls on a disabled date (defaults to <tt>'Disabled'</tt>)
  1035.      */
  1036.     disabledDatesText : 'Disabled',
  1037.     /**
  1038.      * @cfg {Array} monthNames
  1039.      * An array of textual month names which can be overriden for localization support (defaults to Date.monthNames)
  1040.      */
  1041.     monthNames : Date.monthNames,
  1042.     /**
  1043.      * @cfg {Array} dayNames
  1044.      * An array of textual day names which can be overriden for localization support (defaults to Date.dayNames)
  1045.      */
  1046.     dayNames : Date.dayNames,
  1047.     /**
  1048.      * @cfg {String} nextText
  1049.      * The next month navigation button tooltip (defaults to <tt>'Next Month (Control+Right)'</tt>)
  1050.      */
  1051.     nextText : 'Next Month (Control+Right)',
  1052.     /**
  1053.      * @cfg {String} prevText
  1054.      * The previous month navigation button tooltip (defaults to <tt>'Previous Month (Control+Left)'</tt>)
  1055.      */
  1056.     prevText : 'Previous Month (Control+Left)',
  1057.     /**
  1058.      * @cfg {String} monthYearText
  1059.      * The header month selector tooltip (defaults to <tt>'Choose a month (Control+Up/Down to move years)'</tt>)
  1060.      */
  1061.     monthYearText : 'Choose a month (Control+Up/Down to move years)',
  1062.     /**
  1063.      * @cfg {Number} startDay
  1064.      * Day index at which the week should begin, 0-based (defaults to 0, which is Sunday)
  1065.      */
  1066.     startDay : 0,
  1067.     /**
  1068.      * @cfg {Boolean} showToday
  1069.      * False to hide the footer area containing the Today button and disable the keyboard handler for spacebar
  1070.      * that selects the current date (defaults to <tt>true</tt>).
  1071.      */
  1072.     showToday : true,
  1073.     /**
  1074.      * @cfg {Date} minDate
  1075.      * Minimum allowable date (JavaScript date object, defaults to null)
  1076.      */
  1077.     /**
  1078.      * @cfg {Date} maxDate
  1079.      * Maximum allowable date (JavaScript date object, defaults to null)
  1080.      */
  1081.     /**
  1082.      * @cfg {Array} disabledDays
  1083.      * An array of days to disable, 0-based. For example, [0, 6] disables Sunday and Saturday (defaults to null).
  1084.      */
  1085.     /**
  1086.      * @cfg {RegExp} disabledDatesRE
  1087.      * JavaScript regular expression used to disable a pattern of dates (defaults to null).  The {@link #disabledDates}
  1088.      * config will generate this regex internally, but if you specify disabledDatesRE it will take precedence over the
  1089.      * disabledDates value.
  1090.      */
  1091.     /**
  1092.      * @cfg {Array} disabledDates
  1093.      * An array of 'dates' to disable, as strings. These strings will be used to build a dynamic regular
  1094.      * expression so they are very powerful. Some examples:
  1095.      * <ul>
  1096.      * <li>['03/08/2003', '09/16/2003'] would disable those exact dates</li>
  1097.      * <li>['03/08', '09/16'] would disable those days for every year</li>
  1098.      * <li>['^03/08'] would only match the beginning (useful if you are using short years)</li>
  1099.      * <li>['03/../2006'] would disable every day in March 2006</li>
  1100.      * <li>['^03'] would disable every day in every March</li>
  1101.      * </ul>
  1102.      * Note that the format of the dates included in the array should exactly match the {@link #format} config.
  1103.      * In order to support regular expressions, if you are using a date format that has '.' in it, you will have to
  1104.      * escape the dot when restricting dates. For example: ['03\.08\.03'].
  1105.      */
  1106.     // private
  1107.     initComponent : function(){
  1108.         Ext.DatePicker.superclass.initComponent.call(this);
  1109.         this.value = this.value ?
  1110.                  this.value.clearTime() : new Date().clearTime();
  1111.         this.addEvents(
  1112.             /**
  1113.              * @event select
  1114.              * Fires when a date is selected
  1115.              * @param {DatePicker} this
  1116.              * @param {Date} date The selected date
  1117.              */
  1118.             'select'
  1119.         );
  1120.         if(this.handler){
  1121.             this.on('select', this.handler,  this.scope || this);
  1122.         }
  1123.         this.initDisabledDays();
  1124.     },
  1125.     // private
  1126.     initDisabledDays : function(){
  1127.         if(!this.disabledDatesRE && this.disabledDates){
  1128.             var dd = this.disabledDates,
  1129.                 len = dd.length - 1,
  1130.                 re = '(?:';
  1131.                 
  1132.             Ext.each(dd, function(d, i){
  1133.                 re += Ext.isDate(d) ? '^' + Ext.escapeRe(d.dateFormat(this.format)) + '$' : dd[i];
  1134.                 if(i != len){
  1135.                     re += '|';
  1136.                 }
  1137.             }, this);
  1138.             this.disabledDatesRE = new RegExp(re + ')');
  1139.         }
  1140.     },
  1141.     /**
  1142.      * Replaces any existing disabled dates with new values and refreshes the DatePicker.
  1143.      * @param {Array/RegExp} disabledDates An array of date strings (see the {@link #disabledDates} config
  1144.      * for details on supported values), or a JavaScript regular expression used to disable a pattern of dates.
  1145.      */
  1146.     setDisabledDates : function(dd){
  1147.         if(Ext.isArray(dd)){
  1148.             this.disabledDates = dd;
  1149.             this.disabledDatesRE = null;
  1150.         }else{
  1151.             this.disabledDatesRE = dd;
  1152.         }
  1153.         this.initDisabledDays();
  1154.         this.update(this.value, true);
  1155.     },
  1156.     /**
  1157.      * Replaces any existing disabled days (by index, 0-6) with new values and refreshes the DatePicker.
  1158.      * @param {Array} disabledDays An array of disabled day indexes. See the {@link #disabledDays} config
  1159.      * for details on supported values.
  1160.      */
  1161.     setDisabledDays : function(dd){
  1162.         this.disabledDays = dd;
  1163.         this.update(this.value, true);
  1164.     },
  1165.     /**
  1166.      * Replaces any existing {@link #minDate} with the new value and refreshes the DatePicker.
  1167.      * @param {Date} value The minimum date that can be selected
  1168.      */
  1169.     setMinDate : function(dt){
  1170.         this.minDate = dt;
  1171.         this.update(this.value, true);
  1172.     },
  1173.     /**
  1174.      * Replaces any existing {@link #maxDate} with the new value and refreshes the DatePicker.
  1175.      * @param {Date} value The maximum date that can be selected
  1176.      */
  1177.     setMaxDate : function(dt){
  1178.         this.maxDate = dt;
  1179.         this.update(this.value, true);
  1180.     },
  1181.     /**
  1182.      * Sets the value of the date field
  1183.      * @param {Date} value The date to set
  1184.      */
  1185.     setValue : function(value){
  1186.         var old = this.value;
  1187.         this.value = value.clearTime(true);
  1188.         if(this.el){
  1189.             this.update(this.value);
  1190.         }
  1191.     },
  1192.     /**
  1193.      * Gets the current selected value of the date field
  1194.      * @return {Date} The selected date
  1195.      */
  1196.     getValue : function(){
  1197.         return this.value;
  1198.     },
  1199.     // private
  1200.     focus : function(){
  1201.         if(this.el){
  1202.             this.update(this.activeDate);
  1203.         }
  1204.     },
  1205.     
  1206.     // private
  1207.     onEnable: function(initial){
  1208.         Ext.DatePicker.superclass.onEnable.call(this);    
  1209.         this.doDisabled(false);
  1210.         this.update(initial ? this.value : this.activeDate);
  1211.         if(Ext.isIE){
  1212.             this.el.repaint();
  1213.         }
  1214.         
  1215.     },
  1216.     
  1217.     // private
  1218.     onDisable: function(){
  1219.         Ext.DatePicker.superclass.onDisable.call(this);   
  1220.         this.doDisabled(true);
  1221.         if(Ext.isIE && !Ext.isIE8){
  1222.             /* Really strange problem in IE6/7, when disabled, have to explicitly
  1223.              * repaint each of the nodes to get them to display correctly, simply
  1224.              * calling repaint on the main element doesn't appear to be enough.
  1225.              */
  1226.              Ext.each([].concat(this.textNodes, this.el.query('th span')), function(el){
  1227.                  Ext.fly(el).repaint();
  1228.              });
  1229.         }
  1230.     },
  1231.     
  1232.     // private
  1233.     doDisabled: function(disabled){
  1234.         this.keyNav.setDisabled(disabled);
  1235.         this.prevRepeater.setDisabled(disabled);
  1236.         this.nextRepeater.setDisabled(disabled);
  1237.         if(this.showToday){
  1238.             this.todayKeyListener.setDisabled(disabled);
  1239.             this.todayBtn.setDisabled(disabled);
  1240.         }
  1241.     },
  1242.     // private
  1243.     onRender : function(container, position){
  1244.         var m = [
  1245.              '<table cellspacing="0">',
  1246.                 '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'">&#160;</a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'">&#160;</a></td></tr>',
  1247.                 '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'],
  1248.                 dn = this.dayNames,
  1249.                 i;
  1250.         for(i = 0; i < 7; i++){
  1251.             var d = this.startDay+i;
  1252.             if(d > 6){
  1253.                 d = d-7;
  1254.             }
  1255.             m.push('<th><span>', dn[d].substr(0,1), '</span></th>');
  1256.         }
  1257.         m[m.length] = '</tr></thead><tbody><tr>';
  1258.         for(i = 0; i < 42; i++) {
  1259.             if(i % 7 === 0 && i !== 0){
  1260.                 m[m.length] = '</tr><tr>';
  1261.             }
  1262.             m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';
  1263.         }
  1264.         m.push('</tr></tbody></table></td></tr>',
  1265.                 this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '',
  1266.                 '</table><div class="x-date-mp"></div>');
  1267.         var el = document.createElement('div');
  1268.         el.className = 'x-date-picker';
  1269.         el.innerHTML = m.join('');
  1270.         container.dom.insertBefore(el, position);
  1271.         this.el = Ext.get(el);
  1272.         this.eventEl = Ext.get(el.firstChild);
  1273.         this.prevRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-left a'), {
  1274.             handler: this.showPrevMonth,
  1275.             scope: this,
  1276.             preventDefault:true,
  1277.             stopDefault:true
  1278.         });
  1279.         this.nextRepeater = new Ext.util.ClickRepeater(this.el.child('td.x-date-right a'), {
  1280.             handler: this.showNextMonth,
  1281.             scope: this,
  1282.             preventDefault:true,
  1283.             stopDefault:true
  1284.         });
  1285.         this.monthPicker = this.el.down('div.x-date-mp');
  1286.         this.monthPicker.enableDisplayMode('block');
  1287.         this.keyNav = new Ext.KeyNav(this.eventEl, {
  1288.             'left' : function(e){
  1289.                 if(e.ctrlKey){
  1290.                     this.showPrevMonth();
  1291.                 }else{
  1292.                     this.update(this.activeDate.add('d', -1));    
  1293.                 }
  1294.             },
  1295.             'right' : function(e){
  1296.                 if(e.ctrlKey){
  1297.                     this.showNextMonth();
  1298.                 }else{
  1299.                     this.update(this.activeDate.add('d', 1));    
  1300.                 }
  1301.             },
  1302.             'up' : function(e){
  1303.                 if(e.ctrlKey){
  1304.                     this.showNextYear();
  1305.                 }else{
  1306.                     this.update(this.activeDate.add('d', -7));
  1307.                 }
  1308.             },
  1309.             'down' : function(e){
  1310.                 if(e.ctrlKey){
  1311.                     this.showPrevYear();
  1312.                 }else{
  1313.                     this.update(this.activeDate.add('d', 7));
  1314.                 }
  1315.             },
  1316.             'pageUp' : function(e){
  1317.                 this.showNextMonth();
  1318.             },
  1319.             'pageDown' : function(e){
  1320.                 this.showPrevMonth();
  1321.             },
  1322.             'enter' : function(e){
  1323.                 e.stopPropagation();
  1324.                 return true;
  1325.             },
  1326.             scope : this
  1327.         });
  1328.         this.el.unselectable();
  1329.         this.cells = this.el.select('table.x-date-inner tbody td');
  1330.         this.textNodes = this.el.query('table.x-date-inner tbody span');
  1331.         this.mbtn = new Ext.Button({
  1332.             text: '&#160;',
  1333.             tooltip: this.monthYearText,
  1334.             renderTo: this.el.child('td.x-date-middle', true)
  1335.         });
  1336.         this.mbtn.el.child('em').addClass('x-btn-arrow');
  1337.         if(this.showToday){
  1338.             this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday,  this);
  1339.             var today = (new Date()).dateFormat(this.format);
  1340.             this.todayBtn = new Ext.Button({
  1341.                 renderTo: this.el.child('td.x-date-bottom', true),
  1342.                 text: String.format(this.todayText, today),
  1343.                 tooltip: String.format(this.todayTip, today),
  1344.                 handler: this.selectToday,
  1345.                 scope: this
  1346.             });
  1347.         }
  1348.         this.mon(this.eventEl, 'mousewheel', this.handleMouseWheel, this);
  1349.         this.mon(this.eventEl, 'click', this.handleDateClick,  this, {delegate: 'a.x-date-date'});
  1350.         this.mon(this.mbtn, 'click', this.showMonthPicker, this);
  1351.         this.onEnable(true);
  1352.     },
  1353.     // private
  1354.     createMonthPicker : function(){
  1355.         if(!this.monthPicker.dom.firstChild){
  1356.             var buf = ['<table border="0" cellspacing="0">'];
  1357.             for(var i = 0; i < 6; i++){
  1358.                 buf.push(
  1359.                     '<tr><td class="x-date-mp-month"><a href="#">', Date.getShortMonthName(i), '</a></td>',
  1360.                     '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', Date.getShortMonthName(i + 6), '</a></td>',
  1361.                     i === 0 ?
  1362.                     '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :
  1363.                     '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'
  1364.                 );
  1365.             }
  1366.             buf.push(
  1367.                 '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',
  1368.                     this.okText,
  1369.                     '</button><button type="button" class="x-date-mp-cancel">',
  1370.                     this.cancelText,
  1371.                     '</button></td></tr>',
  1372.                 '</table>'
  1373.             );
  1374.             this.monthPicker.update(buf.join(''));
  1375.             this.mon(this.monthPicker, 'click', this.onMonthClick, this);
  1376.             this.mon(this.monthPicker, 'dblclick', this.onMonthDblClick, this);
  1377.             this.mpMonths = this.monthPicker.select('td.x-date-mp-month');
  1378.             this.mpYears = this.monthPicker.select('td.x-date-mp-year');
  1379.             this.mpMonths.each(function(m, a, i){
  1380.                 i += 1;
  1381.                 if((i%2) === 0){
  1382.                     m.dom.xmonth = 5 + Math.round(i * 0.5);
  1383.                 }else{
  1384.                     m.dom.xmonth = Math.round((i-1) * 0.5);
  1385.                 }
  1386.             });
  1387.         }
  1388.     },
  1389.     // private
  1390.     showMonthPicker : function(){
  1391.         if(!this.disabled){
  1392.             this.createMonthPicker();
  1393.             var size = this.el.getSize();
  1394.             this.monthPicker.setSize(size);
  1395.             this.monthPicker.child('table').setSize(size);
  1396.             this.mpSelMonth = (this.activeDate || this.value).getMonth();
  1397.             this.updateMPMonth(this.mpSelMonth);
  1398.             this.mpSelYear = (this.activeDate || this.value).getFullYear();
  1399.             this.updateMPYear(this.mpSelYear);
  1400.             this.monthPicker.slideIn('t', {duration:0.2});
  1401.         }
  1402.     },
  1403.     // private
  1404.     updateMPYear : function(y){
  1405.         this.mpyear = y;
  1406.         var ys = this.mpYears.elements;
  1407.         for(var i = 1; i <= 10; i++){
  1408.             var td = ys[i-1], y2;
  1409.             if((i%2) === 0){
  1410.                 y2 = y + Math.round(i * 0.5);
  1411.                 td.firstChild.innerHTML = y2;
  1412.                 td.xyear = y2;
  1413.             }else{
  1414.                 y2 = y - (5-Math.round(i * 0.5));
  1415.                 td.firstChild.innerHTML = y2;
  1416.                 td.xyear = y2;
  1417.             }
  1418.             this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');
  1419.         }
  1420.     },
  1421.     // private
  1422.     updateMPMonth : function(sm){
  1423.         this.mpMonths.each(function(m, a, i){
  1424.             m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');
  1425.         });
  1426.     },
  1427.     // private
  1428.     selectMPMonth : function(m){
  1429.     },
  1430.     // private
  1431.     onMonthClick : function(e, t){
  1432.         e.stopEvent();
  1433.         var el = new Ext.Element(t), pn;
  1434.         if(el.is('button.x-date-mp-cancel')){
  1435.             this.hideMonthPicker();
  1436.         }
  1437.         else if(el.is('button.x-date-mp-ok')){
  1438.             var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());
  1439.             if(d.getMonth() != this.mpSelMonth){
  1440.                 // 'fix' the JS rolling date conversion if needed
  1441.                 d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();
  1442.             }
  1443.             this.update(d);
  1444.             this.hideMonthPicker();
  1445.         }
  1446.         else if((pn = el.up('td.x-date-mp-month', 2))){
  1447.             this.mpMonths.removeClass('x-date-mp-sel');
  1448.             pn.addClass('x-date-mp-sel');
  1449.             this.mpSelMonth = pn.dom.xmonth;
  1450.         }
  1451.         else if((pn = el.up('td.x-date-mp-year', 2))){
  1452.             this.mpYears.removeClass('x-date-mp-sel');
  1453.             pn.addClass('x-date-mp-sel');
  1454.             this.mpSelYear = pn.dom.xyear;
  1455.         }
  1456.         else if(el.is('a.x-date-mp-prev')){
  1457.             this.updateMPYear(this.mpyear-10);
  1458.         }
  1459.         else if(el.is('a.x-date-mp-next')){
  1460.             this.updateMPYear(this.mpyear+10);
  1461.         }
  1462.     },
  1463.     // private
  1464.     onMonthDblClick : function(e, t){
  1465.         e.stopEvent();
  1466.         var el = new Ext.Element(t), pn;
  1467.         if((pn = el.up('td.x-date-mp-month', 2))){
  1468.             this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));
  1469.             this.hideMonthPicker();
  1470.         }
  1471.         else if((pn = el.up('td.x-date-mp-year', 2))){
  1472.             this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));
  1473.             this.hideMonthPicker();
  1474.         }
  1475.     },
  1476.     // private
  1477.     hideMonthPicker : function(disableAnim){
  1478.         if(this.monthPicker){
  1479.             if(disableAnim === true){
  1480.                 this.monthPicker.hide();
  1481.             }else{
  1482.                 this.monthPicker.slideOut('t', {duration:0.2});
  1483.             }
  1484.         }
  1485.     },
  1486.     // private
  1487.     showPrevMonth : function(e){
  1488.         this.update(this.activeDate.add('mo', -1));
  1489.     },
  1490.     // private
  1491.     showNextMonth : function(e){
  1492.         this.update(this.activeDate.add('mo', 1));
  1493.     },
  1494.     // private
  1495.     showPrevYear : function(){
  1496.         this.update(this.activeDate.add('y', -1));
  1497.     },
  1498.     // private
  1499.     showNextYear : function(){
  1500.         this.update(this.activeDate.add('y', 1));
  1501.     },
  1502.     // private
  1503.     handleMouseWheel : function(e){
  1504.         e.stopEvent();
  1505.         if(!this.disabled){
  1506.             var delta = e.getWheelDelta();
  1507.             if(delta > 0){
  1508.                 this.showPrevMonth();
  1509.             } else if(delta < 0){
  1510.                 this.showNextMonth();
  1511.             }
  1512.         }
  1513.     },
  1514.     // private
  1515.     handleDateClick : function(e, t){
  1516.         e.stopEvent();
  1517.         if(!this.disabled && t.dateValue && !Ext.fly(t.parentNode).hasClass('x-date-disabled')){
  1518.             this.setValue(new Date(t.dateValue));
  1519.             this.fireEvent('select', this, this.value);
  1520.         }
  1521.     },
  1522.     // private
  1523.     selectToday : function(){
  1524.         if(this.todayBtn && !this.todayBtn.disabled){
  1525.             this.setValue(new Date().clearTime());
  1526.             this.fireEvent('select', this, this.value);
  1527.         }
  1528.     },
  1529.     // private
  1530.     update : function(date, forceRefresh){
  1531.         var vd = this.activeDate, vis = this.isVisible();
  1532.         this.activeDate = date;