var AjaxForm = Class.create({

	cancelled: false,

	initialize: function(formId, options) {
		this.form = $(formId);

		if (typeof options == 'object')
		{
			this.onComplete = (options.onComplete) ? options.onComplete : function(){};
			this.onSubmit = (options.onSubmit) ? options.onSubmit : function(){};
		}
		else
		{
			this.onComplete = function(){};
			this.onSubmit = function(){};
		}

		this.form.onsubmit = function(){return false};
		
		if (!this.form.action)
			this.form.action = location.href;

		this.form.observe('submit', function() {
			this.onSubmit();
			if (!this.cancelled)
				ajax_submitForm(this.form, this.onComplete.bind(this));
			this.cancelled = false;
		}.bindAsEventListener(this));
	},
	
	reSubmit: function() {
		ajax_submitForm(this.form, this.onComplete.bind(this));
	}, 
	
	cancel: function() {
		this.cancelled = true;
	}

});


ajaxOnComplete = function(ajax, afterOnComplete)
{
	try {
		response = ajax.responseText.evalJSON();
	}
	catch(e)
	{
	}
	

	if (typeof response == 'object') 
	{
		if (response.event)
			document.fire(response.event, {response:response});
		if (response.errors && response.errors.length)
			new ErrorMessage(response.errors);
		else if (response.message)
			new Message(response);
		else if (response.redirect)
			location.href = response.redirect;
		else if (response.reload)
			location.reload();

		if (afterOnComplete)
			afterOnComplete(response);
	}
	else
		Modalbox.show(ajax.responseText);
}


ajax_submitForm = function(formId, afterOnComplete)
{
	$(formId).request({ onComplete: function(ajax){
		ajaxOnComplete(ajax, afterOnComplete);
	}})
}



ajax_submitURL = function(URL, afterOnComplete)
{
	new Ajax.Request(URL, {
		method: 'get',
		onComplete: function(ajax) {
			ajaxOnComplete(ajax, afterOnComplete);
		}
	});
}


ajax_submitPostURL = function(URL, parameters, afterOnComplete)
{
	new Ajax.Request(URL, {
		method: 'post', 
		parameters: parameters, 
		onComplete: function(ajax) {
			ajaxOnComplete(ajax, afterOnComplete);
		}
	});
}


ajax_submitPost = function(parameters, afterOnComplete)
{
	new Ajax.Request(location.href, {
		method: 'post', 
		parameters: parameters, 
		onComplete: function(ajax) {
			ajaxOnComplete(ajax, afterOnComplete);
		}
	});
}


