/******************************************************************************/
/*    Title:             formCheck.js                                         */
/*    Author:            Savvy, Inc.                                          */
/*    Last Update Date:  11/15/05                                             */
/******************************************************************************/
/*******************************************/
/*   Validate the format of an email       */
/*   address                               */
/*   Input:  address to test (string)      */
/*   Output: Boolean                       */
/*******************************************/
  function isValidEmail(eMailAddr) {
/*  Check for invalid characters           */
    var mailRegExp1 = /[\/|:|,|;]/
    if (mailRegExp1.test(eMailAddr)) {
      return false;
    }
    mailRegExp1 = /\.(?=@)|@(?=\.)/
    if (mailRegExp1.test(eMailAddr)) {
      return false;
    }
/*   Split by the @ sign.  Both sides
     must exist. Neither side should
     contain another one.                  */
    var mailRegExp1 = /@/ 
    var i = eMailAddr.search(mailRegExp1);
    if (i == -1 || i == 0) {
      return false;
    }
    if (i == eMailAddr.length - 1) {
      return false;
    }
    var firstHalf = eMailAddr.substring(0,i);
    i++;
    var lastHalf = eMailAddr.substring(i);
    if (mailRegExp1.test(firstHalf) || mailRegExp1.test(lastHalf) ) {
      return false;
    }
 /* Now validate that the first half contains blanks only if enclosed in quotes  */
    mailRegExp1 = /\s/
    if (mailRegExp1.test(firstHalf)) {
      if (firstHalf.substring(0,1) != "\"" || firstHalf.substring(firstHalf.length -1) != "\"") {
         return false;
      }
    }
/*   No blanks in the second half    */
    if (mailRegExp1.test(lastHalf)) {
         return false;
    }
/*   Second half has at least 2 characters after last dot  */
    i = lastHalf.lastIndexOf(".");
    if (i + 2 >= lastHalf.length || i == -1) {
      return false;
    }
    return true;
  }
/*******************************************/
/*   Validate the format of a phone number */
/*   Input:  phone number to test (string) */
/*           Country Code (string)         */
/*   Output: Boolean                       */
/*******************************************/
  function isValidPhone(phoneNbr, country) {
    if (country.toUpperCase() == 'US') {
        var phoneRegExp = /^((\(\d{3}\)\s?)|(\d{3}\-))\d{3}\-\d{4}$/
    }
    if (phoneRegExp.test(phoneNbr)) {
      return true;
    } else {
      return false
    }
  }
/*******************************************/
/*   Validate the format of a zip code     */
/*   Input:  Zip code to test (string)     */
/*           Country Code (string)         */
/*   Output: Boolean                       */
/*******************************************/
  function validZip(zip, country) {
    /*   argentina letter,4 digits,3 letters
         austrailia 4 digits
         canada letter,digit,letter,space,digit,letter,digit   */
    country = country.toUpperCase();
    var zipRegExp = "";
    switch (country) {
      case "CA":
        zipRegExp = /^[a-z]\d[a-z]\s\d[a-z]\d$/i
        break
      alert("AR");
        zipRegExp = /^[a-z]\d{4}([a-z]{3})$/i
        break
      case "AU":
        zipRegExp = /^\d{4}$/   
        break
      default:
        zipRegExp = /^(\d{5}){1}((-\d{4})?)$/ 
    }
    if (zipRegExp.test(zip)) {
      return true;
    } else {
      return false;
    }
  }
/***********************************************/
/*   Validate a name                           */
/*   Must be at least two words,and can contain*/
/*   only letters, spaces, commas, hyphens,    */
/*   and apostrophes                           */
/*   Input:   String                           */
/*   Returns: Boolean                          */
/***********************************************/
  function validFullName(theName) {
    var theRegExp = /[^a-z\,\-\s]/i
    if (theRegExp.test(theName)) {
      return false;
    }
    var nameArray = theName.split(" ",10);
    if (nameArray.length < 2 ) {
      return false;
    }
}
  function confirmReset() {
  var resetForm = confirm("Are you sure you want to clear the form?");
  if (resetForm == true) 
    if (arguments.length < 1) {
      return true;  }
    else {
      location.href=arguments[0];
    } 
  return false;
}

function isEmpty(str) {
  var empty = (str == null || str == "") ? true : false
  return empty
}

function noneChecked(zButtonSet) {
  for(i=0; i<zButtonSet.length; i++) {
    if(zButtonSet[i].checked) {
      return false
    }
  }
  return true
}
function whichRadioChecked(radioSet) {
  var checkedButton = -1
  for(i=0; i<radioSet.length; i++) {
    if(radioSet[i].checked) {
      checkedButton = i
      break
    }
  }
  return checkedButton
}
function noneSelected(zSelectList, ckFirst) {
  if(noneSelected.arguments.length == 1) {
    var ckFirst = false
  }
  if(zSelectList.selectedIndex == -1 ||
    zSelectList.selectedIndex == 0 && ckFirst) {
    return true;
  } else {
    return false;
  }
}
/*******************************************/
/*   Return the selected index             */
/*   Input:  Select List                   */
/*   Output: Integer                       */
/*******************************************/

function whichSelected(zSelectList) {

  if(zSelectList.selectedIndex == -1) {
    return -1;   } 
  else {
    return zSelectList.selectedIndex; }
}

function passMod10(ccNum) { 
  if(typeof(ccNum) != "string") {   // make certain it's a string
    ccNum = ccNum.toString()
  }
  var checkDigit = parseInt(ccNum.charAt(ccNum.length - 1))
  var checkSum = 0
  var currDigit = 0
  
  // Step 1: start with next to last digit and work left, 
  // multiplying every other digit by 2, add results to checkSum
  for (i=ccNum.length -2; i>=0; i-=2) {
    currDigit = parseInt(ccNum.charAt(i)) * 2
    if(currDigit < 10) {
      checkSum += currDigit
    } else {
      checkSum += currDigit - 10
      checkSum += 1       // for 10s place
      // highest possible value for currDigit is 18
    }
  }
  
  // Step 2: add skipped digits to checkSum
  for (i=ccNum.length - 1; i>=0; i-=2) {
    currDigit = parseInt(ccNum.charAt(i))
    checkSum += currDigit
  }

  // Step 3: verify passes modulus 10 test
  if (checkSum % 10 == 0) {
    // passes
    return true
  } else {
    // doesn't pass
    return false
  }
}

function cardExpired(ccExpMo, ccExpYr) {
  var today = new Date()
  var currYr = today.getFullYear()
  
  ccExpYr = parseInt(ccExpYr)
  if(currYr < ccExpYr) {
    return false
  } else if (ccExpYr == currYr) {
    var currMo = today.getMonth()
    ccExpMo = parseInt(ccExpMo) - 1
    if (currMo <= ccExpMo) {
      return false
    } 
  }
  return true
}

function validCC(ccNum, ccType) {
  var valid = false
  switch (ccType) {
  case "AmerEx":
    if (ccNum.length == 15 &&
       (ccNum.substring(0,2) == "34" || 
        ccNum.substring(0,2) == "37")) {
      valid = passMod10(ccNum)
    }
    break
  case "Discover":
    if (ccNum.length == 16 &&
      ccNum.substring(0,4) == "6011") {
      valid = passMod10(ccNum)
    }
    break
  case "MC":
    if ((ccNum.length == 16 && ccNum.charAt(0) == "5") &&
      (parseInt(ccNum.charAt(1)) >=1 && 
       parseInt(ccNum.charAt(1) <=5))) {
      valid = passMod10(ccNum)
    }
    break
  case "Visa":
    if ((ccNum.length >= 13 && ccNum.length <= 16) &&
      ccNum.substring(0,1) == "4") {
      valid = passMod10(ccNum)
    }
    break
  }
  return valid
}

function noMatch(str1, str2) {
  if (str2 != str1) {
    return true
  } else {
    return false
  }
}

function validLength(str, minLen, maxLen) {
  if(typeof(str) != "string") {
    str = str.toString()
  }
  if (str.length < minLen || str.length > maxLen) {
    return false
  } else {
    return true
  }
}

function onlyLettersNnums(str) {
  var illegalChars = /[^a-zA-Z0-9]/   // allow only letters and numbers

  if (str.match(illegalChars)) {
    return false
  } else {
    return true
  }
}

// strict is a Boolean value specifying password must have at least 
// one lowercase letter, one uppercase letter, and one number
// set to false if you don't want strict passwords
function validPassword(pwd, pwdConfirm, strict, errorMsg) {
  var error = false;
  errorMsg.value = "Error!\n";
  if (isEmpty(pwd.value) || isEmpty(pwd.value)) {
    errorMsg.value += "Error! You must enter a password and confirm it.";
    pwd.focus();
    return false;
  }
  if (noMatch(pwd.value, pwdConfirm.value)) {
    error = true;
    errorMsg.value += "Password entries do not match.\n";
  }
  if (!validLength(pwd.value, 6, 8)) {
    error = true;
    errorMsg.value += "Password must be 6 to 8 characters long.\n";
  }
  if (!onlyLettersNnums(pwd.value) ){
    error = true;
    errorMsg.value += "Password contains illegal characters.\n";
  }
  if (strict) {
    if (pwd.value.search(/[a-z]+/g) == -1 ||    // at least one lowercase letter
        pwd.value.search(/[A-Z]+/g) == -1 ||    // at least one uppercase
        pwd.value.search(/[0-9]+/g) == -1)  {   // at least one numeric digit
      error = true
      errorMsg.value += "Password must contain at least one "; 
      errorMsg.value += "lowercase letter, one uppercase letter, " ;
      errorMsg.value += "and one numeric digit.";
    }
  }
  if (error) {
    pwdConfirm.value = "";
    pwd.select();
    return false;
  }
  return true;           // everything's OK
}
/*******************************************/
/*   Validate a date                       */
/*   Input:  Month                         */
/*           Day                           */
/*           Year                          */
/*   Output: Boolean                       */
/*******************************************/
function validDate(Mo,Dy,Yr)  {
   mo = parseInt(Mo);
   year = parseInt(Yr);
   day = parseFloat(Dy);
   done = false;
   if (day == parseInt(day) & day > 0 & day < 32) {
       if ((mo == 4 | mo == 6 | mo == 9 | mo == 11) & day > 30) {
             return false; }
       else {
           if (mo == 2) {
              if (day > 29) {
                 return false;  }
              else {
                 if (day == 29) {
                    if (year % 4 == 0) {
                        if (year % 100 == 0) {
                            if (year % 400 == 0)  {
                                done = true;   }
                             else {    
                                return false;
                             }  } 
                        else  {    
                            done = true;   
                        } }  
                    else {
                        return false;  
                    }  }
                 else {
                    done = true;
                 }    
             }  }
           else {
               done = true;
           }       
       }   }            
   else  {
       return false;
   }
   return true;
}
/***************************************/
/*   Open a window and give it focus   */
/*    Input:   The features of the new */
/*             window and the location */
/*             of the source document  */
/*    Returns: Number                  */
/***************************************/
function openWin(theWidth, theHeight, theDoc, xPos, yPos) {
var features = "width=" + theWidth + ",height=" + theHeight;
features += ",screenX=" + xPos + ",screenY=" + yPos;
zWin = window.open(theDoc, "zWin", features)
return(zWin);
}
