/*
SVForm
Server-Validated Form
Santiago Cortés
14/09/2006
*/

SVForm = {};

SVForm.validate = function(form) {
	SVForm.disable(form);
	SVForm.doreset(form);
	new Ajax.Request(form.action, {
		parameters: Form.serialize(form),
		requestHeaders: ['Accept', 'text/json'],
		onComplete: function(req) {
			//alert(req.responseText); return false;
			if (req.status == 200) {
				window.location = req.responseText;
			} else {
				response = eval(req.responseText);
				for ( var i in response ) {
					SVForm.raiseError(i,response[i]);
				}
			}

			SVForm.enable(form);
		}
	});

	return false;
}

SVForm.disable = function(form) {
	inputs = form.getElementsByTagName('input');
	$A(inputs).map(function(input) {
		if (input.type == 'submit'){
			input.disabled = true;
			input.lastvalue = input.value;
			input.value = 'Sending...';
		} else if (input.type == 'reset') {
			Element.hide(input);
		}
	});
}

SVForm.enable = function(form) {
	inputs = form.getElementsByTagName('input');
	$A(inputs).map(function(input) {
		if (input.type == 'submit'){
			input.disabled = false;
			input.value = input.lastvalue;
		} else if (input.type == 'reset') {
			Element.show(input);
		}
	});
}


SVForm.clearError = function(element) {
	element = $(element);
	errors	= element.parentNode.getElementsByTagName('H3');
	$A(errors).map(function(err){
		Effect.Fade(err, {duration: 0.3,
			afterFinish: function() {
				if (err.parentNode) {
					err.parentNode.removeChild(err);
				}
			}
		});
	});	
}

SVForm.raiseError = function(element, message) {
	element = $(element);

	if (!element){
		return;
	}

	errors	= element.parentNode.getElementsByTagName('H3');
	$A(errors).map(function(err){
		err.parentNode.removeChild(err);
	});

	error	= document.createElement('H3');
	error.innerHTML = message;
	error.style.display = 'none';
	element.parentNode.appendChild(error);
	
	Effect.Appear(error,{duration:0.3});

	element.onfocus = function() {
		SVForm.clearError(this);
	}

	element.onkeypress = function() {
		SVForm.clearError(this);
	}
}

SVForm.doreset = function(form) {
	errors	= form.getElementsByTagName('H3');
	$A(errors).map(function(err){
		Effect.Fade(err, {duration: 0.3,
			afterFinish: function() {
				if (err.parentNode) {
					err.parentNode.removeChild(err);
				}
			}
		});
	});
}
