/**
 * @class YAHOO.ext.BasicDialog
 * @extends YAHOO.ext.util.Observable
 * Lightweight Dialog Class.
 * 
 * The code below lists all configuration options along with the default value.
 * If the default value is what you want you can leave it out:
 * <pre><code>
  var dlg = new YAHOO.ext.BasicDialog('element-id', {
       width: auto,
       height: auto,
       x: 200, //(defaults to center screen if blank)
       y: 500, //(defaults to center screen if blank)
       animateTarget: null,// (no animation) This is the id or element to animate from
       resizable: true,
       minHeight: 80,
       minWidth: 200,
       modal: false,
       autoScroll: true,
       closable: true,
       constraintoviewport: true,
       draggable: true,
       autoTabs: false, (if true searches child nodes for elements with class ydlg-tab and converts them to tabs)
       proxyDrag: false, (drag a proxy element rather than the dialog itself)
       fixedcenter: false,
       shadow: false,
       minButtonWidth: 75 
  });
  </code></pre>
 * @constructor
 * Create a new BasicDialog.
 * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element
 * @param {Object} config configuration options
 */
YAHOO.ext.BasicDialog = function(el, config){
    this.el = getEl(el, true);
    this.id = this.el.id;
    this.el.addClass('ydlg');
    this.shadowOffset = 3;
    this.minHeight = 80;
    this.minWidth = 200;
    this.minButtonWidth = 75;
    
    YAHOO.ext.util.Config.apply(this, config);
    
    this.proxy = this.el.createProxy('ydlg-proxy');
    this.proxy.enableDisplayMode('block');
    this.proxy.setOpacity(.5);
    
    if(config.width){
        this.el.setWidth(config.width);
    }
    if(config.height){
        this.el.setHeight(config.height);
    }
    this.size = this.el.getSize();
    if(typeof config.x != 'undefined' && typeof config.y != 'undefined'){
        this.xy = [config.x,config.y];
    }else{
        this.xy = this.el.getCenterXY(true);
    }
    // find the header, body and footer
    var cn = this.el.dom.childNodes;
    for(var i = 0, len = cn.length; i < len; i++) {
    	var node = cn[i];
    	if(node && node.nodeType == 1){
    	    if(YAHOO.util.Dom.hasClass(node, 'ydlg-hd')){
    	        this.header = getEl(node, true);
    	    }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-bd')){
    	        this.body = getEl(node, true);
    	    }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-ft')){
    	        /**
                 * The footer element
                 * @type YAHOO.ext.Element
                 */
                this.footer = getEl(node, true);
    	    }
    	}
    }
    
    var dh = YAHOO.ext.DomHelper;
    if(!this.header){
        /**
         * The header element
         * @type YAHOO.ext.Element
         */
        this.header = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-hd'}, true);
    }
    if(!this.body){
        /**
         * The body element
         * @type YAHOO.ext.Element
         */
        this.body = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-bd'}, true);
    }
    // wrap the header for special rendering
    var hl = dh.insertBefore(this.header.dom, {tag: 'div', cls:'ydlg-hd-left'});
    var hr = dh.append(hl, {tag: 'div', cls:'ydlg-hd-right'});
    hr.appendChild(this.header.dom);
    
    // wrap the body and footer for special rendering
    this.bwrap = dh.insertBefore(this.body.dom, {tag: 'div', cls:'ydlg-dlg-body'}, true);
    this.bwrap.dom.appendChild(this.body.dom);
    if(this.footer) this.bwrap.dom.appendChild(this.footer.dom);
    
    if(this.autoScroll !== false && !this.autoTabs){
        this.body.setStyle('overflow', 'auto');
    }
    if(this.closable !== false){
        this.el.addClass('ydlg-closable');
        this.close = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-close'}, true);
        this.close.mon('click', function(){
            this.hide();
        }, this, true);
    }
    if(this.resizable !== false){
        this.el.addClass('yresizable-pinned');
        this.el.addClass('ydlg-resizable');
        this.resizer = new YAHOO.ext.Resizable(this.el, {
            minWidth: this.minWidth || 80, 
            minHeight:this.minHeight || 80, 
            disableTrackOver:true, 
            multiDirectional: true
        });
        this.resizer.proxy.setStyle('z-index', parseInt(this.el.getStyle('z-index'),10)+1);
        this.resizer.on('beforeresize', this.beforeResize, this, true);
        this.resizer.delayedListener('resize', this.onResize, this, true);
    }
    if(this.draggable !== false){
        this.el.addClass('ydlg-draggable');
        if (!this.proxyDrag) {
            var dd = new YAHOO.util.DD(this.el.dom, 'WindowDrag');
        }
        else {
            var dd = new YAHOO.util.DDProxy(this.el.dom, 'WindowDrag', {dragElId: this.proxy.id});
        }
        dd.setHandleElId(this.header.id);
        dd.endDrag = this.endMove.createDelegate(this);
        dd.startDrag = this.startMove.createDelegate(this);
        dd.onDrag = this.adjustShadow.createDelegate(this);
        this.dd = dd;
    }
    if(this.modal){
        this.mask = dh.append(document.body, {tag: 'div', cls:'ydlg-mask'}, true);
        this.mask.originalDisplay = 'block';
        this.mask.enableDisplayMode();
    }
    if(this.shadow){
        this.shadow = dh.append(document.body, {tag: 'div', cls:'ydlg-shadow'}, true);
        this.shadow.setOpacity(.3);
        this.shadow.setAbsolutePositioned(10000);
        this.shadow.enableDisplayMode('block');
        this.shadow.hide();
    }
    if(this.autoTabs){
        var tabEls = YAHOO.util.Dom.getElementsByClassName('ydlg-tab', 'div', this.el.dom);
        if(tabEls.length > 0){
            this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
            this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
            for(var i = 0, len = tabEls.length; i < len; i++) {
            	var tabEl = tabEls[i];
            	this.tabs.addTab(YAHOO.util.Dom.generateId(tabEl), tabEl.title);
            	tabEl.title = '';
            }
            this.tabs.activate(tabEls[0].id);
        }
    }
    this.syncBodyHeight();
    this.events = {
        /**
         * @event keydown
         * Fires when a key is pressed
         * @param {YAHOO.ext.BasicDialog} this
         * @param {YAHOO.ext.EventObject} e
         */
        'keydown' : new YAHOO.util.CustomEvent('keydown'),
        /**
         * @event move
         * Fires when this dialog is moved by the user.
         * @param {YAHOO.ext.BasicDialog} this
         * @param {Number} x The new page X
         * @param {Number} y The new page Y
         */
        'move' : new YAHOO.util.CustomEvent('move'),
        /**
         * @event resize
         * Fires when this dialog is resized by the user.
         * @param {YAHOO.ext.BasicDialog} this
         * @param {Number} width The new width
         * @param {Number} height The new height
         */
        'resize' : new YAHOO.util.CustomEvent('resize'),
        /**
         * @event beforehide
         * Fires before this dialog is hidden.
         * @param {YAHOO.ext.BasicDialog} this
         */
        'beforehide' : new YAHOO.util.CustomEvent('beforehide'),
        /**
         * @event hide
         * Fires when this dialog is hidden.
         * @param {YAHOO.ext.BasicDialog} this
         */
        'hide' : new YAHOO.util.CustomEvent('hide'),
        /**
         * @event beforeshow
         * Fires before this dialog is shown.
         * @param {YAHOO.ext.BasicDialog} this
         */
        'beforeshow' : new YAHOO.util.CustomEvent('beforeshow'),
        /**
         * @event show
         * Fires when this dialog is shown.
         * @param {YAHOO.ext.BasicDialog} this
         */
        'show' : new YAHOO.util.CustomEvent('show')
    };
    
    this.keyDownDelegate = YAHOO.ext.EventManager.wrap(this.onKeyDown, this, true);
    YAHOO.ext.EventManager.onWindowResize(this.adjustViewport, this, true);
    this.preloaded = false;
    this.el.setDisplayed(false);
    this.defaultButton = null;
};

YAHOO.extendX(YAHOO.ext.BasicDialog, YAHOO.ext.util.Observable, {
    beforeResize : function(){
        this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40);
    },
    
    onResize : function(){
        this.refreshSize();
        this.syncBodyHeight();
        this.adjustShadow();
        this.fireEvent('resize', this, this.size.width, this.size.height);
    },
    
    onKeyDown : function(e){
        this.fireEvent('keydown', this, e);
    },
    
    /**
     * Adds a key listener for when this dialog is displayed
     * @param {Number/Array/Object} key Either the numeric key code, array of key codes or an object with the following options: 
     *                                  {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}
     * @param {Function} fn The function to call
     * @param {Object} scope (optional) The scope of the function
     */
    addKeyListener : function(key, fn, scope){
        var keyCode, shift, ctrl, alt;
        if(typeof key == 'object'){
            keyCode = key['key'];
            shift = key['shift'];
            ctrl = key['ctrl'];
            alt = key['alt'];
        }else{
            keyCode = key;
        }
        var handler = function(dlg, e){
            if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){
                var k = e.getKey();
                if(keyCode instanceof Array){
                    for(var i = 0, len = keyCode.length; i < len; i++){
                        if(keyCode[i] == k){
                          fn.call(scope || window, dlg, k, e);
                          return;
                        }
                    }
                }else{
                    if(k == keyCode){
                        fn.call(scope || window, dlg, k, e);
                    }
                }
            }
        };
        this.on('keydown', handler);
    },
    
    /**
     * Returns the TabPanel component (if autoTabs)
     * @return {YAHOO.ext.TabPanel}
     */
    getTabs : function(){
        if(!this.tabs){
            this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
            this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
        }
        return this.tabs;    
    },
    
    /**
     * Adds a button.
     * @param {String/Object} config A string becomes the button text, an object is expected to be a valid YAHOO.ext.DomHelper element config
     * @param {Function} handler The function called when the button is clicked
     * @param {Object} scope (optional) The scope of the handler function
     * @return {YAHOO.ext.BasicDialog.Button}
     */
    addButton : function(config, handler, scope){
        var dh = YAHOO.ext.DomHelper;
        if(!this.footer){
            this.footer = dh.append(this.bwrap.dom, {tag: 'div', cls:'ydlg-ft'}, true);
        }
        var btn;
        if(typeof config == 'string'){
            if(!this.buttonTemplate){
                // hideous table template
                this.buttonTemplate = new YAHOO.ext.DomHelper.Template('<a href="#" class="ydlg-button-focus"><table border="0" cellpadding="0" cellspacing="0" class="ydlg-button-wrap"><tbody><tr><td class="ydlg-button-left">&nbsp;</td><td class="ydlg-button-center" unselectable="on">{0}</td><td class="ydlg-button-right">&nbsp;</td></tr></tbody></table></a>');
            }
            var btn = this.buttonTemplate.append(this.footer.dom, [config], true);
            var tbl = getEl(btn.dom.firstChild, true);
            if(this.minButtonWidth){
                 tbl.beginMeasure();
                 if(tbl.getWidth() < this.minButtonWidth){
                       tbl.setWidth(this.minButtonWidth);
                 }
                 tbl.endMeasure();
            }
        }else{
            btn = dh.append(this.footer.dom, config, true);
        }
        var bo = new YAHOO.ext.BasicDialog.Button(btn, handler, scope);
        this.syncBodyHeight();
        if(!this.preloaded){ // preload images
            btn.addClass('ydlg-button-over');
            btn.removeClass('ydlg-button-over');
            btn.addClass('ydlg-button-click');
            btn.removeClass('ydlg-button-click');
            this.preloaded = true;
        }
        if(!this.buttons){
            this.buttons = [];
        }
        this.buttons.push(bo);
        return bo;
    },
    
    /**
     * Sets the default button to be focused when the dialog is displayed
     * @param {YAHOO.ext.BasicDialog.Button} btn The button object returned by addButton
     */
    setDefaultButton : function(btn){
        this.defaultButton = btn;  
    },
    
    getHeaderFooterHeight : function(safe){
        if(safe)this.el.beginMeasure();
        var height = 0;
        if(this.header){
           height += this.header.getHeight();
        }
        if(this.footer){
            var fm = this.footer.getMargins();
            height += (this.footer.getHeight()+fm.top+fm.bottom);
        }
        if(safe)this.el.endMeasure();
        height += this.bwrap.getPadding('tb')+this.bwrap.getBorderWidth('tb');
        return height;
    },
    
    syncBodyHeight : function(){
        this.el.beginMeasure();
        var height = this.size.height - this.getHeaderFooterHeight(false);
        var bm = this.body.getMargins();
        this.body.setHeight(height-(bm.top+bm.bottom));
        if(this.tabs){
            this.tabs.syncHeight();
        }
        this.bwrap.setHeight(this.size.height-this.header.getHeight());
        // 11/07/06 jvs update to set fixed width for IE7
        this.body.setWidth(this.el.getWidth(true)-this.bwrap.getBorderWidth('lr')-this.bwrap.getPadding('lr'));
        this.el.endMeasure();
    },
    
    /**
     * Restores the previous state of the dialog if YAHOO.ext.state is configured
     */
    restoreState : function(){
        var box = YAHOO.ext.state.Manager.get(this.el.id + '-state');
        if(box && box.width){
            this.xy = [box.x, box.y];
            this.size = box;
            this.el.setLocation(box.x, box.y);
            this.resizer.resizeTo(box.width, box.height);
            this.adjustViewport();
        }else{
            this.resizer.resizeTo(this.size.width, this.size.height);
            this.adjustViewport();
        }
    },
    
    beforeShow : function(){
        YAHOO.util.Event.on(document, 'keydown', this.keyDownDelegate);
        
        if(this.fixedcenter) {
            this.el.beginMeasure();
            this.xy = this.el.getCenterXY(true);
            this.el.endMeasure();
        }
        if(this.modal){
            YAHOO.util.Dom.addClass(document.body, 'masked');
            this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
            this.mask.show();
        }
                
    },
    
    /**
     * Shows the dialog.
     * @param {String/HTMLElement/YAHOO.ext.Element} animateTarget (optional) Reset the animation target
     */
    show : function(animateTarget){
        if (this.fireEvent('beforeshow', this) === false)
            return;
        
        this.animateTarget = animateTarget || this.animateTarget;
        if(!this.el.isVisible()){
            this.beforeShow();
            if(this.animateTarget){
                var b = getEl(this.animateTarget, true).getBox();
                this.proxy.show();
                this.proxy.setSize(b.width, b.height);
                this.proxy.setLocation(b.x, b.y);
                this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, true, .35, this.showEl.createDelegate(this));
            }else{
                this.el.setDisplayed(true);
                this.el.setXY(this.xy);
                this.el.show();
                var box = this.el.getBox();
                if(this.shadow){
                    this.shadow.show();
                    this.shadow.setSize(box.width, box.height);
                    this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
                }
                if(this.defaultButton) this.defaultButton.focus();
                this.fireEvent('show', this);
            }
        }
    },
    
    showEl : function(){
        var box = this.proxy.getBox();
        this.el.setDisplayed(true);
        this.el.setBox(box);
        this.el.show();
        this.proxy.hide();
        if(this.shadow){
            this.shadow.show();
            this.shadow.setSize(box.width, box.height);
            this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
        }
        if(this.defaultButton) this.defaultButton.focus();
        this.fireEvent('show', this);
    },
    
    adjustViewport : function(width, height){
        this.viewSize = [width, height];
        if(this.modal && this.mask.isVisible()){
            this.mask.setSize(width, height); // first make sure the mask isn't causing overflow
            this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
        }
        if(this.contraintoviewport !== false){
            var moved = false;
            if(this.xy[0] + this.size.width > this.viewSize[0]){
                this.xy[0] = Math.max(0, this.viewSize[0] - this.size.width);
                moved = true;
            }
            if(this.xy[1] + this.size.height > this.viewSize[1]){
                this.xy[1] = Math.max(0, this.viewSize[1] - this.size.height);
                moved = true;
            }
            if(moved){
                this.el.setXY(this.xy);
                this.adjustShadow();
            }
        }
    },
    
    /**
     * Destroys this dialog
     * @param {Boolean} removeEl (optional) true to remove the element from the DOM
     */
    destroy : function(removeEl){
        YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport, this);
        if(this.tabs){
            this.tabs.destroy(removeEl);
        }
        if(removeEl === true){
            this.el.update('');
            this.el.remove();
        }
    },
    
    adjustShadow : function(){
        if(this.shadow && this.shadow.isVisible()){
            var box = this.el.getBox();
            box.x += this.shadowOffset;
            box.y += this.shadowOffset;
            this.shadow.setBox(box);
        }
    },
    
    startMove : function(){
        if(this.proxyDrag){
            this.proxy.show();
        }
        if(this.constraintoviewport !== false){
            this.dd.resetConstraints();
            this.viewSize = [YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight()];
            this.dd.setXConstraint(this.xy[0], this.viewSize[0]-this.xy[0]-this.el.getWidth()-this.shadowOffset);
            this.dd.setYConstraint(this.xy[1], this.viewSize[1]-this.xy[1]-this.el.getHeight()-this.shadowOffset);
        }
    },
    
    endMove : function(){
        if(!this.proxyDrag){
            YAHOO.util.DD.prototype.endDrag.apply(this.dd, arguments);
        }else{
            YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd, arguments);
            this.proxy.setStyle('visibility', 'visible');
            this.proxy.hide();
        }
        this.refreshSize();
        this.adjustShadow();
        this.fireEvent('move', this, this.xy[0], this.xy[1])
    },
   
    
    /**
     * Returns true if the dialog is visible
     * @return {Boolean}
     */
    isVisible : function(){
        return this.el.isVisible();    
    },
    
    beforeHide : function(){
        YAHOO.util.Event.removeListener(document, 'keydown', this.keyDownDelegate);
        if(this.modal){
            this.mask.hide();
            YAHOO.util.Dom.removeClass(document.body, 'masked');
        }
    },
    
    /**
     * Hides the dialog.
     * @param {Function} callback (optional) Function to call when the dialog is hidden
     */
    hide : function(callback){
        if (this.fireEvent('beforehide', this) === false)
            return;
        
        this.beforeHide();
        if(this.shadow){
            this.shadow.hide();
        }
        if(this.animateTarget){
            var b = getEl(this.animateTarget, true).getBox();
            this.proxy.show();
            this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height);
            this.el.setDisplayed(false);
            this.el.hide();
            this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, this.hideEl.createDelegate(this, [callback]));
        }else{
            this.proxy.hide();
            this.el.setDisplayed(false);
            this.el.hide();
            this.fireEvent('hide', this);
        }
    },
    
    hideEl : function(callback){
        this.proxy.hide();
        this.fireEvent('hide', this);
        if(typeof callback == 'function'){
            callback();
        }
    },
    
    refreshSize : function(){
        this.size = this.el.getSize();
        this.xy = this.el.getXY();
        YAHOO.ext.state.Manager.set(this.el.id + '-state', this.el.getBox());
    },
    
    /**
     * Returns the element for this dialog
     * @return {YAHOO.ext.BasicDialog}
     */
    getEl : function(){
        return this.el;
    }
});

/**
 * @class YAHOO.ext.LayoutDialog
 * @extends YAHOO.ext.BasicDialog
 * Dialog which provides adjustments for working with a layout in a Dialog. 
 * Add your neccessary layout config options to the dialogs config.<br>
 * Example Usage (including a nested layout):
 * <pre><code>    if(!dialog){
    dialog = new YAHOO.ext.LayoutDialog("download-dlg", { 
            modal: true,
            width:600,
            height:450,
            shadow:true,
            minWidth:500,
            minHeight:350,
            autoTabs:true,
            proxyDrag:true,
            // layout config merges with the dialog config
            center:{
                tabPosition: 'top',
                alwaysShowTabs: true
            }
    });
    dialog.addKeyListener(27, dialog.hide, dialog);
    dialog.setDefaultButton(dialog.addButton('Close', dialog.hide, dialog));
    dialog.addButton('Build It!', this.getDownload, this);
    
    // we can even add nested layouts
    var innerLayout = new YAHOO.ext.BorderLayout('dl-inner', {
        east: {
            initialSize: 200,
            autoScroll:true,
            split:true
        },
        center: {
            autoScroll:true
        }
    });
    innerLayout.beginUpdate();
    innerLayout.add('east', new YAHOO.ext.ContentPanel('dl-details'));
    innerLayout.add('center', new YAHOO.ext.ContentPanel('selection-panel'));
    innerLayout.endUpdate(true);
    
    // when doing updates to the top level layout in a dialog, you need to 
    // use dialog.beginUpdate()/endUpdate() instead of layout.beginUpdate()/endUpdate()
    var layout = dialog.getLayout();
    dialog.beginUpdate();
    layout.add('center', new YAHOO.ext.ContentPanel('standard-panel', 
                        {title: 'Download the Source', fitToFrame:true}));
    layout.add('center', new YAHOO.ext.NestedLayoutPanel(innerLayout, 
               {title: 'Build your own yui-ext.js'}));
    layout.getRegion('center').showPanel(sp);
    dialog.endUpdate();</code></pre>
    * @constructor
    * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element
    * @param {Object} config configuration options
  */
YAHOO.ext.LayoutDialog = function(el, config){
    config.autoTabs = false;
    YAHOO.ext.LayoutDialog.superclass.constructor.call(this, el, config);
    this.body.setStyle({overflow:'hidden', position:'relative'});
    this.el.setDisplayed(true);
    this.layout = new YAHOO.ext.BorderLayout(this.body.dom, config);
    this.layout.monitorWindowResize = false;
};
YAHOO.extendX(YAHOO.ext.LayoutDialog, YAHOO.ext.BasicDialog, {
    /**
     * Ends update of the layout and resets display to none.
     */
    endUpdate : function(){
        this.layout.endUpdate();
        this.el.setDisplayed(false);
    },
    /**
     * Begins an update of the layout and sets display to block and visibility to hidden.
     */
    beginUpdate : function(){
        this.layout.beginUpdate();
        this.el.setDisplayed(true);
    },
    /**
     * Get the BorderLayout for this dialog
     * @return {YAHOO.ext.BorderLayout} 
     */
    getLayout : function(){
        return this.layout;
    },
    syncBodyHeight : function(){
        YAHOO.ext.LayoutDialog.superclass.syncBodyHeight.call(this);
        if(this.layout)this.layout.layout();
    }
});

/**
 * @class YAHOO.ext.BasicDialog.Button
 * Button class returned by BasicDialog.addButton()
 */
YAHOO.ext.BasicDialog.Button = function(el, handler, scope){
    this.el = el;
    this.el.addClass('ydlg-button');
    this.el.mon('click', this.onClick, this, true);
    this.el.on('mouseover', this.onMouseOver, this, true);
    this.el.on('mouseout', this.onMouseOut, this, true);
    this.el.on('mousedown', this.onMouseDown, this, true);
    this.el.on('mouseup', this.onMouseUp, this, true);
    this.handler = handler;
    this.scope = scope;
    this.disabled = false;
};

YAHOO.ext.BasicDialog.Button.prototype = {
    /**
     * Returns the buttons element
     * @return {YAHOO.ext.Element}
     */
    getEl : function(){
        return this.el;  
    },
    
    /**
     * Sets this buttons click handler
     * @param {Function} handler The function to call when the button is clicked
     * @param {Object} scope (optional) Scope for the function passed above
     */
    setHandler : function(handler, scope){
        this.handler = handler;
        this.scope = scope;  
    },
    
    /**
     * Set this buttons text
     * @param {String} text
     */
    setText : function(text){
        this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text;    
    },
    
    /**
     * Show this button
     */
    show: function(){
        this.el.setStyle('display', '');    
    },
    
    /**
     * Hide this button
     */
    hide: function(){
        this.el.setStyle('display', 'none');    
    },
    
    /**
     * Focus the button
     */
    focus : function(){
        this.el.focus();    
    },
    
    /**
     * Disable this button
     */
    disable : function(){
        this.el.addClass('ydlg-button-disabled');
        this.disabled = true;
    },
    
    /**
     * Enable this button
     */
    enable : function(){
        this.el.removeClass('ydlg-button-disabled');
        this.disabled = false;
    },
    
    onClick : function(e){
        e.preventDefault();
        if(!this.disabled){
            this.handler.call(this.scope || window);
        }
    },
    onMouseOver : function(){
        if(!this.disabled){
            this.el.addClass('ydlg-button-over');
        }
    },
    onMouseOut : function(){
        this.el.removeClass('ydlg-button-over');
    },
    onMouseDown : function(){
        if(!this.disabled){
            this.el.addClass('ydlg-button-click');
        }
    },
    onMouseUp : function(){
        this.el.removeClass('ydlg-button-click');
    }    
};

Copyright © 2006 Jack Slocum. All rights reserved.