/*--------------------------------------------------------------------
 FormValidation Script v1.50
 Copyright © Curtis Sund (curtis@igz.net)
 Provides an array with form elements and the type of validation each
 individual one needs.  Does the needed checking.

 Below is the attached javascript file that contains all of the 
 functions called that do the dirty work.  Here is the code that goes 
 in the header of the page:

 <script language="Javascript" src="../javascript/formvalidation.js"></script>
 <script language="Javascript">
   oFields = new Array()
   oFields[0] = new Array("txtFirstName", "first name", "check", "char", "", "", "20", "")
   oFields[1] = new Array("txtMiddlename", "middle name", "nocheck", "char", "", "", "20", "")
   oFields[2] = new Array("txtLastName", "last name", "check", "char", "", "", "20", "")
   oFields[3] = new Array("txtSSN", "social security number", "check", "ssn", "", "", "9", "")
   oFields[4] = new Array("txtPhoneNo", "phone number", "check", "tel", "", "", "", "")
   oFields[5] = new Array("txtAssociateId", "associate id", "nocheck", "common", "", "", "", "")
   oFields[6] = new Array("cboGroupId", "group id", "nocheck", "num", "", "", "", "")
   oFields[7] = new Array("txtAdminPassword", "password", "nocheck", "password", "", "txtVerifyAdminPassword", "", "")
   oFields[8] = new Array("txtVerifyAdminPassword", "retype password", "nocheck", "password", "", "", "", "") 
   oFields[9] = new Array("txtMonth", "month", "check", "num", "month", "", "", "") 
   oFields[10] = new Array("txtDay", "day", "check", "num", "day", "", "", "") 
   oFields[11] = new Array("txtYear", "year", "check", "num", "year", "", "", "") 
 </script>

 oFields[manually incremented #]

 1st Element - Form field name
 2nd Element - User friendly name for this field -- this is used when 
               alerting an error
 3rd Element - Boolean -- check or nocheck -- Determines whether this 
               form field needs to be filled out
 4th Element - Type of data to check for.  The possible types are: num, 
               common, char, password, email, ssn, zip, tel, date
 5th Element - Type of data to check for if it's a date field.  See 
               the examples above for array numbers 13-15.  The actual 
               value will be numeric so we enter num for the 4th 
               element but then we want to make sure that the number 
               they are entering half way resembles a year and isn't 
               simply 9999.  That's what this field does in the array.
 6th Element - Verify password field. This is the verify password field 
               that needs to match the password field.
 7th Element - Specific length of characters for this field. 
 8th Element - Maximum length of characters for this field.
               
 The form needs to call the main function I've created within the JS 
 file like this:
 
 <form NAME="frmQueryUser" ACTION="user.asp" METHOD="post" onSubmit="return checkData(this)">
 </form>
 --------------------------------------------------------------------*/
function checkData(oForm) {
	var x = 0
	var correct = true

	while ((x < oFields.length) && (correct)) { 
		if ((oFields[x][2] == "check") || (oForm.elements[oFields[x][0]].value != "")) {
			if (oForm.elements[oFields[x][0]].value == "") {
				correct = false;
				alert("Please enter the " + oFields[x][1] + " and try again.")
				oForm.elements[oFields[x][0]].focus()
			}
			if ((oFields[x][6] != "") && (correct)) {
				if (oForm.elements[oFields[x][0]].value.length != oFields[x][6]) {
					correct = false;
					alert("Please enter " + oFields[x][6] + " characters into the " + oFields[x][1] + " field and try again.")
					oForm.elements[oFields[x][0]].focus()				
				}
			}
			if ((oFields[x][7] != "") && (correct)) {
				if (oForm.elements[oFields[x][0]].value.length > oFields[x][7]) {
					correct = false;
					alert("You may only use " + oFields[x][7] + " or less characters for " + oFields[x][1] + ".")
					oForm.elements[oFields[x][0]].focus()				
				}
			}
			if ((oFields[x][3] != "") && (correct)) {
				correct = checkChar(oForm.elements[oFields[x][0]], oFields[x][3], oFields[x][1])
			}
			if (oFields[x][4] != "") {
				if ((oFields[x][4] == "day") && (correct)) {
					correct = checkDay(oForm.elements[oFields[x][0]])
				} 
				if ((oFields[x][4] == "month") && (correct)) {
					correct = checkMonth(oForm.elements[oFields[x][0]])
				}
				if ((oFields[x][4] == "year") && (correct)) {
					correct = checkYear(oForm.elements[oFields[x][0]])
				}
			}
			if ((oFields[x][5] != "") && (correct)) {
				if (oForm.elements[oFields[x][0]].value != oForm.elements[oFields[x][5]].value) {
					correct = false;
					alert("Your " + oFields[x][1] + " did not match the confirmation " + oFields[x][1] + ".")
					oForm.elements[oFields[x][0]].focus()
				}
			}
		}
	x++
	}
	return correct
}	

function checkChar(field, type, msg) {
	var privateCorrect = true
	if (type == "num") {
		var temp;
		var valid = "0123456789"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter a numeric value for this field.")
			field.focus()
		}
	} else if (type == "combo") {
		if (field.options[field.selectedIndex].value == 0) {
			privateCorrect = false
			alert("Please select an item from the drop-down menu.")
			field.focus()
		}
	} else if (type == "checkbox") {
		if (!field.checked) {
			privateCorrect = false
			alert("You must " + msg + "")
			field.focus()
		}
	} else if (type == "radio") {
		var temp = 0;
		for (var w = 0; w < field.length; w++) {
			if (field[w].checked) {
				temp = 1;
			}
		}
		if (temp == 0) {
			privateCorrect = false
			alert(msg)
		}
	} else if (type == "common") {
		var temp;
		var valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 _…’`~!@#$%^&*(\"\\\n\r)+-.,?'=<>/{}[];:"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter the correct characters for this field.")
			field.focus()
		}
	} else if (type == "char") {
		var temp;
		var valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ~"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please use only the following characters for this field. ie. A-Za-z0-9 and space")
			field.focus()
		}
	} else if (type == "username") {
		var temp;
		var valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.~"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please use only the following characters for this field. ie. A-Za-z0-9_.~")
			field.focus()
		}
	} else if (type == "password") {
		var temp;
		var valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_`~!@#$%^&*()+-.,?."
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter only password validated characters for this field. ie. A-Za-z0-9_`~!@#$%^&*()+-.,?.")
			field.focus()
		}
	} else if (type == "email") {
		var temp;
		var valid = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@._-'"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter a valid email address for this field.")
			field.focus()
		}
	} else if (type == "ssn") {
		var temp;
		var valid = "0123456789"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter the correct characters for the social security number. Leave out all dashes and spaces.")
			field.focus()
		}
	} else if (type == "zip") {
		var temp;
		var valid = "0123456789-"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter the correct characters for the zip code. Ex. xxxxx or Ex. xxxxx-xxxx")
			field.focus()
		}
	} else if (type == "tel") {
		var temp;
		var valid = "0123456789 -"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (privateCorrect == false) {
			alert("Please enter the correct characters for the phone number. Ex. x-xxx-xxx-xxxx or xxx-xxx-xxxx")
			field.focus()
		}
	} else if (type == "date") {
		var iLowDay = 1
		var iHighDay = 31
		var iLowMonth = 1
		var iHighMonth = 12
		var iLowYear = 1850 
		var iHighYear = 2200 

		var temp;
		var valid = "0123456789/"
		for (var i=0; i<field.value.length; i++) {
			temp = "" + field.value.substring(i, i+1);
			if (valid.indexOf(temp) == "-1") privateCorrect = false;
		}
		if (!field.value == "") {
			if (privateCorrect == true) {
				date = field.value.split(/\//);
				if ((date[1] < iLowDay) || (date[1] > iHighDay)) {
					privateCorrect = false;
					alert("Please enter a day between " + iLowDay + " and " + iHighDay + ".")
					field.focus()
				}
				if ((date[0] < iLowMonth || date[0] > iHighMonth) && (privateCorrect != false)) {
					privateCorrect = false;
					alert("Please enter a month between " + iLowMonth + " and " + iHighMonth + ".")
					field.focus()
				}
				if ((date[2] < iLowYear || date[2] > iHighYear) && (privateCorrect != false)) {
					privateCorrect = false;
					alert("Please enter a year between " + iLowYear + " and " + iHighYear + ".")
					field.focus()
				}
			} else {
				alert("Please enter the correct date format. Ex. mm/dd/yyyy")
				field.focus()
			}
		} else {
			privateCorrect = false;
			alert("Please enter the correct date format. Ex. mm/dd/yyyy")
			field.focus()
		}
	}
	return privateCorrect
}

function checkDay (day) {
	var privateCorrect = true
	var iLowDay = 1
	var iHighDay = 31
	
	if ((day.value < iLowDay) || (day.value > iHighDay)) {
		privateCorrect = false;
		alert("Please enter a day between " + iLowDay + " and " + iHighDay + ".")
		day.focus()
	}
	return privateCorrect
}
function checkMonth (month) {
	var privateCorrect = true
	var iLowMonth = 1
	var iHighMonth = 12
	
	if ((month.value < iLowMonth) || (month.value > iHighMonth)) {
		privateCorrect = false;
		alert("Please enter a month between " + iLowMonth + " and " + iHighMonth + ".")
		month.focus()
	}
	return privateCorrect
}
function checkYear(year) {
	var today = new Date();
	var privateCorrect = true
	var iLowYear = 1850 
	var iHighYear = today.getFullYear() 
	
	if ((year.value.length != 4) && (privateCorrect != false)) {
		privateCorrect = false;
		alert("Please enter a 4 digit year and try again.")
		year.focus()
	}
	if ((year.value < iLowYear || year.value > iHighYear) && (privateCorrect != false)) {
		privateCorrect = false;
		alert("Please enter a year between " + iLowYear + " and " + iHighYear + ".")
		year.focus()
	}
	return privateCorrect
}

