/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.form.BusyButton"]){
dojo._hasResource["dojox.form.BusyButton"]=true;
dojo.provide("dojox.form.BusyButton");
dojo.require("dijit.form.Button");
dojo.requireLocalization("dijit","loading",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
dojo.declare("dojox.form._BusyButtonMixin",null,{isBusy:false,busyLabel:"",timeout:null,useIcon:true,postMixInProperties:function(){
this.inherited(arguments);
if(!this.busyLabel){
this.busyLabel=dojo.i18n.getLocalization("dijit","loading",this.lang).loadingState;
}
},postCreate:function(){
this.inherited(arguments);
this._label=this.containerNode.innerHTML;
this._initTimeout=this.timeout;
if(this.isBusy){
this.makeBusy();
}
},makeBusy:function(){
this.isBusy=true;
this.attr("disabled",true);
this.setLabel(this.busyLabel,this.timeout);
},cancel:function(){
this.attr("disabled",false);
this.isBusy=false;
this.setLabel(this._label);
if(this._timeout){
clearTimeout(this._timeout);
}
this.timeout=this._initTimeout;
},resetTimeout:function(_1){
if(this._timeout){
clearTimeout(this._timeout);
}
if(_1){
this._timeout=setTimeout(dojo.hitch(this,function(){
this.cancel();
}),_1);
}else{
if(_1==undefined||_1===0){
this.cancel();
}
}
},setLabel:function(_2,_3){
this.label=_2;
while(this.containerNode.firstChild){
this.containerNode.removeChild(this.containerNode.firstChild);
}
this.containerNode.innerHTML=this.label;
if(this.showLabel==false&&!(dojo.attr(this.domNode,"title"))){
this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");
}
if(_3){
this.resetTimeout(_3);
}else{
this.timeout=null;
}
if(this.useIcon&&this.isBusy){
var _4=new Image();
_4.src=this._blankGif;
dojo.attr(_4,"id",this.id+"_icon");
dojo.addClass(_4,"dojoxBusyButtonIcon");
this.containerNode.appendChild(_4);
}
},_clicked:function(e){
if(!this.isBusy){
this.makeBusy();
}
}});
dojo.declare("dojox.form.BusyButton",[dijit.form.Button,dojox.form._BusyButtonMixin],{});
dojo.declare("dojox.form.BusyComboButton",[dijit.form.ComboButton,dojox.form._BusyButtonMixin],{});
dojo.declare("dojox.form.BusyDropDownButton",[dijit.form.DropDownButton,dojox.form._BusyButtonMixin],{});
}
