var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var decimalPointDelimiter = "."
var phoneNumberDelimiters = "()- ";
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 = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."
var sLastName = "Last Name"
var sFirstName = "First Name"
var sEmployer = "Employer"
var sAddress = "Address"
var sCity = "City"
var sStateCode = "State Code"
var sWorldState = "State, or Province"
var sCountry = "Country"
var sZIPCode = "ZIP Code"
var sWorldPostalCode = "Postal Code"
var sResPhone = "Residential Phone Number"
var sBusPhone = "Business Phone Number"
var sFax = "Fax Number"
var sEmail = "Email"
var sDependents = "Dependents"
var sOccupation = "Occupation"
var sTakeHomePay = "Take Home Pay"
var sSpsLastName = "Spouse Last Name"
var sSpsFirstName = "Spouse First Name"
var sSpsEmployer = "Spouse Employer"
var sSpsBusPhone = "Spouse Business Phone Number"
var sSpsOccupation = "Spouse Occupation"
var sSpsTakeHomePay = "Spouse Take Home Pay"
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	iZIPCode4 = "This field must be 4 digits (like 3489). 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 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 foo@bar.com). Please reenter it now."
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. (Click the link on this form to see a list of sample numbers.) 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 iYear4Digit = "This field must be a 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 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 foo@bar.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) {
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;
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"
function isEmpty(s)
{   return ((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 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);
}
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 isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;
if (isPositiveInteger.arguments.length > 1)
secondArg = isPositiveInteger.arguments[1];
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];
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];
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];
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;
for (i = 0; i < s.length; i++)
{
var c = s.charAt(i);
if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
else if (!isDigit(c)) return false;
}
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];
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);
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 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);
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 isYear4Digit (s)
{   if (isEmpty(s))
if (isYear4Digit.arguments.length == 1) return defaultEmptyOK;
else return (isYear4Digit.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);
if (s.charAt(0) == "0")
s = s.substr(1);
return isIntegerInRange (s, 1, 12);
}
function isDay (s)
{   if (isEmpty(s))
if (isDay.arguments.length == 1) return defaultEmptyOK;
else return (isDay.arguments[1] == true);
if (s.charAt(0) == "0")
s = s.substr(1);
return isIntegerInRange (s, 1, 31);
}
function daysInFebruary (year)
{   // February has 29 days in any year evenly divisible by four,
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;
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)
{   theField.focus()
alert(mPrefix + s + mSuffix)
return false
}
function warnUnchecked (radio, s)
{
var mPrefix = "You did not choose a selection for the "
var mSuffix = " radio button. This is a required field. Please enter it now."
radio[0].focus();
alert(mPrefix + s + mSuffix);
return false;
}
function warnInvalid (theField, s)
{   theField.focus()
theField.select()
alert(s)
return false
}
/* FUNCTIONS TO INTERACTIVELY CHECK VARIOUS FIELDS. */
function checkSelectNoZeroIndex(theField,s)
{
if (theField.selectedIndex != 0)
return true;
return warnEmpty (theField, s);
}
function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
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 checkNonnegativeInteger (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
if (checkNonnegativeInteger.arguments.length == 2) emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value))) return true;
if (!isNonnegativeInteger(theField.value))
return warnInvalid (theField, "Please enter a non-negative integer value for the " + s + " field.");
else return true;
}
function checkDropdown(theField, s, emptyOK)
{
if (checkDropdown.arguments.length == 2)
emptyOK = defaultEmptyOK;
var choice = 0;
choice = theField.selectedIndex;
if ( (emptyOK == true) && (choice == 0) )
return true;
if ( choice == 0 )
return warnEmpty (theField, s);
else return true;
}
function checkCurrency(theField, s, emptyOK)
{
if (checkCurrency.arguments.length == 2)
emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value)))
return true;
var stripped;
stripped = stripCharsInBag(theField.value, "$,")
if (!isFloat(stripped))
return warnInvalid (theField, "Please enter a valid currency value for the " + s + " field.");
else
{
theField.value = stripped;
return true;
}
}
function checkMoney(theField, s, emptyOK)
{
if (checkMoney.arguments.length == 2)
emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value)))
return true;
var stripped;
stripped = stripCharsInBag(theField.value, ",")
if ( !isFloat(stripped) )
return warnInvalid (theField, "Please enter a valid amount for the " + s + " field.");
else return true;
}
function checkFloat(theField, s, emptyOK)
{
if (checkFloat.arguments.length == 2)
emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value)))
return true;
if ( !isFloat(theField.value) )
return warnInvalid (theField, "Please enter a valid amount for the " + s + " field.");
else return true;
}
function checkNumeric(theField, s, emptyOK)
{
if (checkNumeric.arguments.length == 2)
emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value)))
return true;
if (!isInteger(theField.value))
return warnInvalid (theField, "Please enter a valid numeric value for " + s);
else
{
return true;
}
}
function checkNumericLength(theField, s, len, emptyOK)
{
if (checkNumericLength.arguments.length == 3)
emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value)))
return true;
var strVal = new String(theField.value);
if (!isInteger(strVal))
return warnInvalid (theField, "Please enter a valid numeric value for " + s);
else if (strVal.length != len)
{
return warnInvalid (theField, "Please enter " + len + " numeric characters for " + s);
}
else
{
return true;
}
}
function checkSelected(theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
if (checkSelected.arguments.length == 2)
emptyOK = defaultEmptyOK;
var iIndex;
iIndex = parseInt( theField.selectedIndex );
if ( emptyOK == true ) //&& iIndex > 0)
return true;
if (iIndex == 0)
{
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 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
{  // if you don't want to insert a hyphen, comment next line out
return true;
}
}
}
function checkZIPCode4 (theField, emptyOK)
{   if (checkZIPCode4.arguments.length == 1) emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value))) return true;
else
{
var strValue = new String(theField.value)
if (!isInteger(strValue) || strValue.length != 4)
return warnInvalid(theField, iZIPCode4);
else
return true;
}
}
function reformatUSPhone (USPhone)
{   //return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
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 checkYear4Digit (theField, emptyOK)
{   if (checkYear4Digit.arguments.length == 1) emptyOK = defaultEmptyOK;
if ((emptyOK == true) && (isEmpty(theField.value))) return true;
if (!isYear4Digit(theField.value, false))
return warnInvalid (theField, iYear4Digit);
else return true;
}
function checkMonth (theField, emptyOK, zeroOK)
{   if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
if (checkMonth.arguments.length == 2) zeroOK = false;
if ((emptyOK == true) && (isEmpty(theField.value))) return true;
if (zeroOK == true && theField.value == "0")
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
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 checkRadioButtonChecked(radio, s, emptyOK)
{
if (checkRadioButtonChecked.arguments.length == 2)
emptyOK = defaultEmptyOK;
for (var i = 0; i < radio.length; i++)
{
if (radio[i].checked)
{
return true;
}
}
if (emptyOK == true)
return true;
return warnUnchecked (radio, s);
}
function checkRadioButtonChecked2(radio, s, emptyOK)
{
if (checkRadioButtonChecked2.arguments.length == 2)
emptyOK = defaultEmptyOK;
for (var i = 0; i < radio.length; i++)
{
if (radio[i].checked)
{
return true;
}
}
if (emptyOK == true)
return true;
alert(s)
return false;
}
function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
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 getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
{   if (radio[i].checked) { break }
}
return radio[i].value
}
function checkCreditCard (radio, theField)
{   var cardType = getRadioButtonValue (radio)
var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
if (!isCardMatch(cardType, normalizedCCN))
return warnInvalid (theField, iCreditCardPrefix + cardType + iCreditCardSuffix);
else
{  theField.value = normalizedCCN
return true
}
}
/*  ================================================================
Credit card verification functions
Originally included as Starter Application 1.0.0 in LivePayment.
20 Feb 1997 modified by egk:
changed naming convention to initial lowercase
(isMasterCard instead of IsMasterCard, etc.)
changed isCC to isCreditCard
retained functions named with older conventions from
LivePayment as stub functions for backward
compatibility only
added "AMERICANEXPRESS" as equivalent of "AMEX"
for naming consistency
================================================================ */
/*  ================================================================
FUNCTION:  isCreditCard(st)
INPUT:     st - a string representing a credit card number
RETURNS:  true, if the credit card number passes the Luhn Mod-10
test.
false, otherwise
================================================================ */
function isCreditCard(st) {
if (st.length > 19)
return (false);
sum = 0; mul = 1; l = st.length;
for (i = 0; i < l; i++) {
digit = st.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 isCreditCard()
/*  ================================================================
FUNCTION:  isVisa()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid VISA number.
false, otherwise
Sample number: 4111 1111 1111 1111 (16 digits)
================================================================ */
function isVisa(cc)
{
if (((cc.length == 16) || (cc.length == 13)) &&
(cc.substring(0,1) == 4))
return isCreditCard(cc);
return false;
}  // END FUNCTION isVisa()
/*  ================================================================
FUNCTION:  isMasterCard()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid MasterCard
number.
false, otherwise
Sample number: 5500 0000 0000 0004 (16 digits)
================================================================ */
function isMasterCard(cc)
{
firstdig = cc.substring(0,1);
seconddig = cc.substring(1,2);
if ((cc.length == 16) && (firstdig == 5) &&
((seconddig >= 1) && (seconddig <= 5)))
return isCreditCard(cc);
return false;
} // END FUNCTION isMasterCard()
/*  ================================================================
FUNCTION:  isAmericanExpress()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid American
Express number.
false, otherwise
Sample number: 340000000000009 (15 digits)
================================================================ */
function isAmericanExpress(cc)
{
firstdig = cc.substring(0,1);
seconddig = cc.substring(1,2);
if ((cc.length == 15) && (firstdig == 3) &&
((seconddig == 4) || (seconddig == 7)))
return isCreditCard(cc);
return false;
} // END FUNCTION isAmericanExpress()
/*  ================================================================
FUNCTION:  isDinersClub()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid Diner's
Club number.
false, otherwise
Sample number: 30000000000004 (14 digits)
================================================================ */
function 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 isCreditCard(cc);
return false;
}
/*  ================================================================
FUNCTION:  isCarteBlanche()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid Carte
Blanche number.
false, otherwise
================================================================ */
function isCarteBlanche(cc)
{
return isDinersClub(cc);
}
/*  ================================================================
FUNCTION:  isDiscover()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid Discover
card number.
false, otherwise
Sample number: 6011000000000004 (16 digits)
================================================================ */
function isDiscover(cc)
{
first4digs = cc.substring(0,4);
if ((cc.length == 16) && (first4digs == "6011"))
return isCreditCard(cc);
return false;
} // END FUNCTION isDiscover()
/*  ================================================================
FUNCTION:  isEnRoute()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid enRoute
card number.
false, otherwise
Sample number: 201400000000009 (15 digits)
================================================================ */
function isEnRoute(cc)
{
first4digs = cc.substring(0,4);
if ((cc.length == 15) &&
((first4digs == "2014") ||
(first4digs == "2149")))
return isCreditCard(cc);
return false;
}
/*  ================================================================
FUNCTION:  isJCB()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is a valid JCB
card number.
false, otherwise
================================================================ */
function isJCB(cc)
{
first4digs = cc.substring(0,4);
if ((cc.length == 16) &&
((first4digs == "3088") ||
(first4digs == "3096") ||
(first4digs == "3112") ||
(first4digs == "3158") ||
(first4digs == "3337") ||
(first4digs == "3528")))
return isCreditCard(cc);
return false;
} // END FUNCTION isJCB()
/*  ================================================================
FUNCTION:  isAnyCard()
INPUT:     cc - a string representing a credit card number
RETURNS:  true, if the credit card number is any valid credit
card number for any of the accepted card types.
false, otherwise
================================================================ */
function isAnyCard(cc)
{
if (!isCreditCard(cc))
return false;
if (!isMasterCard(cc) && !isVisa(cc) && !isAmericanExpress(cc) && !isDinersClub(cc) &&
!isDiscover(cc) && !isEnRoute(cc) && !isJCB(cc)) {
return false;
}
return true;
} // END FUNCTION isAnyCard()
/*  ================================================================
FUNCTION:  isCardMatch()
INPUT:    cardType - a string representing the credit card type
cardNumber - a string representing a credit card number
RETURNS:  true, if the credit card number is valid for the particular
credit card type given in "cardType".
false, otherwise
================================================================ */
function isCardMatch (cardType, cardNumber)
{
cardType = cardType.toUpperCase();
var doesMatch = true;
if ((cardType == "VISA") && (!isVisa(cardNumber)))
doesMatch = false;
if ((cardType == "MASTERCARD") && (!isMasterCard(cardNumber)))
doesMatch = false;
if ( ( (cardType == "AMERICANEXPRESS") || (cardType == "AMEX") )
&& (!isAmericanExpress(cardNumber))) doesMatch = false;
if ((cardType == "DISCOVER") && (!isDiscover(cardNumber)))
doesMatch = false;
if ((cardType == "JCB") && (!isJCB(cardNumber)))
doesMatch = false;
if ((cardType == "DINERS") && (!isDinersClub(cardNumber)))
doesMatch = false;
if ((cardType == "CARTEBLANCHE") && (!isCarteBlanche(cardNumber)))
doesMatch = false;
if ((cardType == "ENROUTE") && (!isEnRoute(cardNumber)))
doesMatch = false;
return doesMatch;
}  // END FUNCTION CardMatch()
/*  ================================================================
The below stub functions are retained for backward compatibility
with the original LivePayment code so that it should be possible
in principle to swap in this new module as a replacement for the
older module without breaking existing code.  (There are no
guarantees, of course, but it should work.)
When writing new code, do not use these stub functions; use the
functions defined above.
================================================================ */
function IsCC (st) {
return isCreditCard(st);
}
function IsVisa (cc)  {
return isVisa(cc);
}
function IsVISA (cc)  {
return isVisa(cc);
}
function IsMasterCard (cc)  {
return isMasterCard(cc);
}
function IsMastercard (cc)  {
return isMasterCard(cc);
}
function IsMC (cc)  {
return isMasterCard(cc);
}
function IsAmericanExpress (cc)  {
return isAmericanExpress(cc);
}
function IsAmEx (cc)  {
return isAmericanExpress(cc);
}
function IsDinersClub (cc)  {
return isDinersClub(cc);
}
function IsDC (cc)  {
return isDinersClub(cc);
}
function IsDiners (cc)  {
return isDinersClub(cc);
}
function IsCarteBlanche (cc)  {
return isCarteBlanche(cc);
}
function IsCB (cc)  {
return isCarteBlanche(cc);
}
function IsDiscover (cc)  {
return isDiscover(cc);
}
function IsEnRoute (cc)  {
return isEnRoute(cc);
}
function IsenRoute (cc)  {
return isEnRoute(cc);
}
function IsJCB (cc)  {
return isJCB(cc);
}
function IsAnyCard(cc)  {
return isAnyCard(cc);
}
function IsCardMatch (cardType, cardNumber)  {
return isCardMatch (cardType, cardNumber);
}

