var AjaxFormRequest = Class.create();

AjaxFormRequest.prototype = {

	initialize: function(prefix, url, updater, showAlert) {

		this.prefix = prefix;
		this.url = url;
		this.showAlert = showAlert;

		if(typeof(updater) == 'undefined') {
			updater = true;
		}
		this.updater = updater;

		var self = this;
		new Validation(prefix + "_form", {
			onFormValidate: function(result, form) {
				if(typeof self.onFormValidate == 'function') {
					self.onFormValidate(result, form);
				}
				self.ajaxFormCallback(result, form);
			}
		});
	},

	ajaxFormCallback: function(result, form) {
		if (document.getElementById)
			var submit_button = document.getElementById(this.prefix + "_submit");
		else if (document.all)
			var submit_button = document.all[this.prefix + "_submit"];
		else if (document.layers)
			var submit_button = document.layers[this.prefix + "_submit"];
		
		if(submit_button)
			submit_button.disabled = true;
		
		if(result) {
			var self = this;
			new Effect.Appear(this.prefix + "_ajax_loader", {duration:1});

			var options = {
				method:'post',
				asynchronous:true,
				evalScripts:true,
				parameters:Form.serialize(this.prefix + "_form"),
				onComplete:function() {
					if(self.updater) {
						var t = new Effect.Appear(self.prefix + "_response", {duration:1});
					}
					//Form.reset(self.prefix + "_form")
					Form.focusFirstElement(self.prefix + "_form");
					new Effect.Opacity(self.prefix + "_ajax_loader", {duration: 1.0, transition: Effect.Transitions.linear, from: 1.0, to: 0.0});
				}
			}

			if(this.updater) {
				new Ajax.Updater(this.prefix + "_response", this.url, options);
			}
			else {
				new Ajax.Request(this.url, options);
			}
		}
		else if(this.showAlert) {
			var fields = document.getElementsByClassName("validation-failed", form);
			var message = "Errors encountered in form:\r\n---------------------------------\r\n";
			fields.each(function(elm) {
				var cn = elm.classNames();
				cn.each(function(value) {
					if(value != "validation-failed") {
						var advice = $("advice-" + value + "-" + elm.id);
						if(typeof advice != "undefined") {
							message += advice.innerHTML.replace(/%s/, elm.title) + "\r\n";
						}
					}
				});
			});
			alert(message);
		}
		
		if(submit_button)
			submit_button.disabled = false;
	}
}
