/*
 * client-side validation for Knowledge Tracker pages.
 * last modified 2009-02-20 jej
 *
 * requires: prototype.js
 * 
 * examples: see pages in /e/ask/.
 * 
 * Initialize a Validator object with the id of a form you'd like to
 * validate. Assign class names like 'validaterequired' to the form
 * elements you'd like to validate. The script will intercept the form
 * when the submit event fires. If any fields fail validation, it will
 * prevent the submission and display an alert box with error messages.
*/

Element.addMethods({
	previousFormElement: function(element) {
		var elements = element.up('form').getElements();
		var e = 0;
		while (e < elements.length) {
			if (elements[e] == element)
				break;
			e++;
		}
		return elements[e-1];
	}
});

var Validator = Class.create({
	initialize: function(form) {
		document.observe('dom:loaded', function() {
			this.form = $(form);
			Event.observe(this.form, 'submit', this.validateForm.bindAsEventListener(this));
		}.bind(this));
	},
	validateForm: function(event) {
		var form = event.element();
		var errors = new Array();
		form.select('.validateemail').each(function(element) {
			if (!this.validateEmailField(element))
				errors.push(element.readAttribute('name') + " is an invalid email address.");
		}.bind(this));
		form.select('.validaterequired', 'select[name="affiliation"]',
			'select[name="proxy_length"]', 'select[name="heard_about"]',
			'select[name="researcher_type"]', 'select[name="category"]').each(function(element) {
			if (!this.validateRequiredField(element))
				errors.push(element.readAttribute('name') + " is required.");
		}.bind(this));
		form.select('.validateconfirm').each(function(element) {
			if (!this.validateConfirmField(element))
				errors.push(element.readAttribute('name') + " doesn't match.");
		}.bind(this));
		form.select('.validateatleastone').invoke('readAttribute', 'name').uniq().each(function(name) {
			var type = form.down('input[name="' + name + '"]').readAttribute('type');
			if (!this.validateAtLeastOneField(form.getInputs(type, name)))
				errors.push(name + " is required.");
		}.bind(this));
		
		if (errors.length > 0 ) {
			event.stop();
			alert(errors.join('\n'));
			return false;
		}
	},
	validateRequiredField: function(element) {
		if ($(element).type && $(element).type.toLowerCase() == 'radio') {
			var radioGroup = $(element).name;
			var form = $(element).form;
			var checked = $(form).getInputs('radio', radioGroup).find(function(re) {
				return re.checked;
			});
			if (checked)
				return true;
			else
				return false;
		} else {
			return ($F(element).replace(' ', '') != '');
		}
	},
	validateEmailField: function(element) {
		var re = /^.+@.+\..+$/;
		return $F(element).match(re);
	},
	validateConfirmField: function(element) {
		return ($F(element) == $F(element.previousFormElement()));
	},
	validateAtLeastOneField: function(elements) {
		return elements.invoke('getValue').join('') != '';
	}
});

