var FormButton = new Class({
	Implements: [Options, Events, Log],
	
	options: {
		showLoader: false
	},
	
	// Variables
	form: null,
	element: null,

	
	/*
	 * Initialize
	 */
	initialize: function(form, selector, options)
	{
		//this.enableLog();
		this.log("FormButton::initialize(" + form + ", " + selector + ", " + options + ")");
		
		// Set options
		this.setOptions(options);
		
		// Set variable
		this.form = form;
		this.element = this.form.element.getElement(selector);
		
		// Enable button
		this.enable();
	},
	
	/*
	 * Reset
	 */
	reset: function()
	{
		this.log("FormButton::reset()");
		
		this.enable();
		this.hideLoadState();
	},
	
	/*
	 * Disable
	 */
	disable: function()
	{
		this.log("FormButton::disable()");
		
		this.element.set('disabled', true);
		this.element.addClass('disabled');
		
		this.removeEvents();
	},
	
	/*
	 * Disable
	 */
	enable: function()
	{
		this.log("FormButton::enable()");
		
		this.element.set('disabled', false);
		this.element.removeClass('disabled');
		
		this.addEvents();
	},
	
	/*
	 * Add events
	 */
	addEvents: function()
	{
		this.log("FormButton::addEvents()");
		
		// First remove events to prevent duplicate event calls
		this.removeEvents();
	},
	
	/*
	 * Remove events
	 */
	removeEvents: function()
	{
		this.log("FormButton::removeEvents()");
		
		this.element.removeEvents('click');
		this.element.addEvent('click', function( event ) {
			event.preventDefault();
		}.bind(this));
	},
	
	/*
	 * Show load state
	 */
	showLoadState: function()
	{
		this.log("FormButton::showLoadState()");
		
		if(this.options.showLoader)
		{
			if(!this.element.getElement('div.loader'))
			{
				var loader = new Element('div', {'class': 'loader'});
				this.element.adopt(loader);
			}
		}
	},
	
	/*
	 * Hide load state
	 */
	hideLoadState: function()
	{
		this.log("FormButton::hideLoadState()");
		
		if(this.options.showLoader)
		{
			if(this.element.getElement('div.loader'))
			{
				this.element.getElement('div.loader').dispose();
			}
		}
	}
	
});
