function ActionButton(
	oElement,
	aStates,
	oLabelElement
	) {

	this.oElement = oElement;
	this.oLabelElement = oLabelElement || oElement;
	this.aStates = aStates;
	this.iState = 0;
	this.bEnabled = false;

	var oThis = this;

	this.fOuterHandler = function(oEvent) {

		Common.Event.cancel(oEvent);

		oThis.processClick(oEvent);

	};

	this.enable();
	this.setState(0);

}

ActionButton.CLASS_NAME_DISABLED = 'button-disabled';

ActionButton.prototype = {

	getState : function() {

		return this.iState;

	},

	setState : function(iState) {

		if(this.getState() == iState) {
			return;
		}

		if(this.aStates[this.getState()].sClassName) {
			this.removeClass(this.aStates[this.getState()].sClassName);
		}

		if(this.aStates[iState].sClassName) {
			this.addClass(this.aStates[iState].sClassName);
		}

		if(this.aStates[iState].sLabel) {
			this.oLabelElement.innerHTML = this.aStates[iState].sLabel;
		}

		this.iState = iState;

	},

	getNextState : function() {

		if(this.getState() == this.aStates.length - 1) {
			return 0;
		}
		else {
			return this.getState() + 1;
		}

	},

	enable : function() {

		if(this.isEnabled()) {
			return;
		}

		Common.Event.add(
			this.oElement,
			'click',
			this.fOuterHandler
			);

		this.removeClass(ActionButton.CLASS_NAME_DISABLED);

		this.bEnabled = true;

	},

	disable : function() {

		if(!this.isEnabled()) {
			return;
		}

		Common.Event.remove(
			this.oElement,
			'click',
			this.fOuterHandler
			);

		this.addClass(ActionButton.CLASS_NAME_DISABLED);

		this.bEnabled = false;

	},

	isEnabled : function() {

		return this.bEnabled;

	},

	addClass : function(sClassName) {

		Common.Class.add(
			this.oElement,
			sClassName
			);

	},

	removeClass : function(sClassName) {

		Common.Class.remove(
			this.oElement,
			sClassName
			);

	},

	processClick : function(oEvent) {

		if(this.aStates[this.getState()].fHandler && !this.aStates[this.getState()].fHandler(oEvent)) {
			return;
		}

		this.setState(this.getNextState());

	}

};