
/* VARIABLE DECLARATIONS */

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var decimalPointDelimiter = "."
var phoneNumberDelimiters = "()- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;
var SSNDelimiters = "- ";
var validSSNChars = digits + SSNDelimiters;
var digitsInSocialSecurityNumber = 9;
var digitsInUSPhoneNumber = 10;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-"
var validZIPCodeChars = digits + ZIPCodeDelimiters
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9

var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field."
var mPrefix2 = "You did not make a selection for \""
var mSuffix2 = "\" (required)."

var iStateCode = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please reenter it now."
var iZIPCode = "This field must be a 5 or 9 digit U.S. ZIP Code (like 94043). Please reenter it now."
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please reenter it now."
var iUSPhone3 = "These three fields must form a 10 digit U.S. phone number (like 415 555 1212). Please reenter them now."
var iSSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please reenter it now."
var iSSN3 = "These three fields must form a 9 digit U.S. social security number (like 123 45 6789). Please reenter them now."
var iEmail = "This field must be a valid email address (like foo@bar.com). Please reenter it now."
var iDay = "This field must be a day number between 1 and 31.  Please reenter it now."
var iMonth = "This field must be a month number between 1 and 12.  Please reenter it now."
var iYear = "This field must be a 2 or 4 digit year number.  Please reenter it now."
var iFullYear = "This field must be a 4 digit year number.  Please reenter it now."
var iDatePrefix = "The Month, Day and Year for "
var iDateSuffix = " do not form a valid date.  Please reenter them now."
var iDigits = "This field must contain only digits. Please reenter them now."

var pEntryPrompt = "Please enter a "
var pStateCode = "2 character code (like CA)."
var pZIPCode = "5 or 9 digit U.S. ZIP Code (like 94043)."
var pUSPhone = "10 digit U.S. phone number (like 415 555 1212)."
var pSSN = "9 digit U.S. social security number (like 123 45 6789)."
var pEmail = "valid email address (like foo@bar.com)."
var pDay = "day number between 1 and 31."
var pMonth = "month number between 1 and 12."
var pYear = "2 or 4 digit year number."
var pRoutingNum = "Please enter a 9 digit routing number."

var defaultEmptyOK = false

function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   }
   return this
}


var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

var USStateCodeDelimiter = "|";
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP"


/* FUNCTIONS TO REFORMAT DATA */

function stripCharsInBag (s, bag)
{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function stripCharsNotInBag (s, bag)
{   var i;
    var returnString = "";


    for (i = 0; i < s.length; i++)
    {
                var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}

function stripWhitespace (s)
{   return stripCharsInBag (s, whitespace)
}

function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}

function stripInitialWhitespace (s)
{   var i = 0;

    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;

    return s.substring (i, s.length);
}




/* BASIC VALIDATION FUNCTIONS */

function isEmpty(s)
{
return ( (s == false) || (s == null) || (s.length == 0) )
}

function isWhitespace (s)
{   var i;
    if (isEmpty(s)) return true;
    for (i = 0; i < s.length; i++)
    {
      var c = s.charAt(i);
      if (whitespace.indexOf(c) == -1) return false;
    }
    return true;
}


function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}

function isInteger (s)
{   var i;
    if (isEmpty(s))
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
      var c = s.charAt(i);
      if (!isDigit(c)) return false;
    }
    return true;
}

function isSignedInteger (s)
{   if (isEmpty(s))
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedInteger.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;
        if (isSignedInteger.arguments.length > 1)
            secondArg = isSignedInteger.arguments[1];
           if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}

function isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;
    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];
    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function isAlphabetic (s)
{   var i;
    if (isEmpty(s))
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (!isLetter(c))
        return false;
    }
    return true;
}


function isAlphanumeric (s)
{   var i;
    if (isEmpty(s))
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }
        return true;
}


function reformat (s)
{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

function isSSN (s)
{   if (isEmpty(s))
       if (isSSN.arguments.length == 1) return defaultEmptyOK;
       else return (isSSN.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}


function isUSPhoneNumber (s)
{   if (isEmpty(s))
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function isZIPCode (s)
{  if (isEmpty(s))
       if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (isZIPCode.arguments[1] == true);
   return (isInteger(s) &&
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2)))
}


function isStateCode(s)
{   if (isEmpty(s))
       if (isStateCode.arguments.length == 1) return defaultEmptyOK;
       else return (isStateCode.arguments[1] == true);
    return ( (USStateCodes.indexOf(s) != -1) &&
             (s.indexOf(USStateCodeDelimiter) == -1) )
}


function isEmail (s)
{   if (isEmpty(s))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);
       if (isWhitespace(s)) return false;
    var i = 1;
    var sLength = s.length;
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }
    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}


function isYear (s)
{   if (isEmpty(s))
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isNonnegativeInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}

function isFullYear (s)
{   if (isEmpty(s))
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isNonnegativeInteger(s)) return false;
    return ((s.length == 4));
}

function isIntegerInRange (s, a, b)
{   if (isEmpty(s))
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);
    if (!isInteger(s, false)) return false;
       var num = parseInt (s);
    return ((num >= a) && (num <= b));
}



function isMonth (s)
{   if (isEmpty(s))
       if (isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (isMonth.arguments[1] == true);
    return isIntegerInRange (s, 1, 12);
}

function isDay (s)
{   if (isEmpty(s))
       if (isDay.arguments.length == 1) return defaultEmptyOK;
       else return (isDay.arguments[1] == true);
    return isIntegerInRange (s, 1, 31);
}


function daysInFebruary (year)
{           return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}


function isDate (year, month, day)
{       if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

            var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);

        if (intDay > daysInMonth[intMonth]) return false;

    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}


/* FUNCTIONS TO NOTIFY USER OF INPUT REQUIREMENTS OR MISTAKES. */

function prompt (s)
{   window.status = s
}

function promptEntry (s)
{   window.status = pEntryPrompt + s
}

function warnEmpty (theField, s)
{ alert(mPrefix + s + mSuffix)
    theField.focus()
    return false
}

function warnInvalid (theField, s)
{   theField.select()
    alert(s)
theField.focus()
    return false
}


/* FUNCTIONS TO INTERACTIVELY CHECK VARIOUS FIELDS. */

function checkString (theField, s, emptyOK)
{
	 if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value))
       return warnEmpty (theField, s);
    else return true;
}

function checkStringII (min, max, theField, s, emptyOK)
{
	 if (checkStringII.arguments.length == 4) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value)) {
       return warnEmpty (theField, s);
	 } else if ( charLimit( min, max, theField, 'characters', s ) ) {
	    return true;
	 } else {
	 	return false;
	 }
}

function checkcheckbox (theField)
{
var ischecked = theField.checked;
if(!ischecked) {
alert ("You must read the terms and conditions and check the agree box before submitting");
theField.focus();
return false;
} else {return true;}
}
function checkDigits (min, max, theField, s, emptyOK)
{
	 if (checkDigits.arguments.length == 4) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value)) {
       return warnEmpty (theField, s);
    } else if (!isInteger(theField.value)) {
       return warnInvalid (theField, iDigits);
	 } else if ( charLimit( min, max, theField, 'digits', s ) ) {
	    return true;
	 } else {
	 	return false;
	 }
}

function charLimit ( min, max, theField, fieldType, s )
{
	len = theField.value.length;
		if( (min == 0) && (max == 0) ) {
		return true;
	}
	warn = "";
	if( (min == max) ) {
		if(min != len)
			warn = "The "+s+" field must contain exactly "+min+" "+fieldType+".";
	} else if( (min == 0) ) {
		if(len > max)
			warn = "The "+s+" field must contain "+max+" "+fieldType+" or less.";
	} else if( (max == 0) ) {
		if(len < min )
			warn = "The "+s+" field must contain "+min+" or more "+fieldType+".";
	} else {
		if( ((len > max) || (len < min)) )
			warn = "The "+s+" field must contain between "+min+" and "+max+" "+fieldType+".";
	}
	if(warn!="") {
		if(charLimit.arguments.length==3) { // just return false; no 's' arg, so no alert
			return false;
		} else {
			return warnInvalid(theField,warn);
		}
	}
	return true;
}


function checkStateCode (theField, emptyOK)
{   if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  theField.value = theField.value.toUpperCase();
       if (!isStateCode(theField.value, false))
          return warnInvalid (theField, iStateCode);
       else return true;
    }
}


function reformatZIPCode (ZIPString)
{   if (ZIPString.length == 5) return ZIPString;
    else return (reformat (ZIPString, "", 5, "-", 4));
}


function checkZIPCode (theField, emptyOK)
{   if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (!isZIPCode(normalizedZIP, false))
         return warnInvalid (theField, iZIPCode);
      else
      {           theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}


function reformatUSPhone (USPhone)
{   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
}


function checkUSPhone (theField, emptyOK)
{   if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
       if (!isUSPhoneNumber(normalizedPhone, false))
          return warnInvalid (theField, iUSPhone);
       else
       {            theField.value = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}

function checkUSPhone3 (theField1, theField2 ,theField3, emptyOK)
{
	returnFlag = "";
	if (checkUSPhone3.arguments.length == 3) emptyOK = defaultEmptyOK;
	for (i = 0; i < 3; i++) {
		if( (emptyOK==true) && (isEmpty(checkUSPhone3.arguments[i].value)) ) returnFlag=true;
	}
	if(returnFlag==true) return true;
	for (i = 0; i < 3; i++) {
		if( !isInteger(checkUSPhone3.arguments[i].value) )
			return warnInvalid(checkUSPhone3.arguments[i], iUSPhone3);
		if( (i==0)&&(!charLimit(3,3,theField1)) )
			return warnInvalid(theField1,iUSPhone3);
		if( (i==1)&&(!charLimit(3,3,theField2)) )
			return warnInvalid(theField2,iUSPhone3);
		if( (i==2)&&(!charLimit(4,4,theField3)) )
			return warnInvalid(theField3,iUSPhone3);
	}
	return true;
}

function checkEmail (theField, emptyOK)
{   if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false))
       return warnInvalid (theField, iEmail);
    else return true;
}

function reformatSSN (SSN)
{   return (reformat (SSN, "", 3, "-", 2, "-", 4))
}

function checkSSN (theField, emptyOK)
{   if (checkSSN.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
       if (!isSSN(normalizedSSN, false))
          return warnInvalid (theField, iSSN);
       else
       {            theField.value = reformatSSN(normalizedSSN)
          return true;
       }
    }
}

function checkSSN3 (theField1, theField2 ,theField3, emptyOK)
{
	returnFlag = "";
	if (checkSSN3.arguments.length == 3) emptyOK = defaultEmptyOK;
	for (i = 0; i < 3; i++) {
		if( (emptyOK==true) && (isEmpty(checkSSN3.arguments[i].value)) ) returnFlag=true;
	}
	if(returnFlag==true) return true;
	for (i = 0; i < 3; i++) {
		if( !isInteger(checkSSN3.arguments[i].value) )
			return warnInvalid(checkSSN3.arguments[i], iSSN3);
		if( (i==0)&&(!charLimit(3,3,theField1)) )
			return warnInvalid(theField1,iSSN3);
		if( (i==1)&&(!charLimit(2,2,theField2)) )
			return warnInvalid(theField2,iSSN3);
		if( (i==2)&&(!charLimit(4,4,theField3)) )
			return warnInvalid(theField3,iSSN3);
	}
	return true;
}

function checkYear (theField, emptyOK)
{   if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isYear(theField.value, false))
       return warnInvalid (theField, iYear);
    else return true;
}


function checkMonth (theField, emptyOK)
{   if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isMonth(theField.value, false))
       return warnInvalid (theField, iMonth);
    else return true;
}


function checkDay (theField, emptyOK)
{   if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isDay(theField.value, false))
       return warnInvalid (theField, iDay);
    else return true;
}


function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay)
{           if (checkDate.arguments.length == 4) OKtoOmitDay = false;
    if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
    if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
    if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
    else if (!isDay(dayField.value))
       return warnInvalid (dayField, iDay);
    if (isDate (yearField.value, monthField.value, dayField.value))
       return true;
    alert (iDatePrefix + labelString + iDateSuffix)
    return false
}

function checkSelectDate (monthField, dayField, yearField, s, OKtoOmitDay)
{
	if (checkSelectDate.arguments.length == 4) OKtoOmitDay = false;
	for (i = 0; i < 3; i++) {
		//alert(getSelectedValue(checkSelectDate.arguments[i]));
		if( isEmpty(getSelectedValue(checkSelectDate.arguments[i])) ) {
			if( (i==1)&&(OKtoOmitDay==true) ) {
			} else {
				s=iDatePrefix+s+iDateSuffix;
				checkSelectDate.arguments[i].focus();
				alert(s);
				return false;
			}
		}
	}
	return true;
}

function checkMatch (theField1, theField2, warn)
{
	if( theField1.value != theField2.value ) {
		warnInvalid(theField2,warn);
		return false;
	} else {
		return true;
	}
}

function getRadioButtonValue (radio)
{   found=false;
	 for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { found=true; break; }
    }
    if(found)
    	return radio[i].value
    else
    	return "";
}

function getSelectedValue (select)
{   for (var i = 0; i < select.length; i++)
    {   if (select[i].selected) { break }
    }
    return select[i].value
}

function getSelected (select)
{   for (var i = 0; i < select.length; i++)
    {   if (select[i].selected) { break }
    }
    return select[i]
}

function checkSelect (theField, s, emptyOK) {
	 if (checkSelect.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(getSelectedValue(theField)))) return true;
	 if( isEmpty( getSelectedValue(theField) ) ) {
		warnEmpty(theField,s)
		return false
	} else {
		return true
	}
}

function checkRadio (theField, s, emptyOK) {
	 if (checkRadio.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(getRadioButtonValue(theField)))) return true;
	 if( isEmpty( getRadioButtonValue(theField) ) ) {
		alert(mPrefix2 + s + mSuffix2)
		return false
	} else return true
}

/* CUSTOM FUNCTIONS FOR SPECIFIC FORMS */

// none yet

function checkAge(dateDob, monthDob, yearDob)
{
	var now = new Date();
	var today = new Date(now.getYear(),now.getMonth(),now.getDate());

	var yearNow = now.getYear();
	var monthNow = now.getMonth() + 1;
	var dateNow = now.getDate();

	yearAge = yearNow - yearDob;

	if (monthNow >= monthDob)
		var monthAge = monthNow - monthDob;
	else {
		yearAge--;
		var monthAge = 12 + monthNow -monthDob;
	}

	if (dateNow >= dateDob)
		var dateAge = dateNow - dateDob;
	else {
		monthAge--;
		var dateAge = 31 + dateNow - dateDob;

		if (monthAge < 0) {
			monthAge = 11;
			yearAge--;
		}
	}

	if (yearAge < 18)
	{
		alert("You have to be 18 or older to apply.");
		return false;
	}
	return true;
}

function checkABA(s, theField) {

  var i, n, t;
  // First, remove any non-numeric characters.
  t = "";
  for (i = 0; i < s.length; i++) {
    c = parseInt(s.charAt(i), 10);
    if (c >= 0 && c <= 9)
      t = t + c;
  }
  // Check the length, it should be nine digits.
  if (t.length != 9)
    return false;
  // Now run through each digit and calculate the total.
  n = 0;
  for (i = 0; i < t.length; i += 3) {
    n += parseInt(t.charAt(i),     10) * 3
      +  parseInt(t.charAt(i + 1), 10) * 7
      +  parseInt(t.charAt(i + 2), 10);
  }
  // If the resulting sum is an even multiple of ten (but not zero),
  // the aba routing number is good.
  if (n != 0 && n % 10 == 0)
    return true;
  else
    {
	alert("Your Routing Number is not valid. Please check the Routing Number and try again.");
        theField.focus()
	return false;
    }
}




function checkSelectMulti (theField, s, emptyOK) 
   {
   var hasSelections = false;
   for(var i = 0; i < theField.options.length; i++)
      {
      if(theField.options[i].selected)
         {
         hasSelections = true;
         return true;
         break;
         }
      }
   warnEmpty(theField,s)
   return false
   }
