//FormCheck.js
//author: various
//purpose: functions used for client side form validation
//last updated 4/19/04
//
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var alwaysinvalidstrchars = "\"";
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 sContactID = "Contact ID"
var sContactType = "Contact Type"
var sCompanyID = "Company ID"
var sCompanyName = "Company Name"
var sBranch = "Company Branch Name"
var sDefaultForm = "Default Form"
var sSecurityLevel = "Security Level"
var sPIN = "PIN Number"
var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sTitle = "Title"
var sUSAddress = "Street Address"
var sWorldAddress = "Address"
var sCity = "City"
var sCounty = "County"
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 sUSFax = "Fax Number"
var sDateOfBirth = "Date of Birth"
var sFromDate = "From Date (MM/DD/YYYY)"
var sToDate = "To Date (MM/DD/YYYY)"
var sExpirationDate = "Expiration Date"
var sEmail = "E-mail Address"
var sSSN = "Social Security Number"
var sCreditCardNumber = "Credit Card Number"
var sOtherInfo = "Other Information"
var sComments = "Comments"

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 75248-1234). Please reenter it now."
var iZIPCodeShort = "This field must be a 5 digit U.S. ZIP Code (like 94043). Please reenter it now."
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please reenter it now."
var 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 e-mail address (like me@abc.com). Please reenter it now."
var iLoginID = "This field must be a valid Login ID consisting of English Letters and Numbers only and must be at least 6 characters long. Please reenter it now."
var iNumber = "This field must consist of positive numbers only. Please reenter it now."
var iCompanyID = "This field must be a valid Company ID consisting of Numbers only. Please reenter it now."
var iPIN = "This field must be a valid PIN number consisting of English Letters and Numbers only and must be at least 6 characters long. 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 iDate = "This field must be a valid date (like 1/1/2003).  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 iZIPRange = "You have entered an invalid zip code format. Please refer to the paragraph above the Zipcode(s) field for valid formats."
var iStatus = "This field must be an 'I' for Inactive or empty for Active."

var pEntryPrompt = "Please enter "
var pContactID = "a Contact ID number."
var pContactType = "a Contact Type."
var pCompanyID = "a Company ID number."
var pSecurityLevel = "a Security Level."
var pUSLastName = "a Last Name."
var pUSFirstName = "a First Name."
var pCompanyName = "a Company Name."
var pBranch = "a Company Branch Name."
var pTitle = "a Title."
var pPosition = "a Business Position."
var pUSAddress = "a Street Address."
var pCity = "a City."
var pCounty = "a County."
var pStateCode = "a 2 character State code (like CA)."
var pZIPCode = "a 5 or 9 digit U.S. ZIP Code (like 94043 or 75248-1234)."
var pZIPCodeShort = "a 5 digit U.S. ZIP Code (like 94043)."
var pPager = "a pager number including PIN # if any."
var pUSPhone = "a 10 digit U.S. phone number (like 415 555 1212)."
var pUSPhoneExt = "up to 5 digit U.S. phone number extension."
var pUSFax = "a 10 digit U.S. fax number (like 415 555 1212)."
var pWorldPhone = "an international phone number."
var pSSN = "a 9 digit U.S. social security number (like 123 45 6789)."
var pEmail = "a valid e-mail address (like foo@bar.com)."
var pCreditCard = "a valid credit card number."
var pDay = "a day number between 1 and 31."
var pMonth = "a month number between 1 and 12."
var pYear = "a 2 or 4 digit year number."
var pPIN = "a PIN number."
var pPriceRangeLow = "the Low price range."
var pPriceRangeHigh = "the High price range."
var pNumRooms = "the number of Rooms."
var pNumBedrooms = "the number of Bedrooms."
var pNumBathrooms = "the number of Bathrooms."
var pLoginID = "a Login ID."
var pDefaultForm = "a Default Form."
var pRemarks = "a Remark."
var pStatus = "a Status code; 'I' for Inactive, leave empty for Active."
var pVendorNum = "a Vendor Number."
var pTZRange = "a Territory Zip Range."
var pTZCity = "a Territory Zip City."
var pTZCounty = "a Territory Zip County."
var pTZState = "a Territory Zip State."
var pDPClientID = "the Client ID assigned by this Data Provider."

var defaultEmptyOK = false

function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this
}

var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;
var USStateCodeDelimiter = "|";
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP"

function checkFormField()
{
	var i;
    for (i = 0; i < arguments.length; i=i+2)
	{
		// alert( arguments[i].value);
		if( isEmpty(arguments[i].value))
		{
			alert("The " + arguments[i+1] + " field is required. Please fill it in.");
			arguments[i].focus();
			return false;
		}
	}
	return true;
}

function checkDropDown() {
	var i;
    for (i = 0; i < arguments.length; i=i+2) {

		theField = arguments[i];

		if( isEmpty(theField.options[theField.selectedIndex].value)) {
			alert("The " + arguments[i+1] + " field is required. Please make a choice.");
			theField.focus();
			return false;
		}
	}
	return true;

}

function checkRadio() {
	var i;
	var ok;
    for (i = 0; i < arguments.length; i=i+2) {

		theField = arguments[i];

		// alert( arguments[i].value);
		ok = false;
		for(x = 0; x < theField.length; x++) {
			if(theField[x].checked)
				ok = true;
		}
		if(ok == false) {
			alert("The " + arguments[i+1] + " field is required. Please make a choice.");
			theField[0].focus();
			return false;
		}
	}
	return true;

}



function isNotPopulated(s)
{   
	if( ! isEmpty(s.value))
		return false;

	alert("This field requires a valid entry");
	s.focus();
	return true;
}

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 hasInvalidChars (s)
{   var i;

	RefString="abcdefghijklmnopqrstuvwxyz";
	if (RefString.indexOf (s, 0)>0) 
		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) &&
			 (s.length == 2) )
}

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 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 Convertnumdate(s)
{
if (s.toUpperCase().search(/JAN/) != -1) return 1;
if (s.toUpperCase().search(/FEB/) != -1) return 2;
if (s.toUpperCase().search(/MAR/) != -1) return 3;
if (s.toUpperCase().search(/APR/) != -1) return 4;
if (s.toUpperCase().search(/MAY/) != -1) return 5;
if (s.toUpperCase().search(/JUN/) != -1) return 6;
if (s.toUpperCase().search(/JUL/) != -1) return 7;
if (s.toUpperCase().search(/AUG/) != -1) return 8;
if (s.toUpperCase().search(/SEP/) != -1) return 9;
if (s.toUpperCase().search(/OCT/) != -1) return 10;
if (s.toUpperCase().search(/NOV/) != -1) return 11;
if (s.toUpperCase().search(/DEC/) != -1) return 12;
return s;
}

function isMonth (s)
{   if (isEmpty(s)) 
       if (isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (isMonth.arguments[1] == true);
	   if (s.length > 2) {
	   		s = Convertnumdate(s);
		}
    return isIntegerInRange (s, 1, 12);
}

function isDay (s)
{   if (isEmpty(s)) 
       if (isDay.arguments.length == 1) return defaultEmptyOK;
       else return (isDay.arguments[1] == true);   
    return isIntegerInRange (s, 1, 31);
}

function daysInFebruary (year)
{   
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (year, month, day)
{   
	month = Convertnumdate(month);
    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 promptChoose (s)
{   window.status = "Please choose " + s
}

function noPrompt ()
{   window.status = ""
}

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

function warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}

function warnInvalid (theField, s)
{
    theField.focus()
    if (theField.type=="text" || theField.type=="textarea")
		{ theField.select()}
    alert(s)
    return false
}

function checkNumber (theField, s, emptyOK)
{
    if (checkNumber.arguments.length == 2) emptyOK = defaultEmptyOK;
    theField.value = stripInitialWhitespace(theField.value);
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value)) 
       return warnEmpty (theField, s);
	if( ! isPositiveInteger( theField.value ))
		return warnInvalid( theField, iNumber );
    else return true;
}

function checkString (theField, minlen, maxlen)
{   
	theField.value = stripInitialWhitespace(theField.value);
	
	if (minlen>0)
	{
		if (theField.value.length<minlen)
		{
			alert(theField.label + " must be at least " + minlen + "characters long.")
			return(false);
		}
	}
	if (maxlen>0)
	{
		if (theField.value.length>maxlen)
		{
			alert (theField.label + " must be less than " + maxlen + " characters long.")
			return(false);
		}
	}
	
	return(true);
}

function checkStateCode (theField, emptyOK)
{   
	if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    theField.value = stripInitialWhitespace(theField.value);
    theField.value = theField.value.toUpperCase();
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {
       if (!isStateCode(theField.value, false)) 
          return warnInvalid (theField, iStateCode);
       else return true;
    }
}

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

function checkZIPCode (theField, emptyOK)
{   
	if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
    theField.value = stripInitialWhitespace(theField.value);
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    { var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
      if (!isZIPCode(normalizedZIP, false)) 
         return warnInvalid (theField, iZIPCode);
      else 
      {  
         theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}

function reformatUSPhone (USPhone)
{   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
}

function checkUSPhone (theField, emptyOK)
{   
	if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    theField.value = stripInitialWhitespace(theField.value);
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
       if (!isUSPhoneNumber(normalizedPhone, false)) 
          return warnInvalid (theField, iUSPhone);
       else 
       {  
          theField.value = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}

function 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;
    theField.value = stripInitialWhitespace(theField.value);
//    theField.value = theField.value.toUpperCase();
    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;
    theField.value = stripInitialWhitespace(theField.value);
    theField.value = stripCharsInBag(theField.value, SSNDelimiters);
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  
		var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
       	if (!isSSN(normalizedSSN, false)) 
          return warnInvalid (theField, iSSN);
    }
}

function checkYear (theField, emptyOK)
{   if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isYear(theField.value, false)) 
       return warnInvalid (theField, iYear);
    else return true;
}

function checkMonth (theField, emptyOK)
{   if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isMonth(theField.value, false)) 
       return warnInvalid (theField, iMonth);
    else return true;
}

function checkDay (theField, emptyOK)
{   if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isDay(theField.value, false)) 
       return warnInvalid (theField, iDay);
    else return true;
}

function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay)
{   
    
    if (checkDate.arguments.length == 4) OKtoOmitDay = false;
    if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
    if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
    if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
    else if (!isDay(dayField.value)) 
       return warnInvalid (dayField, iDay);
    if (isDate (yearField.value, monthField.value, dayField.value))
       return true;
    alert (iDatePrefix + labelString + iDateSuffix)
    return false
}

function 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
    }
}

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);
} 

function isVisa(cc)
{
  if (((cc.length == 16) || (cc.length == 13)) &&
      (cc.substring(0,1) == 4))
    return isCreditCard(cc);
  return false;
}  

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;
} 

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;
} 

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(cc)
{
  return isDinersClub(cc);
}

function isDiscover(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 16) && (first4digs == "6011"))
    return isCreditCard(cc);
  return false;
} 

function isEnRoute(cc)
{
  first4digs = cc.substring(0,4);
  if ((cc.length == 15) &&
      ((first4digs == "2014") ||
       (first4digs == "2149")))
    return isCreditCard(cc);
  return false;
}

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;
} 

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;
} 

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;
}  


// This function will create a table with an "id" of required.
// action=1 starts the table, action=0 ends the table.
function required(action)
{
    if(action == 1) {
		document.write("<table cellpadding=0 cellspacing=0 border=0><tr><td id=required>");
	} else {
		document.write("</td></tr></table>");
	}
}

// This function will validate a string with a date value
// Separators must be a slash, dash or space
function checkDateString(dateField)
{
	var theField = trim(dateField.value);
	var ch = '/';

	if (theField=="") { return(true); }

	i = theField.indexOf(ch);
	if(i == -1) {
		ch = '-';
		i = theField.indexOf(ch);
		if(i == -1) {
			ch = ' ';
			i = theField.indexOf(ch);
			if(i == -1) {
				return warnInvalid( dateField, "The month, day and year separator must be a slash ('/'), a dash ('-'), or a space (' ').\n(12-25-1999, 1/1/1999, 7 4 1999)\nPlease try again.");
			}
		}
	}
    month = theField.substring(0,i);
	i++;
	j = theField.indexOf(ch, i);
    day = theField.substring(i,j);
	j++;
	k = theField.length;
    year = theField.substring(j,k);
    if(year == "0000") {
        return warnInvalid(dateField,"Year is Invalid\n0000 is not a real year");
    }
    if(year.length != 4) {
		return warnInvalid(dateField, "The year must be 4 characters.\n(12-25-1999, 1/1/2000, 7 4 2001)\nPlease try again.");
	}
    if(month.length == 2 && month.substring(0,1) == 0) {
	    month = month.substring(1,2);
    }
    if(day.length == 2 && day.substring(0,1) == 0) {
	    day = day.substring(1,2);
    }

    if (isDate (year, month, day))
       return true;
	//var s = iDatePrefix + str + iDateSuffix;
	var s = iDate
    return warnInvalid( dateField, s );
}

// This function will check for valid money values.
// Only numbers and a decimal point are allowed.
// It will truncate more than 2 decimal positions.
function checkMoney (theField, maxdollarlength,maxlengthwarn)
{   
	var itsok=false;
	var i;
	var s = theField.value;
    var seenDecimalPoint = false;
	var afterDecimalPoint = 0;
    if (s=="")
	{
		return(true);
	}
	if (isFloat(s)==false)
	{
		str = "The value entered is not a positive money amount.  Please reenter now.";
		return(warnInvalid(theField,str));
	}
    if (s == decimalPointDelimiter) return false;
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if ((c == decimalPointDelimiter) && !seenDecimalPoint) {
			seenDecimalPoint = true;
			afterDecimalPoint = 0;
        } else {
			if ((i >= maxdollarlength) && (seenDecimalPoint == false)) {
				var moneystr = "";
				for (x = 0; x < maxdollarlength; x++) {
					moneystr = moneystr + "9";
				}
				moneystr = moneystr + ".99";
				
				var str = "The maximun money amount allowed is " + moneystr + ". Please enter a correct money value.";
				return(warnInvalid(theField,str));
			} else if (maxlengthwarn && ((i+1) == s.length || (i+1) == s.indexOf('.')) &&parseInt(s.substring(0,i+1)) >= parseInt(maxlengthwarn) && seenDecimalPoint == false && itsok == false) {
				var moneystr = (parseInt(maxlengthwarn)-1);
				moneystr += ".99";
				
				var str = "Are you sure you want to enter an amount greater than "+moneystr+"?";
				if ( ! confirm(str)) {
					theField.select();
					theField.focus()
					return false;
				} else {
					itsok=true;
				}
			} 
			if (!isDigit(c)) {
				str = "The entered valued is not money. Please enter a positive money value.";
				return(warnInvalid(theField,str));			
			}
			if(seenDecimalPoint && (afterDecimalPoint++ >= 2))
				break;
		}
    }
    theField.value = s.substring(0,i);
    return true;
}
function checkSignedMoney (theField, maxdollarlength,maxlengthwarn)
{   
	var itsok=false;
	var i;
	var s = theField.value;
    var seenDecimalPoint = false;
	var afterDecimalPoint = 0;
    if (s=="")
	{
		return(true);
	}
	if (isSignedFloat(s)==false)
	{
		str = "The value entered is not a money amount.  Please reenter now.";
		return(warnInvalid(theField,str));
	}
    if (s == decimalPointDelimiter) return false;
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if ((c == decimalPointDelimiter) && !seenDecimalPoint) {
			seenDecimalPoint = true;
			afterDecimalPoint = 0;
        } else {
			if ((i >= maxdollarlength) && (seenDecimalPoint == false)) {
				var moneystr = "";
				for (x = 0; x < maxdollarlength; x++) {
					moneystr = moneystr + "9";
				}
				moneystr = moneystr + ".99";
				
				var str = "The maximun money amount allowed is " + moneystr + ". Please enter a correct money value.";
				return(warnInvalid(theField,str));
			} else if (maxlengthwarn && ((i+1) == s.length || (i+1) == s.indexOf('.')) &&parseInt(s.substring(0,i+1)) >= parseInt(maxlengthwarn) && seenDecimalPoint == false && itsok == false) {
				var moneystr = (parseInt(maxlengthwarn)-1);
				moneystr += ".99";
				
				var str = "Are you sure you want to enter an amount greater than "+moneystr+"?";
				if ( ! confirm(str)) {
					theField.select();
					theField.focus()
					return false;
				} else {
					itsok=true;
				}
			} 
			if (!isDigit(c) && (c!="-" && c!="+" && i!=0)) {
				str = "The entered valued is not money. Please enter a money value.";
				return(warnInvalid(theField,str));			
			}
			if(seenDecimalPoint && (afterDecimalPoint++ >= 2))
				break;
		}
    }
    theField.value = s.substring(0,i);
    return true;
}



// This function will check for valid integer values.
function checkInteger (theField)
{   
	var s = theField.value;
	if (s=="")
	{
		return(true);
	}
	else if (!isInteger(s)) {
		alert("The entered valued is not an integer. Please enter an integer value.");
		theField.focus();
		return false;
	}
    return true;
}

// This function will check for valid float values.
function checkFloat (theField)
{   
	var s = theField.value;
	if (!isFloat(s)) {
		alert("This field must be an unsigned number. Please reenter now.");
		theField.focus();
		return false;
	}
    return true;
}

// This function will check for valid float values.
function checkSignedFloat (theField)
{   
	var s = theField.value;
	if (!isSignedFloat(s)) {
		alert("This field must be number. Please reenter now.");
		theField.focus();
		return false;
	}
    return true;
}


// Will confirm a delete
function confirmdelete() {

	return(confirm("Deleted records will be PERMANENTLY removed from the system.\n\nClick on [OK] to permanently remove the record(s) from the system, or [Cancel] to cancel this operation."));


}


// Will confirm a cancellation
function confirmcancel() {

	return(confirm("Cancelling the order will PERMANENTLY cancel it.\n\nClick on [OK] to Continue, or [Cancel] to stop this operation."));


}


function checkTextarea (theField, maxlength, s, emptyOK)
{   
    if (checkTextarea.arguments.length == 3) emptyOK = defaultEmptyOK;

	theField.value = stripInitialWhitespace(theField.value);

	// theField.value = theField.value.toUpperCase();

    if ((emptyOK == true) && (isEmpty(theField.value))) return true;

    if (isWhitespace(theField.value)) 
       return warnInvalid( theField, mPrefix + s + mSuffix );

	len = theField.value.length;
	if (len > maxlength) {
		str = "The maximum number of characters allowed in this field is " + maxlength + " and there are currently " + len + " characters. Press [OK] to truncate the length to " + maxlength + " or [Cancel] to ignore."
		ret_code = confirm(str);
		if (ret_code) {
			theField.value = theField.value.substring(0, maxlength);
		}
	}

    return true;
}

function checkZIPCodeRange (theField)
{
var zipTxt = theField.value;
var a_comma = zipTxt.lastIndexOf(",");
var a_hyphen = zipTxt.lastIndexOf("-");
theField.value = stripInitialWhitespace(theField.value);
var zips = new Array();
zips = zipTxt.split(/[,-]/);
for(var i=0;i<zips.length;i++){
	if ( zips[i].length != 5 ) {
		return warnInvalid (theField, 'You have entered an Invalid Zipcode range, either because of invalid characters, or because the range includes more than 500 zipcodes.  Please try again\nIf you believe you have received this message in error, Contact your BPO Coordinator for assistance');
	}
}
var zips2 = new Array();
zips2 = zipTxt.split(/,/);
for(var i=0;i<zips2.length;i++){
	if ( zips2[i].indexOf("-") != -1 ) {
		var zipr= new Array();
		zipr = zips2[i].split(/-/);
		if ( zipr.length > 2 || isNaN(zipr[0]) || isNaN(zipr[1]) || (zipr[1] - zipr[0]) > 500 ) {
			return warnInvalid(theField,'You have entered an Invalid Zipcode range, either because of invalid characters, or because the range includes more than 500 zipcodes.  Please try again\nIf you believe you have received this message in error, Contact your BPO Coordinator for assistance');
		}
	}
}
if ((a_comma == zipTxt.length - 1) || (a_hyphen == zipTxt.length - 1))
	{
		return warnInvalid (theField, 'You have entered an Invalid Zipcode range, either because of invalid characters, or because the range includes more than 500 zipcodes.  Please try again\nIf you believe you have received this message in error, Contact your BPO Coordinator for assistance');
	}	
	return true;
}
//this function checks that a date is between the min and max date if supplied
function checkDateRange(datefld,mindate,maxdate,strmindate,strmaxdate)
{
	if (mindate!="" && mindate!=null)
	{
		if (compareDates(mindate,datefld.value)==false)
		{
			s = datefld.label + " must be later than " + strmindate + " ( " + mindate + " ). Please reenter it now";
			return(warnInvalid(datefld, s)); 
		}
	}
	if (maxdate!="" && maxdate!=null)
	{
		if (compareDates(datefld.value,maxdate)==false)
		{
			s = datefld.label + " must be earlier than " + strmaxdate + " ( " + maxdate + " ). Please reenter it now";
			return(warnInvalid(datefld, s)); 
		}
	}
		
	return (true);	
			
}
//checks if the date small is less than date big
function compareDates(datesmall,datebig)
{
	// make sure start date is before the end date
	if (Date.parse(datesmall) > Date.parse(datebig)) 
	{	return false; }
}

function checkFloatRange(lowfld,highfld)
{
	if (compareFloats(lowfld.value,highfld.value)>=0)
	{
		s = highfld.label + " must be more than " + lowfld.value;
		return(warnInvalid(highfld,s));
	}
}

function checkRequired(frm)
{
	var frmLength = frm.length;
	var i;
	
	//check fields whose isreq prop is set to True are not blank
	for (i=0; i<frmLength;i++)
    {		
		if(trim(frm[i].value) == "" && frm[i].isreq=="True")
		{
			s = mPrefix + "'" + frm[i].label + "'" + mSuffix;
			return(warnInvalid(frm[i], s)); 
		}
	}
}

function checkReqFldArr(myarray,myerrprefix,myerrsuffix)
{
		for (i=0; i<myarray.length; i++)
		{
			if(myarray[i].value == "")
			{
				var s = myerrprefix + "'" + myarray[i].label + "'" + myerrsuffix;
				return(warnInvalid(myarray[i], s)); 
			}
		}
		
		return(true);
}


function trimFormFields(frm)
{
	var frmLength = frm.length;
	var i;
	
	//strip white space from all fields
	for (i=0; i<frmLength;i++)
    {
		frm[i].value = trim(frm[i].value); 
	}
}

function FormatNumber(total,decimals)
{
   if ( decimals==undefined )
      decimals = 2;

   decimals *= 1;

   var suffix = ""
   for ( var i=0; i<decimals; i++ )
      suffix += "0";

   var num = "" + parseFloat(total);
   if ( num == "NaN" )
      return num = "0" + ((decimals>0) ? "."+suffix : "");

   if ( num.indexOf(".") == -1 )
      return num += (decimals>0) ? "."+suffix : "";

   num += suffix;
   var tp = num.indexOf(".")+decimals;
   var rnd = Math.round(num.substring(tp,tp+1)+"."+num.substring(tp+1));

   return num.substring(0,tp)+rnd;
}
