//Copywright 2007 Michael Kleiman www.dotslashmk.com//
//v1.0//
//12-20-2007//

//START USER SETTINGS//
var errorClass = "error"
var dropdownDefault = ""
var dropdownOther = "other"
var alternate = ""
var alterrorField = "errorfield"
var alterrorGroup = "errorgroup"
var cbradioClass = "nob"
//END USER SETTINGS//


var reqFields=new Array()
var reqSelects=new Array()
var reqMatches=new Array()
var reqGroups=new Array()
var reqEmails=new Array()
var reqPostals=new Array()
var reqPhones=new Array()
var itemCounter=0;
var oneChecked=false;
var country = '';
var invalidField=false;
var invalidSelect=false;
var invalidGroup=false;
var invalidEmail=false;
var invalidPostal=false;
var invalidMatch=false;
var invalidPhone=false;

function addErrorMsg(fieldID,msgType,groupName) {
	if (alternate=='1' && document.getElementById(fieldID).type.indexOf('text')>-1 || alternate=='1' && document.getElementById(fieldID).type.indexOf('password')>-1 || alternate=='1' && document.getElementById(fieldID).type.indexOf('select')>-1) {
  	document.getElementById(fieldID).className=alterrorField
  } else if (alternate=='1' && document.getElementById(fieldID).type.indexOf('radio')>-1 || alternate=='1' && document.getElementById(fieldID).type.indexOf('checkbox')>-1) {
  	document.getElementById('for' + fieldID).className=alterrorGroup
  } else {
  	//ADD AN ERROR MESSAGE TO THE LABEL/CONTAINER DIV FOR THE FORM FIELD/GROUP
  	if (document.getElementById(groupName + 'group')) {
			var ni = document.getElementById(groupName + 'group')
		} else {
			var ni = document.getElementById('for' + fieldID);
		}
		var newdiv = document.createElement('span');
		newdiv.setAttribute('id','error' + fieldID);
		//ADD CLASS FOR IE
	  newdiv.setAttribute('className',errorClass);
	  //ADD CLASS FOR FF
	  newdiv.setAttribute('class',errorClass);
	  newdiv.innerHTML = msgType;
	  ni.appendChild(newdiv);
  }
}

function removeErrorMsg(fieldID,groupName) {
	if (alternate=='1' && document.getElementById(fieldID)) {
		if (document.getElementById(fieldID).className!=cbradioClass) {
  		document.getElementById(fieldID).className=''
  	}
  	if (document.getElementById(fieldID).type.indexOf('radio')>-1 || document.getElementById(fieldID).type.indexOf('checkbox')>-1) {
  		document.getElementById('for' + fieldID).className='';
  	}
  } else {
		//REMOVE THE ERROR MESSAGE FROM THE LABEL/CONTAINER DIV OF THE FIELD/GROUP
		if (document.getElementById(groupName + 'group')) {
			var d = document.getElementById(groupName + 'group')
		} else {
			var d = document.getElementById('for' + fieldID);
		}
		var olddiv = document.getElementById('error' + fieldID);
		if (olddiv) {
	  	d.removeChild(olddiv);
	  }
	}
}

function retrieveErrorMsg(arrayItem) {
	var errorMsg = arrayItem.substr(arrayItem.indexOf('|')+1,arrayItem.length);
	if (errorMsg == '') {
		errorMsg = 'Please complete'
	}
	return errorMsg;
}

function validateFields(formName) {

	var currentForm = formName.name;
	var elem = document.getElementById(currentForm).elements;
	var a = 0
	var b = 0
	var c = 0
	var d = 0
	var e = 0
	var f = 0
	var g = 0

	//BUILD AN ARRAY OF REQUIRED FIELDS
	for ( var i=0, len=elem.length; i<len; ++i ){
		if (elem[i].title.indexOf('required')>-1) {
			if (elem[i].type.indexOf('select')>-1) {
				reqSelects[d]=elem[i]
				d = d + 1
			} else {
				reqFields[a]=elem[i]
				a = a + 1
			}
		}
		if (elem[i].title.indexOf('email')>-1) {
			reqEmails[b]=elem[i]
			b = b + 1
		}
		if (elem[i].title.indexOf('postal')>-1) {
			reqPostals[c]=elem[i]
			c = c + 1
		}
		if (elem[i].title.indexOf('group')>-1) {
			if (elem[i-1].name!=elem[i].name) {
				reqGroups[e]=elem[i]
				e = e + 1
			}
		}
		if (elem[i].title.indexOf('match_')>-1) {
			reqMatches[f]=elem[i]
			f = f + 1
		}
		if (elem[i].title.indexOf('phone')>-1) {
			reqPhones[g]=elem[i]
			g = g + 1
		}
	}


	//LOOP THROUGH TEXT/CHECKBOX FIELDS REQUIRED
	if (reqFields.length) {
		itemCounter = 0
		for ( var i=0, len=reqFields.length; i<len; ++i ){
			validate_required(reqFields[i]);
			if (itemCounter > len-1) {
				invalidField = false
			} else {
				invalidField = true
			}
		}
	}

	//LOOP THROUGH EMAILS REQUIRED
	if (reqEmails.length) {
		itemCounter = 0
		for ( var i=0, len=reqEmails.length; i<len; ++i ){
			validate_email(reqEmails[i]);
			if (itemCounter > len-1) {
				invalidEmail = false
			} else {
				invalidEmail = true
			}
		}
	}

	//LOOP THROUGH POSTAL CODE FIELDS REQUIRED
	if (reqPostals.length) {
		itemCounter = 0
		for ( var i=0, len=reqPostals.length; i<len; ++i ){
			country = reqPostals[i].title.substring(reqPostals[i].title.indexOf('(')+1,reqPostals[i].title.indexOf(')'))
			validate_postal(reqPostals[i],country);
			if (itemCounter > len-1) {
				invalidPostal = false
			} else {
				invalidPostal = true
			}
		}
	}

	//LOOP THROUGH SELECT FIELDS REQUIRED
	if (reqSelects.length) {
		itemCounter = 0
		for ( var i=0, len=reqSelects.length; i<len; ++i ){
			validate_select(reqSelects[i]);
			if (itemCounter > len-1) {
				invalidSelect = false
			} else {
				invalidSelect = true
			}
		}
	}

	//LOOP THROUGH RADIO BUTTONS THAT ARE REQUIRED
	if (reqGroups.length) {
		itemCounter = 0
		for ( var m=0, len=reqGroups.length; m<len; ++m ){
			oneChecked = false;
			validate_group(reqGroups[m]);
			if (itemCounter > len-1) {
				invalidGroup = false
			} else {
				invalidGroup = true
			}
		}
	}

	//CHECK FOR MATCHING FIELDS
	if (reqMatches.length) {
		itemCounter = 0
		var prevObj = '';
		for ( var i=0, len=reqMatches.length; i<len; ++i ){
			if (reqMatches[i-1]) {
				prevObj = reqMatches[i-1]
			}
			validate_match(reqMatches[i],prevObj);
			if (itemCounter > len-2) {
				invalidMatch = false
			} else {
				invalidMatch = true
			}
		}
	}

	//CHECK VALID PHONE NUMBERS
	if (reqPhones.length) {
		itemCounter = 0
		for ( var i=0, len=reqPhones.length; i<len; ++i ){
			country = reqPhones[i].title.substring(reqPhones[i].title.indexOf('(')+1,reqPhones[i].title.indexOf(')'))
			validate_phone(reqPhones[i],country);
			if (itemCounter > len-1) {
				invalidPhone = false
			} else {
				invalidPhone = true
			}
		}
	}

	//DECIDE WHETHER TO SUBMIT THE FORM OR NOT
	//alert(invalidField + ':' + invalidSelect + ':' + invalidMatch + ':' + invalidGroup + ':' + invalidEmail + ':' + invalidPostal + ':' + invalidPhone)
	if (!invalidField && !invalidSelect && !invalidMatch && !invalidGroup && !invalidEmail && !invalidPostal && !invalidPhone) {
		return true;
	} else {
		return false;
	}
}

function checkEmail(obj) {
	//CHECK EMAIL ADDRESS VALIDITY
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(obj.value)){
		return (true)
	}
	return (false)
}

function checkPostal(obj,country) {
	//CHECK POSTAL CODE VALIDITY
	if (country=='UK') {
		if (/[A-Z]{1,2}[0-9]{1,2} ?[0-9][A-Z]{2}/.test(obj.value)){
			return (true)
		}
		return (false)
	} else {
		if (/(^\d{5}$)|(^\D{1}\d{1}\D{1}\s\d{1}\D{1}\d{1}$)/.test(obj.value)){
			return (true)
		}
		return (false)
	}
}

function checkPhone(obj,country) {
	//CHECK PHONE NUMBER VALIDITY
	if (country=='UK') {
		if (/^\d{5} \d{6}$/.test(obj.value)){
			return (true)
		}
		return (false)
	} else {
		if (/\(*(\d{3})\)*[^\d]*(\d{3})[^\d]*(\d{4})/.test(obj.value)){
			return (true)
		}
		return (false)
	}
}

function numeric(e) {
     var k;
     document.all ? k = e.keyCode : k = e.which;
     return ((k > 47 && k < 58) || k == 8 || k == 9);
}

function alpha(e) {
     var k;
     document.all ? k = e.keyCode : k = e.which;
     return ((k > 64 && k < 91) || (k > 96 && k < 123) || k == 8 || k == 9);
}

function validate_required(obj) {
	if (obj.value != "" && obj.type=='text' || obj.value != "" && obj.type=='password') {
		//VALUE WAS NOT BLANK OR CHECKBOX WAS CHECKED
		removeErrorMsg(obj.id)
		itemCounter = itemCounter + 1
	}
	else if (obj.type=='checkbox' && obj.checked) {
		//MANDATORY CHECKBOX IS CHECKED
		removeErrorMsg(obj.id)
		itemCounter = itemCounter + 1
	}
	else
	{
		//VALUE IS BLANK AND MUST HAVE SOME CHARACTER ENTRY SO ADD ERROR MSG
		removeErrorMsg(obj.id)
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		if (itemCounter!=0) {
			itemCounter = itemCounter - 1
		}
	}
}

function validate_email(obj) {
	if (checkEmail (obj)) {
		//THE EMAIL ADDRESS IS VALID SO HIDE ALL ERRORS
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1
	} else if (obj.value == '' && obj.title.indexOf('required')>-1) {
		//THE EMAIL IS BLANK AND IT IS REQUIRED SO VALIDATE
		validate_required(obj);
	} else if (obj.value == '' && obj.title.indexOf('required')==-1) {
		//THE EMAIL IS BLANK AND IT IS NOT REQUIRED
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1
	} else if (obj.value != '' && obj.title.indexOf('required')==-1 && !checkEmail (obj)) {
		//THE EMAIL IS NOT BLANK AND IT IS NOT REQUIRED BUT THE VALUE IS INVALID
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		itemCounter = itemCounter - 1
	} else {
		//THE EMAIL IS NOT VALID SO DISPLAY INVALID MESSAGE
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		if (itemCounter!=0) {
			itemCounter = itemCounter - 1
		}
	}
}

function validate_postal(obj,country) {
	if (checkPostal (obj,country) && obj.value != '') {
		//THE POSTAL CODE IS VALID AND THE ENTRY IS NOT BLANK SO HIDE ALL ERRORS
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1
	} else if (obj.value == '' && obj.title.indexOf('required')>-1) {
		//THE POSTAL CODE IS BLANK AND IT IS REQUIRED SO VALIDATE
		validate_required(obj);
	} else if (obj.value == '' && obj.title.indexOf('required')==-1) {
		//THE POSTAL CODE IS BLANK AND IT IS NOT REQUIRED
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1
	} else if (obj.value != '' && obj.title.indexOf('required')==-1 && !checkPostal (obj,country)) {
		//THE POSTAL IS NOT BLANK AND IT IS NOT REQUIRED BUT THE VALUE IS INVALID
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		itemCounter = itemCounter - 1
	} else {
		//THE POSTAL CODE IS NOT VALID SO DISPLAY INVALID MESSAGE
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		if (itemCounter!=0) {
			itemCounter = itemCounter - 1
		}
	}
}

function validate_select(obj) {
	if (obj.options[obj.selectedIndex].value == dropdownDefault) {
		//SOMETHING OTHER THAN THE DEFAULT MUST BE SELECTED
		removeErrorMsg(obj.id);
		removeErrorMsg(obj.id + 'other');
		addErrorMsg(obj.id,retrieveErrorMsg(obj.title.substring(obj.title.indexOf('|')+1,obj.title.length)));
		if (itemCounter!=0) {
			itemCounter = itemCounter - 1
		}
	} else {
		//CHECK THAT THE OTHER BOX IS FILLED IF OTHER WAS SELECTED
		if (obj.options[obj.selectedIndex].value.toLowerCase() == dropdownOther && document.getElementById(obj.id + 'other').value == "") {
			//THE OTHER BOX IS BLANK WHEN OTHER HAS BEEN SELECTED
			removeErrorMsg(obj.id);
			removeErrorMsg(obj.id + 'other');
			addErrorMsg(obj.id + 'other',retrieveErrorMsg(document.getElementById(obj.id + 'other').alt));
			if (itemCounter!=0) {
				itemCounter = itemCounter - 1
			}
			//break;
		} else {
			//OTHER WAS SELECTED AND A VALUE WAS ENTERED SO ALL IS GOOD, HIDE ALL ERRORS
			removeErrorMsg(obj.id);
			removeErrorMsg(obj.id + 'other');
			itemCounter = itemCounter + 1
			//RESET THE OTHER VALUE TO BLANK IF OTHER WAS NOT SELECTED
			if (obj.options[obj.selectedIndex].value.toLowerCase() != dropdownOther && document.getElementById(obj.id + 'other')) {
				document.getElementById(obj.id + 'other').value = "";
			}
		}
	}
}

function validate_group(obj) {
	for ( var i=0, len=document.getElementsByName(obj.name).length; i<len; ++i ){
		if (i==0) {
			var errorMsgId = document.getElementsByName(obj.name).item(i).id
		}
		if (document.getElementsByName(obj.name).item(i).checked) {
			//ATLEAST ONE ITEM HAS BEEN CHECKED, NOW CHECK IF IT IS AN 'OTHER' ITEM, AND IF THIS ASSOCIATED BOX IS FILLED
			if (document.getElementsByName(obj.name).item(i).value.toLowerCase()== dropdownOther && document.getElementById(obj.name + 'other').value == "") {
				//THE OTHER BOX IS BLANK WHEN OTHER HAS BEEN SELECTED
				removeErrorMsg(errorMsgId,obj.name);
				removeErrorMsg(document.getElementById(obj.name + 'other').id,obj.name);
				addErrorMsg(document.getElementById(obj.name + 'other').id,retrieveErrorMsg(document.getElementById(obj.name + 'other').alt),obj.name);
				if (itemCounter!=0) {
					itemCounter = itemCounter - 1
				}
			} else if (document.getElementsByName(obj.name).item(i).value.toLowerCase()== dropdownOther && document.getElementById(obj.name + 'other').value != "") {
				removeErrorMsg(errorMsgId,obj.name);
				removeErrorMsg(document.getElementById(obj.name + 'other').id,obj.name);
				oneChecked = true;
				itemCounter = itemCounter + 1;
			} else {
				//ALL IS GOOD, ATLEAST ONE RADIO BUTTON WAS CHECKED
				removeErrorMsg(errorMsgId,obj.name);
				if (document.getElementById(obj.name + 'other')) {
					removeErrorMsg(document.getElementById(obj.name + 'other').id,obj.name);
				}
				oneChecked = true;
				itemCounter = itemCounter + 1;
				if (document.getElementById(obj.name + 'other')) {
					if (document.getElementsByName(obj.name).item(i).type=='radio' && document.getElementsByName(obj.name).item(i).value.toLowerCase() != dropdownOther) {
						document.getElementById(obj.name + 'other').value = "";
					}
				}
			}
		} else if (i == len-1 && !oneChecked) {
			//THE END OF THE COLLECTION HAS BEEN REACHED AN NO ITEMS WERE CHECKED, SHOW ERROR
			removeErrorMsg(errorMsgId,obj.name);
			addErrorMsg(errorMsgId,retrieveErrorMsg(obj.alt),obj.name);
			if (itemCounter!=0) {
				itemCounter = itemCounter - 1;
			}
		}
	}
}

function validate_phone(obj,country) {
	if (checkPhone (obj,country) && obj.value != '') {
		//THE PHONE NUMBER IS VALID SO HIDE ALL ERRORS
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1;
	} else if (obj.value == '' && obj.title.indexOf('required')>-1) {
		//THE PHONE NUMBER IS BLANK AND IT IS REQUIRED SO VALIDATE
		validate_required(obj);
	} else if (obj.value == '' && obj.title.indexOf('required')==-1) {
		//THE PHONE NUMBER IS BLANK AND IT IS NOT REQUIRED
		removeErrorMsg(obj.id);
		itemCounter = itemCounter + 1
	} else if (obj.value != '' && obj.title.indexOf('required')==-1 && !checkPhone (obj,country)) {
		//THE PHONE NUMBER IS NOT BLANK AND IT IS NOT REQUIRED BUT THE VALUE IS INVALID
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		itemCounter = itemCounter - 1
	} else {
		//THE PHONE NUMBER IS NOT VALID SO DISPLAY INVALID MESSAGE
		removeErrorMsg(obj.id);
		addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
		if (itemCounter!=0) {
			itemCounter = itemCounter - 1
		}
	}
}

function validate_match(obj,matchobj) {
	//GET IDS FOR MATCHING FIELDS
	var match_a = obj.id
	if (matchobj) {
		var match_b = matchobj.id
	}
	//CHECK THE TWO IDS EXISTS AND THAT THE VALUES MATCH
	if (match_a && match_b) {
		if (document.getElementById(match_a).value != "" && document.getElementById(match_a).value == document.getElementById(match_b).value) {
			//THE TWO VALUES MATCH
			removeErrorMsg(obj.id);
			itemCounter = itemCounter + 2;
		} else {
			//THE VALUES DO NOT MATCH
			removeErrorMsg(obj.id);
			addErrorMsg(obj.id,retrieveErrorMsg(obj.alt));
			if (itemCounter!=0) {
				itemCounter = itemCounter - 1
			}
		}
	}
}