/* Validation Error Message */
var validationErrorMessage = new Object();
validationErrorMessage['required'] = 'Mandatory field';
validationErrorMessage['numeric'] = 'This field requires a number';
validationErrorMessage['postcode'] = 'This field must hold a Dutch postal code';
validationErrorMessage['pattern'] = 'Pattern incorrect';
validationErrorMessage['email'] = 'Incorrect email address';
validationErrorMessage['fixlen9'] = 'Please enter 9 digits';
validationErrorMessage['fixlen8'] = 'Please enter 8 characters';
validationErrorMessage['pastDate'] = 'Invalid date';
validationErrorMessage['password'] = 'Password does not match';
validationErrorMessage['minlen'] = 'Mininum length of 6 characters';
validationErrorMessage['tnc'] = 'You have not agreed to the terms and conditions';
validationErrorMessage['chooseOne'] = 'Please choose one.';
validationErrorMessage['checkPhone'] = 'Please fill in either Telephone Number or Mobile Number.';
validationErrorMessage['checkPhoneAC'] = 'Please fill in both Area Code and Phone Number.';
validationErrorMessage['phone'] = 'Invalid phone number';
validationErrorMessage['wordCount'] = 'Maximum 200 words.';
validationErrorMessage['ext'] = 'Please attach file in doc ppt pdf zip or docx format.';
/*validationErrorMessage['chooseTwo'] = 'Please select up to 2 preferred days.';*/

/* Validation Types */
var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["postcode"] = isPostCode;
validationFunctions["numeric"] = isnumeric;
validationFunctions["email"] = isEmail;
validationFunctions["fixlen9"] = isLen9;
validationFunctions["fixlen8"] = isLen8;
validationFunctions["pastDate"] = isPastDate;
validationFunctions["password"] = isMatch;
validationFunctions["minlen"] = isMinLen;
validationFunctions["tnc"] = isRequired;
validationFunctions["chooseOne"] = isRequired;
validationFunctions["checkPhoneAC"] = isCheckPhoneAC;
validationFunctions["checkPhone"] = isCheckPhone;
validationFunctions["phone"] = isPhone;
validationFunctions["wordCount"] = isWordCount;
validationFunctions["ext"] = isExt;
/*validationFunctions["chooseTwo"] = checkChoice;*/

/* Reset form */
function resetfrm(formObj)
{
	document.getElementById(formObj).reset()
	var els = document.getElementById(formObj);
	for (var i=0;i<els.length;i++) {
		if (els[i].className=='errorMessage'){
			els[i].className = els[i].className.replace(/errorMessage/,'');
			if (els[i].errorMessage) {
			els[i].parentNode.removeChild(els[i].errorMessage);
			els[i].errorMessage = null;
			els[i].parentNode.errorMessage = null;
			}
		}
	}	
	return false;
}


/********************* Validation functions start *******************************/

function isRequired(formField) {
	switch (formField.type) {
		case 'text':
		case 'textarea':
		case 'password':
		case 'select-one':
			ffield = formField.value.replace(/ /g,'')
			if (ffield)
				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 isPostCode(formField) {
	return isPattern(formField,"\\d{4}\\s*\\D{2}");
}

function isnumeric(formField) {
	if (formField.value.length == 0 )
		return true;
	else
		return isPattern(formField,"\\d+");
}

function isEmail(formField) {
	if (!isRequired(formField)) 
		return true;
	else
		return isPattern(formField,"([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})")
}

function isLen9(formField){
	//return formField.value.length == 9
	return isPattern(formField,"\\d{9}");
}

function isLen8(formField){
	return formField.value.length == 8
}

function isMatch(formField){
	var xmatch = formField.name + '_confirm'
	return formField.value == document.getElementById(xmatch).value
}

function isMinLen(formField){
	return formField.value.length > 5
}

function emptyFunction() {
	return true;
}

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 isPhonePattern(formField) {
	var pattern = pattern || formField.getAttribute('pattern');
	var regExp = new RegExp("^\\d+$","");
	var stripped = formField.value.replace(/[\(\)\-\ ]/g, '');
	var correct = regExp.test(stripped);
	if (!correct && formField.getAttribute('patternDesc'))
		correct = formField.getAttribute('patternDesc');
	return correct;
}

function isPhone(formField) {
	if (isRequired(formField))
		return isPhonePattern(formField);
	else
		return true;
}

function isPastDate()
{
	return checkDate();
}

function isCheckPhone(formField)
{
	var x = document.forms[0].elements;
	var phonetype = formField.name;
	if (phonetype == "TelHome")
	{
		if (!isRequired(x["TelHomeAC"]) && !isRequired(x["TelHome"])){
			return (isRequired(x["MobileProvider"]) || isRequired(x["Mobile"]));
		}
		else
			return true;
	}
	else 
	{
		if (!isRequired(x["MobileProvider"]) && !isRequired(x["Mobile"])){
			return (isRequired(x["TelHomeAC"]) || isRequired(x["TelHome"]));
		}
		else
			return true;
	}
}

function isCheckPhoneAC(formField)
{
	var phoneAC = formField.name;
	if (phoneAC != 'Mobile' && phoneAC != 'AltMobile')
	{
		phoneAC = phoneAC + 'AC';
	}
	else
	{
		phoneAC = phoneAC + 'Provider';
	}
	
	var x = document.forms[0].elements;
	if (isRequired(formField))
	{
		return (isRequired(x[phoneAC]));
	}
	else
	{
		return (!isRequired(x[phoneAC]));
	}
}

function isWordCount(formField)
{
	var temp = new Array();
	temp = formField.value.split(" ");
	if (temp.length > 200)
		return "Total length: " & temp.length & "words. Maximum length 200 words";
	else return true;
}

function isExt(formField)
{
	var matched = 0;
	var ext = new Array('.doc', '.docx', '.ppt', '.pdf', '.zip');
	var x = formField.value.lastIndexOf('.');
	if (x) 
	{
		var current = formField.value.substring(x);
		current = current.toLowerCase();
		for (i=0; i<ext.length; i++)
		{
			if (current==ext[i])
			{
				matched++;
			}
		}
		
		if (matched > 0)
			return true;
		else
			return false;		
	}
	else
		return false;
	
}

/********************* Validation functions end *******************************/

var monthLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

function checkDate()
{
	var ffield = "dateOfVisit_"
	var x = document.forms[0].elements;
	var day = parseInt(x[ffield + "DD"].options[x[ffield + "DD"].selectedIndex].value);
	var month = parseInt(x[ffield + "MM"].options[x[ffield + "MM"].selectedIndex].value);
	var year = parseInt(x[ffield + "YY"].options[x[ffield + "YY"].selectedIndex].value);

	if (!day || !month || !year)
		return false;

	if (year/4 == parseInt(year/4))
		monthLength[1] = 29;

	if (day > monthLength[month-1])
		return false;

	monthLength[1] = 28;

	var now = new Date();
	now = now.getTime(); //NN3

	var dateToCheck = new Date();
	dateToCheck.setYear(year);
	dateToCheck.setMonth(month-1);
	dateToCheck.setDate(day);
	var checkDate = dateToCheck.getTime();

	var futureDate = (now < checkDate);
	var pastDate = (now >= checkDate);

	return pastDate;
}

var W3CDOM = document.createElement && document.getElementsByTagName;

function checkform()
{
	if (!W3CDOM) return;
	var forms = document.forms;
	for (var i=0;i<forms.length;i++) {
		forms[i].onsubmit = validate;
	}
}

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(' ');
		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("Some fields are empty or contain invalid characters.");
		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('div');
	errorMessage.className = 'errmsg';
	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;
}

addEvent(window,'load',checkform);

function addEvent(obj,type,fn)
{
	if (obj.addEventListener)
		obj.addEventListener(type,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent("on"+type,fn);
}

/*********** Wrong Input Alerts *************/
function alertEmail(input){
var inputStr=input.value
if(window.RegExp && inputStr){
	var regstr1 = "(@.*@)|(\\.\\.)|(@\\.)|(\\.@)|(^\\.)"
	var regstr2 = "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"
	var regExp1 = new RegExp(regstr1)
	var regExp2 = new RegExp(regstr2)
	var regExp3 = /[^a-zA-Z0-9\-_.@]/
	if(!(!regExp1.test(inputStr) && regExp2.test(inputStr) && !regExp3.test(inputStr)) || !(inputStr.indexOf("@")>=0)) {alert("Please enter a valid Email Address.");input.value=input.defaultValue;input.focus();return false}; return true
}}

function alertNumber(input){
var inputStr=input.value
if(window.RegExp && inputStr){
	var regExp1 = /[^0-9]/
	if(regExp1.test(inputStr)) {alert("Please ensure that entries are numbers (0-9) only.");input.value=input.defaultValue;input.focus();return false}; return true
}}
