//Written by Steve Pera, 3/7/2005.  University of Nebraska Medical Center
//Last Modified: 10/27/09.
/* Place in form validation function call: 	if(!validateField(parm1,param2,param3,param4))return; 
 Param1 = fieldname (e.g., first_name) 
 Param2 = field label (e.g., First Name)
 param3 = is a response required ('y' or 'n')
 			If 'y' and user does not provide a response, a pop-up will prompt user for input.
 param4 = name of pattern to match, 0 if none (e.g., eMail)
 
 Example: if(!validateField("email,Email,y,eMail"))return false;
 
 If desired, put user-defined field definitions  in validate___.js
 include validateField.js and validate___.js (if exists) on page containing form(s) to be validated.

Usage:
	I. 	 Include this file in <head></head> (<script language="JavaScript" src="http://app1.unmc.edu/common/validateFields.js"></script>)
	II.  Create a validation function in JavaScript
			param4, pattern-matching is done with regular expressions.  
			Each pattern definition also contains a pattern description and an examnple.
			You can add your own definitions.
	III. Call function.  I like to do this in the <form> tag: onsubmit="return validateForm()" 
			Then must use "return false" in the function.  Otherwise just use "return".
	IV.	 The pop-up message is made up of two parts: startOfPhrase + field label (param2).
			Default is "Please provide a response for " + param2, e.g. "Please provide a response for First Name."
			Customize in validateForm() by resetting startOfPhrase, e.g. startOfPhrase = "Please answer "
	V.	 validateField() can validate radio buttons, checkboxes, and select lists.
		 	For select lists, the first option must be a prompt. e.g. <option value=""> - Select one -
	VI.	 validateFields.js contains a function to validate checkbox series (e.g., "select at least 3 of the following...")
			Call checkCheckBoxSeries(minNum,thisCaption,hiddenFieldsYN)
			Before calling it, create a list of fields to check: arrFields = new Array("field1","field2","field3")
			make hiddenFieldsYN 'y' if you use hidden fields with duplicate fieldnames to force the existence of the field
			(radio button or checkbox fields are not passed in form submission if they aren't checked)
	VII. validateFields.js contains a function to validate text series.
		 This is for a series of text fields grouped as one question (e.g., "rank your favorite 3 songs"
		 	Call checkTextSeries(minNum,maxNum,thisCaption)
			Before calling it, create a list of fields to check: arrFields = new Array("field1","field2","field3")
	VIII. validateFields.js contains a function to validate a sum of values, for example, if the total of 5 fields must add up to 100%.
			Call sumFields(desiredValue,thisCaption,percentYN)

		
Example of using validateField():

<head>
	<title>Untitled</title>
	<script language="JavaScript" src="/common/validateFields.js"></script>
	<script language="JavaScript">
	function validateForm(){
		startOfPhrase = "Please answer "
		if(!validateField("age,Age,y,numericOnly"))return false;
		if(!validateField("Contact_Phone,Contact Phone,y,phonePlusParens"))return false;
		if(!validateField("Contact_Email,Contact Email,y,eMail"))return false;
		if(!validateField("City,City,y,0"))return false;
		if(!validateField("State,State,y,alphaTwo"))return false;
		if(!validateField("Zip,Zip,y,zipOrPlus"))return false;
	}
	</script>	
</head>
<body>
<form name="form1" action="youractionfile.cfm" method="post" onsubmit="return validateForm()">
</form>
</body>
*/
var phoneAreaRequired = /^\d{3}-\d{3}-\d{4}$|^\(\d{3}\) \d{3}-\d{4}$|^\(\d{3}\)\d{3}-\d{4}$/; // (###) ###-####
var phoneAreaRequiredExample = "402-123-1234 or (402) 123-1234"
var phoneAreaRequiredPattern = "###-###-#### or (###) ###-####"
var phonePlusArea = /^\d{3}-\d{3}-\d{4}$|^\d{3}-\d{4}$/; // (###) ###-####
var phonePlusAreaExample = "402-123-1234"
var phonePlusAreaPattern = "[###-]###-####"
var phonePlusParens = /^\(\d{3}\) \d{3}-\d{4}$/; // (###) ###-####
var phonePlusParensExample = "(402) 123-1234"
var phonePlusParensPattern = "(###) ###-####"
var phoneLabelPlusParens = /(^[{\w, }]+: \(\d{3}\) \d{3}-\d{4}$)|(^\(\d{3}\) \d{3}-\d{4}$)/; // (###) ###-####
var phoneLabelPlusParensExample = "Office: (402) 123-1234"
var phoneLabelPlusParensPattern = "[label: ](###) ###-####"
//var phone1800PlusParens = /(^\(\d{3}\) \d{3}-\d{4}$)|(^1-\(\d{3}\) \d{3}-\d{4}$)/; // [1](800) ###-####
//var phone1800PlusParensPattern = "[1-](800) ###-####"
//var phone1800LabelPlusParens = /(^[{\w, }]+: \(\d{3}\) \d{3}-\d{4}$)|(^\(\d{3}\) \d{3}-\d{4}$)|(^[{\w, }]+: 1-\(\d{3}\) \d{3}-\d{4}$)|(^1-\(\d{3}\) \d{3}-\d{4}$)/; // (###) ###-####
//var phone1800LabelPlusParensPattern = "[label: ][1-](800) ###-####"
var phoneNoAreaCode = /^\d{3}-\d{4}$/; // ###-####
var phoneNoAreaCodeExample = "123-1234"
var phoneNoAreaCodePattern = "###-####"
var phoneHyphens = /(^\d{3}-\d{4}$)|(^\d{3}-\d{3}-\d{4}$)/; // ###-####
var phoneHyphensExample = "402-123-4567"
var phoneHyphensPattern = "[###-]###-####"
var phone = /(^\d{3}-\d{4}$)|(^\d{3}-\d{3}-\d{4}$)|^\(\d{3}\) \d{3}-\d{4}$|^\(\d{3}\)\d{3}-\d{4}$/;
var phoneExample = "402-123-4567 or  (402) 123-1234 or  (402)123-1234 or 123-1234";
var phonePattern = "";
var digitsFour = /^\d\d\d\d$/; // ####
var digitsFourExample = "2007"
var digitsFourPattern = "####"
var alphaTwo = /^[a-zA-Z]{2}$/; //  AA
var alphaTwoExample = "NE"
var alphaTwoPattern = "AA"
var zipOrPlus = /(^\d{5})$|(^\d{5}-\d{4}$)/; // #####[-####]
var zipOrPlusExample = "12345-1234"
var zipOrPlusPattern = "#####[-####]"
//var eMail = /^[\w-]+[\w.][\w-]+@[\w-]+\.[\w-]+[\w.]+$/ // xxx@xxx.xxx
//var eMail = /^(\w+\.)*\w+@(\w+\.)+[A-Za-z]+$/ // xxx@xxx.xxx
//Page URL: http://www.Regular-Expressions.info/email.html
//Page last updated: 27 January 2008
//Site last updated: 26 April 2009
//Copyright © 2003-2009 Jan Goyvaerts. All rights reserved.
//steve pera added the A-Z's
var eMail = /^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]{2}|com|org|edu|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b$/;
var eMailExample = "'jdoe@unmc.edu'"
var eMailPattern = "[XXX.]XXX@XXX.XXX[.XXX]"
var digitsTwo = /^\d\d$/; // ####
var digitsTwoExample = "12 (Two Digits)"
var digitsTwoPattern = ""
var digitsThree = /^\d\d\d$/; // ####
var digitsThreeExample = "123 (Three Digits)"
var digitsThreePattern = ""
var digitsOneOrTwo = /^\d{1,2}$/;
var digitsOneOrTwoExample = "One or two numerals"
var digitsOneOrTwoPattern = ""
var digitsNullToTwo = /^\d{0,2}$/;
var digitsNullToTwoExample = "One or two numerals or leave blank"
var digitsNullToTwoPattern = ""
var digitsOneToThree = /^\d{1,3}$/;
var digitsOneToThreeExample = "One to three digits"
var digitsOneToThreePattern = ""
var digits50to100 = /^100$|^[5-9]\d$/;
var digits50to100Example = "A number from 50 to 100"
var digits50to100Pattern = ""
var digitsOneOrTwoAndOrDot = /^\d{1,2}\.{0,1}$|^\d{0,2}\.\d{1,2}$/;
var digitsOneOrTwoAndOrDotExample = "12.12"
var digitsOneOrTwoAndOrDotPattern = "[#]#[.#][#]"
var numericOnly = /^[\d]+$/; // ####
var numericOnlyExample = "Use numerals only."
var numericOnlyPattern = "";
var digits0to100 = /^100$|^\d{1,2}$/;
var digits0to100Example = "A number from 0 to 100"
var digits0to100Pattern = ""
var nums_one_to_five = /^[1-5]$|^$/;
var nums_one_to_fiveExample = "A number from 1 to 5"
var nums_one_to_fivePattern = ""
var nums_one_to_three = /^[1-3]$|^$/;
var nums_one_to_threeExample = "A number from 1 to 3"
var nums_one_to_threePattern = ""
var oneLowerAlpha = /[a-z]/
var oneLowerAlphaExample = "Must include at least one lower-case letter."
var oneLowerAlphaPattern = ""
var oneUpperAlpha = /[A-Z]/
var oneUpperAlphaExample = "Must include at least one upper-case letter."
var oneUpperAlphaPattern = ""
var oneNumber = /[0-9]/
var oneNumberExample = "Must include at least one numeral."
var oneNumberPattern = ""
var digitsSevenPlus = /^\w{7,25}$/;
var digitsSevenPlusExample = "Must be at least 7 and no\n more than 25 characters long and\n contain only alphnumerical characters."
var digitsSevenPlusPattern = ""
var digitsEightPlus = /^\w{7,25}$/;
var digitsEightPlusExample = "Must be at least 8 and no\n more than 25 characters long and\n contain only alphnumerical characters."
var digitsEightPlusPattern = ""
var alphanumeric = /^[\w]+$/; // ####
var alphanumericExample = "Use letters, numbers and/or underscores (no spaces)."
var alphanumericPattern = "";
var mmddyyyy = /^(0[1-9]|1[012]|[1-9])[- \/.](0[1-9]|[12][0-9]|3[01]|[1-9])[- \/.]((19|20)\d\d|\d\d)$/;
var mmddyyyyExample = "1/1/2005, 12/12/2005, etc." 
var mmddyyyyPattern = "mm/dd/yyyy"
var cuContactPhone = /^\d{3}[-.]\d{3}[-.]\d{4}$|^\d{3}[-.]\d{4}$/; // (###) ###-####
var cuContactPhoneExample = "402-123-1234";
var cuContactPhonePattern = "[###-]###-####";
var cuCardPhone = /^\d{3}.\d{3}.\d{4}$/; // (###) ###-####
var cuCardPhoneExample = "402.123.1234"
var cuCardPhonePattern = "###.###.####";
//var cuCreditCardNum = /^4\d{15}$/; // (###) ###-####
//var cuCreditCardNumExample = "4444333322221111";
//var cuCreditCardNumPattern = "4###############";
var digitsOnly = /^[\d]+$/; // ####
var digitsOnlyExample = "Numbers Only"
var digitsOnlyPattern = ""
var floatingPoints = /^[\d]+$|^.[\d]+$|^[\d]+.[\d]+$|^[\d]+.$/; // ####
var floatingPointsExample = "Numbers and decimal points only"
var floatingPointsPattern = "###.###"
var noExe = /exe$/
var noExeExample = "No .exe files are allowed."
var noExePattern = ""
var uscurrancy = /^\$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$/
var uscurrancyExample = "Example: 100000 or 100,000 or $100,000.00\n\n(Use only numbers, decimals, commas, and dollar signs.)"
var uscurrancyPattern = ""


// ^ = start string, $ = end string
var myForm = "form1";
var arrFields = new Array("");
var startOfPhrase = "Please provide a response for ";

function nameForm(formName){
	// needed if form is other than "form1"
	myForm = formName;
}
function validateField(thisFieldDef){
	//if(!document[myForm][thisField][0])alert("not");
	//if(document[myForm][thisField][0])alert("is"), ie is array, eg is radio;
	var valParams = thisFieldDef.split(",");
	var thisField = valParams[0];
	var thisFieldValue = this.document[myForm][thisField].value;
	var thisCaption = valParams[1];
	if((document[myForm][thisField].type == "text") || (document[myForm][thisField].type == "textarea")
	||(document[myForm][thisField].type == "file")||(document[myForm][thisField].type == "password")){
		var thisRequiredYN = valParams[2];
		var thisPattern = eval(valParams[3]);
		if((thisRequiredYN == "y") && (thisFieldValue == '')){
			alert(startOfPhrase + thisCaption);
			this.document[myForm][thisField].focus();
			return 0;
		}else if((thisPattern != 0) && (thisFieldValue > '')){
			if(thisFieldValue.match(thisPattern) == null){
				var thisExampleName = valParams[3] + "Example";
				var thisPatternName = valParams[3] + "Pattern";
				var thisPattern = eval(thisPatternName);
				var thisPatternScript = "";
				//If there's a pattern, create a pattern section to the alert.
				if(thisPattern != ""){
					thisPatternScript = 
						"\n\n\n---------------------------------------" +
						"\nPattern for this entry:" +
						"\n " + thisPattern;
					if(thisPattern.indexOf("[") > -1){
						thisPatternScript = thisPatternScript +
						"\n\n[ ] = optional item"
					}
					if(thisPattern.indexOf("A") > -1){
						thisPatternScript = thisPatternScript +
						"\nA  = alpha character"
					}
					if(thisPattern.indexOf("#") > -1){
						thisPatternScript = thisPatternScript +
						"\n#  = numeral"
					}
					if(thisPattern.indexOf("X") > -1){
						thisPatternScript = thisPatternScript +
						"\nX   = alpha-numerical character"
					}
					if(thisPattern.indexOf("?") > -1){
						thisPatternScript = thisPatternScript +
						"\n?   = any character"
					}
				}	
				var mssg = "Follow this example for " + thisCaption + ":" +
					"\n\n " + eval(thisExampleName) + 
					thisPatternScript
				alert(mssg);
				this.document[myForm][thisField].focus();
				return 0;
			}
		}
	}else if(document[myForm][thisField].type == "select-one" || document[myForm][thisField].type == "select-multiple"){
		var thisFLength = document[myForm][thisField].length;
		var isChecked = 'No';
		for (var i2 = 1; i2 < thisFLength; i2++){
			if(document[myForm][thisField][i2].selected == true){isChecked = 'Yes';}
		}
		if(isChecked == 'No'){
			alert(startOfPhrase + thisCaption);
			this.document[myForm][thisField].focus();
			return 0;
		}
	}else{//radio buttons or checkboxes with same name
		var thisFLength = document[myForm][thisField].length;
		var isChecked = 'No';
		for (var i2 = 0; i2 < thisFLength; i2++){
			if(document[myForm][thisField][i2].checked == true){isChecked = 'Yes';}
		}
		if(isChecked == 'No'){
			alert(startOfPhrase + thisCaption);
			this.document[myForm][thisField][0].focus();//focus on first radio button;
			return 0;
		}
	}
	return 1; 
}
//(series of checkboxes.)
//arrFields = new Array("field1","field2","field3")
function checkCheckBoxSeries(minNum,thisCaption,hiddenFieldsYN){
	var thisTotal = 0;
	var firstField = arrFields[0]
	for (var i = 0; i < arrFields.length; i++){
		var thisField = arrFields[i]
		if(hiddenFieldsYN == "y"){
			if(document[myForm][thisField][0].checked == true){thisTotal++;}
		}else{
			if(document[myForm][thisField].checked == true){thisTotal++;}
		}
	}
	if(thisTotal < minNum){
		if(minNum > 1){var ess = "s"}else{var ess = ""}
		var thisMssg = "Please make at least " + minNum + " selection" + ess + " for " + thisCaption;
		alert(thisMssg);
		if(hiddenFieldsYN == "y"){
			this.document[myForm][firstField][0].focus();
		}else{
			this.document[myForm][firstField].focus();
		}
		return 0;
	}else{return 1}
}
function countChecks(mssg,currentField,focusField){
	var numChecked = 0;
	for(var i=0;i<arrDepts.length;i++){
		var thisField = arrDepts[i];
		if(document[myForm][thisField].checked == true){
			numChecked += 1;
		}
	}
	if(numChecked > 8){
		alert(mssg);
		document[myForm][currentField].checked = false;
		this.document[myForm][focusField].focus();
		return 0;
	}
	return 1;
}
function sumFields(desiredValue,thisCaption,percentYN){
//arrFields = new Array("field1","field2","field3");
	var thisSum = 0;
	var firstField = arrFields[0];
	for (var i = 0; i < arrFields.length; i++){
		var thisField = arrFields[i]; 
		thisSum = thisSum + Number(document[myForm][thisField].value);
	}
	if(thisSum != desiredValue){
		if(percentYN == "y"){ var isPercent = "%"}else{var isPercent = ""}
		alert("Your total for " + thisCaption + " does not equal " + desiredValue + isPercent + ".");
		this.document[myForm][firstField].focus();
		return 0;
	}else{return 1;}
}
//(series of text fields grouped as one question.  i.e., must complete n number to be valid.)
//arrFields = new Array("field1","field2","field3");
function checkTextSeries(minNum,maxNum,thisCaption){
	var thisTotal = 0;
	var firstField = arrFields[0]
	if(minNum > 1){var ess = "s"}else{var ess = ""}
	for (var i = 0; i < arrFields.length; i++){
		var thisField = arrFields[i]
		if(document[myForm][thisField].value > ""){thisTotal++;}
	}
	if(thisTotal < minNum){
		if(minNum == maxNum){
			var thisMssg = "Please complete " + minNum + " selection" + ess + " for " + thisCaption + ".";
		}else{
			var thisMssg = "Please complete at least " + minNum + " selection" + ess + " for " + thisCaption + ".";
		}
		alert(thisMssg);
		this.document[myForm][firstField].focus();
		return 0;
	}else if((maxNum > 0) && (thisTotal > maxNum)){
		if(minNum == maxNum){
			var thisMssg = "Please complete " + maxNum + " selection" + ess + " for " + thisCaption + ".";
		}else{
			var thisMssg = "Please complete no more than " + maxNum + " selection" + ess + " for " + thisCaption + ".";
		}
		alert(thisMssg);
		this.document[myForm][firstField].focus();
		return 0;
	}else{return 1}
}
//trimAll was created by ASPDEV.com
function trimAll_vF(sString){
	while (sString.substring(0,1) == ' '){
	sString = sString.substring(1, sString.length);
	}
	while (sString.substring(sString.length-1, sString.length) == ' '){
	sString = sString.substring(0,sString.length-1);
	}
	return sString
}