/*
   validation.js
   BY:
        Danny Goodman
   
   DESCRIPTION:
        validations.js is a library of client-side JavaScript data
        entry validation routines. To include this file with an HTML
        document, enter the following statement within the <HEAD>...</HEAD>
        tag pair:
           <SCRIPT LANGUAGE="JavaScript" SRC="validation.js">
        This library file should be in the same directory as the HTML
        files that call upon its routines.
        
        Input fields in a form include onChange event handlers that invoke
        the validate() function (or parent.validate() if the .js file is
        included in the framesetting document), passing as arguments:
        	window
        	this
        	a string of the name of the specific validation routine
        For example:

     <INPUT TYPE="text" NAME="exp_date" ... onChange="validate(window, this,'isPhone')">

        To include multiple validations for a given field, add more validation
        name strings as arguments to the event handler:

            <...onChange="validate(window, this,'<valName1>'[...'valNamen'])">
        
 */
// BB All date functaion have been removed as we only allow the input via the calendar picker
// global variables--reference to input field and owning frame
// being validated set when validate() called
var gField;
var fldName;
// see bottom of code for the array set ting up the sunctions to call - one of
// the javascript error checkers said it should
// be after the functions were actually defined.
// main validation function called by form event handlers
//
function validate(field, method) {
gField = field;
	fldName = field.alt;
	if (fldName === "" || fldName === null) {
		fldName = field.name;
	}

	for ( var i = 1; i < arguments.length; i++) {
		if (!dispatchLookup[arguments[i]].doValidate()) {
			return false;
		}
	}
	return true;
}
/*******************************************************************************
 * Begin validation routines
 ******************************************************************************/

// input field is not empty
function isNotEmpty() {
	if (gField.value === "" || gField.value === null) {
		alert("The " + fldName + " cannot be left empty.");
		gField.focus();
		gField.select();
		return false;
	}
	return true;
}

// input value is a positive integer of any length
function isPositiveInteger() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	inputStr = stripCommas(inputStr);
	for ( var i = 0; i < inputStr.length; i++) {
		var oneChar = inputStr.charAt(i);
		if (oneChar < "0" || oneChar > "9") {
			alert("The selected field must be a positive, whole number (no letters or punctuation are allowed).");
			gField.focus();
			gField.select();
			return false;
		}
	}
	return true;
}
// input value is a positive integer of any length
function isPositiveDouble2dp() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	if (!isNumber(inputStr)) {
		alert("Please enter a  positive  number.");
		gField.focus();
		gField.select();
		return false;
	}
	var integers = getDollars(inputStr); // removes any commas or $ signs
	var decimals = getCents(inputStr);
	if (inputStr.charAt(0) == "-") {
		alert("Please enter a  positive number.");
		gField.focus();
		gField.select();
		return false;
	}
	if (decimals.length > 2 && decimals.length !== 0) {
		alert("Please enter a up to 2 decimal places only.");
		gField.focus();
		gField.select();
		return false;
	}
	return true;
}
// input value is a positive dollar value only 2 decimal places max5 dollar
// places
function isPositiveDollarAmt() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	if (!isNumber(inputStr)) {
		alert("Please enter a  positive dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	var dollars = getDollars(inputStr); // removes any commas or $ signs
	var cents = getCents(inputStr);
	if (inputStr.charAt(0) == "-") {
		alert("Please enter a  positive dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	if (isNaN(dollars) || isNaN(cents)) {
		alert("Please enter a dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	if (cents.length != 2 && cents.length !== 0) {
		alert("Please enter a dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	return true;
}
// input value is a dollar value only 2 decimal places max5 dollar places
function isDollarAmt() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	if (inputStr.charAt(0) == "-") {
		inputStr = inputStr.substring(1, inputStr.length);
	}
	if (!isNumber(inputStr)) {
		alert("Please enter a dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	var dollars = getDollars(inputStr); // removes any commas or $ signs
	var cents = getCents(inputStr);
	if (isNaN(dollars) || isNaN(cents)) {
		alert("Please enter a dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	if (cents.length != 2 && cents.length !== 0) {
		alert("Please enter a dollar amount.");
		gField.focus();
		gField.select();
		return false;
	}
	return true;
}
// input value is a positive integer, max 8 characters (and strip commas,
// periods, and "$")
// then re-insert commas for display.
function isDollarsOnly8Commas() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	inputStr = getDollars(gField.value);
	gField.value = inputStr;

	if (isPositiveInteger()) {
		if (inputStr.length > 8) {
			alert("The selected field must be less than 100,000,000.");
			gField.focus();
			gField.select();
			return false;
		}
		gField.value = reinsertCommas(inputStr);
		return true;
	}
	alert("Check the dollar amount entered.");
	gField.focus();
	gField.select();
	return false;
}

// input value is a positive number with possible 1 decimal place which can only
// be .5
function isValidHours() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	if (!isNumber(inputStr)) {
		alert("Please enter valid hours.You can use half hourly increments.");
		gField.focus();
		gField.select();
		return false;
	}
	var hrs = getDollars(inputStr); // removes any commas or $ signs
	var mins = getCents(inputStr);
	if (inputStr.charAt(0) == "-") {
		alert("Please enter a  positive number.");
		gField.focus();
		gField.select();
		return false;
	}
	if ((hrs.length > 0 && isNaN(hrs)) || (mins.length > 0 && isNaN(mins))) {
		alert("Please enter valid hours.You can use half hourly increments.");
		gField.focus();
		gField.select();
		return false;
	}
	if (mins.length > 0 && mins != 5 && mins !== 0) {
		alert("Please enter valid hours.You can use half hourly increments.");
		gField.focus();
		gField.select();
		return false;
	}
	return true;
}
// input value is between 7 and 15 chars long and contains 1 number one
// uppercase and one lower case letter
// and is only numbers or letters
function isValidPassword() {
	var inputStr = gField.value;
	var pwlen = inputStr.length;
	if (pwlen === 0) {
		return true;
	}
	if (pwlen < 7 || pwlen > 15) {
		alert("Password must be between 7 and 15 characters long.");
		gField.select();
		gField.focus();
		return false;
	}
	var re = /^\w+$/;
	if (!re.test(inputStr)) {
		alert("Passwords must contain only letters, numbers and underscores.");
		gField.select();
		gField.focus();
		return false;
	}
	re = /[0-9]/;
	if (!re.test(inputStr)) {
		alert("Password must contain at least one number (0-9).");
		gField.select();
		gField.focus();
		return false;
	}
	re = /[a-z]/;
	if (!re.test(inputStr)) {
		alert("Password must contain at least one lowercase letter (a-z).");
		gField.select();
		gField.focus();
		return false;
	}
	re = /[A-Z]/;
	if (!re.test(inputStr)) {
		alert("Password must contain at least one uppercase letter (A-Z).");
		gField.select();
		gField.focus();
		return false;
	}

	return true;
}

// input value has not single or double quotes in it
function hasNoQuotes() {
	var inputStr = gField.value;
	if (inputStr.length === 0) {
		return true;
	}
	for ( var i = 0; i < inputStr.length; i++) {
		var oneChar = inputStr.charAt(i);
		if (oneChar == "'" || oneChar == '"') {
			alert("The text cannot contain single or double quotes.");
			gField.focus();
			gField.select();
			return false;
		}
	}
	return true;
}
// checks for strings of maximum length
function maxString15() {
	return maxString(15);
}
function maxString25() {
	return maxString(25);
}
function maxString30() {
	return maxString(30);
}
function maxString35() {
	return maxString(35);
}

/*******************************************************************************
 * Begin utility validation and support routines
 ******************************************************************************/

// generic maximum string length checker (called by dispatched validation
// functions)
function maxString(len) {
	var inputStr = gField.value.toUpperCase();
	if (inputStr.length > len) {
		if (!confirm("This field is limited to " + len + " characters long. Should the system accept the first " + len
				+ " characters of your entry, and ignore the rest?")) {
			gField.focus();
			gField.select();
			return false;
		}
		inputStr = inputStr.substring(0, len);
	}
	gField.value = inputStr;
	return true;
}
// is a number can have commas, -ve (only at 0), or decimal point
function isNumber(inputStr) {
	for ( var i = 0; i < inputStr.length; i++) {
		var oneChar = inputStr.charAt(i);
		if (oneChar < "0" || oneChar > "9") {
			if (i === 0 && oneChar != "-") {
				return false;
			}
			if (oneChar != "," && oneChar != ".") {
				return false;
			}
		}
	}
	return true;
}

// get dollars by stripping $ and commas andstrip decimal and trailing cents
function getDollars(inputStr) {
	var marker;
	while (inputStr.indexOf("$") != -1) {
		marker = inputStr.indexOf("$");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	while (inputStr.indexOf(",") != -1) {
		marker = inputStr.indexOf(",");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	marker = inputStr.indexOf(".");
	if (marker != -1) {
		return inputStr.substring(0, marker);
	}
	return inputStr;
}

// get cents
function getCents(inputStr) {
	var marker = inputStr.indexOf(".");
	if (marker != -1) {
		return inputStr.substring(marker + 1, inputStr.length);
	}
	return "";
}
// restore commas for big dollar amounts
function reinsertCommas(inputStr) {
	var out = "";
	var len = inputStr.length;
	for ( var i = 0; i < len; i++) {
		if (i !== 0 && i % 3 === 0) {
			out = "," + out;
		}
		out = inputStr.charAt(len - i - 1) + out;
	}
	return out;
}
// restore commas and 2 dp for for big dollar amounts if no value is passed
// blank is passed back
function makeDollars(dollars, cents) {
	var out = "";
	out = reinsertCommas(dollars);
	if (out.length < 1) {
		out = "0";
	}
	if (isNaN(cents)) {
		cents = '00';
	} else if (cents.length != 2) {
		cents = cents.substring(0, 2);
	}
	out += "." + cents;
	return out;
}
function formatDollars(amt) {
	var negative = false;
	if (amt.charAt(0) == "-") {
		negative = true;
		amt = amt.substring(1, amt.length);
	}
	var dollars = getDollars(amt);
	if (dollars === "") {
		dollars = 0;
	}
	var cents = getCents(amt);
	var out = "";

	out = reinsertCommas(dollars);
	if (out.length < 1) {
		out = "0";
	}
	if (isNaN(cents)) {
		cents = '00';
	} else if (cents.length > 2) {
		cents = cents.substring(0, 2);
	} else if (cents.length == 1) {
		cents = cents + '0';
	} else if (cents.length === 0) {
		cents = '00';
	}
	out += "." + cents;
	if (negative) {
		out = "-" + out;
	}
	return out;
}
// strip hyphens
function stripHyphens(inputStr) {
	var marker;
	while (inputStr.indexOf("-") != -1) {
		marker = inputStr.indexOf("-");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	return inputStr;
}
// strip hyphens
function stripCommas(inputStr) {
	var marker;
	while (inputStr.indexOf(",") != -1) {
		marker = inputStr.indexOf(",");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	return inputStr;
}

// strip phone number entry slashes and parentheses
function stripSlashParens(inputStr) {
	var marker;
	while (inputStr.indexOf("/") != -1) {
		marker = inputStr.indexOf("/");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	while (inputStr.indexOf("(") != -1) {
		marker = inputStr.indexOf("(");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	while (inputStr.indexOf(")") != -1) {
		marker = inputStr.indexOf(")");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	while (inputStr.indexOf(" ") != -1) {
		marker = inputStr.indexOf(" ");
		inputStr = inputStr.substring(0, marker) + inputStr.substring(marker + 1, inputStr.length);
	}
	return inputStr;
}

function stripZeros(inputStr) {
	var result = inputStr;
	while (result.substring(0, 1) == "0") {
		result = result.substring(1, result.length);
	}
	return result;
}

// insert hyphens into phone number
function restorePhoneHyphens(inputStr) {
	var n1 = inputStr.substring(0, 3);
	var n2 = inputStr.substring(3, 6);
	var n3 = inputStr.substring(6, 10);
	return (n1 + "-" + n2 + "-" + n3);
}

// utility for isNum validations
function isNum(n) {
	if (isPositiveInteger()) {
		var inputStr = gField.value;
		if (inputStr.length != n) {
			alert("The selected field requires a number " + n + " digits long.");
			gField.focus();
			gField.select();
			return false;
		}
		return true;
	}
	return false;
}

// String utilities for search/replace functions
// extract front part of string prior to searchString
function getFront(mainStr, searchStr) {
	var foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) {
		return null;
	}
	return mainStr.substring(0, foundOffset);
}

// extract back end of string after searchString
function getEnd(mainStr, searchStr) {
	var foundOffset = mainStr.indexOf(searchStr);
	if (foundOffset == -1) {
		return null;
	}
	return mainStr.substring(foundOffset + searchStr.length, mainStr.length);
}

// insert insertString immediately before searchString
function insertString(mainStr, searchStr, insertStr) {
	var front = getFront(mainStr, searchStr);
	var end = getEnd(mainStr, searchStr);
	if (front !== null && end !== null) {
		return front + insertStr + searchStr + end;
	}
	return null;
}

// remove deleteString
function deleteString(mainStr, deleteStr) {
	return replaceString(mainStr, deleteStr, "");
}

// replace searchString with replaceString

function replaceString(mainStr, searchStr, replaceStr) {
	var front = getFront(mainStr, searchStr);
	var end = getEnd(mainStr, searchStr);
	if (front !== null && end !== null) {
		return front + replaceStr + end;
	}
	return null;
}
/*******************************************************************************
 * Begin validation dispatching mechanism
 ******************************************************************************/
// validation function object constructor
function dispatcher(validationFunc) {
	this.doValidate = validationFunc;
}
var dispatchLookup = new Array;
dispatchLookup.isNotEmpty = new dispatcher(isNotEmpty);
dispatchLookup.isPositiveInteger = new dispatcher(isPositiveInteger);
dispatchLookup.isValidHours = new dispatcher(isValidHours);
dispatchLookup.isValidPassword= new dispatcher(isValidPassword);
dispatchLookup.isDollarAmt = new dispatcher(isDollarAmt);
dispatchLookup.isPositiveDollarAmt = new dispatcher(isPositiveDollarAmt);
dispatchLookup.isPositiveDouble2dp = new dispatcher(isPositiveDouble2dp);
dispatchLookup.isDollarsOnly8Commas = new dispatcher(isDollarsOnly8Commas);
dispatchLookup.hasNoQuotes = new dispatcher(hasNoQuotes);
dispatchLookup.maxString15 = new dispatcher(maxString15);
dispatchLookup.maxString25 = new dispatcher(maxString25);
dispatchLookup.maxString30 = new dispatcher(maxString30);
dispatchLookup.maxString35 = new dispatcher(maxString35);
