// Validation routines for IMCCSRA Herman van Beek 13 Aug 2001

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

// whitespace characters
var whitespace = " \t\n\r";
var tabcrlf = "\t\r\n";

//---------------------------------------------------------------------
// look for invalid characters -- returns 'false' at first character not in validCharacters
function useInvalidCharacters(inputStringValue, validCharacters)
  {
   var i;
   var allValid = true;
   for (i = 0;  i < inputStringValue.length;  i++)
     {
      var c = inputStringValue.charAt(i);
      if (validCharacters.indexOf(c) == -1) 
        {
         allValid = false;     // did not find this character in validCharacters
         break;
        }
     }
   return allValid
  }
//---------------------------------------------------------------------
// insert comma separator for thousands
// e.g., addCommas(1000) returns string: "1,000"
// \d+ in combination with \d{3} will match a group of 3 numbers preceded by any amount of numbers. 
// This tricks the search into replacing from right to left. 
function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

//---------------------------------------------------------------------
// look for properly formatted US SAILING membership number -- 6 digits plus 1 alpha
// returns 'false' at first character not in validCharacters
function validateUSSA(memberNumber)
  {
   var i;
   var allValid = false;
   if (isEmpty(memberNumber)) return allValid;
   allValid = true;
   var numericLength = 6;
   var alphaChar = memberNumber.charAt(numericLength);
   for (i = 0;  i < numericLength;  i++) {
      var c = memberNumber.charAt(i);
      if (digits.indexOf(c) == -1) {
         allValid = false;     // not a number
         alert("Not a valid US SAILING Member ID")
         break;
        }
     }
   if (!isLetter(alphaChar)) {
      allValid = false;       // not a letter
      alert("Not a valid US SAILING Member ID")
     }
   return allValid
  }
// --------------------------------------------------------------------
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"))
  }
//------------------------------------------------------------------------

function name_samples () {
   alert ("Example #1: " + "\n" +
          "Full Name:  \t \t Hilton Wayne Spence II -- goes by Wayne Spence \n" +
          "First Name:  \t \t Hilton \n" +
          "MI: \t  \t \t W \n" +
          "Nickname/Usual Name:  \t Wayne \n" +
          "Last Name:  \t \t Spence \n" + 
          "Suffix:  \t \t \t II \n \n" +
          "Example #2: " + "\n" +
          "Full Name:  \t \t Herman William van Beek -- goes by Herman van Beek\n" +
          "First Name:  \t \t Herman \n" +
          "MI: \t \t \tW \n" +
          "Nickname/Usual Name:  \t  \n" +
          "Last Name:  \t \t van Beek \n" + 
          "Suffix: \n \n" +
          "Example #3: " + "\n" +
          "Full Name:  \t \t John R Woodruff -- goes by Woody Woodruff\n" +
          "First Name:  \t \t John \n" +
          "MI: \t \t \t R \n" +
          "Nickname/Usual Name:  \t Woody \n" +
          "Last Name:  \t \t Woodruff \n" +
          "Suffix: \n \n");
 }
   // --------------------------------------------------------------------
   function checkforPipes (inputStringValue)
     {
       var checkStr = inputStringValue
       var checkBad = "|";
       for (i = 0;  i < checkStr.length;  i++)
        {
         var ch = checkStr.charAt(i);
         if (ch == checkBad)
          {
           return true
           break;
          }
        }
       return false
     }
  // --------------------------------------------------------------------
   function removeCRLF(inputStringValue)
     {
     // Replace CRLF sequences in user input with blank spaces
       var checkStr = escape(inputStringValue);
       var newStr = "";
       var i = 0;
       var j = 0;
   
       while (i < checkStr.length)
       {
         var ch = checkStr.charAt(i);
         j = i;
         if (ch == "%")
           {
            if (checkStr.charAt(j+1) == "0" && checkStr.charAt(j+2) == "D")
              {
               newStr += "%20";
               i = i + 3;
              }
            if (checkStr.charAt(j+1) == "0" && checkStr.charAt(j+2) == "A")
              {
               newStr += "%20";
               i = i + 3;
              }
            if (i == j)
              {
               newStr += ch;
               i++;
              }
           }
          else
           {
            newStr += ch;
            i++;
           }
       }
       var convertedString = unescape(newStr);
       return convertedString;
     }
     
   // --------------------------------------------------------------------
   // Remove from list any characters not in string bag 
   function removeTabCRLF(s)
     {   
      // is s empty?
      var returnString = "";
      if (isEmpty(s)) return returnString;
      var i;
      // Search through string's characters one by one. If character is NOT in list, append to returnString.
      for (i = 0; i < s.length; i++)
        {
         var c = s.charAt(i);
         if (tabcrlf.indexOf(c) < 0) returnString += c;
        }
      return returnString;
     }

   // --------------------------------------------------------------------
   // Remove from list any characters not in string bag 
   function removeNonNumbers (s)
     {   
      // is s empty?
      var returnString = "";
      if (isEmpty(s)) return returnString;
      var i;
      var digits = "0123456789";
      // Search through string's characters one by one. If character is in bag, append to returnString.
      for (i = 0; i < s.length; i++)
        {
         var c = s.charAt(i);
         if (digits.indexOf(c) >= 0) returnString += c;
        }
      return returnString;
     }
     
   // Remove from list any characters not in string bag 
   function removeWhiteSpace (s)
     {   
      // is s empty?
      var returnString = "";
      if (isEmpty(s)) return returnString;
      var i;
      // Search through string's characters one by one. If character is NOT in list, append to returnString.
      for (i = 0; i < s.length; i++)
        {
         var c = s.charAt(i);
         if (whitespace.indexOf(c) < 0) returnString += c;
        }
      return returnString;
     }
   // --------------------------------------------------------------------
   // Check whether string s is empty.
   function isEmpty(s)
     { return ((s == null) || (s.length == 0))
     }

   <!-- Original:  Ron Olson (keepberthasurfin\@hotmail.com) -->
   // returns 1 or 0 indicating whether number is valid
   // first digit = Major Industry Identifier (MII) is 4 = Visa, 5 = MC (banking and financial)
   // first 6 digits (#0 - #5) represent credit card bank
   // next 9 digits (#6 - #14) represent account number -  
   // last digit (#15) is check digit
   function CheckLUHN(cardnum) 
     { 
      if (cardnum.length != 16) return 0;
      var bankNum = new Number(parseInt(cardnum.substr(0, 6),10));
      if (bankNum == 0) return 0;
      var accountNum = new Number(parseInt(cardnum.substr(6, 9),10));
      if (accountNum == 0) return 0;
      if (accountNum == 111111111) return 0;
      if (accountNum == 222222222) return 0;
      if (accountNum == 333333333) return 0;
      if (accountNum == 444444444) return 0;
      if (accountNum == 555555555) return 0;
      if (accountNum == 666666666) return 0;
      if (accountNum == 777777777) return 0;
      if (accountNum == 888888888) return 0;
      if (accountNum == 999999999) return 0;
      var RevNum = new String(cardnum);
      RevNum = Reverse(RevNum);
      var total = new Number(0);
      for ( var i = 0; i < RevNum.length; i += 1 ) 
        {
         var temp = 0;
         if (i % 2) 
           {
            temp = parseInt(RevNum.substr(i, 1) * 2, 10);
            if (temp > 9) temp -= 9;
           }
         else temp = parseInt(RevNum.substr(i, 1), 10);
         total += parseInt(temp, 10); 
        }
         // if there's no remainder, we return 1 (true)
         return (total % 10) ? 0 : 1;
     }
   function Reverse(strToReverse) 
     {
      var strRev = new String;
      var i = strToReverse.length;
      while (i--)
      strRev += strToReverse.charAt(i);
      return strRev;
     }   

//---------------------------------------------------------------------
// look for properly formatted CVC CC number -- 3 digits for MC and VISA
// returns 'false' at first character not in validCharacters
function validateCVC(cvcNumber)
  {
   var i;
   var allValid = false;
   if (isEmpty(cvcNumber)) return allValid;
   allValid = true;
   var numericLength = 3;
   var alphaChar = cvcNumber.charAt(numericLength);
   for (i = 0;  i < numericLength;  i++) {
      var c = cvcNumber.charAt(i);
      if (digits.indexOf(c) == -1) {
         allValid = false;     // not a number
         alert("Not a valid Card Validation Code")
         break;
        }
     }
   return allValid
  }
//---------------------------------------------------------------

// States array plus Canadian Provinces/Territories (added 10may2006)
var USStates = new Array(64)
USStates["AB"] = "ALBERTA"
USStates["AL"] = "ALABAMA"
USStates["AK"] = "ALASKA"
USStates["AZ"] = "ARIZONA"
USStates["AR"] = "ARKANSAS"
USStates["BC"] = "BRITISH COLUMBIA"
USStates["CA"] = "CALIFORNIA"
USStates["CO"] = "COLORADO"
USStates["CT"] = "CONNECTICUT"
USStates["DE"] = "DELAWARE"
USStates["DC"] = "DISTRICT OF COLUMBIA"
USStates["FL"] = "FLORIDA"
USStates["GA"] = "GEORGIA"
USStates["HI"] = "HAWAII"
USStates["ID"] = "IDAHO"
USStates["IL"] = "ILLINOIS"
USStates["IN"] = "INDIANA"
USStates["IA"] = "IOWA"
USStates["KS"] = "KANSAS"
USStates["KY"] = "KENTUCKY"
USStates["LA"] = "LOUISIANA"
USStates["ME"] = "MAINE"
USStates["MB"] = "MANITOBA"
USStates["MD"] = "MARYLAND"
USStates["MA"] = "MASSACHUSETTS"
USStates["MI"] = "MICHIGAN"
USStates["MN"] = "MINNESOTA"
USStates["MS"] = "MISSISSIPPI"
USStates["MO"] = "MISSOURI"
USStates["MT"] = "MONTANA"
USStates["NU"] = "NANAVUT TERRITORY"
USStates["NE"] = "NEBRASKA"
USStates["NV"] = "NEVADA"
USStates["NB"] = "NEW BRUNSWICK"
USStates["NH"] = "NEW HAMPSHIRE"
USStates["NJ"] = "NEW JERSEY"
USStates["NM"] = "NEW MEXICO"
USStates["NY"] = "NEW YORK"
USStates["NL"] = "NEWFOUNDLAND LABRADOR"
USStates["NC"] = "NORTH CAROLINA"
USStates["ND"] = "NORTH DAKOTA"
USStates["NT"] = "NORTHWEST TERRITORY"
USStates["NS"] = "NOVA SCOTIA"
USStates["OH"] = "OHIO"
USStates["OK"] = "OKLAHOMA"
USStates["ON"] = "ONTARIO"
USStates["OR"] = "OREGON"
USStates["PA"] = "PENNSYLVANIA"
USStates["PE"] = "PRINCE EDWARD ISLAND"
USStates["QC"] = "QUEBEC"
USStates["RI"] = "RHODE ISLAND"
USStates["SK"] = "SASKATCHEWAN"
USStates["SC"] = "SOUTH CAROLINA"
USStates["SD"] = "SOUTH DAKOTA"
USStates["TN"] = "TENNESSEE"
USStates["TX"] = "TEXAS"
USStates["UT"] = "UTAH"
USStates["VT"] = "VERMONT"
USStates["VA"] = "VIRGINIA"
USStates["WA"] = "WASHINGTON"
USStates["WV"] = "WEST VIRGINIA"
USStates["WI"] = "WISCONSIN"
USStates["WY"] = "WYOMING"
USStates["YT"] = "YUKON TERRITORY"


// input value is a U.S. state abbreviation; set entered value to all uppercase
function isUSState(stateName)
  {
   var inputStr = stateName.toUpperCase();
   if (inputStr.length > 0 && USStates[inputStr] == null) 
     {
      var msg = "";
      var firstChar = inputStr.charAt(0);
      if (firstChar == "A") {
      	msg += "\n(Alabama = AL; Alaska = AK; Arizona = AZ; Arkansas = AR)"
      }
      if (firstChar == "D") {
      	msg += "\n(Delaware = DE; District of Columbia = DC)"
      }
      if (firstChar == "I") {
      	msg += "\n(Idaho = ID; Illinois = IL; Indiana = IN; Iowa = IA)"
      }
      if (firstChar == "M") {
      	msg += "\n(Maine = ME; Maryland = MD; Massachusetts = MA; Michigan = MI; Minnesota = MN; Mississippi = MS; Missouri = MO; Montana = MT)"
      }
      if (firstChar == "N") {
      	msg += "\n(Nebraska = NE; Nevada = NV)"
      }
      alert("Check the spelling of the state abbreviation." + msg)
      return false
     }
   return true
  }
//------------------- isValidDate -------------------------------
 function isValidDate(day, mon, year)
   {
    var intday = parseInt(day, 10);
    if (isNaN(intday)) return false;

    var intMonth = parseInt(mon, 10);
    if (isNaN(intMonth)) return false;

    var intYear = parseInt(year, 10);
    if (isNaN(intYear)) return false;

    if (intMonth>12 || intMonth<1) return false;

    if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 ||
        intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) return false;
    
    if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 ||
        intday < 1)) {
       alert("This month can not have more than 30 days");
       return false;
      }

    if (intMonth == 2) 
      {
       if (intday < 1)  return false; 
       if (LeapYear(intYear) == true) 
         {
          if (intday > 29) {
            alert("Leap year - February can not have more than 29 days");
            return false; 
            }
         }
        else 
         {
          if (intday > 28) {
            alert("Not a leap year - February can not have more than 28 days");
             return false;
            }
         }
      }
   return true;
  }

 //---------------------- leapYear ------------------------------
 function LeapYear(intYear) 
   {
    if (intYear % 100 == 0) 
      {
       if (intYear % 400 == 0) { return true; }
      }
     else 
      {
       if ((intYear % 4) == 0) { return true; }
      }
    return false;
   }

//Define function to format a value as currency:
function formatCurrency(num) 
  {
   <!-- Function courtesy of:  Cyanide_7 (leo7278-at-hotmail.com) -->
   <!-- Web Site:  www7.ewebcity.com/cyanide7 -->
   var num = num.toString().replace(/\$|\,/g,'');
   if(isNaN(num)) num = "0";
   var cents = Math.floor((num*100+0.5)%100);
   num = Math.floor((num*100+0.5)/100).toString();
   if(cents < 10) cents = "0" + cents;
   for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
   num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
   return ("$" + num + "." + cents);
  }

// --------------------------------------------------------------------
function getCookieVal (offset) {
  var endstr = document.cookie.indexOf (";", offset);
  if (("" + endstr) == "" || endstr == -1)
    endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}

// --------------------------------------------------------------------
function getCookie (name) {
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while (i < clen) {
    var j = i + alen;
    if (document.cookie.substring(i, j) == arg)
      return getCookieVal (j);
    i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0) break; 
  }
  return "";
}

// --------------------------------------------------------------------
function setCookie (name,value) {
  var exp = new Date()
//var oneYearFromNow = exp.getTime() + (365 * 24 * 60 * 60 * 1000)
//var oneYearAgo     = exp.getTime() - (365 * 24 * 60 * 60 * 1000)
//var oneHourFromNow = exp.getTime() + (           60 * 60 * 1000)
  var twentyMinutesFromNow = exp.getTime() + (     20 * 60 * 1000)
//exp.setTime(oneYearFromNow)
//exp.setTime(oneYearAgo)
//exp.setTime(oneHourFromNow)
  exp.setTime(twentyMinutesFromNow)
  document.cookie = name + "=" + escape (value) + "; expires=" + exp.toGMTString()
}
