// VALIDATION CHECK SCRIPT


// BASIC FIELD VALUE CHECK
function isIn(sub, s) {
	// checks whether the substring sub is in string
	return (s.indexOf(sub) != -1);
}

function doSelection(field) {
	field.focus();
	field.select();
}

function isEmpty(s) {
	return (trim(s).length == 0);
}

// -------------
// NUMERIC CHECK
// -------------
function isDigit(c) {
	if (c.length == 1) {
		return isIn(c, "0123456789");
	} else {
		return false;
	}
}

function toDigits(s) {
	var retVal = "";
	var c;
	for (i=0; i<s.length; i++) {
		c = s.charAt(i);
		if (isDigit(c)) {
			retVal += c;
		}
	}
	return retVal;
}

// --------------
// ALPHABET CHECK
// --------------

function isLetter(c) {
	if (c.length == 1) {
		return isIn(c, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
	} else {
		return false;
	}
}

function isUpperCaseLetter(c) {
	if (c.length == 1) {
		return isIn(c, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
	} else {
		return false;
	}
}

function isLowerCaseLetter(c) {
	if (c.length == 1) {
		return isIn(c, "abcdefghijklmnopqrstuvwxyz");
	} else {
		return false;
	}
}

// ----------------
// TRIM FIELD VALUE
// ----------------

function trim(s) {
	var retVal = "";
	var first = 0;
	var last = s.length-1;
	while (first < s.length && isIn(s.charAt(first), " \n\r\t")) {
		first++;
	}
	if (first <= last) {
		while (isIn(s.charAt(last), " \n\r\t")) {
			last--;
		}
		if (first <= last) {
			return s.substring(first, last+1);
		} else {
			return "";
		}
	} else {
		return "";
	}
}

// ++++++++++++++++++++++++++++++++++
// BEGIN VALIDATION FUNCTIONS
// ++++++++++++++++++++++++++++++++++

// -----------------------------
// START PHONE NUMBER VALIDATION
// -----------------------------


function isPhoneNumber(s) {
	var num = toDigits(s);
	return ((num.length == 10) && (num.charAt(0) != "0") && (num.charAt(0) != "1") && (num.charAt(3) != "0") && (num.charAt(3) != "1"));
}

function toPhoneNumber(s) {
	// s must be a String with exactly 10 digits
	var x = toDigits(s);
	if (x.length != 10) {
		return "ERROR!";
	} else {
		var retVal = "(" + x.substring(0,3) + ") " + x.substring(3,6);
		retVal += "-" + x.substring(6,10);
		return retVal;
	}
}


function checkPhoneNumber(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isPhoneNumber(field.value)) {
			field.value = toPhoneNumber(field.value);
		} else {
			if (toDigits(field.value).length == 7) {
				alert("Please include the area code.");
				field.value = toPhoneNumber("000" + field.value);
				document.getElementById(field.id).focus();
			} else if (toDigits(field.value).length == 10) {
				//could be valid phone numbers, must be problem with
				//digits
				var num = toDigits(field.value);
				if (num.charAt(0) == "0" || num.charAt(0) == "1") {
					alert("Area codes don't start with 0 or 1.");
					document.getElementById(field.id).focus();
				} else if (num.charAt(3) == "0" || num.charAt(3) == "1") {
					alert("Phone numbers don't start with 0 or 1.");
					document.getElementById(field.id).focus();
				}
				field.value = toPhoneNumber(field.value);
			} else {
				alert("Please enter a valid phone number.");
				document.getElementById(field.id).focus();
			}
			setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
		}
	}
}

// -------------------------
// START ZIP CODE VALIDATION
// -------------------------

function isZip(s) {
	var num = toDigits(s);
	return ((num.length == 5));
}

function toZip(s) {
	// s must be a String with exactly 5 digits
	var x = toDigits(s);
	if (x.length != 5) {
		return "ERROR!";
	} else {
		var retVal = x.substring(0,5);
		return retVal;
	}
}


function checkZip(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isZip(field.value)) {
			field.value = toZip(field.value);
		} else {
			alert("Please enter a valid Zip Code (ie. 40208)");
			setTimeout("doSelection(document.forms['" + field.form.name + 
			"'].elements['" + field.name + "'])", 0);
			document.getElementById(field.id).focus();
		}
	}
}

// -----------------------------------
// START ZIP CODE PLUS FOUR VALIDATION
// -----------------------------------

function isPlusFour(s) {
	var num = toDigits(s);
	return ((num.length == 4));
}

function toPlusFour(s) {
	// s must be a String with exactly 4 digits
	var x = toDigits(s);
	if (x.length != 4) {
		return "ERROR!";
	} else {
		var retVal = x.substring(0,4);
		return retVal;
	}
}


function checkPlusFour(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isPlusFour(field.value)) {
			field.value = toPlusFour(field.value);
		} else {
			alert("Please enter a valid Zip Code Plus Four Code (ie. 40208-xxxx)");
			setTimeout("doSelection(document.forms['" + field.form.name + 
			"'].elements['" + field.name + "'])", 0);
		}
	}
}

// ----------------------
// START EMAIL VALIDATION
// ----------------------

function isValidEmail(field) {
	// email must contain '@' and '.'
	var atMark = field.value.indexOf("@");
	if (atMark != -1 && field.value.indexOf(".", atMark) != -1) {
		return true;
	}
	return false;
}
 
function checkEmail(field) {
	if (! isEmpty(field.value) && ! isValidEmail(field)) {
		alert("Please enter a valid e-mail address - including your ISP.");
		setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
		document.getElementById(field.id).focus();
	}
}

// --------------------------
// START US STATE VALIDATION
// --------------------------

function isStateCapitalized(s) {
	return (isUpperCaseLetter(s.substring(0,3)));
}

function isValidState(field) {
	if (field.value.length == 2) {
		return isInStates(field.value);
	} else {
		return false;
	}
}

function isInStates(s) {
	var states = [ "AK", "AR", "AL", "AZ", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "PR", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY" ];
	var l = 0; // left boundary to search
	var r = 50; // right boundary to search
	var midpoint;
	while (l <= r) {
		midpoint = Math.floor((l + r) / 2);
		if (states[midpoint] == s) {
			return true;
		} else if (s > states[midpoint]) {
			l = midpoint + 1;
		} else {
			r = midpoint - 1;
		}
	}
	return false;
}

function checkState(field) {
	field.value = trim(field.value);
	if (isEmpty(field.value)) {
		return;
	} else {
		field.value = field.value.toUpperCase();
		if (isValidState(field)) {
			return true;
		} else {
			alert("Please enter a valid US State abbreviation.");
		}
		setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
	}
}


// -------------------------
// START CREDIT CARD VALIDATION
// -------------------------

function isCreditCard(s) {
	var num = toDigits(s);
	return ((num.length == 16));
}

function toCreditCard(s) {
	// s must be a String with exactly 16 digits
	var x = toDigits(s);
	if (x.length != 16) {
		return "ERROR!";
	} else {
		var retVal = x.substring(0,16);
		return retVal;
	}
}


function checkCreditCard(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isCreditCard(field.value)) {
			field.value = toCreditCard(field.value);
		} else {
			alert("Please enter a valid Credit Card number");
			setTimeout("doSelection(document.forms['" + field.form.name + 
			"'].elements['" + field.name + "'])", 0);
			document.getElementById(field.id).focus();
		}
	}
}

// ---------------------
// START NAME VALIDATION
// ---------------------

function isNameCapitalized(s) {
	return (isUpperCaseLetter(s.substring(0,1)));
}

function isValidNameEntry(s) {
	for (i=0; i<s.length; i++) {
		if (! isIn(s.substring(i, i+1), " -'") && ! isLetter(s.substring(i, i+1))) {
			return false;
		}
	}
	return true;
}

function checkName(field) {
	field.value = trim(field.value);
	if (isEmpty(field.value)) {
		return;
	} else {
		if (!isNameCapitalized(field.value)) {
			confirm("The name you entered doesn't start with a capital letter. Is this right?");
			setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
			document.getElementById(field.id).focus();
		} else {
			if (isValidNameEntry(field.value)) {
				return
			} else {
				alert("The name you entered contains some strange characters. Only letters, hyphens, and apostrophes are allowed.");
				setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
				document.getElementById(field.id).focus();
			}
		}
	}
}


// -----------------------------------
// START CREDIT CARD EXPERIENCE DATE
// -----------------------------------

function isExpireDate(field) {
	//months in numerical format
	if (field.value.length == 5) {
		if (isMonth(field.value.substring(0,2))) {
			// email must contain '/'
			var atMark = field.value.indexOf("/");
			if (atMark != -1) {
				return ((field.value.length == 5));
			}
		}
	}
	return false;
}

function isMonth(s) {
	var months = [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
	var l = 0; // left boundary to search
	var r = 50; // right boundary to search
	var midpoint;
	while (l <= r) {
		midpoint = Math.floor((l + r) / 2);
		if (months[midpoint] == s) {
			return true;
		} else if (s > months[midpoint]) {
			l = midpoint + 1;
		} else {
			r = midpoint - 1;
		}
	}
	return false;
}

function checkExpireDate(field) {
	if (! isEmpty(field.value) && ! isExpireDate(field)) {
		alert("Please enter a valid expiration date: MM/YY");
		setTimeout("doSelection(document.forms['" + field.form.name + 
		"'].elements['" + field.name + "'])", 0);
	}
}