/* 
	Form Validation based partly on http://marcgrabanski.com/code/clean-form-validation
	Reworked by Vernon Blackmore http://www.netnak.co.uk
*/

var cleanValidator = {
	init: function (settings,errormessage) {
		this.settings = settings;
		this.form = document.getElementById(this.settings["formId"]);
		formInputs = this.form.getElementsByTagName("input");

		for(i=0;i<formInputs.length;i++)
		{
			if(formInputs[i].getAttribute("type") != "submit") {
				input = formInputs[i];
				input.style.background = "";
				//input.style.border = "1px solid "+this.settings["inputColors"][1];	//don'tforce borders on load
			}
		};

		this.form.onsubmit = function () {
			error = cleanValidator.validate(errormessage);
			if(error.length < 1) {
				return true;
			} else {
				if (error !=" ") {cleanValidator.printError(error);}
				return false;
			}
		};
	},
	validate: function (errormessage) {
		error = '';
		var errorField;
		var errorFields = "";
		validationTypes = new Array("isRequired", "isTicked", "isSelected", "isFirstchoice", "isEmail", "isNumeric", "isDay", "isMonth", "isYear", "isPostcode");
		for(n=0; n<validationTypes.length; n++) {
			var x = this.settings[validationTypes[n]];
			if(x != null) {
				for(i=0; i<x.length; i++) 
				{
					var restoreborder = true;
					inputField = document.getElementById(x[i]);
					errorField = inputField.name + "_error";
					document.getElementById(errorField).style.display = "none";
					switch (validationTypes[n]) {
						case "isRequired" :
							valid = isRequired(inputField.value);
							break;
						case "isTicked" :
							valid = inputField.checked;
							restoreborder = false;
							break;
						case "isSelected" :
							var selectedIndex = inputField.selectedIndex;
							valid = true;
							if (inputField.options[selectedIndex].value=="") {valid = false;}
							break;
						case "isFirstchoice" :
							valid = getfirstchoice(inputField);
							restoreborder = false;
							break;	
						case "isNumeric" :
							valid = regtest(inputField.value,"\\d*"); break;
						case "isDay" :
							valid = isRange(inputField.value,1,31);
							break;
						case "isMonth" :
							valid = isRange(inputField.value,1,12);	break;
						case "isYear" :
							valid = isRange(inputField.value,1900,2049); break;
						case "isText" :
							valid = regtest(inputField.value,"\\D*"); break;
						case "isEmail" :
							valid = regtest(inputField.value,"[^\\s()<>@,;:\\/]+@\\w[\\w\\.-]+\\.[a-z]{2,}");	break;
						case "isPostcode" :
							valid = regtest(inputField.value,"[A-Za-z]{1,2}[0-9A-Za-z]{1,2}[ ]?[0-9]{0,1}[A-Za-z]{2}");	break;
					}
					if(!valid) {errorFields = errorFields + "," + inputField.name;}
					if(valid) {if (errorFields.indexOf(inputField.name+",") > 0) valid = !valid; }
					
					if(!valid) {
						error = errormessage + " ";
						inputField.style.background = this.settings["errorColors"][0];
						inputField.style.border = "1px solid "+this.settings["errorColors"][1];
						document.getElementById(errorField).style.display = "inline";
						
						} else {
						inputField.style.background = "";
						//restore the borders if the field is not radio/checkbox
						if (restoreborder) {
							inputField.style.border = "1px solid "+this.settings["inputColors"][1];
							} else {
							inputField.style.border = "none";
							}
						}
				}
			}
		}
		return error;
	},
	printError: function (error) {
		alert(error);
	}
};

function isRequired(str){
	if ((str == null) || (str.length == 0)) {return false};
	return true;
}
function isTicked(str){
	return str;
}
function regtest(str,expr) {
	if ( (str == null) || (str.length == 0)) return true;
	var re = new RegExp("^"+expr+"$","i");
	return re.test(str);
}

// returns true if the string only contains characters 0-9 and is not null and is in range 1-31
function isRange(str,startvalue,endvalue){
	if ((str == null) || (str.length == 0)) {return true};	//ignore empty fields (need to use isRequired for these)
	var re = /^\d*$/
	var result = re.test(str);
	if (!result) {return false;}
	var strno = parseInt(str);
	if (strno < startvalue || strno > endvalue) return false;
	return true;
}

//Checks to see if the first option in a radio group is checked
function getfirstchoice(radioObj) {
	if(!radioObj)
		return false;
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return true;
		else
			return false;
		if(radioObj[0].checked) {
			return true;
		}
	return false;
}