// 18 Feb 97 created Eric Krock
// summer 2000 modified by Joseph Rawlinson
// most of this (c) 1997 Netscape Communications Corporation
function checkCCForm(formname){
	//first check if any blank fields
	var formLength = eval("document." + formname + ".length");
	var formPath = eval("document." + formname);
	var userFeedback="The following fields need to be filled in properly:\n\n";
	var fieldsEmpty = false;
	if (!formPath.Credit_Card_Type[0].checked && !formPath.Credit_Card_Type[1].checked && !formPath.Credit_Card_Type[2].checked){
			userFeedback += "A credit card type needs to be selected.\n";
			fieldsEmpty = true;
	}
	for(i=0;i<formLength;i++){
		//first check to see if any fields are empty
		if(isWhitespace(formPath.elements[i].value) && 
			formPath.elements[i].name !="Address2" && 
			formPath.elements[i].name !="Address3"){
			if(formPath.elements[i].name != "Month" && formPath.elements[i].name != "Year" && formPath.elements[i].name != "State"){
				userFeedback += ("The " + formPath.elements[i].name + " field can not be blank.\n");
				fieldsEmpty = true;
				continue;
			}
		}
		//if all fields are full then check for validity
		if(!fieldsEmpty){
			switch(formPath.elements[i].name){
				case "Credit_Card_Number":
				if (!isInteger(formPath.elements[i].value)){
					userFeedback += ("Credit Card Number invalid. Please reenter it now.\n");
				}				
				break;
				default:
				//alert("error in checkForm");
			}
		}
	}
	if(userFeedback=="The following fields need to be filled in properly:\n\n"){
		return true;
	}else{
		while(charInString("_",userFeedback)){
			userFeedback = userFeedback.replace("_"," ");
		}
		alert(userFeedback);
		return false;
	}
}

function checkForm(formname){
	//first check if any blank fields
	var formLength = eval("document." + formname + ".length");
	var formPath = eval("document." + formname);
	var userFeedback="The following fields need to be filled in properly:\n\n";
	var fieldsEmpty = false;

	if(formPath.elements['State'].options[formPath.elements['State'].selectedIndex].value == ""){
		userFeedback += ("The State field can not be blank.\n");
		fieldsEmpty = true;
	}
	for(i=0;i<formLength;i++){
		//first check to see if any fields are empty
		if(isWhitespace(formPath.elements[i].value) && 
			formPath.elements[i].name !="Address2" && 
			formPath.elements[i].name !="Address3"){
			if(formPath.elements[i].name != "Month" && formPath.elements[i].name != "Year" && formPath.elements[i].name != "State"){
				userFeedback += ("The " + formPath.elements[i].name + " field can not be blank.\n");
				fieldsEmpty = true;
				continue;
			}
		}
		//if all fields are full then check for validity
		if(!fieldsEmpty){
			switch(formPath.elements[i].name){
				case "Zip_Code":
				var normalizedZIP = stripCharsInBag(formPath.elements[i].value, ZIPCodeDelimiters)
				if(!isZIPCode(normalizedZIP, false)){
					userFeedback += (iZIPCode + "\n");
				}
				break;
				case "Phone":
				var normalizedPhone = stripCharsInBag(formPath.elements[i].value, phoneNumberDelimiters)
			      if (!isUSPhoneNumber(normalizedPhone, false)){
					userFeedback += (iUSPhone + "\n");
				}				
				break;
				case "Email":
				if(!isEmail(formPath.elements[i].value, false)){
					userFeedback += (iEmail + "\n");
				}				
				break;
				default:
				//alert("error in checkForm");
			}
		}
	}
	if(userFeedback=="The following fields need to be filled in properly:\n\n"){
		return true;
	}else{
		while(charInString("_",userFeedback)){
			userFeedback = userFeedback.replace("_"," ");
		}
		alert(userFeedback);
		return false;
	}
}

// VARIABLE DECLARATIONS
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
var decimalPointDelimiter = "."
var phoneNumberDelimiters = "()- ";
var validUSPhoneChars = digits + phoneNumberDelimiters;
var digitsInUSPhoneNumber = 10;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-"
var validZIPCodeChars = digits + ZIPCodeDelimiters
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9
var creditCardDelimiters = " "
// CONSTANT STRING DECLARATIONS
var iStateCode = "This field must be a valid two character state/province abbreviation (like CA for California). Please reenter it now."
var iZIPCode = "The Zip/Postal Code field must be a 5 or 9 digit U.S. ZIP Code (like 43055) or a valid Canadian postal code like M4B 1G5. Please reenter it now."
var iUSPhone = "The Phone field must be a 10 digit U.S. or Canadian phone number (like 415 555 1212). Please reenter it now."
var iEmail = "The Email field must be a valid email address (like you@host.com). Please reenter it now."
var iCreditCardPrefix = "The credit card number you provided is not a valid "
var iCreditCardSuffix = " card number. Please reenter it now."
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
}

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

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

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

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

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 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 reformat (s)

{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

function isUSPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function isZIPCode (s)
{  if (isEmpty(s)){ 
       if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (isZIPCode.arguments[1] == true);
   }
   //first is US format
   return (isInteger(s) && 
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2))
			 //next is Canadian format: A#A #A#
			 || (s.length == 7 && isWhitespace(s.substring(3,4)))
			 );
}

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 warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}

function warnInvalid (theField, s)
{   theField.focus()
    theField.select()
    alert(s)
    return false
}

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

var maxLen = 250; // max number of characters allowed

function checkMaxInput(form) {
	if (form.instructions.value.length > maxLen){ // if too long.... trim it!
		form.instructions.value = form.instructions.value.substring(0, maxLen);
		alert('Please limit your instructions to 250 characters.\nIf you have very detailed instructions, please call us at 1.800.362.4260');
	}
}