var Ct_Form = Class.create(Ct_Component_Abstract, {

	__construct: function() {
		Ct_Page.domLoaded(this._assemble.bind(this));

		this.element.on('Ct_Page:refresh', null, this._assemble.bindAsEventListener(this));

		this.element.on('submit', '.' + this._namespace + ' .ctForm-form', function(event) {
			Event.stop(event);
			this._submit(event.findElement('.' + this._namespace));
		}.bindAsEventListener(this));

		this.element.on('Ct_Form:forceSubmit', '.' + this._namespace + ' .ctForm-form', function(event) {
			Event.stop(event);
			this._submit(event.findElement('.' + this._namespace));
		}.bindAsEventListener(this));

		this.element.on('click', '.' + this._namespace + ' .ctForm-submit', function(event) {
			Event.stop(event);
			this._submit(event.findElement('.' + this._namespace));
		}.bindAsEventListener(this));

		this.element.on('click', '.' + this._namespace + ' .ctForm-reset', function(event) {
			Event.stop(event);
			this._reset(event.findElement('.' + this._namespace));
		}.bindAsEventListener(this));

	},

	_assemble: function() {
		$$('.' + this._namespace + ' .ctForm-form').each(function(element) {
			if (element.retrieve('handler', null) !== null) {
				return;
			}
			element.store('handler', element.on('submit', null, function(event) {
				event.stop();
				event.findElement().fire('Ct_Form:forceSubmit');
			}.bindAsEventListener(this)));
		}.bind(this));
	},

	_submit: function(element) {
		var formElement = element.down('.ctForm-form');

		formElement.fire('Ct_Form:submit');
		if (!Object.isElement(formElement)) {
			return;
		}

		var requestType = (Object.isElement(formElement.down('input[type=file]'))) ? 'iframe' : 'ajax';

		var request = Ct_Page.getRequest(element.identify(), requestType);
		request.form = formElement;
		request.send();
	},

	_reset: function(element) {
		var formElement = element.down('.ctForm-form');
		if (!Object.isElement(formElement)) {
			return;
		}
		formElement.reset();
	},

	_setNamespace: function() {
		this._namespace = 'ctForm';
	},

	refresh: function(ident, response) {
		var element = $(ident);

		if (!Object.isElement(element)) {
			return;
		}

		var returnElement = element.down('.ctForm-return input[type="checkbox"]');
		if (!Object.isElement(returnElement)) {
			returnElement = element.down('.ctForm-return input');
		}
		var returnChecked = (Object.isElement(returnElement) && returnElement.getValue() == 1);
		var responseHasErrors = Ct_Page.getComponent('Ct_Component_Message').hasErrors();
		var redirectPathIsSet = (response.json && response.json.redirectPath && Object.isString(response.json.redirectPath));
		if (returnChecked && redirectPathIsSet && !responseHasErrors) {
			document.location.href = response.json.redirectPath;
			return;
		}

		if (response.html && response.html.length) {
			element.update(response.html);
		}
	}

});

Ct_Page.registerScript("Ct_Form");

