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 = "()- ";
var digitsInUSPhoneNumber = 10;
// characters which are allowed in US phone numbers
var validUSPhoneChars = digits + phoneNumberDelimiters;
var defaultEmptyOK = false

var sLastName = "Last Name"
var sFirstName = "First Name"
var sCompanyName = "Company Name"
var sStateCode = "State"
var sPhone = "Phone Number"
var sEmail = "Email"
var sUserName = "User Name"
var sPassword = "Password"
var sConfirmPassword = "Confirm Password"
var sNextPurchase = "Next Purchase"
var sNextPurchaseAmount = "Next Purchase Amount"
var iUSPhone = "10 digit U.S. phone number required."
var iEmail = "Email address must be in the proper format (someone@somewhere.com)."
var iStateCode = "U.S. state abbreviation is missing."

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

function validateForm(form)
{
        if (checkString(form.elements["USERID"],sUserName) &&
                        checkString(form.elements["PASSWORD"],sPassword) &&
                        checkString(form.elements["CONFIRMPASSWORD"],sConfirmPassword) &&
                        checkString(form.elements["FIRSTNAME"],sFirstName) &&
                        checkString(form.elements["LASTNAME"],sLastName) &&
                        checkUSPhone(form.elements["BUSPHONE"],sPhone) &&
                        checkString(form.elements["COMPANYNAME"],sCompanyName) &&
                        checkEmail(form.elements["EMAIL"],sEmail) &&
			(form.elements["OUTSIDEUSCAN"].value=="true" || 
			 (form.elements["OUTSIDEUSCAN"].value!="true" &&
			  checkString(form.elements["STATE"],sStateCode))) &&
                        checkString(form.elements["NEXTPURCHASE"],sNextPurchase) &&
                        checkString(form.elements["NEXTPURCHASEBUDGET"],sNextPurchaseAmount))
        {
                form.submit();
        }
}

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

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 warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    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 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 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 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 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 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 checkStateCode (theField, emptyOK)
{
    if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;	
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
	return false;
}



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

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

