/*extern DOMAssistant, $ */
DOMAssistant.AJAXForms = function () {
	var ajaxForms = null;
	return {
		publicMethods : [
			"setBeforeSubmissionHandler",
			"setAJAXForm",
			"setResponseHandler"
		],
		beforeSubmissionHandler : function () {
			return true;
		},
		responseHandler : null,
		init : function () {
			DOMAssistant.DOMReady("DOMAssistant.AJAXForms.applyFormHandling()");
		},
		
		applyFormHandling : function (elm) {
			ajaxForms = (elm)? $(elm).cssSelect(".ajax-form") : $(".ajax-form");
			for (var i=0, il=ajaxForms.length; i<il; i++) {
				this.setAJAXForm.call(ajaxForms[i]);
			}
		},
		
		setAJAXForm : function (beforeHandler, responseHandler, headers) {
			$(this).addEvent("submit", DOMAssistant.AJAXForms.sendForm);
			beforeHandler = beforeHandler || /before-handler-(\w+)/.exec(this.className);
			if (beforeHandler) {
				this.setBeforeSubmissionHandler((typeof beforeHandler === "function")? beforeHandler : window[beforeHandler[1]]);
			}
			responseHandler = responseHandler || /response-handler-(\w+)/.exec(this.className);
			if (responseHandler) {
				this.setResponseHandler((typeof responseHandler === "function")? responseHandler : window[responseHandler[1]]);
			}
			if (headers) {
				this.headers = headers;
			}
			return this;
		},
		
		sendForm : function () {
			var beforeSubmission = this.beforeSubmissionHandler || DOMAssistant.AJAXForms.beforeSubmissionHandler;
			if (beforeSubmission.call(this) !== false) {
				var fields = this.elements;
				var parameters = "";
				for (var i=0, il=fields.length, field, type, isSelect; i<il; i++) {
					field = fields[i];
					type = field.getAttribute("type");
					isSelect = /select/i.test(field.nodeName);
					if (field.getAttribute("name") && (/text|hidden|password|submit|image/i.test(type) || isSelect || (/radio|checkbox/i.test(type) && field.checked) || /textarea/i.test(field.nodeName))) {
						parameters += field.getAttribute("name") + "=" + escape(((isSelect)? field.options[field.selectedIndex].value : field.value)) + "&";
					}
				}
				this.ajax({
					url : this.getAttribute("action"),
					method: "POST",
					params : parameters.replace(/&*$/g, ""),
					callback : this.responseHandler || DOMAssistant.AJAXForms.responseHandler,
					headers : this.headers || {}
				});
			}
			return false;
		},
		
		setBeforeSubmissionHandler : function (funcRef) {
			this.beforeSubmissionHandler = funcRef;
			return this;
		},
		
		setResponseHandler : function (funcRef) {
			this.responseHandler = funcRef;
			return this;
		}
	};
}();
DOMAssistant.attach(DOMAssistant.AJAXForms);