// FormBuilder.js
// VARIABLE DECLARATIONS

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var removespace = " ";
var decimalPointDelimiter = "."
var phoneNumberDelimiters = "()-. ";
var dateDelimiters = "/- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;
var validWorldPhoneChars = 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 creditCardDelimiters = " "
var mPrefix = "The form was not submitted due to the following error.\nPlease correct this error and resubmit the form.\n_________________________________________________________\n\n"
var mSuffix = " is a required field."

// Date Variables
var dateCHAR = "/";

var sUserName = "Username"
var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sYourName = "Your Name"
var sTitle = "Title"
var sCompanyName = "Company Name"
var sUSAddress = "Street Address"
var sUSCardName = "Name on Credit Card"
var sWorldAddress = "Address"
var sCity = "City"
var sStateCode = "State Code"
var sWorldState = "State, Province, or Prefecture"
var sCountry = "Country"
var sZIPCode = "ZIP Code"
var sWorldPostalCode = "Postal Code"
var sPhone = "Phone Number"
var sFax = "Fax Number"
var sDateOfBirth = "Date of Birth"
var sExpirationDate = "Expiration Date"
var sEmail = "Email"
var sSSN = "Social Security Number"
var sCreditCardNumber = "Credit Card Number"
var sUserName = "Username"
var sIDnumber = "ID"
var sOtherInfo = "Other Information"
var sALERT = ""

// i is an abbreviation for "invalid"

var iStateCode = "Please select a U.S. State."
//var iStateCode = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please re-enter it now."
var iZIPCode = "\nFormat - XXXXX or XXXXX-XXXX"
var iUSPhone = "\nFormat - XXX-XXX-XXXX or (XXX)XXX-XXXX"
var iWorldPhone = "\nFormat - +XX-(X)XXXX-XXXX-XXXX"
var iSSN = "\nFormat - XXX XX XXXX or XXX-XX-XXXX"
var iPW1 = "\nFormat - Must be at least 6 characters."
var iPW2 = "\nFormat - Must be equal."
var iSignInt = " must be a valid Positive (+) or Negative (-) Integer."
var iPosInt = " must be a valid Positive (+) Integer."
var iDecimal = " must be a valid decimal number."
var iEmail = "\nFormat - johndoe@aol.com\n(Valid Extensions .com .net .org .us .biz .info .tv .ws .cc .bs .mil .coop (and all Country Extensions)"
var iMultiEmail = "Format - johndoe@aol.com\n\n(Valid Extenstions .com .net .org .us .biz .info .tv .ws .cc .bs .mil .coop (and all Country Extensions))\n\nThe following email address(s) are invalid:\n"
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. Please re-enter a valid number credit card number."
var iDate = "\nFormat - MM/DD/YY or MM/DD/YYYY (i.e. 01/04/02 or 01/04/2002)"

var defaultEmptyOK = false

function FB_makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this
}

var daysInMonth = FB_makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
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 = "NOTUS|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"
var emailExtDelimiter = "|"
var emailExtCode = "COM|NET|ORG|BIZ|INFO|EDU|INT|GOV|AC|AD|AE|AG|AI|AL|AM|AN|AP|AQ|AR|AS|AT|AU|AZ|BA|BB|BE|BF|BG|BH|BI|BM|BN|BO|BR|BT|BY|BZ|CA|CC|CD|CF|CG|CH|CK|CL|CM|CN|CO|CR|CU|CX|CY|CZ|DE|DJ|DK|DO|DZ|EC|EE|EG|ES|FI|FJ|FK|FM|FR|FO|GB|GE|GF|GG|GH|GI|GL|GM|GN|GR|GS|GT|GU|HK|HM|HN|HR|HU|ID|IE|IL|IM|IN|INT|IO|IR|IS|IT|JE|JO|JP|KE|KG|KH|KR|KW|KY|KZ|LB|LC|LI|LK|LR|LT|LU|LV|LY|MC|MD|MG|MH|MK|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MX|MY|MW|NA|NC|NF|NI|NL|NO|NP|NU|NZ|OM|PA|PE|PG|PH|PL|PT|PK|QA|RE|RO|RU|RW|SA|SB|SE|SG|SH|SI|SK|SM|SN|SO|ST|SU|SV|SZ|TC|TD|TF|TH|TJ|TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|UM|US|UY|VE|VG|VI|VU|WF|WS|YT|YU|ZA|ZM|BS|MIL|COOP|NAME|JOBS|MOBI|MUSEUM|TRAVEL"

function FB_isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

function FB_isWhitespace (s)

{   var i;

    if (FB_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 FB_stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}

function FB_stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}

function FB_stripWhitespace (s)

{   return FB_stripCharsInBag (s, whitespace)
}

function FB_charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}

function FB_stripInitialWhitespace (s)

{   var i = 0;

    while ((i < s.length) && FB_charInString (s.charAt(i), whitespace))
       i++;
    
    return s.substring (i, s.length);
}

function FB_isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function FB_isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function FB_isLetterOrDigit (c)
{   return (FB_isLetter(c) || FB_isDigit(c))
}

// FB_isInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isInteger (s)

{   var i;

    if (FB_isEmpty(s)) 
       if (FB_isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isInteger.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if (!FB_isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

// FB_isSignedInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isSignedInteger (s)

{   if (FB_isEmpty(s)) 
       if (FB_isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isSignedInteger.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (FB_isSignedInteger.arguments.length > 1)
            secondArg = FB_isSignedInteger.arguments[1];

        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;    
        return (FB_isInteger(s.substring(startPos, s.length), secondArg))
    }
}

// FB_isPositiveInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (FB_isPositiveInteger.arguments.length > 1)
        secondArg = FB_isPositiveInteger.arguments[1];

    return (FB_isSignedInteger(s, secondArg)
         && ( (FB_isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}

// FB_isNonnegativeInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (FB_isNonnegativeInteger.arguments.length > 1)
        secondArg = FB_isNonnegativeInteger.arguments[1];

    return (FB_isSignedInteger(s, secondArg)
         && ( (FB_isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

// FB_isNegativeInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isNegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (FB_isNegativeInteger.arguments.length > 1)
        secondArg = FB_isNegativeInteger.arguments[1];

    return (FB_isSignedInteger(s, secondArg)
         && ( (FB_isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}

// FB_isNonpositiveInteger (STRING s [, BOOLEAN emptyOK])
// 
function FB_isNonpositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (FB_isNonpositiveInteger.arguments.length > 1)
        secondArg = FB_isNonpositiveInteger.arguments[1];

    return (FB_isSignedInteger(s, secondArg)
         && ( (FB_isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}

// FB_isFloat (STRING s [, BOOLEAN emptyOK])
// 
function FB_isFloat (s)

{   var i;
    var seenDecimalPoint = false;

    if (FB_isEmpty(s)) 
       if (FB_isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!FB_isDigit(c)) return false;
    }

    return true;
}

// isSignedFloat (STRING s [, BOOLEAN emptyOK])
// 
function FB_isSignedFloat (s)

{   if (FB_isEmpty(s)) 
       if (FB_isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isSignedFloat.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (FB_isSignedFloat.arguments.length > 1)
            secondArg = FB_isSignedFloat.arguments[1];

        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;    
        return (FB_isFloat(s.substring(startPos, s.length), secondArg))
    }
}

// FB_isAlphabetic (STRING s [, BOOLEAN emptyOK])
// 
function FB_isAlphabetic (s)

{   var i;

    if (FB_isEmpty(s)) 
       if (FB_isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isAlphabetic.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);

        if (!FB_isLetter(c))
        return false;
    }

    return true;
}

// isAlphanumeric (STRING s [, BOOLEAN emptyOK])
// 
function FB_isAlphanumeric (s)

{   var i;

    if (FB_isEmpty(s)) 
       if (FB_isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isAlphanumeric.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number or letter.
        var c = s.charAt(i);

        if (! (FB_isLetter(c) || FB_isDigit(c) ) )
        return false;
    }

    return true;
}

// FB_reformat (TARGETSTRING, STRING, INTEGER, STRING, INTEGER ... )       
//
function FB_reformat (s)

{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < FB_reformat.arguments.length; i++) {
       arg = FB_reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

// FB_isSSN (STRING s [, BOOLEAN emptyOK])
// 
function FB_isSSN (s)
{   if (FB_isEmpty(s)) 
       if (FB_isSSN.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isSSN.arguments[1] == true);
    return (FB_isInteger(s) && s.length == digitsInSocialSecurityNumber)
}

// FB_isUSPhoneNumber (STRING s [, BOOLEAN emptyOK])
//
function FB_isUSPhoneNumber (s)
{   if (FB_isEmpty(s)) 
       if (FB_isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isUSPhoneNumber.arguments[1] == true);
    return (FB_isInteger(s) && s.length == digitsInUSPhoneNumber)
}

// FB_isInternationalPhoneNumber (STRING s [, BOOLEAN emptyOK])
// 
function FB_isInternationalPhoneNumber (s)
{   if (FB_isEmpty(s)) 
       if (FB_isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isInternationalPhoneNumber.arguments[1] == true);
    return (FB_isPositiveInteger(s))
}

// FB_isZIPCode (STRING s [, BOOLEAN emptyOK])
// 
function FB_isZIPCode (s)
{  if (FB_isEmpty(s)) 
       if (FB_isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isZIPCode.arguments[1] == true);
   return (FB_isInteger(s) && 
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2)))
}

// FB_isStateCode (STRING s [, BOOLEAN emptyOK])
//
function FB_isStateCode(s, emptyOK)
{
   if (FB_isEmpty(s)) 
	return false;
   else {
	   return ( (USStateCodes.indexOf(s) != -1) &&
             (s.indexOf(USStateCodeDelimiter) == -1) )
   }
}

// FB_isEmail (STRING s [, BOOLEAN emptyOK])
// 
function FB_isEmail (s)
{  var cUPPER = s.toUpperCase();
   var getEXT = cUPPER.split(".");

   if (FB_isEmpty(s)) 
       if (FB_isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isEmail.arguments[1] == true);

   // check for valid extensions
   if (getEXT.length > 1) {
	   var sEXT = getEXT[getEXT.length-1];
	   if ( (emailExtCode.indexOf(sEXT.toUpperCase()) == -1) && (sEXT.indexOf(emailExtDelimiter) == -1) ) 
		return false;
    }

    if (FB_isWhitespace(s)) return false;

    var i = 1;
    var sLength = s.length;

    // Make sure only 1 @ exists
    var atFOUND = 0
    for (j=0; j<sLength; j++)
       if (s.charAt(j) == "@")
	   atFOUND++;

    if (atFOUND > 1) return false;

    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;
}

// Verify multiple email addresses
//
function FB_isMultiEmail (s, delim) 
{
    var getAddresses = s.split(delim);
    var invAddress = "";

    for (i=0;i<getAddresses.length;i++) {
	var curEMAIL = FB_stripCharsInBag(getAddresses[i], removespace)
	// Get rid of N/A Characters
	curEMAIL = curEMAIL.replace('\n', '');
	curEMAIL = curEMAIL.replace('\r', '');		
	curEMAIL = curEMAIL.replace('\t', '');
	if (!FB_isEmail(curEMAIL))
	    invAddress = invAddress + curEMAIL + '\n';
    }

    return invAddress;
}

// FB_isIntegerInRange (STRING s, INTEGER a, INTEGER b [, BOOLEAN emptyOK])
// 
function FB_isIntegerInRange (s, a, b)
{   if (FB_isEmpty(s)) 
       if (FB_isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isIntegerInRange.arguments[1] == true);

    if (!FB_isInteger(s, false)) return false;

    var num = parseInt (s);
    return ((num >= a) && (num <= b));
}

// FB_isMonth (STRING s [, BOOLEAN emptyOK])
//
function FB_isMonth (s)
{   
   if (FB_isEmpty(s)) 
       if (FB_isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isMonth.arguments[1] == true);
    return FB_isIntegerInRange (s, 1, 12);
}

// FB_isDay (STRING s [, BOOLEAN emptyOK])
// 
function FB_isDay (s)
{   
    if (FB_isEmpty(s)) 
       if (FB_isDay.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isDay.arguments[1] == true);   
    return FB_isIntegerInRange (s, 1, 31);
}

// FB_isYear (STRING s [, BOOLEAN emptyOK])
//
function FB_isYear (s)
{   
    if (FB_isEmpty(s)) 
       if (FB_isYear.arguments.length == 1) return defaultEmptyOK;
       else return (FB_isYear.arguments[1] == true);

    if (!FB_isNonnegativeInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}

// FB_daysInFebruary (INTEGER year)
// 
function FB_daysInFebruary (year)
{ return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 ); }

// FB_isDate (STRING date)
//

function FB_isDate(dtStr) {

     var pos1=dtStr.indexOf(dateCHAR)
     var pos2=dtStr.indexOf(dateCHAR,pos1+1)
     var strMonth=dtStr.substring(0,pos1)
     var strDay=dtStr.substring(pos1+1,pos2)
     var strYear=dtStr.substring(pos2+1)
	
     strYr=strYear
     if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
     if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
     for (var i = 1; i <= 3; i++) {
          if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
     }
     
     month=parseInt(strMonth)
     day=parseInt(strDay)
     year=parseInt(strYr)

     if (!FB_isYear(strYr, false) ) return "year";
     if (!FB_isMonth(month, false) ) return "month";
     if (!FB_isDay(day, false) ) return "day";

//     if (! (FB_isYear(strYr, false) && FB_isMonth(month, false) && FB_isDay(day, false))) return false;
     if (day > daysInMonth[month]) return "day"; 
     if ((month == 2) && (day > FB_daysInFebruary(year))) return "day";
     return "OK";
}


function FB_warnEmpty (theField, s)
{   if (!theField.disabled) theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}

function FB_warnInvalid (theField, s)
{   theField.focus()
    theField.select()
    alert(s)
    return false
}

function FB_checkString (theField, s, emptyOK)
{   theField.disabled = false;

    if (FB_checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    if (FB_isWhitespace(theField.value)) 
       return FB_warnEmpty (theField, s);
    else return true;
}

// FB_checkStateCode (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
function FB_checkStateCode (theField, emptyOK)
{ 
  if (FB_checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
  else  
  {  	if (FB_isEmpty(theField.value)) {
	alert(iStateCode);
	return false;}
  }
  return true;
}

function FB_reformatZIPCode (ZIPString)
{   if (ZIPString.length == 5) return ZIPString;
    else return (FB_reformat (ZIPString, "", 5, "-", 4));
}

// FB_checkZIPCode (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
function FB_checkZIPCode (theField, s, emptyOK)
{   if (FB_checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    { var normalizedZIP = FB_stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (!FB_isZIPCode(normalizedZIP, false)) 
         return FB_warnInvalid (theField, mPrefix + s + mSuffix + iZIPCode);
      else 
      {  theField.value = FB_reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}

function FB_reformatUSPhone (USPhone)
{ return (FB_reformat (USPhone, "", 3, "-", 3, "-", 4)) }

// FB_checkUSPhone (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
function FB_checkUSPhone (theField, s, emptyOK)
{   if (FB_checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  var normalizedPhone = FB_stripCharsInBag(theField.value, phoneNumberDelimiters)
       if (!FB_isUSPhoneNumber(normalizedPhone, false)) 
          return FB_warnInvalid (theField, mPrefix + s + mSuffix + iUSPhone);
       else 
       {  // if you don't want to reformat as (123) 456-789, comment next line out
          //theField.value = FB_reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}

// FB_checkInternationalPhone (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
function FB_checkInternationalPhone (theField, s, emptyOK)
{   if (FB_checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  if (!FB_isInternationalPhoneNumber(theField.value, false)) 
          return FB_warnInvalid (theField, mPrefix + s + mSuffix + iWorldPhone);
       else return true;
    }
}

// FB_checkEmail (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
function FB_checkEmail (theField, s, emptyOK)
{   if (FB_checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else if (!FB_isEmail(theField.value, false)) 
       return FB_warnInvalid (theField, mPrefix + s + mSuffix + iEmail);
    else return true;
}

// FB_checkMultiEmail (TEXTFIELD theField, s, , delim, [, BOOLEAN emptyOK==false])
//
function FB_checkMultiEmail (theField, s, delim, emptyOK)
{   
    var addtext = '';
    if (delim == ',')
	addtext = 'comma(,)';
    else
	addtext = 'Carriage Return (Enter)'

    if (FB_checkMultiEmail.arguments.length == 3) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else if (FB_isEmpty(theField.value)) return FB_warnInvalid (theField, mPrefix + s + mSuffix);
    else 
	var checkAddress = FB_isMultiEmail(theField.value, delim)
	if (!FB_isEmpty(checkAddress))
	    return FB_warnInvalid (theField, mPrefix + iMultiEmail + checkAddress + '\nNote: Separate email addresses with a '+ addtext +'.\n');
	else return true;
}

function FB_reformatSSN (SSN)
{   return (FB_reformat (SSN, "", 3, "-", 2, "-", 4))
}


// Check that string theField.value is a valid SSN.
//
function FB_checkSSN (theField, s, emptyOK)
{   if (FB_checkSSN.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  var normalizedSSN = FB_stripCharsInBag(theField.value, SSNDelimiters)
       if (!FB_isSSN(normalizedSSN, false)) 
          return FB_warnInvalid (theField, mPrefix + s + mSuffix + iSSN);
       else 
       {  // if you don't want to reformats as 123-456-7890, comment next line out
          theField.value = FB_reformatSSN(normalizedSSN)
          return true;
       }
    }
}

// Check if a number is a valid positive/negative integer.
//
function FB_checkSignedInteger (theField, s, emptyOK)
{   if (FB_checkSignedInteger.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  
       if (!FB_isSignedInteger(theField.value)) 
          return FB_warnInvalid (theField, mPrefix + s + iSignInt);
       else 
       { return true;}
    }
}

// Check if a number is a valid postivite/negative decimal value
//
function FB_checkDecimal (theField, s, emptyOK)
{   if (FB_checkDecimal.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  
       if (!FB_isSignedFloat(theField.value)) 
          return FB_warnInvalid (theField, mPrefix + s + iDecimal);
       else 
       { return true;}
    }
}

// Check if a number is a valid positive integer.
//
function FB_checkPosInteger (theField, s, emptyOK)
{   if (FB_checkPosInteger.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    else
    {  
       if (!FB_isPositiveInteger(theField.value)) 
          return FB_warnInvalid (theField, mPrefix + s + iPosInt);
       else 
       { return true;}
    }
}

// Check that string theField.value is a valid Year.
//
function FB_checkYear (theField, emptyOK)
{   if (FB_checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    if (!FB_isYear(theField.value, false)) 
       return FB_warnInvalid (theField, iYear);
    else return true;
}


// Check that string theField.value is a valid Month.
//
function FB_checkMonth (theField, emptyOK)
{   if (FB_checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    if (!FB_isMonth(theField.value, false)) 
       return FB_warnInvalid (theField, iMonth);
    else return true;
}

// Check that string theField.value is a valid Day.
//
function FB_checkDay (theField, emptyOK)
{   if (FB_checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;
    if (!FB_isDay(theField.value, false)) 
       return FB_warnInvalid (theField, iDay);
    else return true;
}

// checkDate (theField, STRING s, emptyOK)
//
function FB_checkDate (theField, s, emptyOK)
{
   if (FB_checkDate.arguments.length == 2) emptyOK = defaultEmptyOK;
   if ((emptyOK == true) && (FB_isEmpty(theField.value))) return true;

   checkERROR = FB_isDate (theField.value);
   var setEMSG = '';

    switch (checkERROR) {
	case "day":
           setEMSG = "\nThe DAY entered is incorrect for the number of days in this month.";
	   return FB_warnInvalid (theField, mPrefix + s + mSuffix + iDate + setEMSG)
	   break;
	case "month":
           setEMSG = "\nThe MONTH entered should be between 1 and 12.";
	   return FB_warnInvalid (theField, mPrefix + s + mSuffix + iDate + setEMSG)
	   break;
	case "year":
           setEMSG = "\nThe YEAR entered is incorrect and should contain the YY or YYYY numeric format.";
	   return FB_warnInvalid (theField, mPrefix + s + mSuffix + iDate + setEMSG)
	   break;
	default:
	   return true;
	   break;
    }
}

function FB_checkPassword (theField, theField2, s) {
	
   if (FB_checkPassword.arguments.length == 3) {
	   if ( theField.value.length < 4 )
		return FB_warnInvalid (theField, mPrefix + theField2 + mSuffix + iPW1);

	   if ( theField.value != theField2.value )
		return FB_warnInvalid (theField2, mPrefix + s + mSuffix + iPW2);
	
	   if ((theField.value == theField2.value) && (theField.value.length > 5))
		return true;

   } else {

	   if ( theField.value.length < 4 )
		return FB_warnInvalid (theField, mPrefix + theField2 + mSuffix + iPW1);
	   else
		return true;

   }
}

// Get checked value from radio button.

function FB_getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}

// Validate credit card info.
//
function FB_checkCreditCardRadio (radio, theField)
{   var cardType = FB_getRadioButtonValue (radio)
    var normalizedCCN = FB_stripCharsInBag(theField.value, creditCardDelimiters)
    if (!FB_isCardMatch(cardType, normalizedCCN)) 
       return FB_warnInvalid (theField, iCreditCardPrefix + cardType + iCreditCardSuffix);
    else 
    {  theField.value = normalizedCCN
       return true
    }
}

// Validate credit card info.
//
function FB_checkCreditCard (cardType, theField)
{
    var validCard = false

    switch (cardType) {
	case "VS":
	   cardType = "VISA";
	   validCard = true;
	   break;
	case "MC":
	   cardType = "MASTERCARD";
	   validCard = true;
	   break;
	case "AX":
	   cardType = "AMERICAN EXPRESS";
	   validCard = true;
	   break;
	case "DC":
	   cardType = "DINERS";
	   validCard = true;
	   break;
	case "CB":
	   cardType = "CARTEBLANCHE";
	   validCard = true;
	   break;
	case "DI":
	   cardType = "DISCOVER";
	   validCard = true;
	   break;
	default:
	   alert('Please enter a valid credit card type');
	   return false;
	   break;
    }

    if (validCard) {

	var normalizedCCN = FB_stripCharsInBag(theField.value, creditCardDelimiters)
	if (!FB_isCardMatch(cardType, normalizedCCN))
     	  	return FB_warnInvalid (theField, iCreditCardPrefix + cardType + iCreditCardSuffix);
    	else 
    	{  
	    theField.value = normalizedCCN;
       	    return true;
    	}
    }
}

function FB_isCreditCard(st) {
  // Encoding only works on cards with less than 19 digits
  // EJM Added Normalized check form space and "-"
  var stNormalizedCCN = FB_stripCharsInBag(st, creditCardDelimiters)
  if (st.length > 19)
    return (false);

  if (st.length < 13)
    return (false);
  
  sum = 0; mul = 1; l = stNormalizedCCN.length;
  for (i = 0; i < l; i++) {
    digit = stNormalizedCCN.substring(l-i-1,l-i);
    tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }


  if ((sum % 10) == 0)
    return (true);
  else
    return (false);

} // END function FB_isCreditCard()


function FB_isVisa(cc)
{
  if (((cc.length == 16) || (cc.length == 13)) &&
      (cc.substring(0,1) == 4))
    return FB_isCreditCard(cc);
  return false;
}  // END function FB_isVisa()


function FB_isMasterCard(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 16) && (firstdig == 5) &&
      ((seconddig >= 1) && (seconddig <= 5)))
    return FB_isCreditCard(cc);
  return false;

} // END function FB_isMasterCard()


function FB_isAmericanExpress(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 15) && (firstdig == 3) &&
      ((seconddig == 4) || (seconddig == 7)))
    return FB_isCreditCard(cc);
  return false;

} // END function FB_isAmericanExpress()


function FB_isDinersClub(cc)
{
  firstdig = cc.substring(0,1);
  seconddig = cc.substring(1,2);
  if ((cc.length == 14) && (firstdig == 3) &&
      ((seconddig == 0) || (seconddig == 6) || (seconddig == 8)))
    return FB_isCreditCard(cc);
  return false;
}


function FB_isCarteBlanche(cc)
{
  return FB_isDinersClub(cc);
}

function FB_isDiscover(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) && (first4digs == "6011"))
    return FB_isCreditCard(cc);
  return false;

} // END function FB_isDiscover()


function FB_isEnRoute(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 15) &&
      ((first4digs == "2014") ||
       (first4digs == "2149")))
    return FB_isCreditCard(cc);
  return false;
}



function FB_isJCB(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) &&
      ((first4digs == "3088") ||
       (first4digs == "3096") ||
       (first4digs == "3112") ||
       (first4digs == "3158") ||
       (first4digs == "3337") ||
       (first4digs == "3528")))
    return FB_isCreditCard(cc);
  return false;

} // END function FB_isJCB()


function FB_isAnyCard(cc)
{
  if (!FB_isCreditCard(cc))
    return false;
  if (!FB_isMasterCard(cc) && !FB_isVisa(cc) && !FB_isAmericanExpress(cc) && !FB_isDinersClub(cc) &&
      !FB_isDiscover(cc) && !FB_isEnRoute(cc) && !FB_isJCB(cc)) {
    return false;
  }
  return true;

} // END function FB_isAnyCard()


function FB_isCardMatch (cardType, cardNumber)
{

	cardType = cardType.toUpperCase();
	var doesMatch = true;

	if ((cardType == "VISA") && (!FB_isVisa(cardNumber)))
		doesMatch = false;
	if ((cardType == "MASTERCARD") && (!FB_isMasterCard(cardNumber)))
		doesMatch = false;
	if ( ( (cardType == "AMERICAN EXPRESS") || (cardType == "AMEX") )
                && (!FB_isAmericanExpress(cardNumber))) doesMatch = false;
	if ((cardType == "DISCOVER") && (!FB_isDiscover(cardNumber)))
		doesMatch = false;
	if ((cardType == "JCB") && (!FB_isJCB(cardNumber)))
		doesMatch = false;
	if ((cardType == "DINERS") && (!FB_isDinersClub(cardNumber)))
		doesMatch = false;
	if ((cardType == "CARTEBLANCHE") && (!FB_isCarteBlanche(cardNumber)))
		doesMatch = false;
	if ((cardType == "ENROUTE") && (!FB_isEnRoute(cardNumber)))
		doesMatch = false;
	return doesMatch;

}  // END function FB_CardMatch()


function FB_IsCC (st) {
    return FB_isCreditCard(st);
}

function FB_IsVisa (cc)  {
  return FB_isVisa(cc);
}

function FB_IsVISA (cc)  {
  return FB_isVisa(cc);
}

function FB_IsMasterCard (cc)  {
  return FB_isMasterCard(cc);
}

function FB_IsMastercard (cc)  {
  return FB_isMasterCard(cc);
}

function FB_IsMC (cc)  {
  return FB_isMasterCard(cc);
}

function FB_IsAmericanExpress (cc)  {
  return FB_isAmericanExpress(cc);
}

function FB_IsAmEx (cc)  {
  return FB_isAmericanExpress(cc);
}

function FB_IsDinersClub (cc)  {
  return FB_isDinersClub(cc);
}

function FB_IsDC (cc)  {
  return FB_isDinersClub(cc);
}

function FB_IsDiners (cc)  {
  return FB_isDinersClub(cc);
}

function FB_IsCarteBlanche (cc)  {
  return FB_isCarteBlanche(cc);
}

function FB_IsCB (cc)  {
  return FB_isCarteBlanche(cc);
}

function FB_IsDiscover (cc)  {
  return FB_isDiscover(cc);
}

function FB_IsEnRoute (cc)  {
  return FB_isEnRoute(cc);
}

function FB_IsenRoute (cc)  {
  return FB_isEnRoute(cc);
}

function FB_IsJCB (cc)  {
  return FB_isJCB(cc);
}

function FB_IsAnyCard(cc)  {
  return FB_isAnyCard(cc);
}

function FB_IsCardMatch (cardType, cardNumber)  {
  return FB_isCardMatch (cardType, cardNumber);
}
document.write('<scr'+'ipt language="Javascript" src="common_images/scripts/calendar.js"></scr'+'ipt>');