var mode = 0
if (mode > 0){
	var allowEscape = true;
	var alertOnInvalidNames = false
	var alertOnInvalidGroupNames = true
};
var submitDataType = "1"

function ValidateByName(thisForm) {
	var groups = new Array();
	var groupsCount = 0;
	var groupMembersCount = 0;
	var curGroupName = "";
	
	for (j=0; j<thisForm.elements.length; j++) {
		var curElement = thisForm.elements[j];
		if (allowEscape && curElement.value=="escape") return true;
		var namePieces = curElement.name.split(":");
		if (!(namePieces.length>=4)){
			if (!alertOnInvalidNames) continue;
			else {
				alert("Form element #"+j+" ("+curElement.name+") has an invalid name syntax for auto validation.");
				return false;
			}
		}
		var validationOn = namePieces[namePieces.length-1]>0;
		if (validationOn){

			if (namePieces.length == 6){
				var curGroupPieces = namePieces[4].split("_")
				if (curGroupName == ""){
					groups[groupsCount] = new Array();
					groups[groupsCount][groupMembersCount] = curGroupPieces;
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = curElement.name
					curGroupName = groups[groupsCount][groupMembersCount][0];
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = getFriendlyName(curElement)
				}else if(curGroupPieces[0] == curGroupName){
					groupMembersCount = groupMembersCount + 1;
					groups[groupsCount][groupMembersCount] = curGroupPieces;
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = curElement.name
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = getFriendlyName(curElement)
				}else{
					groupsCount = groupsCount + 1;
					groupMembersCount = 0;
					groups[groupsCount] = new Array();
					groups[groupsCount][groupMembersCount] = curGroupPieces;
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = curElement.name
					curGroupName = groups[groupsCount][groupMembersCount][0];
					groups[groupsCount][groupMembersCount][curGroupPieces.length] = getFriendlyName(curElement)
				}
			}
			var isValid = true;
			switch(curElement.type){
				case "password" :
				case "text" :
				case "textarea" :
					isValid = ValidateText(curElement,thisForm);
					break;
				case "select-one" :
					isValid = ValidateSelectSingle(curElement);
					break;
				case "select-multiple" :
					isValid = ValidateSelectMultiple(curElement);
					break;
				case "checkbox" :
					isValid = ValidateCheckbox(curElement, j);
					break;
				case "radio" :
					isValid = ValidateRadio(curElement, j);
					break;
			}
			if (!isValid){
				checkboxesChecked = new Array();
				radiosChecked = new Array();
				return false;
			}
		}
	}
	if (groups.length > 0){
		isValid = validateGroups(thisForm,groups);
	}
	if (!isValid){
		return false;
	}

	for (j=0; j<thisForm.elements.length; j++) {
		var curElement = thisForm.elements[j];
		var namePieces = curElement.name.split(":");
		switch(submitDataType){
			case "1" :
				curElement.name = namePieces[0];
				break;
			case "2" :
				curElement.name = namePieces[1];
				break;
		}
	}
	if (mode==2){
	}
	return true;
}

function ValidateText(curElement,thisForm){
	var iValue;
	var namePieces = curElement.name.split(":");
	var friendlyName = namePieces[1].replace(/_/g," ");
	var options = namePieces[3].split("_");
	var validationStatus = 1*namePieces[namePieces.length-1];
	var NameToCheck = curElement.name;
	var errorMsg;
	
	var valueToCheck = curElement.value;
	if (valueToCheck.length > 0) valueToCheck = valueToCheck.replace(/^\s+/gi,"");
	if (valueToCheck.length > 0) valueToCheck = valueToCheck.replace(/\s+$/gi,"");
	if (validationStatus==1 && (valueToCheck.length==0 || valueToCheck=="")) return true;
	if (validationStatus==2 && (valueToCheck.length==0 || valueToCheck=="")) errorMsg = "'"+friendlyName + "' is a required field.";
	else {
		var validationType = namePieces[2].toLowerCase();
		
		if (validationType == "credit"){
			var someInt = valueToCheck*1;
			ccTypeBox = thisForm.elements[j-options[0]].name
			ccType = thisForm[ccTypeBox].options[thisForm[ccTypeBox].selectedIndex].value;
			firstN = valueToCheck.substr(0,1)
			valueToCheckLength= valueToCheck.length;
			amixCC = 3
			errorMsg = "";
		
			if (isNaN(someInt) || someInt%1!=0) errorMsg = "'"+friendlyName+"' must be a whole number.";
			else if(valueToCheckLength < 15 || valueToCheckLength>16) errorMsg = "'"+friendlyName+"' must be at least 15 digits and no more than 16.";
			else if(valueToCheckLength==15 && ccType != amixCC) errorMsg="Credit Card Type does not match Credit Card Number.";
			else if(valueToCheckLength==16 && ccType != firstN) errorMsg="Credit Card Type does not match Credit Card Number.";
		
		}
		
		
		if (validationType == "text") {

		}
		
		if (validationType == "address") {
			
		}
		
		if (validationType == "textarea") {

			if(options[0] != ""){
				return CheckDataLengthInTextArea(options[0],curElement,friendlyName);
			}
		}
		
		if (validationType == "state") {
			var someState = /a[lkszr]|c[aot]|d[ec]|f[ml]|g[au]|hi|i[dlna]|k[sy]|la|m[ehdainsotp]|n[evhjmycd]|o[hkr]|p[war]|ri|s[cd]|t[nx]|ut|v[tia]|w[aviy]/i;
			var matchUp = valueToCheck.match(someState);
			if (valueToCheck != matchUp) errorMsg = "'"+friendlyName+"' must be a valid abbreviation, e.g. 'PA' or 'NY'.";
		}
		
		if (validationType == "zip") {
			var someZip = /\d{5}(-\d{4})?/;
			var matchUp = valueToCheck.match(someZip);
			if (matchUp) matchUp = matchUp[0];
			if (valueToCheck != matchUp) errorMsg = "'"+friendlyName+"' must be a valid zip code, i.e. '55555' or '55555-4444'.";
		}
		
		if (validationType == "phone") {
			var somePhoneNum = /(\(\d{3}\)|\d{3}[-. ])\d{3}[-. ]\d{4}/;
			var matchUpPhone = valueToCheck.match(somePhoneNum);
			if (matchUpPhone) matchUpPhone = matchUpPhone[0];
			if (valueToCheck != matchUpPhone) errorMsg = "'"+friendlyName+"' must be a phone number with area code, e.g. '312-465-8790' or '(312)465-8790'.";
		}

		if (validationType == "gate") {
			var whiteSpace = /\s/;
//			var someEmail = /[^@ \/:;,]+@[^@ \/:;,]+\.[^@. \/:;,]+/;
			var someEmail = /^[a-z,\d]+/gi;
			var sCurValue = curElement.value;
			var matchUp = valueToCheck.match(someEmail);
			if (valueToCheck != matchUp){
				errorMsg = "Please enter a valid Company Site. ex:DPT";
			}else{
				if ((sCurValue.charAt(0) == " ") || (sCurValue.charAt(sCurValue.length-1) == " ")) errorMsg = "'"+friendlyName+"' may not contain leading or trailing spaces";
			}
		}
		
		if (validationType == "email") {
			var whiteSpace = /\s/;
			var someEmail = /[^@ \/:;,]+@[^@ \/:;,]+\.[^@. \/:;,]+/;
			var sCurValue = curElement.value;
			var matchUp = valueToCheck.match(someEmail);
			if (valueToCheck != matchUp){
				errorMsg = "Please enter a valid Email Address.";
			}else{
				if ((sCurValue.charAt(0) == " ") || (sCurValue.charAt(sCurValue.length-1) == " ")) errorMsg = "'"+friendlyName+"' may not contain leading or trailing spaces";
			}
		}
		
		if (validationType == "date") {
			var matchUp1 = valueToCheck.match(/\d{4}-\d{1,2}-\d{1,2}/);
			var matchUp2 = valueToCheck.match(/\d{1,2}\/\d{1,2}\/\d{4}/);
			var badFormat = false;
			var min;
			var max;
			if (options[0] && options[0].length>0) min = 1*options[0];
			if (options[1] && options[1].length>0) max = 1*options[1];
			if (valueToCheck!=matchUp1 && valueToCheck!=matchUp2) badFormat = true;
			var year,month,day;
			if (!badFormat) {
				var datePieces = valueToCheck.split(/[-\/]/);
				if (valueToCheck==matchUp1){
					year = datePieces[0]*1;
					month = datePieces[1]*1;
					day = datePieces[2]*1;
				} else {
					month = datePieces[0]*1;
					day = datePieces[1]*1;
					year = datePieces[2]*1;
				}
				if (isNaN(year) || isNaN(month) || isNaN(day)) badFormat = true;
			}
			if (!badFormat){
				if (month<1 || month>12) badFormat = true;
				if (day<1) badFormat = true;
				if (day>31) badFormat = true;
				if (day>30 && (month==4 || month==6 || month==9 || month==11)) badFormat = true;
				if ((day>28 && month==2 & year%4!=0) || (day>29 && month==2 && year%4==0)) badFormat = true;
			}
			if (!badFormat){
				if (!isNaN(min) && year<min) errorMsg = "The date for '"+friendlyName+"' must not be before 01-Jan-"+min+".";
				if (!isNaN(max) && year>max) errorMsg = "The date for '"+friendlyName+"' must not be after 31-Dec-"+max+".";
			}
			if (badFormat) errorMsg = "Please enter a valid date format (MM/DD/YYYY or YYYY-MM-DD) for '"+friendlyName+"'.";
		}
		
		if (validationType == "recentyr") {
			validationType = "year";
			var now = new Date();
			options = new Array(now.getFullYear()-4,now.getFullYear()+10);
		}
		
		if (validationType == "year") {
			var someYear = valueToCheck*1;
			var min;
			var max;
			if (options[0] && options[0].length>0) min = 1*options[0];
			if (options[1] && options[1].length>0) max = 1*options[1];
			if (!isNaN(min) && someYear<min) errorMsg = "The year for '"+friendlyName+"' may not be before "+min+".";
			if (!isNaN(max) && someYear>max) errorMsg = "The year for '"+friendlyName+"' may not be after "+max+".";
			if (isNaN(someYear) || someYear%1!=0 ){
				errorMsg = "'"+friendlyName+"' must be a year";
				if (!isNaN(min) || !isNaN(max)){
					errorMsg += " (";
					if (!isNaN(min)){
						errorMsg += "after "+(min-1);
						if (!isNaN(max)) errorMsg += " and ";
					}
					if (!isNaN(max)) errorMsg += "before "+(max+1);
					errorMsg += ")";
				}
				errorMsg += ".";
			}
		}
		
		if (validationType=="integer") {
			var lcase = valueToCheck.toLowerCase();
			valueToCheck = valueToCheck.replace(/[,\s]/g,"");
			var min;
			var max;
			if (options[0] && options[0].length>0) min = 1*options[0];
			if (options[1] && options[1].length>0) max = 1*options[1];
			if (lcase=="not applicable" || lcase=="n/a" || lcase=="na") return true;
			var someInt = valueToCheck*1;
			errorMsg = "";
			if (isNaN(someInt) || someInt%1!=0) errorMsg = "'"+friendlyName+"' must be a whole number.";
			else if (!isNaN(min) && someInt<min) errorMsg = "'"+friendlyName+"' must be no less than "+min+".";
			else if (!isNaN(max) && someInt>max && max!=min) errorMsg = "'"+friendlyName+"' must be no greater than "+max+".";
			if (errorMsg.length <= 0){
				curElement.value = someInt;
			}
			
		}
		
		if (validationType == "float") {
			var lcase = valueToCheck.toLowerCase();
			valueToCheck = valueToCheck.replace(/[,\s]/g,"");
			var min;
			var max;
			if (options[0] && options[0].length>0) min = 1*options[0];
			if (options[1] && options[1].length>0) max = 1*options[1];
			if (lcase=="not applicable" || lcase=="n/a" || lcase=="na") return true;
			var someFloat = valueToCheck*1;
			if (isNaN(someFloat)) errorMsg = "'"+friendlyName+"' must be a number.";
			else if (!isNaN(min) && someFloat<min) errorMsg = "'"+friendlyName+"' must be no less than "+min+".";
			else if (!isNaN(max) && someFloat>max && max!=min) errorMsg = "'"+friendlyName+"' must be no greater than "+max+".";
		}
		
		if (validationType == "intrange") {
			valueToCheck = valueToCheck.replace(/[,\s]/g,"");
				if (valueToCheck.indexOf("-") >=0) {
					var matchUp = valueToCheck.match(/\d+-\d+/);
				}
				else {
					var matchUp = valueToCheck.match(/\d+/);
				}
			if (valueToCheck != matchUp) errorMsg = "'"+friendlyName+"' must be an integer, e.g. 10, or a range of integers, e.g. 10-60.";
		}
		
		if (validationType == "floatrange") {
			valueToCheck = valueToCheck.replace(/[,\s]+/g,"");
				if (valueToCheck.indexOf("-") >=0) {
					var matchUp = valueToCheck.match(/[\d]*[.]?[\d]+-[\d]*[.]?[\d]+/);
				}
				else {
					var matchUp = valueToCheck.match(/[\d]*[.]?[\d]*/);
				}
			if (valueToCheck != matchUp){
				errorMsg = "'"+friendlyName+"' must be a float, e.g. 10 or 10.1, or a range of floats, e.g. 10-60 or 10.1-60.1.";
			}
			else{
				iValue = ""
				rangePiece = valueToCheck.split("-")
				iRange0=rangePiece[0]-0
				iRange1=rangePiece[1]-0
				if(iRange0 >= iRange1){
					errorMsg = "The upper limit of the Loan Fees range must be greater than the lower limit."
				}
				if((iRange0 > 100) || (iRange1 > 100)){
					errorMsg = "The Loan Fees should not be greater than 100."
				}
				for (z=0; z<rangePiece.length; z++){
					if (rangePiece[z].charAt(0) == "."){
						rangePiece[z] = "0" + rangePiece[z]
					}
					else{
						if (!(rangePiece[z].indexOf(".") >= 0)){
							rangePiece[z] = rangePiece[z] + ".0"
						}
					}
				}
				if (rangePiece.length == 2){
					iValue = rangePiece[0] + "-" + rangePiece[1]
				}
				else{
					iValue = rangePiece[0]
				}
				if (!errorMsg) curElement.value = iValue
			}
		}
		
		if (validationType == "yesno") {
			var someYorN = /yes|no|y|n/i;
			var matchUp = valueToCheck.match(someYorN);
			if (valueToCheck != matchUp) errorMsg = "'"+friendlyName+"' requires a response of 'Y' or 'N' (or 'yes' or 'no').";
		}
		
		if (validationType == "region") {
			
			
			
			
		}
		
		if (validationType == "statelist") {
			var fixedStateList = "";
			var allStates = /(a[lkszr]|c[aot]|d[ec]|f[ml]|g[au]|hi|i[dlna]|k[sy]|la|m[ehdainsotp]|n[evhjmycd]|o[hkr]|p[war]|ri|s[cd]|t[nx]|ut|v[tia]|w[aviy])/i;
			condensedValue = valueToCheck.replace(/[,\s]/g,"");
			if (condensedValue.length%2 != 0) errorMsg = "Please enter a valid list of state abbreviations, e.g. 'PA, NY, CA'.";
			for (i=0; i<condensedValue.length; i+=2) {
				curPair = condensedValue.substring(i,i+2);
				curMatch = curPair.match(allStates);
				if (curMatch) curMatch = curMatch[0];
				if (curPair!=curMatch) errorMsg = "Please enter a valid list of state abbreviations, e.g. 'PA, NY, CA'.";
			}
		}
		
		if (validationType == "currency") {
			var condensedValue = valueToCheck.replace(/[$,\s]/g,"");			
			var someCurrency = /-?\d*(\.\d{2})?/;
			var matchup = condensedValue.match(someCurrency);
			matchup = matchup[0];
			//alert(condensedValue)
			if (condensedValue != matchup || isNaN(condensedValue) || condensedValue == '') errorMsg = "'"+friendlyName+"' must be a currency amount, e.g. '$1,000,000' or '53.07'";
		}

		if (validationType == "password") {
			var whiteSpace = /[^\s]+/;
			var password = curElement.value
			var matchUp = password.match(whiteSpace);
			if (options[0] && options[0].length>0) min = 1*options[0];
			someInt = password.length;
			if (password != matchUp) errorMsg = "'"+friendlyName+"' may not contain spaces.";
			else if (!isNaN(min) && someInt<min) errorMsg = "'"+friendlyName+"' must be no less than "+min+".";

		}

	}
	if (errorMsg){
		alert(errorMsg);
		curElement.focus();
		curElement.select();
		return false;
	} else return true;
}

function ValidateSelectSingle(curElement){
	var namePieces = curElement.name.split(":");
	var friendlyName = namePieces[1].replace(/_/g," ");
	var unselectableValue=namePieces[3];
	valueToCheck = curElement.options[curElement.selectedIndex].value;
	if (valueToCheck == unselectableValue) {
		alert("'"+friendlyName+"' is required.");
		curElement.focus();
		return false;
	}	else return true;
}

function ValidateSelectMultiple(curElement){
	var namePieces = curElement.name.split(":");
	var friendlyName = namePieces[1].replace(/_/g," ");
	var options = namePieces[3].split("_");
	var min;
	var max;
	if (options[0] && options[0].length>0) min = 1*options[0];
	if (options[1] && options[1].length>0) max = 1*options[1];
	var optionsSelected = 0;
	for(i=0; i<curElement.options.length; i++) if (curElement.options[i].selected == true) optionsSelected++;
	if (optionsSelected<min || (max>min && optionsSelected>max)) {
		var errorMsg = "You must select";
		var lastNumber;
		if (min>0){
			errorMsg += " at least "+min;
			lastNumber = min;
			if (max>min) errorMsg += " and";
		}
		if (max>min){
			errorMsg += " no more than "+max;
			lastNumber = max;
		}
		errorMsg += (" item" + (lastNumber!=1?"s":"") + " from '"+friendlyName+"'.");
		alert(errorMsg);
		curElement.focus();
		return false;
	} else return true;
}
var checkboxesChecked = new Array();

function ValidateCheckbox(curElement, curIndex){
	var thisForm = curElement.form;
	var masterName = curElement.name;
	var numberChecked = 0;
	if (checkboxesChecked[masterName]) return true;
	var namePieces = curElement.name.split(":");
	var options = namePieces[3].split("_");
	var friendlyName = namePieces[1].replace(/_/g," ");
	var min;
	var max;
	if (options[0] && options[0].length>0) min = 1*options[0];
	if (options[1] && options[1].length>0) max = 1*options[1];
	
	for (i=curIndex; i<thisForm.elements.length; i++) if (thisForm.elements[i].name==masterName && thisForm.elements[i].checked) numberChecked++;
	checkboxesChecked[masterName] = true;
	var errorMsg;
	if (numberChecked<min) errorMsg = "You must select at least " + min + " checkbox" + ((min>1) ? "es" : "") + " from '"+friendlyName+"'.";
	if (numberChecked>max && max>min) errorMsg = "You may select no more than " + max + " checkbox" + ((max>1) ? "es" : "") + " from '"+friendlyName+"'.";
	if (errorMsg) {
		alert(errorMsg);
		curElement.focus();
		return false;
	} else return true;
}
var radiosChecked = new Array();

function ValidateRadio(curElement, curIndex){
	var thisForm = curElement.form;
	var masterName = curElement.name;
	var numberChecked = 0;
	if (radiosChecked[masterName]) return true;
	var namePieces = curElement.name.split(":");
	var friendlyName = namePieces[1].replace(/_/g," ");
	
	for (i=curIndex; i<thisForm.elements.length; i++) if (thisForm.elements[i].name==masterName && thisForm.elements[i].checked) numberChecked++;
	radiosChecked[masterName] = true;
	if (numberChecked<1){
		alert("Please select a choice for '"+friendlyName+"'.");
		curElement.focus();
		return false;
	} else return true;
}

function validateGroups(groupForm,groups){
var curGroupType
var element1,element2;
var compareValue1,compareValue2;
var doComparison = true
	for (i=0; i<groups.length; i++){
		if (groups[i].length > 1){
			curGroupType = groups[i][0][1]
			if(curGroupType == "equal"){	
				curGroup = groups[i]
			}else{							
				var curGroup = new Array();
				var curGroupIndex;
				for (l=0; l<groups[i].length; l++){
					curGroupIndex = groups[i][l][2];
					curGroup[curGroupIndex] = groups[i][l];
				}
			}
			for (l=1; l<curGroup.length; l++){
				element1 = groupForm.elements[curGroup[l-1][curGroup[l-1].length-2]];

				if ((getRequired(element1) != "2") && (element1.value == "")){
					continue;					
				}
				
				
				for (m=l; m<curGroup.length; m++){
					element2 = groupForm.elements[curGroup[m][curGroup[m].length-2]];
					if ((getRequired(element2) != "2") && (element2.value == "")){
						if (m == curGroup.length-1){
							doComparison = false;
						}
						continue;					
					}else{
						break;
					}
				}
				l=m;



				if (alertOnInvalidGroupNames){
					if (getDataType(element1) != getDataType(element2))
						alert("Invalid element name encoding!\r\r'" + getFriendlyName(element1) + "' and '" + getFriendlyName(element2) + "' data types ('" + getDataType(element1) + "'/'" + getDataType(element2) + "') must be equal for a valid value comparison.");
				}
				if (doComparison){
					compareValue1 = element1.value;
					compareValue2 = element2.value;
					if (getDataType(element1) == "date"){
						compareValue1 = new Date(compareValue1);
						compareValue2 = new Date(compareValue2);
						compareValue1 = compareValue1.valueOf()
						compareValue2 = compareValue2.valueOf()
					}
					switch(curGroupType){
						case "equal" :
							curComparison = (compareValue1 == compareValue2);
							break;
						case "order" :
							curComparison = (compareValue1 < compareValue2);
							break;
					}
					if (!curComparison){
						switch(curGroupType){
							case "equal" :
								groupElementNames = new Array;
								var alertMessage = "'" + curGroup[0][3] + "'";
								var m2=1;
								for (m=1; m<curGroup.length-1; m++){
									alertMessage = alertMessage + ", '" + curGroup[m][3] + "'";
									m2++;
								}
								alertMessage = alertMessage + " and '" + curGroup[m2][3] + "'";
								if ((getDataType(element1) == "currency") || (getDataType(element1) == "integer") || (getDataType(element1) == "float") || (getDataType(element1) == "intrange")) {
									alertMessage = alertMessage + " must be equal.";
								}else{
									alertMessage = alertMessage + " must be the same.";
								}
							break;
						case "order" :
							if ((getDataType(element1) == "date") || (getDataType(element1) == "year") || (getDataType(element1) == "recentyr")){
								alertMessage = "'" + getFriendlyName(element2) + "' must be after '" + getFriendlyName(element1) + "'";
							}else{
								alertMessage = "'" + getFriendlyName(element2) + "' must be greater than '" + getFriendlyName(element1) + "'";
							}
							break;
						}
						alert(alertMessage)
						element2.focus();
						element2.select();
						return false;
					}
				}
			}
		}
	}
	return true;
}

function getFriendlyName(curNameElement){
	var curNameElementPieces = curNameElement.name.split(":");
	var friendlyName = curNameElementPieces[1].replace(/_/g," ");
	return friendlyName;
}

function getDataType(curNameElement){
	var curNameElementPieces = curNameElement.name.split(":");
	var dataType = curNameElementPieces[2];
	return dataType;
}

function getRequired(curNameElement){
	var curNameElementPieces = curNameElement.name.split(":");
	var requireValue = curNameElementPieces[curNameElementPieces.length-1];
	return requireValue;
}
function CheckDataLengthInTextArea(maxchars,objTA,ValidationName) {
if(objTA.value.length > maxchars) {
  alert('The ' + ValidationName + ' text box has a limit of ' + maxchars +' characters. Please remove '+
   (objTA.value.length - maxchars)+ ' characters from the ' + ValidationName + ' text.');
   objTA.focus();
   return false; }
else
  return true; }

