
if (typeof(Form) == 'undefined') throw 'Prototype in required.';

Form.HandleSubmit = function(form, options) {
	
	form = $(form);
	
	form.observe('submit', function(evt) {
		Event.stop(evt);
		Form.Submit(form, options);
	});
};

Form.Submit = function(form, options) {

	form = $(form);
	
	options = Object.extend({
		onSuccess: Prototype.emptyFunction,
		onFailure: Prototype.emptyFunction,
		onComplete: Prototype.emptyFunction
	}, options || {});
	
	form.request({
		onLoading: function() {
			form.disable();
		},
		onComplete: function(response) {

			var success;
			
			try {
				success = Form.HandleValidationResponse(form, response, options);
			} catch (e) {
				console.log(e);
				success = false;
			}
			
			options[success ? 'onSuccess' : 'onFailure'](response);
			options.onComplete(response);
		}
	});
};

Form.HandleValidationResponse = function(form, response, options) {
	
	options = Object.extend({
		successMessage: 'Succesvol opgeslagen',
		onSuccessMessageHidden: Prototype.emptyFunction
	}, options || {});

	if (!response.responseJSON) {
		alert('Geen geldig antwoord ontvangen. Meld deze fout bij de systeembeheerder.');
		return false;
	}
	
	var result = response.responseJSON;
	var errorListItems = [];
	
	// eerst alle elementen ontdoen van de classname "error"
	$A(form.elements).invoke('removeClassName', 'error');
	
	if (!result.success) {
		
		for (var field in result.errors || {}) {
			
			// indien de error aan een veld gekoppeld is
			if (form[field]) {
				$(form[field]).addClassName('error');
			}
			
			// door alle errors lopen
			$A(result.errors[field]).each(function(error) {
				
				// list-item aanmaken
				var errorListItem = new Element('LI').update(error);
				
				errorListItems.push(errorListItem);
			});
		}
		
		if (errorListItems.length > 0) {
			
			var listCreated = false;
			
			if (this.errorList) {
				listCreated = true;
				this.errorList.remove();
			}
			
			this.errorList = new Element('UL').addClassName('errors');
			
			for (var i = 0; i < errorListItems.length; i++) {
				this.errorList.insert(errorListItems[i]);
			}
			
			if (!listCreated) {
				this.errorList.hide();
			}
			
			form.insert({
				'top': this.errorList
			});
			
			if (!listCreated) {
				this.errorList.blindDown({duration: 0.3});
			}
		}
	} else {
		
		if (this.errorList) {
			
			this.errorList.blindUp({
				duration: 0.3, 
				afterFinish: function() {
					this.errorList.remove();
					this.errorList = null;
				}.bind(this)
			});
		}
		
		var message = new Element('div').addClassName('notice').update(options.successMessage);
		message.hide();
		
		form.insert({
			'top': message
		});
		
		message.blindDown({
			duration: 0.3,
			afterFinish: function() {
				message.blindUp({
					duration: 0.3,
					delay: 2,
					afterFinish: function() {
						message.remove();
						options.onSuccessMessageHidden();
					}
				});
			}
		});
	}
	
	form.enable();
	
	return result.success;
};

