//Copyright 2003 Mike Farr. No part of this script may be used without express written permission.
function validateForm(whichForm) {
	validContent = true;
	var errorMessage = "The following problems occured with the form:\n";
	var separator = "______________________________________________________________";
	errorMessage += separator + "\n\n";
	for (i=0;i<theFields.length;i++) {
		//the current fields
		currField = eval("document." + whichForm + "." + theFields[i][0]);

		//--------------

		//check which type the field is		
		if (theFields[i][4] == "integer") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\d+$/;
				if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more digit(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][3] + " or less digit(s).\n";
				} else if (!re.exec(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain only digits.\n";
				}
			}
		} else if (theFields[i][4] == "decimal") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^[\d\.]+$/;
				if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more digit(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][3] + " or less digit(s).\n";
				} else if (!re.exec(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain only digits or a period.\n";
				}
			}
		} else if (theFields[i][4] == "money") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\$?\d+(\.\d{2})?$/;
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a valid dollar amount ($123.45).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more digit(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][3] + " or less digit(s).\n";
				}
			}
		} else if (theFields[i][4] == "string") {
			if (theFields[i][5]) {
				if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "binary") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^[true,false,0,1]$/;
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be either true or false.\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "hex") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^#[A-Fa-f0-9]{6}$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a hexidecimail color code (#AF614C).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "email") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^([a-zA-Z0-9_\-])([a-zA-Z0-9_\-\.]*)@(\[((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}|((([a-zA-Z0-9\-]+)\.)+))([a-zA-Z]{2,}|(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\])$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a properly formatted email address (you@yourserver.com).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "username") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^[a-zA-Z0-9_\-]+$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" may only contain letters, numbers, underscores, or dashes.\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "phone") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^1?\s*[-\.]?\s*(\d{3}|\(\s*\d{3}\s*\))\s*[-\.]?\s*\d{3}\s*[-\.]?\s*\d{4}$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a properly formatted phone number (123)-456-7890.\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "zip") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\d{5}(-?\d{4})?$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a 5 or 9 digit zip code (12345-6789).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "date") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\d{1,2}\/|-\d{1,2}\/|-\d{4}$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be in date format (MM/DD/YYYY).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4] == "mysqlDate") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\d{4}-\d{2}|-\d{2}$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be in date format (YYYY-MM-DD).\n";
				}
			}
		} else if (theFields[i][4] == "file") {
			if (theFields[i][5]) {
				if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain the name of a file on your drive.\n";
				}
			}
		} else if (theFields[i][4] == "ssn") {
			if (theFields[i][5] || (!theFields[i][5] && currField.value != "")) {
				re = /^\d{3}[\-\. ]?\d{2}[\-\. ]?\d{4}$/
				if (!re.test(currField.value)) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must be a valid social security number (123-45-6789).\n";
				} else if (currField.value.length < theFields[i][2]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more character(s).\n";
				} else if (currField.value.length > theFields[i][3]) {
					validContent = false;
					errorMessage += "\"" + theFields[i][1] + "\" must contain less than " + theFields[i][3] + " or less character(s).\n";
				}
			}
		} else if (theFields[i][4].indexOf("password-") == 0) {
			var theCompareField = eval("document." + whichForm + "." + theFields[i][4].substring((theFields[i][4].indexOf("(") + 1),theFields[i][4].indexOf(")")));
			if (theFields[i][5] && currField.value.length < theFields[i][2]) {
				validContent = false;
				errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][2] + " or more digit(s).\n";
			} else if (theFields[i][5] && currField.value.length > theFields[i][3]) {
				validContent = false;
				errorMessage += "\"" + theFields[i][1] + "\" must contain " + theFields[i][3] + " or less digit(s).\n";
			}
			if (currField.value != theCompareField.value) {
				validContent = false;
				errorMessage += "Your passwords do not match.\n";	
			}
		} else if (theFields[i][4].indexOf("cc-") == 0) {
			var types = theFields[i][4].substring((theFields[i][4].indexOf("(") + 1),theFields[i][4].indexOf(")")).split("|");
			validCC = false;
			for (j=0;j<types.length;j++) {
				if (types[j] == "visa") {
					// Visa: length 16, prefix 4, dashes optional.
					re = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
				} else if (types[j] == "mc") {
					// Mastercard: length 16, prefix 51-55, dashes optional.
					re = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
				} else if (types[j] == "discover") {
					// Discover: length 16, prefix 6011, dashes optional.
					re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
				} else if (types[j] == "amex") {
					// American Express: length 15, prefix 34 or 37.
					re = /^3[4,7]\d{13}$/;
				} else if (types[j] == "diners") {
					// Diners: length 14, prefix 30, 36, or 38.
					re = /^3[0,6,8]\d{12}$/;
				}
				if (re.test(currField.value)) {
					validCC = true;
				}
			}
			if (validCC) {
				// Checksum ("Mod 10")
				// Add even digits in even length strings or odd digits in odd length strings.
				var checksum = 0;
				var currCcNum = currField.value.replace(/\-/g,"");
				
				for (j=(2-(currCcNum.length % 2)); j<=currCcNum.length; j+=2) {
					checksum += parseInt(currCcNum.charAt(j-1));
				}
				// Analyze odd digits in even length strings or even digits in odd length strings.
				for (j=(currCcNum.length % 2) + 1; j<currCcNum.length; j+=2) {
					var digit = parseInt(currCcNum.charAt(j-1)) * 2;
					if (digit < 10) { 
						checksum += digit; 
					} else { 
						checksum += (digit-9);
					}
				}
				if ((checksum % 10) != 0) {
					validCC = false;
				}			
			}
			if (!validCC) {
				validContent = false;
				errorMessage += "\"" + currField.value + "\" is not a valid credit card number.\n";
			}
		} else if (theFields[i][4] == "checkbox") {
			if (theFields[i][5] && !currField.checked) {
				validContent = false;
				errorMessage += "\"" + theFields[i][1] + "\" must be checked.\n";
			}
		} 
	}
	errorMessage += separator;
	if (!validContent) alert(errorMessage);
	return validContent;
}
