
/* 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

/* 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 isLetterorDash (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) || (c == "-"))
}

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 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 isAlphabeticorDash (s)
{   var i;
    if (isEmpty(s))
       if (isAlphabeticorDash.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabeticorDash.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {
        var c = s.charAt(i);
        if (!isLetterorDash(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 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 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;
}

/* 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 checkStringAlphaDash (theField, s, emptyOK)
{
    var onlyalpha = "Only letters and dashes are valid in the name fields.";
	 if (checkStringAlphaDash.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value)) {
       return warnEmpty (theField, s);
    } else if ( !isAlphabeticorDash(theField.value) ) {
        return warnInvalid(theField, onlyalpha);
    } else {
        return true;
    }
}

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 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 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 getSelectedValue (select)
{   for (var i = 0; i < select.length; i++)
    {   if (select[i].selected) { break }
    }
    return select[i].value
}

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
	}
}

