// VALIDATION CHECK SCRIPT
// ------------------------------------------
// WRITTEN BY Todd O'Bryan and Frank Garofalo
// duPont Manual High School dupontmanual.com
// ------------------------------------------

// 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);				
			} 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.");
				} else if (num.charAt(3) == "0" || num.charAt(3) == "1") {
					alert("Phone numbers don't start with 0 or 1.");
				}
				field.value = toPhoneNumber(field.value);
			} else {
				alert("Please enter a valid phone number.");
			}
			setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
		}
	}
}

// --------------------------------
// START SOCIAL SECURITY VALIDATION
// --------------------------------

function isSocialSecurity(s) {
	var num = toDigits(s);
	return ((num.length == 9));
}

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


function checkSocialSecurity(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isSocialSecurity(field.value)) {
			field.value = toSocialSecurity(field.value);
		} else {
			alert("Please enter a valid Social Security Number.");
			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);
		}
	}
}

// -----------------------------------
// 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);
	}
}

// --------------------------
// 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 HOMEROOM VALIDATION
// --------------------------

function isHomeroomCapitalized(s) {
	return (isUpperCaseLetter(s.substring(0,4)));
}

function isValidHomeroom(field) {
	if (field.value.length == 3) {
		return isInHomeroom(field.value);
	} else {
		return false;
	}
}

function isInHomeroom(s) {
	var homerooms = [ "9A", "9B", "9C", "9D", "9E", "9F", "9G", "9H", "9I", "9J", "9K", "9L", "9M", "9N", "9O", "9P", "9Q", "9R", "10A", "10B", "10C", "10D", "10E", "10F", "10G", "10H", "10I", "10J", "10K", "10L", "10M", "10N", "10O", "10P", "10Q", "10R", "11A", "11B", "11C", "11D", "11E", "11F", "11G", "11H", "11I", "11J", "11K", "11L", "11M", "11N", "11O", "11P", "11Q", "11R", "12A", "12B", "12C", "12D", "12E", "12F", "12G", "12H", "12I", "12J", "12K", "12L", "12M", "12N", "12O", "12P", "12Q", "12R", "15A", "15B", "15C", "15D", "15E", "15F", "15G", "15H", "15I", "15J", "15K", "15L", "15M", "15N", "15O", "15P", "15Q", "15R" ];
	var l = 0; // left boundary to search
	var r = 90; // right boundary to search
	var midpoint;
	while (l <= r) {
		midpoint = Math.floor((l + r) / 2);
		if (homerooms[midpoint] == s) {
			return true;
		} else if (s > homerooms[midpoint]) {
			l = midpoint + 1;
		} else {
			r = midpoint - 1;
		}
	}
	return false;
}

function checkHomeroom(field) {
	field.value = trim(field.value);
	if (isEmpty(field.value)) {
		return;
	} else {
		field.value = field.value.toUpperCase();
		if (isValidHomeroom(field)) {
			return true;
		} else {
			alert("Please enter a valid Grade & Homeroom Number.");
		}
		setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
	}
}

// ---------------------
// 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);
		} 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);
			}
		}
	}
}


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

function checkMName(field) {
	checkName(field);
	if (field.value.length == 1) {
		if (! confirm("You only entered one letter. Is this your whole middle name?")) {
			setTimeout("doSelection(document.forms['" + field.form.name + "'].elements['" + field.name + "'])", 0);
		}
	}
}

// -----------------------------------
// START DATE OF BIRTH VALIDATION
// -----------------------------------

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

function toDate(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 checkDate(field) {
	if (isEmpty(field.value)) {
		return;
	} else {
		if (isDate(field.value)) {
			field.value = toDate(field.value);
		} else {
			alert("Please enter a valid Year (ie. 1985 or 2004)");
			setTimeout("doSelection(document.forms['" + field.form.name + 
			"'].elements['" + field.name + "'])", 0);
		}
	}
}
