/**
 * @class Ext.layout.BoxLayout
 * @extends Ext.layout.ContainerLayout
 *

Base Class for HBoxLayout and VBoxLayout Classes. Generally it should not need to be used directly.


 */

Ext.layout.BoxLayout = Ext.extend(Ext.layout.ContainerLayout, {
   
/**
     * @cfg {Object} defaultMargins
     *

If the individual contained items do not have a margins
     * property specified, the default margins from this property will be
     * applied to each item.


     *

This property may be specified as an object containing margins
     * to apply in the format:


{
    top: (top margin),
    right: (right margin),
    bottom: (bottom margin),
    left: (left margin)
}

     *

This property may also be specified as a string containing
     * space-separated, numeric margin values. The order of the sides associated
     * with each value matches the way CSS processes margin values:


     *

     *

Defaults to:


     * {top:0, right:0, bottom:0, left:0}
     *

     */

    defaultMargins
: {left:0,top:0,right:0,bottom:0},
   
/**
     * @cfg {String} padding
     * Defaults to
'0'. Sets the padding to be applied to all child items managed by this
     * container's layout.
     */

    padding
: '0',
   
// documented in subclasses
    pack
: 'start',

   
// private
    monitorResize
: true,
    scrollOffset
: 0,
    extraCls
: 'x-box-item',
    ctCls
: 'x-box-layout-ct',
    innerCls
: 'x-box-inner',

   
// private
    isValidParent
: function(c, target){
       
return c.getEl().dom.parentNode == this.innerCt.dom;
   
},

   
// private
    onLayout
: function(ct, target){
       
var cs = ct.items.items, len = cs.length, c, i, last = len-1, cm;

       
if(!this.innerCt){
            target
.addClass(this.ctCls);

           
// the innerCt prevents wrapping and shuffling while
           
// the container is resizing
           
this.innerCt = target.createChild({cls:this.innerCls});
           
this.padding = this.parseMargins(this.padding);
       
}
       
this.renderAll(ct, this.innerCt);
   
},

   
// private
    renderItem
: function(c){
       
if(typeof c.margins == 'string'){
            c
.margins = this.parseMargins(c.margins);
       
}else if(!c.margins){
            c
.margins = this.defaultMargins;
       
}
       
Ext.layout.BoxLayout.superclass.renderItem.apply(this, arguments);
   
},

    getTargetSize
: function(target){
       
return (Ext.isIE6 && Ext.isStrict && target.dom == document.body) ? target.getStyleSize() : target.getViewSize();
   
},
   
    getItems
: function(ct){
       
var items = [];
        ct
.items.each(function(c){
           
if(c.isVisible()){
                items
.push(c);
           
}
       
});
       
return items;
   
}

   
/**
     * @property activeItem
     * @hide
     */

});

/**
 * @class Ext.layout.VBoxLayout
 * @extends Ext.layout.BoxLayout
 * A layout that arranges items vertically
 */

Ext.layout.VBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
   
/**
     * @cfg {String} align
     * Controls how the child items of the container are aligned. Acceptable configuration values for this
     * property are:
     *

     */

    align
: 'left', // left, center, stretch, strechmax
   
/**
     * @cfg {String} pack
     * Controls how the child items of the container are packed together. Acceptable configuration values
     * for this property are:
     *

     */

   
/**
     * @cfg {Number} flex
     * This configuation option is to be applied to
child items of the container managed
     * by this layout. Each child item with a
flex property will be flexed vertically
     * according to each item's
relative flex value compared to the sum of all items with
     * a
flex value specified.  Any child items that have either a flex = 0 or
     *
flex = undefined will not be 'flexed' (the initial size will not be changed).
     */


   
// private
    onLayout
: function(ct, target){
       
Ext.layout.VBoxLayout.superclass.onLayout.call(this, ct, target);
                   
       
       
var cs = this.getItems(ct), cm, ch, margin,
            size
= this.getTargetSize(target),
            w
= size.width - target.getPadding('lr') - this.scrollOffset,
            h
= size.height - target.getPadding('tb'),
            l
= this.padding.left, t = this.padding.top,
            isStart
= this.pack == 'start',
            isRestore
= ['stretch', 'stretchmax'].indexOf(this.align) == -1,
            stretchWidth
= w - (this.padding.left + this.padding.right),
            extraHeight
= 0,
            maxWidth
= 0,
            totalFlex
= 0,
            flexHeight
= 0,
            usedHeight
= 0;
           
       
Ext.each(cs, function(c){
            cm
= c.margins;
            totalFlex
+= c.flex || 0;
            ch
= c.getHeight();
            margin
= cm.top + cm.bottom;
            extraHeight
+= ch + margin;
            flexHeight
+= margin + (c.flex ? 0 : ch);
            maxWidth
= Math.max(maxWidth, c.getWidth() + cm.left + cm.right);
       
});
        extraHeight
= h - extraHeight - this.padding.top - this.padding.bottom;
       
       
var innerCtWidth = maxWidth + this.padding.left + this.padding.right;
       
switch(this.align){
           
case 'stretch':
               
this.innerCt.setSize(w, h);
               
break;
           
case 'stretchmax':
           
case 'left':
               
this.innerCt.setSize(innerCtWidth, h);
               
break;
           
case 'center':
               
this.innerCt.setSize(w = Math.max(w, innerCtWidth), h);
               
break;
       
}

       
var availHeight = Math.max(0, h - this.padding.top - this.padding.bottom - flexHeight),
            leftOver
= availHeight,
            heights
= [],
            restore
= [],
            idx
= 0,
            availableWidth
= Math.max(0, w - this.padding.left - this.padding.right);
           

       
Ext.each(cs, function(c){
           
if(isStart && c.flex){
                ch
= Math.floor(availHeight * (c.flex / totalFlex));
                leftOver
-= ch;
                heights
.push(ch);
           
}
       
});
       
       
if(this.pack == 'center'){
            t
+= extraHeight ? extraHeight / 2 : 0;
       
}else if(this.pack == 'end'){
            t
+= extraHeight;
       
}
       
Ext.each(cs, function(c){
            cm
= c.margins;
            t
+= cm.top;
            c
.setPosition(l + cm.left, t);
           
if(isStart && c.flex){
                ch
= Math.max(0, heights[idx++] + (leftOver-- > 0 ? 1 : 0));
               
if(isRestore){
                    restore
.push(c.getWidth());
               
}
                c
.setSize(availableWidth, ch);
           
}else{
                ch
= c.getHeight();
           
}
            t
+= ch + cm.bottom;
       
});
       
        idx
= 0;
       
Ext.each(cs, function(c){
            cm
= c.margins;
           
if(this.align == 'stretch'){
                c
.setWidth((stretchWidth - (cm.left + cm.right)).constrain(
                    c
.minWidth || 0, c.maxWidth || 1000000));
           
}else if(this.align == 'stretchmax'){
                c
.setWidth((maxWidth - (cm.left + cm.right)).constrain(
                    c
.minWidth || 0, c.maxWidth || 1000000));
           
}else{
               
if(this.align == 'center'){
                   
var diff = availableWidth - (c.getWidth() + cm.left + cm.right);
                   
if(diff > 0){
                        c
.setPosition(l + cm.left + (diff/2), c.y);
                   
}
               
}
               
if(isStart && c.flex){
                    c
.setWidth(restore[idx++]);
               
}
           
}
       
}, this);
   
}
   
/**
     * @property activeItem
     * @hide
     */

});

Ext.Container.LAYOUTS.vbox = Ext.layout.VBoxLayout;

/**
 * @class Ext.layout.HBoxLayout
 * @extends Ext.layout.BoxLayout
 * A layout that arranges items horizontally
 */

Ext.layout.HBoxLayout = Ext.extend(Ext.layout.BoxLayout, {
   
/**
     * @cfg {String} align
     * Controls how the child items of the container are aligned. Acceptable configuration values for this
     * property are:
     *