// Global Variables
var hasErrors = false;
var errorMsg = "";
var badFieldFocus = "";

// Global Functions
function trim(str) {
	str = this != window? this : str;
	return str.replace(/^\s+/g, '').replace(/\s+$/g, ''); }
function replaceall(checkMe,toberep,repwith) { 
	var temp = checkMe; 
	var i = temp.indexOf(toberep); 
	while(i > -1){ 
		temp = temp.replace(toberep, repwith); 
		i = temp.indexOf(toberep); } 
	return temp; }
function canAddErrMsg(currentErrMsg, msgToAdd) {
	lcasecurrent = currentErrMsg.toLowerCase();
	lcasenew = msgToAdd.toLowerCase();
	if(lcasecurrent.search(lcasenew) > -1) {
		return false;
	} else {
		return true; } }
function isValidEmail(emailStr) {
	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	if(matchArray==null) { return false; }
	var user=matchArray[1];
	var domain=matchArray[2];
	for(i=0; i<user.length; i++) {
		if(user.charCodeAt(i)>127) {
			return false; } }
	for(i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false; } }
	if(user.match(userPat)==null) { return false; }
	var IPArray=domain.match(ipDomainPat);
	if(IPArray!=null) {
		for(var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false; } }
		return true; }
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for(i=0;i<len;i++) {
		if(domArr[i].search(atomPat)==-1) {
			return false; } }
	if(checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) { return false; }
	if (len<2) { return false; }
	return true; }
function unflagBadField(formObjDom) {
	formObjDom.style.color="";
	formObjDom.style.backgroundColor=""; }
function flagBadField(formObjDom) {
	if(badFieldFocus == "") { badFieldFocus = formObjDom; }
	formObjDom.style.color="#EE3300";
	formObjDom.style.backgroundColor="#FFFFE1"; }
function writeErrorDiv(errMsg) { 
	if(document.getElementById('errorMessages')) {
		replaceReg = /\n\.\s/gi;
		errMsg = errMsg.replace(replaceReg, "</li><li>");
		divDom = document.getElementById('errorMessages');
		divDom.innerHTML = "<ul>"+errMsg+"</ul>"; } }

// Validation Method Functions
function notEmpty(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(formObjHandle.value.length < 1 ) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function maxChars(theform, errMsg, formObj, formObjLen) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(formObjHandle.value.length > formObjLen) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function minChars(theform, errMsg, formObj, formObjLen) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(formObjHandle.value.length < formObjLen) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function exactChars(theform, errMsg, formObj, formObjLen) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(formObjHandle.value.length != formObjLen) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function hasChars(theform, errMsg, formObj, charsToFind) {
	formObjHandle = eval("document."+theform+"."+formObj);
	charsToFind = charsToFind.toLowerCase();
	foundVars = formObjHandle.value.toLowerCase();
	foundVars = charsToFind.search(foundVars);
	if(foundVars < 0) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isAlpha(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	foundVars = formObjHandle.value.search("[^A-Za-z]");
	if(foundVars > -1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isUppercase(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	foundVars = formObjHandle.value.search("[a-z]+");
	if(foundVars > -1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isLowercase(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	foundVars = formObjHandle.value.search("[A-Z]+");
	if(foundVars > -1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isNumeric(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	foundVars = formObjHandle.value.search("[^0-9]");
	if(foundVars > -1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isLessThan(theform, errMsg, formObj, formObjVal) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(parseFloat(formObjHandle.value) > parseFloat(formObjVal) - 1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isGreaterThan(theform, errMsg, formObj, formObjVal) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(parseFloat(formObjHandle.value) < parseFloat(formObjVal) + 1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isEqualTo(theform, errMsg, formObj, formObjVal) {
	formObjHandle = eval("document."+theform+"."+formObj);
	compareVal = formObjHandle.value+'';
	yourVal = formObjVal+'';
	if(compareVal != yourVal) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isEmail(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	if(!isValidEmail(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isZipCode(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /\d{5}(-\d{4})?/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isState(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isPhone(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isTime(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^([1-9]|1[0-2]):[0-5]\d (AM|PM)$/i;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isCurrency(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /\$\d{1,3}(,\d{3})*\.\d{2}/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isIPAddress(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isDate(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^((((0?[13578])|(1[02]))[\/|\-]?((0?[1-9]|[0-2][0-9])|(3[01])))|(((0?[469])|(11))[\/|\-]?((0?[1-9]|[0-2][0-9])|(30)))|(0?[2][\/\-]?(0?[1-9]|[0-2][0-9])))[\/\-]?\d{2,4}$/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isSSN(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	var pattern = /^\d{3}\-\d{2}\-\d{4}$/;
	if(!pattern.test(formObjHandle.value)) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

function isUDF(theform, errMsg, formObj) {
	formObjHandle = eval("document."+theform+"."+formObj);
	foundVars = formObjHandle.value.search("[^0-9]");
	if(foundVars > -1) {
		hasErrors = true;
		flagBadField(formObjHandle);
		if(canAddErrMsg(errorMsg, errMsg)) { errorMsg += "\n. " + errMsg; } } }

// Main Function
function validate(theform) {
	//Clean variables
	hasErrors = false;
	errorMsg = "";
	badFieldFocus = "";
	
	formHandle = eval("document."+theform);
	formObjCount = formHandle.length;
	for(x=0; x<formObjCount; x++) {
		formObjHandle = formHandle[x];
		unflagBadField(formObjHandle);
		functionNames = formObjHandle.getAttribute('functions');
		if(functionNames) {
			errorMessage = formObjHandle.getAttribute('errormsg');
			functionNames = functionNames.replace(/\(/g,"('"+theform+"', '"+errorMessage+"', ");
			//alert('Executing Function Call(s):\n'+functionNames);
			eval(functionNames);
		}
	}

	// Display the error message and stop the form submit
	if(hasErrors) {
		writeErrorDiv(errorMsg);
		alert(errorMsg);
		badFieldFocus.focus();
		return false;
	} else {
		return true; }
}