function validateForm(form) {
	var msg = '';
	var els = form.elements;
	var processed = [];
	for (var i = 0; i < els.length; i++) {
		var name = els[i].getAttribute('name');
		if (name == null || processed.contains(name)) continue; else processed[processed.length] = name;
		var type = els[i].getAttribute('type');
		var desc = els[i].getAttribute('desc') || name;
		var range = [];
		var val = '';
		if (type == 'radio' || type == 'checkbox') {
			range = document.getElementsByName(name);
			for (var j = 0; j < range.length; j++) if (range[j].checked) val += (val == '' ? '' : ',') + range[j].value;
		} else {
			range[0] = els[i];
			val = String(els[i].value);
		}

		for (var j = 0; j < range.length; j++) range[j].className = range[j].className.replace(/ attention/g, '');

		var invalid = (els[i].getAttribute('required') == 'yes' && val == '');
		if (els[i].getAttribute('email') == 'yes' && !new RegExp("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}", "gi").test(val)) invalid = true;

		if (invalid) {
			for (var j = 0; j < range.length; j++) range[j].className = range[j].className += ' attention';
			msg += '- ' + desc.replace(/_/g, ' ') + '\n';
		}
	}
	if (msg != '') {
		msg = (form.getAttribute('required_fields_message') || 'The following fields are not yet filled in:')+ '\n\n' + msg;
		alert(msg);
		return false;
	}
	return true;
}

Array.prototype.contains = function(x) {
	for (var i = 0; i < this.length; i++) if (this[i] == x) return true;
	return false;
};
