/* Based on the Form Validation script by ppk - http://quirksmode.com
 * ------------------------------------------------------------------
 * This script has been modified/butchered from the original.
 *  More information on the original version may be found here:
 *  http://www.quirksmode.org/book/examplescripts.html#formvalidation
 */

var validationErrorMessage = new Object();
validationErrorMessage['required'] = ' ';
validationErrorMessage['numeric'] = 'This field requires a number';
validationErrorMessage['req'] = '';
validationErrorMessage['num'] = '';
validationErrorMessage['postcode'] = 'This field must hold a postal code';
validationErrorMessage['pattern'] = 'Pattern incorrect';
validationErrorMessage['email'] = 'Incorrect email address';

var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["pattern"] = isPattern;
validationFunctions["postcode"] = isPostCode;
validationFunctions["numeric"] = isnumeric;
validationFunctions["email"] = isEmail;
validationFunctions["req"] = isRequired;
validationFunctions["num"] = isnumeric;

function isRequired(formField) {
	switch (formField.type) {
		case 'text':
		case 'textarea':
		case 'select-one':
			if (formField.value)
				return true;
			return false;
		case 'radio':
			var radios = formField.form[formField.name];
			for (var i=0;i<radios.length;i++) {
				if (radios[i].checked) return true;
			}
			return false;
		case 'checkbox':
			return formField.checked;
	}	
}

function isPattern(formField,pattern) {
	var pattern = pattern || formField.getAttribute('pattern');
	var regExp = new RegExp("^"+pattern+"$","");
	var correct = regExp.test(formField.value);
	if (!correct && formField.getAttribute('patternDesc'))
		correct = formField.getAttribute('patternDesc');
	return correct;
}

function isPostCode(formField) {
	return isPattern(formField,"\\d{4}\\s*\\D{2}");
}

function isnumeric(formField) {
	//return isPattern(formField,"\\d+");
	return isPattern(formField,"(\\d+(\.\\d+)?)|(\.\\d+)");
}

function isEmail(formField) {
	return isPattern(formField,"\\w*@\\w*\.\\w{2,4}")
}

function emptyFunction() {
	return true;
}

/*********************************/

var W3CDOM = document.createElement && document.getElementsByTagName;

function validateForms() {
	if (!W3CDOM) return;
	var forms = document.forms;
	for (var i=0;i<forms.length;i++) {
		if( forms[i].className == 'quit_form' ) continue;
		if( forms[i].is_rapi ) continue;
		forms[i].onsubmit = validate;
	}
}

addEventSimple(window,'load',validateForms);

function validate() {
	var els = this.elements;
	var validForm = true;
	var firstError = null;
	for (var i=0;i<els.length;i++) {
		if (els[i].removeError)
			els[i].removeError();
		var req = els[i].className;
		if (!req) continue;
		var reqs = req.split(' ');
		if (els[i].getAttribute('pattern'))
			reqs[reqs.length] = 'pattern';
		for (var j=0;j<reqs.length;j++) {
			if (!validationFunctions[reqs[j]])
				validationFunctions[reqs[j]] = emptyFunction;
			var OK = validationFunctions[reqs[j]](els[i]);
			if (OK != true) {
				var errorMessage = OK || validationErrorMessage[reqs[j]];
				writeError(els[i],errorMessage);
				validForm = false;
				if (!firstError)
					firstError = els[i];
				break;
			}
		}
	}

	if (!validForm) {
		var msg = 'Please complete all form fields before submitting.';
		alert(msg);
		//location.hash = '#startOfForm';
		//document.getElementById('errors').innerHTML = msg;
	}
	return validForm;
	
}

function writeError(obj,message) {
	// Highlight field
	document.getElementById(obj.id).style.backgroundColor='yellow';
	// Attaches error msg class to input -- so use background-color: yellow in css
	//obj.className += ' errorMessage';
	obj.onchange = removeError;
	// Skip following steps if error already attached, unless the
	//  element is a radio, in which case we need to attach errorMessage
	//  to multiple objects (all of the radios).
	if ( (obj.errorMessage || obj.parentNode.errorMessage) && (obj.type != 'radio') ) return;
	// Insert inline error msg into error span element if it exists,
	//  if it doesn't, then create new element for error msg.
	var errorMessage = document.getElementById(obj.name + '_error');
	if( errorMessage )
	{
		errorMessage.innerHTML = message;
		errorMessage.className += ' errorMessage';
	}
	else if( message )
	{
		var errorMessage = document.createElement('label');
		errorMessage.className = 'errorMessage error';
		errorMessage.setAttribute('for',obj.id);
		errorMessage.setAttribute('htmlFor',obj.id);
		errorMessage.appendChild(document.createTextNode(message));
		obj.parentNode.appendChild(errorMessage);
	}
	// Attach to object
	obj.errorMessage = errorMessage;
	obj.parentNode.errorMessage = errorMessage;
}

function removeError() {
	// un-Highlight field
	this.style.backgroundColor='';
	// Remove error
	//this.className = this.className.replace(/errorMessage/,'');
	if (this.errorMessage) {
		this.errorMessage.innerHTML = '';
		this.parentNode.removeChild(this.errorMessage);
		// Remove from object
		this.errorMessage = null;
		this.parentNode.errorMessage = null;
	}
	this.onchange = null;
}