/* Variable holding the regular expressions and error messages */

var validationSet = {
	'name': {
		'regexp': /^[ \.a-zA-Z]+$/,
		'error': "Please check your name.",
		'error2': "Please enter your name."
	},
	'company': {
		'regexp': /^[ \'a-zA-Z0-9]+$/,
		'error': "Please check your organisation name.",
		'error2': "Please enter your organisation name."
	},
	'subject': {
		'regexp': /^[ \'a-zA-Z0-9]+$/,
		'error': "Please check the subject title."
	},
	'email': {
		'regexp': /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/,
		'error': "Please enter a valid email address.",
		'error2': "Please enter your email address."
	},
	'phone': {
		'regexp': /^[\- ()0-9]+$/,
		'error': "Please check your telephone number."
	},
	'mobile': {
		'regexp': /^[\- ()0-9]+$/,
		'error': "Please check your mobile number."
	},
	'message': {
		'regexp': /\w+/,
		'error': "Please check your message.",
		'error2': "Please enter your message."
	},
	'check': {
		'error': "Please check the anti-spam checkbox before submission."
	}
};

var vF = {
	/* This function makes the label area clickable to bring it into focus */
	focusLabels: function() {
		if (typeof document.getElementById == 'undefined'  || typeof document.getElementsByTagName == 'undefined'  || typeof document.createElement == 'undefined') {return;}
		var labels = document.getElementsByTagName("label");
		for (var i=0; i<labels.length; i++) {
			if (!labels[i].getAttribute("for")) {
				continue;
			}
			labels[i].onclick = function() {
				var id = this.getAttribute("for");
				if (!document.getElementById(id)) {
					return false;
				}
				var element = document.getElementById(id);
				element.focus();
			};
		}
	},

	/* Adds the submit event handler */
	prepareForms: function() {
		for (var i=0; i<document.forms.length; i++) {
			var thisform = document.forms[i];
			if (thisform.id == 'contactForm') {
				thisform.onsubmit = function() {
					return vF.validateForm(this);
				};
			}
		}
	},


	/* Checks the field has some content */
	isFilled: function(field) {
		if (field.value.length < 1) {
			return false;
		} else {
			return true;
		}
	},

	/* Checks the entered data is valid */
	isValid: function(field) {
		if (!field.value) {
	      return null;
	    }
	    var fieldName = field.getAttribute('id').match(/[A-Za-z]+/);
	    var regex = 'regexp';
		var RE = validationSet[fieldName][regex];
		if (!field.value.match(RE)) {
			return field;
		} else {
			return null;
		}
	},

	/* Called on submission. */
	validateForm: function(whichform) {
		var error;
		for (var i=0; i<whichform.elements.length; i++) {
			var whichfield = whichform.elements[i];
			// Checks 'required' fields contain a value 
			if (whichfield.className && whichfield.className.indexOf("required") != -1) {
				if (!vF.isFilled(whichfield)) {
					error = 'error2';
					vF.displayError(whichfield,error);
					return false;
				} else {
					vF.clearField(whichfield);
				}
			}
			// Ensures an incorrect field can't be submitted
			if (whichfield.className && whichfield.className.indexOf("validate") != -1) {
				if (vF.isValid(whichfield)) {
					error = 'error';
					vF.displayError(whichfield,error);
					return false;
				} else {
					vF.clearField(whichfield);
				}
			}	
		}
		// Checks checkbox id checked
		var checkbox = document.getElementById('check');
		if (!checkbox.checked) {
			error = 'error';
			vF.displayError(checkbox,error);
			return false;
		}
		
		// Changes the submit button value
		var submit = document.getElementById("submit");
		submit.className = "submitLoading";
		submit.value = "Contacting server";
		 return true;
	},
	
	/* Display error message and add 'failed' class */
	displayError: function(element,error) {
		var fieldType = element.getAttribute('id').match(/[A-Za-z]+/);
		var errorMsg = validationSet[fieldType][error];
		alert('Error! ' + errorMsg);
		// Applies a 'failed' class for styling
		addClass(element, "failed");
		element.focus();
	},
	/* Clears any error messages and removes 'failed' class */
	clearField: function(element) {
		if (element.className && (element.className.indexOf('failed'))) { 
			element.className = element.className.replace(/\b ?failed ?\b/, '');
		}
	},
	
	/* Add the toggle fields link */
	addLink: function() {
		if (document.getElementById('linkHolder')) {
			var linkHolder = document.getElementById('linkHolder');
			var link = document.createElement('a');
			link.href = '#';
			link.id = 'toggleLink';
			link.onclick = vF.toggleFields;
			var txt = document.createTextNode('Remove optional fields?');
			link.appendChild(txt);
			linkHolder.appendChild(link);
		} else {
			return;
		}
	},
	
	toggleFields: function() {
		var linkText = this.firstChild.nodeValue;
		this.firstChild.nodeValue = (linkText == 'Remove optional fields?') ? 'Display optional fields?' : 'Remove optional fields?';
		var form = document.getElementById('contactForm');
		for (var i=0; i<form.elements.length; i++) {
			var field = form.elements[i];
			// Checks 'required' fields contain a value 
			if (field.className && (field.className.indexOf("required") == -1)) {
				var parent = field.parentNode;
				parent.style.display = (parent.style.display == 'none') ? 'block' : 'none';
			}
		}
		return false;
	}
	
};

addEvent(window,'load',vF.focusLabels,false);
addEvent(window,'load',vF.prepareForms,false);
addEvent(window,'load',vF.addLink,false);


