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

中间件编程

开发平台:

JavaScript

  1.      * This is a raw adjustment where the first anchor is the offset from the right edge of the container,
  2.      * and the second is the offset from the bottom edge. For example:<pre><code>
  3. // two values specified
  4. anchor: '-50 -100' // render item the complete width of the container
  5.                    // minus 50 pixels and
  6.                    // the complete height minus 100 pixels.
  7. // one value specified
  8. anchor: '-50'      // anchor value is assumed to be the right offset value
  9.                    // bottom offset will default to 0
  10.      * </code></pre></div></li>
  11.      * 
  12.      * <li><b>Sides</b> : Valid values are <tt>'right'</tt> (or <tt>'r'</tt>) and <tt>'bottom'</tt>
  13.      * (or <tt>'b'</tt>).<div class="sub-desc">
  14.      * Either the container must have a fixed size or an anchorSize config value defined at render time in
  15.      * order for these to have any effect.</div></li>
  16.      *
  17.      * <li><b>Mixed</b> : <div class="sub-desc">
  18.      * Anchor values can also be mixed as needed.  For example, to render the width offset from the container
  19.      * right edge by 50 pixels and 75% of the container's height use:
  20.      * <pre><code>
  21. anchor: '-50 75%' 
  22.      * </code></pre></div></li>
  23.      * 
  24.      * 
  25.      * </ul></div>
  26.      */
  27.     
  28.     // private
  29.     monitorResize:true,
  30.     // private
  31.     getAnchorViewSize : function(ct, target){
  32.         return target.dom == document.body ?
  33.                    target.getViewSize() : target.getStyleSize();
  34.     },
  35.     // private
  36.     onLayout : function(ct, target){
  37.         Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);
  38.         var size = this.getAnchorViewSize(ct, target);
  39.         var w = size.width, h = size.height;
  40.         if(w < 20 && h < 20){
  41.             return;
  42.         }
  43.         // find the container anchoring size
  44.         var aw, ah;
  45.         if(ct.anchorSize){
  46.             if(typeof ct.anchorSize == 'number'){
  47.                 aw = ct.anchorSize;
  48.             }else{
  49.                 aw = ct.anchorSize.width;
  50.                 ah = ct.anchorSize.height;
  51.             }
  52.         }else{
  53.             aw = ct.initialConfig.width;
  54.             ah = ct.initialConfig.height;
  55.         }
  56.         var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;
  57.         for(i = 0; i < len; i++){
  58.             c = cs[i];
  59.             if(c.anchor){
  60.                 a = c.anchorSpec;
  61.                 if(!a){ // cache all anchor values
  62.                     var vs = c.anchor.split(' ');
  63.                     c.anchorSpec = a = {
  64.                         right: this.parseAnchor(vs[0], c.initialConfig.width, aw),
  65.                         bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)
  66.                     };
  67.                 }
  68.                 cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;
  69.                 ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;
  70.                 if(cw || ch){
  71.                     c.setSize(cw || undefined, ch || undefined);
  72.                 }
  73.             }
  74.         }
  75.     },
  76.     // private
  77.     parseAnchor : function(a, start, cstart){
  78.         if(a && a != 'none'){
  79.             var last;
  80.             if(/^(r|right|b|bottom)$/i.test(a)){   // standard anchor
  81.                 var diff = cstart - start;
  82.                 return function(v){
  83.                     if(v !== last){
  84.                         last = v;
  85.                         return v - diff;
  86.                     }
  87.                 }
  88.             }else if(a.indexOf('%') != -1){
  89.                 var ratio = parseFloat(a.replace('%', ''))*.01;   // percentage
  90.                 return function(v){
  91.                     if(v !== last){
  92.                         last = v;
  93.                         return Math.floor(v*ratio);
  94.                     }
  95.                 }
  96.             }else{
  97.                 a = parseInt(a, 10);
  98.                 if(!isNaN(a)){                            // simple offset adjustment
  99.                     return function(v){
  100.                         if(v !== last){
  101.                             last = v;
  102.                             return v + a;
  103.                         }
  104.                     }
  105.                 }
  106.             }
  107.         }
  108.         return false;
  109.     },
  110.     // private
  111.     adjustWidthAnchor : function(value, comp){
  112.         return value;
  113.     },
  114.     // private
  115.     adjustHeightAnchor : function(value, comp){
  116.         return value;
  117.     }
  118.     
  119.     /**
  120.      * @property activeItem
  121.      * @hide
  122.      */
  123. });
  124. Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;/**
  125.  * @class Ext.layout.ColumnLayout
  126.  * @extends Ext.layout.ContainerLayout
  127.  * <p>This is the layout style of choice for creating structural layouts in a multi-column format where the width of
  128.  * each column can be specified as a percentage or fixed width, but the height is allowed to vary based on the content.
  129.  * This class is intended to be extended or created via the layout:'column' {@link Ext.Container#layout} config,
  130.  * and should generally not need to be created directly via the new keyword.</p>
  131.  * <p>ColumnLayout does not have any direct config options (other than inherited ones), but it does support a
  132.  * specific config property of <b><tt>columnWidth</tt></b> that can be included in the config of any panel added to it.  The
  133.  * layout will use the columnWidth (if present) or width of each panel during layout to determine how to size each panel.
  134.  * If width or columnWidth is not specified for a given panel, its width will default to the panel's width (or auto).</p>
  135.  * <p>The width property is always evaluated as pixels, and must be a number greater than or equal to 1.
  136.  * The columnWidth property is always evaluated as a percentage, and must be a decimal value greater than 0 and
  137.  * less than 1 (e.g., .25).</p>
  138.  * <p>The basic rules for specifying column widths are pretty simple.  The logic makes two passes through the
  139.  * set of contained panels.  During the first layout pass, all panels that either have a fixed width or none
  140.  * specified (auto) are skipped, but their widths are subtracted from the overall container width.  During the second
  141.  * pass, all panels with columnWidths are assigned pixel widths in proportion to their percentages based on
  142.  * the total <b>remaining</b> container width.  In other words, percentage width panels are designed to fill the space
  143.  * left over by all the fixed-width and/or auto-width panels.  Because of this, while you can specify any number of columns
  144.  * with different percentages, the columnWidths must always add up to 1 (or 100%) when added together, otherwise your
  145.  * layout may not render as expected.  Example usage:</p>
  146.  * <pre><code>
  147. // All columns are percentages -- they must add up to 1
  148. var p = new Ext.Panel({
  149.     title: 'Column Layout - Percentage Only',
  150.     layout:'column',
  151.     items: [{
  152.         title: 'Column 1',
  153.         columnWidth: .25 
  154.     },{
  155.         title: 'Column 2',
  156.         columnWidth: .6
  157.     },{
  158.         title: 'Column 3',
  159.         columnWidth: .15
  160.     }]
  161. });
  162. // Mix of width and columnWidth -- all columnWidth values must add up
  163. // to 1. The first column will take up exactly 120px, and the last two
  164. // columns will fill the remaining container width.
  165. var p = new Ext.Panel({
  166.     title: 'Column Layout - Mixed',
  167.     layout:'column',
  168.     items: [{
  169.         title: 'Column 1',
  170.         width: 120
  171.     },{
  172.         title: 'Column 2',
  173.         columnWidth: .8
  174.     },{
  175.         title: 'Column 3',
  176.         columnWidth: .2
  177.     }]
  178. });
  179. </code></pre>
  180.  */
  181. Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {
  182.     // private
  183.     monitorResize:true,
  184.     
  185.     extraCls: 'x-column',
  186.     scrollOffset : 0,
  187.     // private
  188.     isValidParent : function(c, target){
  189.         return (c.getPositionEl ? c.getPositionEl() : c.getEl()).dom.parentNode == this.innerCt.dom;
  190.     },
  191.     // private
  192.     onLayout : function(ct, target){
  193.         var cs = ct.items.items, len = cs.length, c, i;
  194.         if(!this.innerCt){
  195.             target.addClass('x-column-layout-ct');
  196.             // the innerCt prevents wrapping and shuffling while
  197.             // the container is resizing
  198.             this.innerCt = target.createChild({cls:'x-column-inner'});
  199.             this.innerCt.createChild({cls:'x-clear'});
  200.         }
  201.         this.renderAll(ct, this.innerCt);
  202.         var size = Ext.isIE && target.dom != Ext.getBody().dom ? target.getStyleSize() : target.getViewSize();
  203.         if(size.width < 1 && size.height < 1){ // display none?
  204.             return;
  205.         }
  206.         var w = size.width - target.getPadding('lr') - this.scrollOffset,
  207.             h = size.height - target.getPadding('tb'),
  208.             pw = w;
  209.         this.innerCt.setWidth(w);
  210.         
  211.         // some columns can be percentages while others are fixed
  212.         // so we need to make 2 passes
  213.         for(i = 0; i < len; i++){
  214.             c = cs[i];
  215.             if(!c.columnWidth){
  216.                 pw -= (c.getSize().width + c.getEl().getMargins('lr'));
  217.             }
  218.         }
  219.         pw = pw < 0 ? 0 : pw;
  220.         for(i = 0; i < len; i++){
  221.             c = cs[i];
  222.             if(c.columnWidth){
  223.                 c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));
  224.             }
  225.         }
  226.     }
  227.     
  228.     /**
  229.      * @property activeItem
  230.      * @hide
  231.      */
  232. });
  233. 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;/**
  234.  * @class Ext.layout.AccordionLayout
  235.  * @extends Ext.layout.FitLayout
  236.  * <p>This is a layout that contains multiple panels in an expandable accordion style such that only
  237.  * <b>one panel can be open at any given time</b>.  Each panel has built-in support for expanding and collapsing.
  238.  * <p>This class is intended to be extended or created via the <tt><b>{@link Ext.Container#layout layout}</b></tt>
  239.  * configuration property.  See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>
  240.  * <p>Example usage:</p>
  241.  * <pre><code>
  242. var accordion = new Ext.Panel({
  243.     title: 'Accordion Layout',
  244.     layout:'accordion',
  245.     defaults: {
  246.         // applied to each contained panel
  247.         bodyStyle: 'padding:15px'
  248.     },
  249.     layoutConfig: {
  250.         // layout-specific configs go here
  251.         titleCollapse: false,
  252.         animate: true,
  253.         activeOnTop: true
  254.     },
  255.     items: [{
  256.         title: 'Panel 1',
  257.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  258.     },{
  259.         title: 'Panel 2',
  260.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  261.     },{
  262.         title: 'Panel 3',
  263.         html: '&lt;p&gt;Panel content!&lt;/p&gt;'
  264.     }]
  265. });
  266. </code></pre>
  267.  */
  268. Ext.layout.AccordionLayout = Ext.extend(Ext.layout.FitLayout, {
  269.     /**
  270.      * @cfg {Boolean} fill
  271.      * True to adjust the active item's height to fill the available space in the container, false to use the
  272.      * item's current height, or auto height if not explicitly set (defaults to true).
  273.      */
  274.     fill : true,
  275.     /**
  276.      * @cfg {Boolean} autoWidth
  277.      * True to set each contained item's width to 'auto', false to use the item's current width (defaults to true).
  278.      * Note that some components, in particular the {@link Ext.grid.GridPanel grid}, will not function properly within
  279.      * layouts if they have auto width, so in such cases this config should be set to false.
  280.      */
  281.     autoWidth : true,
  282.     /**
  283.      * @cfg {Boolean} titleCollapse
  284.      * True to allow expand/collapse of each contained panel by clicking anywhere on the title bar, false to allow
  285.      * expand/collapse only when the toggle tool button is clicked (defaults to true).  When set to false,
  286.      * {@link #hideCollapseTool} should be false also.
  287.      */
  288.     titleCollapse : true,
  289.     /**
  290.      * @cfg {Boolean} hideCollapseTool
  291.      * True to hide the contained panels' collapse/expand toggle buttons, false to display them (defaults to false).
  292.      * When set to true, {@link #titleCollapse} should be true also.
  293.      */
  294.     hideCollapseTool : false,
  295.     /**
  296.      * @cfg {Boolean} collapseFirst
  297.      * True to make sure the collapse/expand toggle button always renders first (to the left of) any other tools
  298.      * in the contained panels' title bars, false to render it last (defaults to false).
  299.      */
  300.     collapseFirst : false,
  301.     /**
  302.      * @cfg {Boolean} animate
  303.      * True to slide the contained panels open and closed during expand/collapse using animation, false to open and
  304.      * close directly with no animation (defaults to false).  Note: to defer to the specific config setting of each
  305.      * contained panel for this property, set this to undefined at the layout level.
  306.      */
  307.     animate : false,
  308.     /**
  309.      * @cfg {Boolean} sequence
  310.      * <b>Experimental</b>. If animate is set to true, this will result in each animation running in sequence.
  311.      */
  312.     sequence : false,
  313.     /**
  314.      * @cfg {Boolean} activeOnTop
  315.      * True to swap the position of each panel as it is expanded so that it becomes the first item in the container,
  316.      * false to keep the panels in the rendered order. <b>This is NOT compatible with "animate:true"</b> (defaults to false).
  317.      */
  318.     activeOnTop : false,
  319.     renderItem : function(c){
  320.         if(this.animate === false){
  321.             c.animCollapse = false;
  322.         }
  323.         c.collapsible = true;
  324.         if(this.autoWidth){
  325.             c.autoWidth = true;
  326.         }
  327.         if(this.titleCollapse){
  328.             c.titleCollapse = true;
  329.         }
  330.         if(this.hideCollapseTool){
  331.             c.hideCollapseTool = true;
  332.         }
  333.         if(this.collapseFirst !== undefined){
  334.             c.collapseFirst = this.collapseFirst;
  335.         }
  336.         if(!this.activeItem && !c.collapsed){
  337.             this.activeItem = c;
  338.         }else if(this.activeItem && this.activeItem != c){
  339.             c.collapsed = true;
  340.         }
  341.         Ext.layout.AccordionLayout.superclass.renderItem.apply(this, arguments);
  342.         c.header.addClass('x-accordion-hd');
  343.         c.on('beforeexpand', this.beforeExpand, this);
  344.     },
  345.     // private
  346.     beforeExpand : function(p, anim){
  347.         var ai = this.activeItem;
  348.         if(ai){
  349.             if(this.sequence){
  350.                 delete this.activeItem;
  351.                 if (!ai.collapsed){
  352.                     ai.collapse({callback:function(){
  353.                         p.expand(anim || true);
  354.                     }, scope: this});
  355.                     return false;
  356.                 }
  357.             }else{
  358.                 ai.collapse(this.animate);
  359.             }
  360.         }
  361.         this.activeItem = p;
  362.         if(this.activeOnTop){
  363.             p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);
  364.         }
  365.         this.layout();
  366.     },
  367.     // private
  368.     setItemSize : function(item, size){
  369.         if(this.fill && item){
  370.             var hh = 0;
  371.             this.container.items.each(function(p){
  372.                 if(p != item){
  373.                     hh += p.header.getHeight();
  374.                 }    
  375.             });
  376.             size.height -= hh;
  377.             item.setSize(size);
  378.         }
  379.     },
  380.     /**
  381.      * Sets the active (expanded) item in the layout.
  382.      * @param {String/Number} item The string component id or numeric index of the item to activate
  383.      */
  384.     setActiveItem : function(item){
  385.         item = this.container.getComponent(item);
  386.         if(this.activeItem != item){
  387.             if(item.rendered && item.collapsed){
  388.                 item.expand();
  389.             }else{
  390.                 this.activeItem = item;
  391.             }
  392.         }
  393.     }
  394. });
  395. Ext.Container.LAYOUTS.accordion = Ext.layout.AccordionLayout;
  396. //backwards compat
  397. Ext.layout.Accordion = Ext.layout.AccordionLayout;/**
  398.  * @class Ext.layout.TableLayout
  399.  * @extends Ext.layout.ContainerLayout
  400.  * <p>This layout allows you to easily render content into an HTML table.  The total number of columns can be
  401.  * specified, and rowspan and colspan can be used to create complex layouts within the table.
  402.  * This class is intended to be extended or created via the layout:'table' {@link Ext.Container#layout} config,
  403.  * and should generally not need to be created directly via the new keyword.</p>
  404.  * <p>Note that when creating a layout via config, the layout-specific config properties must be passed in via
  405.  * the {@link Ext.Container#layoutConfig} object which will then be applied internally to the layout.  In the
  406.  * case of TableLayout, the only valid layout config property is {@link #columns}.  However, the items added to a
  407.  * TableLayout can supply the following table-specific config properties:</p>
  408.  * <ul>
  409.  * <li><b>rowspan</b> Applied to the table cell containing the item.</li>
  410.  * <li><b>colspan</b> Applied to the table cell containing the item.</li>
  411.  * <li><b>cellId</b> An id applied to the table cell containing the item.</li>
  412.  * <li><b>cellCls</b> A CSS class name added to the table cell containing the item.</li>
  413.  * </ul>
  414.  * <p>The basic concept of building up a TableLayout is conceptually very similar to building up a standard
  415.  * HTML table.  You simply add each panel (or "cell") that you want to include along with any span attributes
  416.  * specified as the special config properties of rowspan and colspan which work exactly like their HTML counterparts.
  417.  * Rather than explicitly creating and nesting rows and columns as you would in HTML, you simply specify the
  418.  * total column count in the layoutConfig and start adding panels in their natural order from left to right,
  419.  * top to bottom.  The layout will automatically figure out, based on the column count, rowspans and colspans,
  420.  * how to position each panel within the table.  Just like with HTML tables, your rowspans and colspans must add
  421.  * up correctly in your overall layout or you'll end up with missing and/or extra cells!  Example usage:</p>
  422.  * <pre><code>
  423. // This code will generate a layout table that is 3 columns by 2 rows
  424. // with some spanning included.  The basic layout will be:
  425. // +--------+-----------------+
  426. // |   A    |   B             |
  427. // |        |--------+--------|
  428. // |        |   C    |   D    |
  429. // +--------+--------+--------+
  430. var table = new Ext.Panel({
  431.     title: 'Table Layout',
  432.     layout:'table',
  433.     defaults: {
  434.         // applied to each contained panel
  435.         bodyStyle:'padding:20px'
  436.     },
  437.     layoutConfig: {
  438.         // The total column count must be specified here
  439.         columns: 3
  440.     },
  441.     items: [{
  442.         html: '&lt;p&gt;Cell A content&lt;/p&gt;',
  443.         rowspan: 2
  444.     },{
  445.         html: '&lt;p&gt;Cell B content&lt;/p&gt;',
  446.         colspan: 2
  447.     },{
  448.         html: '&lt;p&gt;Cell C content&lt;/p&gt;',
  449.         cellCls: 'highlight'
  450.     },{
  451.         html: '&lt;p&gt;Cell D content&lt;/p&gt;'
  452.     }]
  453. });
  454. </code></pre>
  455.  */
  456. Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {
  457.     /**
  458.      * @cfg {Number} columns
  459.      * The total number of columns to create in the table for this layout.  If not specified, all Components added to
  460.      * this layout will be rendered into a single row using one column per Component.
  461.      */
  462.     // private
  463.     monitorResize:false,
  464.     /**
  465.      * @cfg {Object} tableAttrs
  466.      * <p>An object containing properties which are added to the {@link Ext.DomHelper DomHelper} specification
  467.      * used to create the layout's <tt>&lt;table&gt;</tt> element. Example:</p><pre><code>
  468. {
  469.     xtype: 'panel',
  470.     layout: 'table',
  471.     layoutConfig: {
  472.         tableAttrs: {
  473.          style: {
  474.          width: '100%'
  475.          }
  476.         },
  477.         columns: 3
  478.     }
  479. }</code></pre>
  480.      */
  481.     tableAttrs:null,
  482.     
  483.     // private
  484.     setContainer : function(ct){
  485.         Ext.layout.TableLayout.superclass.setContainer.call(this, ct);
  486.         this.currentRow = 0;
  487.         this.currentColumn = 0;
  488.         this.cells = [];
  489.     },
  490.     // private
  491.     onLayout : function(ct, target){
  492.         var cs = ct.items.items, len = cs.length, c, i;
  493.         if(!this.table){
  494.             target.addClass('x-table-layout-ct');
  495.             this.table = target.createChild(
  496.                 Ext.apply({tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, this.tableAttrs), null, true);
  497.         }
  498.         this.renderAll(ct, target);
  499.     },
  500.     // private
  501.     getRow : function(index){
  502.         var row = this.table.tBodies[0].childNodes[index];
  503.         if(!row){
  504.             row = document.createElement('tr');
  505.             this.table.tBodies[0].appendChild(row);
  506.         }
  507.         return row;
  508.     },
  509.     // private
  510.     getNextCell : function(c){
  511.         var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);
  512.         var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];
  513.         for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){
  514.             if(!this.cells[rowIndex]){
  515.                 this.cells[rowIndex] = [];
  516.             }
  517.             for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){
  518.                 this.cells[rowIndex][colIndex] = true;
  519.             }
  520.         }
  521.         var td = document.createElement('td');
  522.         if(c.cellId){
  523.             td.id = c.cellId;
  524.         }
  525.         var cls = 'x-table-layout-cell';
  526.         if(c.cellCls){
  527.             cls += ' ' + c.cellCls;
  528.         }
  529.         td.className = cls;
  530.         if(c.colspan){
  531.             td.colSpan = c.colspan;
  532.         }
  533.         if(c.rowspan){
  534.             td.rowSpan = c.rowspan;
  535.         }
  536.         this.getRow(curRow).appendChild(td);
  537.         return td;
  538.     },
  539.     
  540.     // private
  541.     getNextNonSpan: function(colIndex, rowIndex){
  542.         var cols = this.columns;
  543.         while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {
  544.             if(cols && colIndex >= cols){
  545.                 rowIndex++;
  546.                 colIndex = 0;
  547.             }else{
  548.                 colIndex++;
  549.             }
  550.         }
  551.         return [colIndex, rowIndex];
  552.     },
  553.     // private
  554.     renderItem : function(c, position, target){
  555.         if(c && !c.rendered){
  556.             c.render(this.getNextCell(c));
  557.             if(this.extraCls){
  558.                 var t = c.getPositionEl ? c.getPositionEl() : c;
  559.                 t.addClass(this.extraCls);
  560.             }
  561.         }
  562.     },
  563.     // private
  564.     isValidParent : function(c, target){
  565.         return true;
  566.     }
  567.     /**
  568.      * @property activeItem
  569.      * @hide
  570.      */
  571. });
  572. Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;/**
  573.  * @class Ext.layout.AbsoluteLayout
  574.  * @extends Ext.layout.AnchorLayout
  575.  * <p>This is a layout that inherits the anchoring of <b>{@link Ext.layout.AnchorLayout}</b> and adds the
  576.  * ability for x/y positioning using the standard x and y component config options.</p>
  577.  * <p>This class is intended to be extended or created via the <tt><b>{@link Ext.Container#layout layout}</b></tt>
  578.  * configuration property.  See <tt><b>{@link Ext.Container#layout}</b></tt> for additional details.</p>
  579.  * <p>Example usage:</p>
  580.  * <pre><code>
  581. var form = new Ext.form.FormPanel({
  582.     title: 'Absolute Layout',
  583.     layout:'absolute',
  584.     layoutConfig: {
  585.         // layout-specific configs go here
  586.         extraCls: 'x-abs-layout-item',
  587.     },
  588.     baseCls: 'x-plain',
  589.     url:'save-form.php',
  590.     defaultType: 'textfield',
  591.     items: [{
  592.         x: 0,
  593.         y: 5,
  594.         xtype:'label',
  595.         text: 'Send To:'
  596.     },{
  597.         x: 60,
  598.         y: 0,
  599.         name: 'to',
  600.         anchor:'100%'  // anchor width by percentage
  601.     },{
  602.         x: 0,
  603.         y: 35,
  604.         xtype:'label',
  605.         text: 'Subject:'
  606.     },{
  607.         x: 60,
  608.         y: 30,
  609.         name: 'subject',
  610.         anchor: '100%'  // anchor width by percentage
  611.     },{
  612.         x:0,
  613.         y: 60,
  614.         xtype: 'textarea',
  615.         name: 'msg',
  616.         anchor: '100% 100%'  // anchor width and height
  617.     }]
  618. });
  619. </code></pre>
  620.  */
  621. Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {
  622.     extraCls: 'x-abs-layout-item',
  623.     onLayout : function(ct, target){
  624.         target.position();
  625.         this.paddingLeft = target.getPadding('l');
  626.         this.paddingTop = target.getPadding('t');
  627.         Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);
  628.     },
  629.     // private
  630.     adjustWidthAnchor : function(value, comp){
  631.         return value ? value - comp.getPosition(true)[0] + this.paddingLeft : value;
  632.     },
  633.     // private
  634.     adjustHeightAnchor : function(value, comp){
  635.         return  value ? value - comp.getPosition(true)[1] + this.paddingTop : value;
  636.     }
  637.     /**
  638.      * @property activeItem
  639.      * @hide
  640.      */
  641. });
  642. Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout; /**
  643.  * @class Ext.layout.BoxLayout
  644.  * @extends Ext.layout.ContainerLayout
  645.  * <p>Base Class for HBoxLayout and VBoxLayout Classes. Generally it should not need to be used directly.</p>
  646.  */
  647. Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
  648.     /**
  649.      * @cfg {Object} defaultMargins
  650.      * <p>If the individual contained items do not have a <tt>margins</tt>
  651.      * property specified, the default margins from this property will be
  652.      * applied to each item.</p>
  653.      * <br><p>This property may be specified as an object containing margins
  654.      * to apply in the format:</p><pre><code>
  655. {
  656.     top: (top margin),
  657.     right: (right margin),
  658.     bottom: (bottom margin),
  659.     left: (left margin)
  660. }</code></pre>
  661.      * <p>This property may also be specified as a string containing
  662.      * space-separated, numeric margin values. The order of the sides associated
  663.      * with each value matches the way CSS processes margin values:</p>
  664.      * <div class="mdetail-params"><ul>
  665.      * <li>If there is only one value, it applies to all sides.</li>
  666.      * <li>If there are two values, the top and bottom borders are set to the
  667.      * first value and the right and left are set to the second.</li>
  668.      * <li>If there are three values, the top is set to the first value, the left
  669.      * and right are set to the second, and the bottom is set to the third.</li>
  670.      * <li>If there are four values, they apply to the top, right, bottom, and
  671.      * left, respectively.</li>
  672.      * </ul></div>
  673.      * <p>Defaults to:</p><pre><code>
  674.      * {top:0, right:0, bottom:0, left:0}
  675.      * </code></pre>
  676.      */
  677.     defaultMargins : {left:0,top:0,right:0,bottom:0},
  678.     /**
  679.      * @cfg {String} padding
  680.      * Defaults to <tt>'0'</tt>. Sets the padding to be applied to all child items managed by this
  681.      * container's layout. 
  682.      */
  683.     padding : '0',
  684.     // documented in subclasses
  685.     pack : 'start',
  686.     // private
  687.     monitorResize : true,
  688.     scrollOffset : 0,
  689.     extraCls : 'x-box-item',
  690.     ctCls : 'x-box-layout-ct',
  691.     innerCls : 'x-box-inner',
  692.     // private
  693.     isValidParent : function(c, target){
  694.         return c.getEl().dom.parentNode == this.innerCt.dom;
  695.     },
  696.     // private
  697.     onLayout : function(ct, target){
  698.         var cs = ct.items.items, len = cs.length, c, i, last = len-1, cm;
  699.         if(!this.innerCt){
  700.             target.addClass(this.ctCls);
  701.             // the innerCt prevents wrapping and shuffling while
  702.             // the container is resizing
  703.             this.innerCt = target.createChild({cls:this.innerCls});
  704.             this.padding = this.parseMargins(this.padding); 
  705.         }
  706.         this.renderAll(ct, this.innerCt);
  707.     },
  708.     // private
  709.     renderItem : function(c){
  710.         if(typeof c.margins == 'string'){
  711.             c.margins = this.parseMargins(c.margins);
  712.         }else if(!c.margins){
  713.             c.margins = this.defaultMargins;
  714.         }
  715.         Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
  716.     },
  717.     getTargetSize : function(target){         return (Ext.isIE6 && Ext.isStrict && target.dom == document.body) ? target.getStyleSize() : target.getViewSize();
  718.     },
  719.     
  720.     getItems: function(ct){
  721.         var items = [];
  722.         ct.items.each(function(c){
  723.             if(c.isVisible()){
  724.                 items.push(c);
  725.             }
  726.         });
  727.         return items;
  728.     }
  729.     /**
  730.      * @property activeItem
  731.      * @hide
  732.      */
  733. });
  734. /**
  735.  * @class Ext.layout.VBoxLayout
  736.  * @extends Ext.layout.BoxLayout
  737.  * A layout that arranges items vertically
  738.  */
  739. Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
  740.     /**
  741.      * @cfg {String} align
  742.      * Controls how the child items of the container are aligned. Acceptable configuration values for this
  743.      * property are:
  744.      * <div class="mdetail-params"><ul>
  745.      * <li><b><tt>left</tt></b> : <b>Default</b><div class="sub-desc">child items are aligned horizontally
  746.      * at the <b>left</b> side of the container</div></li>
  747.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are aligned horizontally at the
  748.      * <b>mid-width</b> of the container</div></li>
  749.      * <li><b><tt>stretch</tt></b> : <div class="sub-desc">child items are stretched horizontally to fill
  750.      * the width of the container</div></li>
  751.      * <li><b><tt>stretchmax</tt></b> : <div class="sub-desc">child items are stretched horizontally to
  752.      * the size of the largest item.</div></li>
  753.      * </ul></div>
  754.      */
  755.     align : 'left', // left, center, stretch, strechmax
  756.     /**
  757.      * @cfg {String} pack
  758.      * Controls how the child items of the container are packed together. Acceptable configuration values
  759.      * for this property are:
  760.      * <div class="mdetail-params"><ul>
  761.      * <li><b><tt>start</tt></b> : <b>Default</b><div class="sub-desc">child items are packed together at
  762.      * <b>top</b> side of container</div></li>
  763.      * <li><b><tt>center</tt></b> : <div class="sub-desc">child items are packed together at
  764.      * <b>mid-height</b> of container</div></li>
  765.      * <li><b><tt>end</tt></b> : <div class="sub-desc">child items are packed together at <b>bottom</b>
  766.      * side of container</div></li>
  767.      * </ul></div>
  768.      */
  769.     /**
  770.      * @cfg {Number} flex
  771.      * This configuation option is to be applied to <b>child <tt>items</tt></b> of the container managed
  772.      * by this layout. Each child item with a <tt>flex</tt> property will be flexed <b>vertically</b>
  773.      * according to each item's <b>relative</b> <tt>flex</tt> value compared to the sum of all items with
  774.      * a <tt>flex</tt> value specified.  Any child items that have either a <tt>flex = 0</tt> or
  775.      * <tt>flex = undefined</tt> will not be 'flexed' (the initial size will not be changed).
  776.      */
  777.     // private
  778.     onLayout : function(ct, target){
  779.         Ext.layout.VBoxLayout.superclass.onLayout.call(this, ct, target);
  780.                     
  781.         
  782.         var cs = this.getItems(ct), cm, ch, margin,
  783.             size = this.getTargetSize(target),
  784.             w = size.width - target.getPadding('lr') - this.scrollOffset,
  785.             h = size.height - target.getPadding('tb'),
  786.             l = this.padding.left, t = this.padding.top,
  787.             isStart = this.pack == 'start',
  788.             isRestore = ['stretch', 'stretchmax'].indexOf(this.align) == -1,
  789.             stretchWidth = w - (this.padding.left + this.padding.right),
  790.             extraHeight = 0,
  791.             maxWidth = 0,
  792.             totalFlex = 0,
  793.             flexHeight = 0,
  794.             usedHeight = 0;
  795.             
  796.         Ext.each(cs, function(c){
  797.             cm = c.margins;
  798.             totalFlex += c.flex || 0;
  799.             ch = c.getHeight();
  800.             margin = cm.top + cm.bottom;
  801.             extraHeight += ch + margin;
  802.             flexHeight += margin + (c.flex ? 0 : ch);
  803.             maxWidth = Math.max(maxWidth, c.getWidth() + cm.left + cm.right);
  804.         });
  805.         extraHeight = h - extraHeight - this.padding.top - this.padding.bottom;
  806.         
  807.         var innerCtWidth = maxWidth + this.padding.left + this.padding.right;
  808.         switch(this.align){
  809.             case 'stretch':
  810.                 this.innerCt.setSize(w, h);
  811.                 break;
  812.             case 'stretchmax':
  813.             case 'left':
  814.                 this.innerCt.setSize(innerCtWidth, h);
  815.                 break;
  816.             case 'center':
  817.                 this.innerCt.setSize(w = Math.max(w, innerCtWidth), h);
  818.                 break;
  819.         }
  820.         var availHeight = Math.max(0, h - this.padding.top - this.padding.bottom - flexHeight),
  821.             leftOver = availHeight,
  822.             heights = [],
  823.             restore = [],
  824.             idx = 0,
  825.             availableWidth = Math.max(0, w - this.padding.left - this.padding.right);
  826.             
  827.         Ext.each(cs, function(c){
  828.             if(isStart && c.flex){
  829.                 ch = Math.floor(availHeight * (c.flex / totalFlex));
  830.                 leftOver -= ch;
  831.                 heights.push(ch);
  832.             }
  833.         }); 
  834.         
  835.         if(this.pack == 'center'){