// FormChek.js
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

// whitespace characters
var whitespace = " \t\n\r";

// decimal point character differs by language and culture
var decimalPointDelimiter = "."

// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";

// characters which are allowed in US phone numbers
var validUSPhoneChars = digits + phoneNumberDelimiters;

// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";

// non-digit characters which are allowed in 
// Social Security Numbers
var SSNDelimiters = "- ";

// characters which are allowed in Social Security Numbers
var validSSNChars = digits + SSNDelimiters;

// U.S. Social Security Numbers have 9 digits.
// They are formatted as 123-45-6789.
var digitsInSocialSecurityNumber = 9;

// U.S. phone numbers have 10 digits.
// They are formatted as 123 456 7890 or (123) 456-7890.
var digitsInUSPhoneNumber = 10;

// non-digit characters which are allowed in ZIP Codes
var ZIPCodeDelimiters = "-";

// our preferred delimiter for reformatting ZIP Codes
var ZIPCodeDelimeter = "-"

// characters which are allowed in Social Security Numbers
var validZIPCodeChars = digits + ZIPCodeDelimiters

// U.S. ZIP codes have 5 or 9 digits.
// They are formatted as 12345 or 12345-6789.
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9

// non-digit characters which are allowed in credit card numbers
var creditCardDelimiters = " "


// CONSTANT STRING DECLARATIONS
// (grouped for ease of translation and localization)

// m is an abbreviation for "missing"

var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."

// s is an abbreviation for "string"

var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sTitle = "Title"
var sCompanyName = "Company Name"
var sUSAddress = "Street Address"
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 = "Zip or 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 sOtherInfo = "Other Information"




// i is an abbreviation for "invalid"

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) or a valid International Postal Code."
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please reenter it now."
var iWorldPhone = "This field must be a valid international phone number. Please reenter it now."
var iSSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please reenter it now."
var iEmail = "This field must be a valid email address (like jsmith@yahoo.com). Please reenter it now."
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. 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 iDatePrefix = "The Day, Month, and Year for "
var iDateSuffix = " do not form a valid date.  Please reenter them now."
var iContractAccept = "You must agree to the terms of the Product Sales Agreement by checking the box before placing your order.  If you do not accept the terms then you may not purchase our software."

var iRadio = "You must click a selection on the radio button for: "
var iSelectionList = "You must make a selection on the list for: "


// p is an abbreviation for "prompt"

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 pWorldPhone = "international phone number."
var pSSN = "9 digit U.S. social security number (like 123 45 6789)."
var pEmail = "valid email address (like jsmith@yahoo.com)."
var pCreditCard = "valid credit card number."
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 defaultEmptyOK = false

function makeArray(n) {
//*** BUG: If I put this line in, I get two error messages:
//(1) Window.length can't be set by assignment
//(2) daysInMonth has no property indexed by 4
//If I leave it out, the code works fine.
//   this.length = n;
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this
}

var daysInMonth = 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;

// Valid U.S. Postal Codes for states, territories, armed forces, etc.
// See http://www.usps.gov/ncsc/lookups/abbr_state.txt.
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"

// Check whether string s is empty.
function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

// Returns true if string s is empty or 
// whitespace characters only.
function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}



// Removes all characters which appear in string bag from string s.

function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to 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;
}



// Removes all characters which do NOT appear in string bag 
// from string s.

function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is in bag, append to 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;
}



// Removes all whitespace characters from s.
// Global variable whitespace (see above)
// defines which characters are considered whitespace.

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
}



// Removes initial (leading) whitespace characters from s.
// Global variable whitespace (see above)
// defines which characters are considered whitespace.

function stripInitialWhitespace (s)

{   var i = 0;

    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;
    
    return s.substring (i, s.length);
}


function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}


// Returns true if character c is a digit 
// (0 .. 9).
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// Returns true if character c is a letter or digit.
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);

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    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];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;    
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}

function isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a positive, not negative, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}

function isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number >= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}


function isNegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNegativeInteger.arguments.length > 1)
        secondArg = isNegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a negative, not positive, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}

function isNonpositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonpositiveInteger.arguments.length > 1)
        secondArg = isNonpositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number <= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}

function isFloat (s)

{   var i;
    var seenDecimalPoint = false;

    if (isEmpty(s)) 
       if (isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) 
seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

function isSignedFloat (s)

{   if (isEmpty(s)) 
       if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedFloat.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (isSignedFloat.arguments.length > 1)
            secondArg = isSignedFloat.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;    
        return (isFloat(s.substring(startPos, s.length), secondArg))
    }
}

function isAlphabetic (s)

{   var i;

    if (isEmpty(s)) 
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-alphabetic character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is letter.
        var c = s.charAt(i);

        if (!isLetter(c))
        return false;
    }

    // All characters are letters.
    return true;
}




function isAlphanumeric (s)

{   var i;

    if (isEmpty(s)) 
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-alphanumeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number or letter.
        var c = s.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }

    // All characters are numbers or letters.
    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 isInternationalPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isInternationalPhoneNumber.arguments[1] == true);
    return (isPositiveInteger(s))
}

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);
   
    // is s whitespace?
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    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 isIntegerInRange (s, a, b)
{   if (isEmpty(s)) 
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);

    // Catch non-integer strings to avoid creating a NaN below,
    // which isn't available on JavaScript 1.0 for Windows.
    if (!isInteger(s, false)) return false;

    // Now, explicitly change the type to integer via parseInt
    // so that the comparison code below will work both on 
    // JavaScript 1.2 (which typechecks in equality comparisons)
    // and JavaScript 1.1 and before (which doesn't).
    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)
{   // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (year, month, day)
{   // catch invalid years (not 2- or 4-digit) and invalid months and days.
    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    // Explicitly change type to integer to make code work in both
    // JavaScript 1.1 and JavaScript 1.2.
    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);

    // catch invalid days, except for February
    if (intDay > daysInMonth[intMonth]) return false; 

    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}

function prompt (s)
{   window.status = s
}
function promptEntry (s)
{   window.status = pEntryPrompt + s
}

function warnEmpty (theField, s)
{
	// this check found on web still fails on hidden field

	//if(theField.focus) {
	//	theField.focus()
	//}
	if (theField.type == "text") {
		theField.focus()
    	theField.select()
	}
    alert(mPrefix + s + mSuffix)
    return false
}

function warnInvalid (theField, s)
{   
	// alert ("warninvalid theField name = " +  theField.name)
    //theField.focus()
	if (theField.type == "text") {
		theField.focus()
    		theField.select()
	}
	//if (theField.type == "select-one") {
	//	theField.focus()
	//}

	
    alert(s)
    return false
}


function selectScroller(n) {
optlist = document.scrollform.scroller;
optlist[optlist.length] = new Option(optlist[0].text, "", false, false);
optlist[0] = null;
optlist.selectedIndex = -1;
n = (n + 1) % optlist.length;
// change the speed below: 1000 = 1 second.
setTimeout("selectScroller("+n+")",2000);
}


function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    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 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 checkStateCodeSelectList (theField, emptyOK)
{   

//alert("checkStateCodeSelectList selected=" + theField.selectedIndex)
if(theField.selectedIndex != -1) { // otherwise if nothing selected it throws an error in IE
    if (theField.options[theField.selectedIndex].value.length > 1) { return true;
    } else
    {  
//alert("checkStateCodeSelectList 1")
          return warnInvalid (theField, iStateCode);

    }
} else 
    {  
//alert("checkStateCodeSelectList 2")
          return warnInvalid (theField, iStateCode);

    }

}

function reformatZIPCode (ZIPString) 
{   if (ZIPString.length == 5) return ZIPString;
    else return (reformat (ZIPString, "", 5, "-", 4));
}


function checkZIPCode (theField, emptyOK)
{ 

	//alert("entering checkZip ...")
  if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    { //var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (isEmpty(theField.value)) 
         return warnInvalid (theField, iZIPCode);
      else 
      {  // if you don't want to insert a hyphen, comment next line out
         //theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}

// this one fails on international postal codes
function checkZIPCodeOLD (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 
      {  // if you don't want to insert a hyphen, comment next line out
         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 
       {  // if you don't want to reformat as (123) 456-789, comment next line out
          theField.value = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}




function checkInternationalPhone (theField, emptyOK)
{   if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  if (!isInternationalPhoneNumber(theField.value, false)) 
          return warnInvalid (theField, iWorldPhone);
       else 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 
       {  // if you don't want to reformats as 123-456-7890, comment next line out
          theField.value = reformatSSN(normalizedSSN)
          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)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    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 getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}

function checkRadioButton(btnRadio,addText) {
    var cnt = -1;
    for (var i=btnRadio.length-1; i > -1; i--) {
        if (btnRadio[i].checked) {cnt = i; i = -1;}
    }
    if (cnt > -1) return true; // use  btnRadio[cnt].value if you want the value
    else return (warnInvalid (btnRadio, iRadio + addText));
}

function checkSelectList (theList, addedText)
{   
	//alert ("selectedindex is <" + theList.selectedIndex + ">")
    if (theList.selectedIndex <= 0) return warnInvalid (theList, iSelectionList + addedText); // that means nothing or "please select" is selected
    else
    {  
          return true;

    }
} 

function compFields(form) {

  var aa,bb;
  aa = form.Contact0Email.value;
  bb = form.Contact0EmailValidate.value;
  if ((aa=="") || (bb=="")) { return true; }
  if (aa!=bb) {
    alert("Email and email check fields should match.  Please double check that your email doesn't have a typo.");
    form.Contact0Email.focus();
    return false;
  }
  return true;
}

function validateSurvey(form)
{   
	//alert ("in validateUS last=" + form.elements["Contact0LastName"].value)
	//alert ("validate province=[" + form.elements["province"].value + "]")
	
   return (
      checkString(form.elements["Contact0FirstName"],sUSFirstName) &&
      checkString(form.elements["Contact0LastName"],sUSLastName) &&
      checkEmail(form.elements["Contact0Email"]) &&
      checkEmail(form.elements["Contact0EmailValidate"]) &&
      checkString(form.elements["Contact0StreetAddress1"],sUSAddress) &&
      checkString(form.elements["Contact0City"],sCity) &&
      checkStateCodeSelectList(form.elements["Contact0State"]) &&
      checkSelectList(form.elements["Contact0ContactType"],"Job Position") &&
      checkSelectList(form.elements["Contact0OwnerID"],"Representative") &&
      checkRadioButton(form.elements["Contact0_IsthismyfirstTraining"],"Is it your first Training?") &&
      checkSelectList(form.elements["Contact0_HowmanyTrainingshaveIbeento"],"How many Trainings have you been to?") &&
      checkSelectList(form.elements["Contact0_WhatclassdidItake"],"What class did I take?") &&
      checkSelectList(form.elements["Contact0_Whotaughtmyclass0"],"Who taught my class?") &&
      checkString(form.elements["Contact0_Hours"],"Hours") &&
      checkRadioButton(form.elements["Contact0_OverallRating"],"Overall Rating") &&
      checkRadioButton(form.elements["Contact0_ContentwaswhatIexpected"],"Content what you expected") &&
      checkRadioButton(form.elements["Contact0_DirectlyApplicabletomyjob"],"Directly Applicable to your job") &&
      checkRadioButton(form.elements["Contact0_Organizationofthematerial"],"Organization of the material") &&
      checkRadioButton(form.elements["Contact0_Ifoundvalueintheresourcematerial"],"I found value in the resource material") &&
      checkRadioButton(form.elements["Contact0_OverallRatingoftheInstructor"],"Overall Rating of the Instructor") &&
      checkRadioButton(form.elements["Contact0_InstructordemonstratedKnowledgeofthesoftware"],"Instructor demonstrated Knowledge of the software") &&
      checkRadioButton(form.elements["Contact0_InstructorsPresentation"],"Instructors Presentation") &&
      checkRadioButton(form.elements["Contact0_Iwasfullypresentandactivelyparticipated"],"I was fully present and actively participated") 

   )


	//DISABLED CHECKS
      		//checkString(form.elements["zip"],sZIPCode) &&  // -> fails on international transactions like Canada
      //checkZIPCode(form.elements["zip"]) &&  // -> fails on international transactions like Canada
      //checkUSPhone(form.elements["phone"], true) &&
      		// checkUSPhone(form.elements["fax"], true) &&
      //checkContractAcceptance(form.elements["I_agree_to_contract"])


   
}

function submitSurvey (form) {

//alert("Submit was called");

	document.SURVEY.submit();
}


inState="";
inCity="";

function getSearchUrl(theForm) {

	var str="http://www.backbonecommunications.com/cgi-bin/bbone-get-schools.pl?"
	//alert("City=" + theForm.Contact0City.value + " State=" + theForm.Contact0State.value)
	if (theForm.Contact0_SchoolName.value) {
		str = str + "&school=" + escape(theForm.Contact0_SchoolName.value)
	}
	if (theForm.Contact0City.value) {
		str = str + "&city=" + escape(theForm.Contact0City.value)
	}
	if (theForm.Contact0State.value) {
		str = str + "&state=" + escape(theForm.Contact0State.value)
	}
	if (theForm.Contact0StreetAddress1.value) {
		str = str + "&street=" + escape(theForm.Contact0StreetAddress1.value)
	}
	
	return str;

}

// SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
function setSchoolNameField(nameField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    nameFieldObj = nameField;

    // GET THE VALUE OF THE INCOMING FIELD
    inName = nameField.value;

}

function setAddressField(addrField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    addrFieldObj = addrField;

    // GET THE VALUE OF THE INCOMING FIELD
    inAddress = addrField.value;

}

function setCityField(cityField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    cityFieldObj = cityField;
}
function setStateField(stateField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    stateFieldObj = stateField;

    // GET THE VALUE OF THE INCOMING FIELD
    inState = stateField.value;

}
function setCompanyField(companyField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    companyFieldObj = companyField;

    // GET THE VALUE OF THE INCOMING FIELD
    inCompany = companyField.value;

}
function setZipcodeField(zipcodeField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    zipcodeFieldObj = zipcodeField;

    // GET THE VALUE OF THE INCOMING FIELD
    inZipcode = zipcodeField.value;

}

function setContactField(contactField) {

    // ASSIGN THE INCOMING FIELD OBJECT TO A GLOBAL VARIABLE
    contactFieldObj = contactField;

    // GET THE VALUE OF THE INCOMING FIELD
    inContact = contactField.value;

}
// SET THE INITIAL VALUE OF THE GLOBAL DATE FIELD
function returnSchool(outName,outAddress,outCity,outState,outZipcode,outId,outContactId) {

    // SET THE VALUE OF THE FIELD THAT WAS PASSED TO THE POP-UP
     nameFieldObj.value = outName;
     addrFieldObj.value = outAddress;
     cityFieldObj.value = outCity;
     stateFieldObj.value = outState;
     zipcodeFieldObj.value = outZipcode;
     companyFieldObj.value = outId;
     contactFieldObj.value = outContactId;

    // GIVE FOCUS BACK TO THE  FIELD
     nameFieldObj.focus();

    // CLOSE THE  WINDOW
    top.newWin.close()

    // set mailto link for bad addresses
    setmailto(document.forms[2])

}

function processMail(theForm) {


	with (document.SURVEY) {

	action = "mailto:" + part1 + "@" + part2 + "?subject=" + subjstr;

	} // end with

} // end function

function setmailto(theForm) {
var part1="info"
var part2="backbonecommunications.com"
var addrstr= theForm.Contact0_SchoolName.value + " - " + theForm.Contact0StreetAddress1.value + " " +  theForm.Contact0City.value + " - " + theForm.Contact0Zipcode.value
var subjstr= "Update School Address: " + addrstr
var htmlstr= "School Address: " + addrstr

var x = document.getElementById('surveyTable').rows[0].cells;
x[0].innerHTML = htmlstr;

x = document.getElementById('surveyTable').rows[1].cells;
x[0].innerHTML = "<a href=mailto:" + part1 + "@" + part2 + "?subject=" + escape(subjstr) + ">Click here to notify us if above address is incorrect</a>";
//alert (x[0].innerHTML);
return ;
}


function verify(theForm) {
var themessage = "You are required to complete the following fields: ";
if (theForm.Contact0_SchoolName.value=="") {
themessage = themessage + "\n - School Name";
}
if (theForm.Contact0StreetAddress1.value=="") {
themessage = themessage + "\n - School Street Address";
}
if (theForm.Contact0City.value=="") {
themessage = themessage + "\n - School City";
}
if (theForm.Contact0State.value=="") {
themessage = themessage + "\n - School State";
}
if (theForm.Contact0FirstName.value=="") {
themessage = themessage + "\n - First Name";
}
if (theForm.Contact0LastName.value=="") {
themessage = themessage + "\n - Last Name";
}
if (theForm.Contact0Email.value=="") {
themessage = themessage + "\n - E-mail";
}
if (theForm.Contact0ContactType.value=="") {
themessage = themessage + "\n - Job Position";
}
if (theForm.Contact0OwnerID.value=="") {
themessage = themessage + "\n - Representative";
}
if (NoneWithCheck(theForm.Contact0_IsthismyfirstTraining)) {
themessage = themessage + "\n - Survey: First Training";
}
if (WithoutSelectionValue(theForm.Contact0_HowmanyTrainingshaveIbeento)) {
themessage = themessage + "\n - Survey: Number of Trainings";
}
if (WithoutSelectionValue(theForm.Contact0_WhatclassdidItake)) {
themessage = themessage + "\n - Survey: What Class You Took";
}
if (WithoutSelectionValue(theForm.Contact0_Whotaughtmyclass0)) {
themessage = themessage + "\n - Survey: Who Taught Class";
}
if (theForm.Contact0_Hours.value=="") {
themessage = themessage + "\n - Survey: Number of Hours";
}
if (WithoutContent(theForm.Contact0_Howdoyouplantousetheinformationpresentedinthissession.value)) {
themessage = themessage + "\n - Survey: How Will You Use the Info";
}
if (WithoutContent(theForm.Contact0_TheinformationIfoundmostusefulwas0.value)) {
themessage = themessage + "\n - Survey: Info Found Most Useful";
}
if (WithoutContent(theForm.Contact0_WhatIwishIwouldhavelearnedfromtheprogramwas.value)) {
themessage = themessage + "\n - Survey: What I Wish I Had Learned";
}
if (NoneWithCheck(theForm.Contact0_OverallRating)) {
themessage = themessage + "\n - Survey: Overall Rating";
}
if (NoneWithCheck(theForm.Contact0_ContentwaswhatIexpected)) {
themessage = themessage + "\n - Survey: Contact What I Expected";
}
if (NoneWithCheck(theForm.Contact0_DirectlyApplicabletomyjob)) {
themessage = themessage + "\n - Survey: Applicable to My Job";
}
if (NoneWithCheck(theForm.Contact0_Organizationofthematerial)) {
themessage = themessage + "\n - Survey: Organization of Material";
}
if (NoneWithCheck(theForm.Contact0_Ifoundvalueintheresourcematerial)) {
themessage = themessage + "\n - Survey: Value of Resource Material";
}
if (NoneWithCheck(theForm.Contact0_OverallRatingoftheInstructor)) {
themessage = themessage + "\n - Survey: Overall Rating of Instructor";
}
if (NoneWithCheck(theForm.Contact0_InstructordemonstratedKnowledgeofthesoftware)) {
themessage = themessage + "\n - Survey: Instructor Knowledge of Software";
}
if (NoneWithCheck(theForm.Contact0_InstructorsPresentation)) {
themessage = themessage + "\n - Survey: Instructor Presentation";
}
if (NoneWithCheck(theForm.Contact0_Iwasfullypresentandactivelyparticipated)) {
themessage = themessage + "\n - Survey: I was Present and Active";
}

//alert if fields are empty and cancel form submit
if (themessage == "You are required to complete the following fields: ") {
theForm.submit();
}
else {
alert(themessage);
return false;
   }
}

function WithoutContent(ss) {
if(ss.length > 0) { return false; }
return true;
}

function NoneWithContent(ss) {
for(var i = 0; i < ss.length; i++) {
	if(ss[i].value.length > 0) { return false; }
	}
return true;
}

function NoneWithCheck(ss) {
for(var i = 0; i < ss.length; i++) {
	if(ss[i].checked) { return false; }
	}
return true;
}

function WithoutCheck(ss) {
if(ss.checked) { return false; }
return true;
}

function WithoutSelectionValue(ss) {
for(var i = 0; i < ss.length; i++) {
	if(ss[i].selected) {
		if(ss[i].value.length) { return false; }
		}
	}
return true;
}

