	var validationErrorMessage = new Object();
	validationErrorMessage['required'] = 'Required';
	validationErrorMessage['numeric'] = 'Requires a number';
	validationErrorMessage['postcode'] = 'Required';
	validationErrorMessage['pattern'] = 'Pattern incorrect';
	validationErrorMessage['email'] = 'Incorrect Email';
	
	var validationFunctions = new Object();
	validationFunctions["required"] = isRequired;
	validationFunctions["pattern"] = isPattern;
	validationFunctions["postcode"] = isPostCode;
	validationFunctions["numeric"] = isnumeric;
	validationFunctions["email"] = isEmail;
//--------------------------------------------------------	
function addEvent(obj,type,fn)
{
	if (obj.addEventListener)
		obj.addEventListener(type,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent("on"+type,fn);
}

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}");//\\d{4}\\s*\\D{2}
	}
	
	function isnumeric(formField) {
		return isPattern(formField,"\\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++) {
			forms[i].onsubmit = validate;
		}
	}
	
 	addEvent(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].getAttribute('validation');
			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) {
			alert("Please correct the fields that are not entered propperly.");
			location.hash = '#startOfForm';
		}
		return validForm;
	}
	
	function writeError(obj,message) {
		obj.className += ' errorMessage';
		obj.onchange = removeError;
		if (obj.errorMessage || obj.parentNode.errorMessage) return;
		var errorMessage = document.createElement('label');
		errorMessage.className = 'errorMessage';
		errorMessage.setAttribute('for',obj.id);
		errorMessage.setAttribute('htmlFor',obj.id);
		errorMessage.appendChild(document.createTextNode(message));
		obj.parentNode.appendChild(errorMessage);
		obj.errorMessage = errorMessage;
		obj.parentNode.errorMessage = errorMessage;
	}
	
	function removeError() {
		this.className = this.className.replace(/errorMessage/,'');
		if (this.errorMessage) {
			this.parentNode.removeChild(this.errorMessage);
			this.errorMessage = null;
			this.parentNode.errorMessage = null;
		}
		this.onchange = null;
	}

