/**
* @class YAHOO.ext.Button
* @extends YAHOO.ext.util.Observable
* Simple Button class
* @cfg {String} text The button text
* @cfg {Function} handler A function called when the button is clicked (can be used instead of click event)
* @cfg {Object} scope The scope of the handler
* @cfg {Number} minWidth The minimum width for this button (used to give a set of buttons a common width)
* @constructor
* Create a new button
* @param {String/HTMLElement/Element} renderTo The element to append the button to
* @param {Object} config The config object
*/
YAHOO.ext.Button = function(renderTo, config){
YAHOO.ext.util.Config.apply(this, config);
this.events = {
/**
* @event click
* Fires when this button is clicked
* @param {Button} this
* @param {EventObject} e The click event
*/
'click' : true
};
if(renderTo){
this.render(renderTo);
}
};
YAHOO.extendX(YAHOO.ext.Button, YAHOO.ext.util.Observable, {
render : function(renderTo){
var btn;
if(!this.dhconfig){
if(!YAHOO.ext.Button.buttonTemplate){
// hideous table template
YAHOO.ext.Button.buttonTemplate = new YAHOO.ext.DomHelper.Template('
');
}
btn = YAHOO.ext.Button.buttonTemplate.append(
getEl(renderTo).dom, [this.text], true);
this.tbl = getEl(btn.dom.firstChild, true);
}else{
btn = YAHOO.ext.DomHelper.append(this.footer.dom, this.dhconfig, true);
}
this.el = btn;
this.autoWidth();
btn.addClass('ybtn');
btn.mon('click', this.onClick, this, true);
btn.on('mouseover', this.onMouseOver, this, true);
btn.on('mouseout', this.onMouseOut, this, true);
btn.on('mousedown', this.onMouseDown, this, true);
btn.on('mouseup', this.onMouseUp, this, true);
},
/**
* Returns the buttons element
* @return {YAHOO.ext.Element}
*/
getEl : function(){
return this.el;
},
/**
* Destroys this Button.
*/
destroy : function(){
this.el.removeAllListeners();
this.purgeListeners();
this.el.update('');
this.el.remove();
},
autoWidth : function(){
if(this.tbl){
this.el.setWidth('auto');
this.tbl.setWidth('auto');
if(this.minWidth){
if(this.tbl.getWidth() < this.minWidth){
this.tbl.setWidth(this.minWidth);
}
}
this.el.setWidth(this.tbl.getWidth());
}
},
/**
* 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.text = text;
this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text;
this.autoWidth();
},
/**
* Get the text for this button
* @return {String}
*/
getText : function(){
return this.text;
},
/**
* Show this button
*/
show: function(){
this.el.setStyle('display', '');
},
/**
* Hide this button
*/
hide: function(){
this.el.setStyle('display', 'none');
},
/**
* Convenience function for boolean show/hide
* @param {Boolean} visible true to show/false to hide
*/
setVisible: function(visible){
if(visible) {
this.show();
}else{
this.hide();
}
},
/**
* Focus the button
*/
focus : function(){
this.el.focus();
},
/**
* Disable this button
*/
disable : function(){
this.el.addClass('ybtn-disabled');
this.disabled = true;
},
/**
* Enable this button
*/
enable : function(){
this.el.removeClass('ybtn-disabled');
this.disabled = false;
},
onClick : function(e){
e.preventDefault();
if(!this.disabled){
this.fireEvent('click', this, e);
if(this.handler){
this.handler.call(this.scope || this, this, e);
}
}
},
onMouseOver : function(e){
if(!this.disabled){
this.el.addClass('ybtn-over');
}
},
onMouseOut : function(e){
this.el.removeClass('ybtn-over');
},
onMouseDown : function(){
if(!this.disabled){
this.el.addClass('ybtn-click');
}
},
onMouseUp : function(){
this.el.removeClass('ybtn-click');
}
});