    /**
     * @class YAHOO.ext.LayoutManager
     * @extends YAHOO.ext.util.Observable
     * Base class for layout managers.
     */
    YAHOO.ext.LayoutManager = function(container){
        YAHOO.ext.LayoutManager.superclass.constructor.call(this);
        this.el = getEl(container, true);
        this.id = this.el.id;
        this.el.addClass('ylayout-container');
        /** false to disable window resize monitoring @type Boolean */
        this.monitorWindowResize = true;
        this.regions = {};
        this.events = {
            /**
             * @event layout
             * Fires when a layout is performed.
             * @param {YAHOO.ext.LayoutManager} this
             */
            'layout' : new YAHOO.util.CustomEvent(),
            /**
             * @event regionresized
             * Fires when the user resizes a region.
             * @param {YAHOO.ext.LayoutRegion} region
             * @param {Number} newSize The new size (width for east/west, height for north/south)
             */
            'regionresized' : new YAHOO.util.CustomEvent(),
            /**
             * @event regioncollapsed
             * Fires when a region is collapsed.
             * @param {YAHOO.ext.LayoutRegion} region
             */
            'regioncollapsed' : new YAHOO.util.CustomEvent(),
            /**
             * @event regionexpanded
             * Fires when a region is expanded.
             * @param {YAHOO.ext.LayoutRegion} region
             */
            'regionexpanded' : new YAHOO.util.CustomEvent()
        };
        this.updating = false;
        YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true);
    };

    YAHOO.extendX(YAHOO.ext.LayoutManager, YAHOO.ext.util.Observable, {
        /**
         * Returns true if this layout is currently being updated
         * @return {Boolean}
         */
        isUpdating : function(){
            return this.updating;
        },

        /**
         * Suspend the LayoutManager from doing auto-layouts while
         * making multiple add or remove calls
         */
        beginUpdate : function(){
            this.updating = true;
        },

        /**
         * Restore auto-layouts and optionally disable the manager from performing a layout
         * @param {Boolean} noLayout true to disable a layout update
         */
        endUpdate : function(noLayout){
            this.updating = false;
            if(!noLayout){
                this.layout();
            }
        },

        layout: function(){

        },

        onRegionResized : function(region, newSize){
            this.fireEvent('regionresized', region, newSize);
            this.layout();
        },

        onRegionCollapsed : function(region){
            this.fireEvent('regioncollapsed', region);
        },

        onRegionExpanded : function(region){
            this.fireEvent('regionexpanded', region);
        },

        /**
         * Returns the size of the current view, This method normalizes document.body and element embedded layouts and
         * performs box-model adjustments.
         * @return {Object} The size as an object {width: (the width), height: (the height)}
         */
        getViewSize : function(){
            var size;
            if(this.el.dom != document.body){
                this.el.beginMeasure();
                size = this.el.getSize();
                this.el.endMeasure();
            }else{
                size = {width: YAHOO.util.Dom.getViewportWidth(), height: YAHOO.util.Dom.getViewportHeight()};
            }
            size.width -= this.el.getBorderWidth('lr')-this.el.getPadding('lr');
            size.height -= this.el.getBorderWidth('tb')-this.el.getPadding('tb');
            return size;
        },

        /**
         * Returns the element this layout is bound to.
         * @return {YAHOO.ext.Element}
         */
        getEl : function(){
            return this.el;
        },

        /**
         * Returns the specified region.
         * @param {String} target The region key
         * @return {YAHOO.ext.LayoutRegion}
         */
        getRegion : function(target){
            return this.regions[target];
        },

        onWindowResize : function(){
            if(this.monitorWindowResize){
                this.layout();
            }
        }
    });

Copyright © 2006 Jack Slocum. All rights reserved.