/*
 * validation.js
 *
 * depends on:
 *   scl.js, for iterative Array functions and add_load_event()
 */

/* Validation:
 * On submittion any FORM, INPUT elements are validated according to any 
 * validate_* classes set on them.
 * Validation error messages are added to the element with id validationerrors 
 * (i.e. place an empty DIV where errors should appear).
 */
var clear_validation_errors = function (form) {
	var spans = form.getElementsByTagName('span');
	for (var i = spans.length - 1; i >= 0; i --) {
		if (has_class(spans[i], 'error')) {
			spans[i].parentNode.removeChild(spans[i]);
		}
	}
};
var span_error = function (error_message) {
	var elem = document.createElement('span');
	set_class(elem, 'error');
	elem.appendChild(document.createTextNode(error_message));
	return elem;
};
var validate = function (form) {
	var valid = true;
	foreach(form.elements, function (element) {
		if (element.nodeName == 'INPUT' || element.nodeName == "SELECT") {							   
			foreach(element.className.split(' '), function (className) {
				if (/^validate_/.test(className)) {
					var validation_error = eval(className + '(element)');
					if (validation_error != null) {
						valid = false;
						element.parentNode.appendChild(document.createTextNode(' '));
						element.parentNode.appendChild(span_error(validation_error));
					}
				}
			});
		}
	});
	return valid;
};
add_load_event(function () {
	foreach(document.getElementsByTagName('form'), function (form) {
		form.onsubmit = function () {
			clear_validation_errors(form);
			return validate(form);
		};
	});
});

function validate_nonempty(elem) {
	if (elem.value == '')
		return 'Please enter a value.';
	return null;
}

function validate_select(elem) {
	if (elem.value == '')
		return 'Please select an option.';
	return null;
}

function validate_email(elem) {
	if (!/^[a-zA-Z0-9][a-zA-Z0-9._%+-]*@[-a-zA-Z.]+$/.test(elem.value))
		return 'Please enter an e-mail address.';
	return null;
}

