/*
 * http://www.lowermybills.com/javascript/formcheck.js
 *
 * Standard form verification functions  Javascript 1.0
 *
 * pbishop
 *
 */



function isNumOrCharOrUrl( InString ) {
  if ( InString.length != 1 )
    return ( false );
  InString = InString.toLowerCase();
  RefString = "1234567890abcdefghijklmnopqrstuvwxyz.:/~-_$&+@";
  if ( RefString.indexOf( InString, 0 ) == -1 )
    return ( false );
  return ( true );
}

function isTelcom(InString)  {
  if(InString.length!=1)
    return (false);
  InString=InString.toLowerCase();
  RefString="1234567890.)(-";
  if (RefString.indexOf (InString, 0)==-1)
    return (false);
  return (true);
}

function checkTelcom(theField) {
  fldValue = theField.value;
  for (var i = 0; i <fldValue.length;  i++) {
    var ch = fldValue.substring(i,i+1);
    var ret = isTelcom(ch);
    if (ret == false) {
      return(false);
      break;
    }
  }
  return ( true );
}

function isName( InString ) {
  if ( InString.length != 1 )
    return ( false );
  InString = InString.toLowerCase();
  RefString = "abcdefghijklmnopqrstuvwxyz`.-";
  if ( RefString.indexOf( InString, 0 ) == -1 )
    return ( false );
  return ( true );
}

function checkUrl( theField ) {
  fldValue = theField.value;  
  for ( var i = 0; i < fldValue.length;  i++ ) {
    var ch = fldValue.substring( i, i+1 );
    var ret = isNumOrCharOrUrl( ch );
    if ( ret == false ){
      return ( false );
      break;
    }
  }
  string_start = fldValue.substring( 0, 7 );
  if (( string_start.toLowerCase() != 'http://') || ( fldValue.lastIndexOf('.') == -1 )){
    return ( false );
  }
  return ( true );
}


function isEmail(InString)  {
 if(InString.length!=1)
  return (false);
 InString=InString.toLowerCase();
 RefString="1234567890abcdefghijklmnopqrstuvwxyz.@_-";
 if (RefString.indexOf (InString, 0)==-1)
  return (false);
 return (true);
}

function checkEmail(hInput) {
	// Interim fix to allow leading/trailing spaces.
	// TODO: Use client-side validation functions from /js/forms.js instead
	var strEmail = hInput.value;
	if (/^\s/.test(strEmail)) { strEmail = strEmail.replace(/^\s{1,}/, ""); }
	if (/\s$/.test(strEmail)) { strEmail = strEmail.replace(/\s{1,}$/, ""); }
	hInput.value = strEmail;
	if (strEmail.length < 5) { return false; }
	if (!/(^[A-z0-9\.\-_]*)@([A-z0-9\.\-_]+)\.([A-z]{2,4})$/.test(strEmail)) { return false; }
	return true;
}


function isNumber(InString)  {
  if(InString.length!=1)
    return (false);
  InString=InString.toLowerCase();
  RefString="1234567890.-";
  if (RefString.indexOf (InString, 0)==-1)
    return (false);
  return (true);
}


function checkNumber(theField) {
  fldValue = theField.value;
  for (var i = 0; i <fldValue.length;  i++) {
    var ch = fldValue.substring(i,i+1);
    var ret = isNumber(ch);
    if (ret == false ) {
      return(false);
      break;
    }
  }
  return ( true );
}




function isTaxId (InString)  {
  if (InString.length != 1)
     return (false);
  InString = InString.toLowerCase();
  RefString = "1234567890-";
  if (RefString.indexOf (InString, 0)==-1)
    return (false);
  return (true);
}


function checkTaxId(theField) {
  fldValue = theField.value;
  for (var i = 0; i <fldValue.length;  i++) {
    var ch = fldValue.substring(i,i+1);
    var ret = isTaxId(ch);
    if (ret == false ) {
      alert("Social Security Number or Federal Tax Id can not contain any \ncharacters other than numbers and hyphens")
      return(false);
      break;
    }
  }
  return(true);
}


function state_validate(form) {
  if (form.mail_country.options[form.rownumber.value].selected == false) {
    if (form.mail_country.options[0].selected == false) {        
      form.mail_state.options[0].selected = true;
    }
  } else {
    if (form.mail_country.options[0].selected == false) {
      form.mail_prov.value = "Not Applicable";
    }
    if (form. mail_state.options[0].selected){
      form.mail_state.options[1].selected = true;
    }
  }
}

function country_validate(form) {       
  if (form.mail_country.options[form.rownumber.value].selected == false){
    form.mail_state.options[0].selected = true;
    if (form.mail_prov.value == "Not Applicable"){
      form.mail_prov.value = "";
    }
  } else {
    if (form.mail_state.options[0].selected == true){
      form.mail_state.options[1].selected = true;
    }
    form.mail_prov.value = "Not Applicable";
  }
}

function prov_validate(form) {
  if (form.mail_country.options[form.rownumber.value].selected){
    form.mail_prov.value = "Not Applicable";
  }
}




function phoneValidate(tfName)
{
  var GoodChars = "-( )0123456789";
  var ValidChars = true;
  var Char;
  var gcCharNum;

  for (tfCharNum = 0; tfCharNum < tfName.value.length; tfCharNum++)
  {
     Char =  tfName.value.charAt(tfCharNum);
     for (gcCharNum = 0;  gcCharNum < GoodChars.length;  gcCharNum++)
       if (Char == GoodChars.charAt(gcCharNum))
           break;
     
    if (gcCharNum == GoodChars.length)
         {
           ValidChars = false;
           break;
         }
  }
  if (!ValidChars)
    return "NO";


  var pos1,pos2,pos3,pos4;
  var cleanstring,cleanstring1,cleanstring2,cleanstring3,cleanstring4;
  
  pos1=tfName.value.indexOf("(");
  pos2=tfName.value.indexOf(")");
  pos3=tfName.value.indexOf("-");

  
  if (pos1>0)  
     cleanstring1=tfName.value.substring(0, pos1);
  else
     cleanstring1="";	
  cleanstring2=tfName.value.substring(pos1+1, pos2);
  cleanstring3=tfName.value.substring(pos2+1, pos3);

  if (tfName.value.length>pos3)
	 cleanstring4=tfName.value.substring(pos3+1, tfName.value.length); 
 
  
  cleanstring=cleanstring1+cleanstring2+cleanstring3+cleanstring4;
  

  if ( isNaN(parseInt(cleanstring) ) )
	return "NO";
  else
        return "OK";
  return "OK";		
 
 
}






// VARIABLE DECLARATIONS

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var whitespace = " \t\n\r";
// non-digit characters which are allowed in credit card numbers
var creditCardDelimiters = " "
// 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 sExpirationDate = "Expiration Date"
var sCreditCardNumber = "Credit Card Number"
// i is an abbreviation for "invalid"
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."
// p is an abbreviation for "prompt"
var pEntryPrompt = "Please enter a "
var pCreditCard = "valid credit card number."
var defaultEmptyOK = false



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


/* FUNCTIONS TO NOTIFY USER OF INPUT REQUIREMENTS OR MISTAKES. */


// Display prompt string s in status bar.

function prompt (s)
{   window.status = s
}



// Display data entry prompt string s in status bar.

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




// Notify user that required field theField is empty.
// String s describes expected contents of theField.value.
// Put focus in theField and return false.

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



// Notify user that contents of field theField are invalid.
// String s describes expected contents of theField.value.
// Put select theField, pu focus in it, and return false.

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





// checkDate (yearField, monthField, dayField, STRING labelString [, OKtoOmitDay==false])
//
// Check that yearField.value, monthField.value, and dayField.value 
// form a valid date.
//
// If they don't, labelString (the name of the date, like "Birth Date")
// is displayed to tell the user which date field is invalid.
//
// If it is OK for the day field to be empty, set optional argument
// OKtoOmitDay to true.  It defaults to false.

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
}



// Get checked value from radio button.

function getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}




// Validate credit card info.

function checkCreditCard (radio, theField)
{   var cardType = getRadioButtonValue (radio)
    var normalizedCCN = stripCharsInBag(theField.value, creditCardDelimiters)
    if (!isCardMatch(cardType, normalizedCCN)) 
        
    return (false);
   
}





function isCreditCard(st) {
  // Encoding only works on cards with less than 19 digits
  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--;
  }
// Uncomment the following line to help create credit card numbers
// 1. Create a dummy number with a 0 as the last digit
// 2. Examine the sum written out
// 3. Replace the last digit with the difference between the sum and
//    the next multiple of 10.

//  document.writeln("<BR>Sum      = ",sum,"<BR>");
//  alert("Sum      = " + sum);

  if ((sum % 10) == 0)
    return (true);
  else
    return (false);

} // END FUNCTION isCreditCard()





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

} // END FUNCTION isDiscover()





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;

} // END FUNCTION isJCB()




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




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

