/*************************************************************************/
//////////////////////////////////////////////////////////////////////////
//CREDIT CARD VALIDATION - added by Brian Smith 20-April-2005
//////////////////////////////////////////////////////////////////////////
/*************************************************************************/
var Cards = new makeArray(9);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();
Cards[8] = new CardType("VisaDebitDeltaCard", "4", "13,16");
var VisaDebitDeltaCard = Cards[8];
Cards[9] = new CardType("VisaElectronCard", "4", "13,16");
var VisaElectronCard = Cards[9];



/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function ValidateVisitorPaymentDetails(form) {


   var CardNumber   = form.CardNumber.value;
   var SecurityCode = form.SecurityCode.value;

   error_msg = '';
   num_errors = 0;

   if ((SecurityCode == "tbs")  ||
       (SecurityCode == "TBS")  ||
       (SecurityCode == "nwcl") ||
       (SecurityCode == "NWCL"))  { return true; }

   if ((isNaN(CardNumber)) || (CardNumber == '') || (CardNumber.length < 13))
      { error_msg += " - Invalid Card Number\n";
      num_errors++; }

   if (form.ExpiryMonth.value == "")
      { error_msg += " - Invalid Expiry Date Month\n";
      num_errors++; }

   if (form.ExpiryYear.value == "")
      { error_msg += " - Invalid Expiry Date Year\n";
      num_errors++; }
   
   if (form.CardHolderName.value == "")
      { error_msg += " - Invalid Card Holder Name\n";
      num_errors++; }

   /* RS: 3-July-2006 */
   if (form.CardType.value == "Switch") {
		if (form.IssueNumber.value == "") { 
			error_msg += " - Invalid Issue Number\n";
			num_errors++; 
		}
	   	if (form.StartMonth.value == "") { 
	     	error_msg += " - Invalid Start Date Month\n";
	      	num_errors++; 
	   	}
	   	if (form.StartYear.value == "") { 
	   		error_msg += " - Invalid Start Date Year\n";
	      	num_errors++; 
	   	}      
   }

   if (form.CardType.value != "Laser") {
	   if (SecurityCode.length < 3)
	      { error_msg += " - Invalid Security Code Number\n";
	      num_errors++; }
   }

   if (num_errors > 0)
      {
      alert("Error: You have not completed the form correctly.\n"+error_msg);
      return false;
      }


var tmpyear;
if (form.CardNumber.value.length == 0) {
   alert("Please enter a Card Number.");
   form.CardNumber.focus();
   return false;
   }

if (form.ExpiryYear.value.length == 0) {
   alert("Please enter the Expiration Year.");
   form.ExpiryYear.focus();
   return false;
   }

if (form.ExpiryYear.value > 96)
   tmpyear = "19" + form.ExpiryYear.value;
else if (form.ExpiryYear.value < 21)
   tmpyear = "20" + form.ExpiryYear.value;
else {
   alert("The Expiration Year is not valid.");
   return false;
   }

tmpmonth = form.ExpiryMonth.options[form.ExpiryMonth.selectedIndex].value;
// The following line doesn't work in IE3, you need to change it
// to something like "(new CardType())...".
// if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
   alert("This card has already expired.");
   return false;
   }

card = form.CardType.options[form.CardType.selectedIndex].value;
var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value +
"\", " + tmpyear + ", " + tmpmonth + ");");

cardname = "";

if (retval)
   {
   // comment this out if used on an order form
   // alert("This card number appears to be valid.");
   cardname = "";
   }
else {
   // The cardnumber has the valid luhn checksum, but we want to know which
   // cardtype it belongs to.
   for (var n = 0; n < Cards.size; n++) {
      if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
         cardname = Cards[n].getCardType();
         break;
         }
      }
   if (cardname.length > 0) {
      alert("This looks like a " + cardname + " number, not a " + card + " number.");
      return false;
      }
   else {
      alert("This card number is not a valid " + card + " number.");
      return false;
      }
   }

alert("Please don't click the 'Complete Booking' button again - it may take up to 30 seconds to process the booking.");
}


/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year, 
                                        int month])
cardtype    : type of card, eg: MasterCard, Visa, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VisaCard = new CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
var n;
var argv = CardType.arguments;
var argc = CardType.arguments.length;

this.objname = "object CardType";

var tmpcardtype = (argc > 0) ? argv[0] : "";
var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

this.setCardNumber = setCardNumber;  // set CardNumber method.
this.setCardType = setCardType;  // setCardType method.
this.setLen = setLen;  // setLen method.
this.setRules = setRules;  // setRules method.
this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

this.setCardType(tmpcardtype);
this.setLen(tmplen);
this.setRules(tmprules);
if (argc > 4)
this.setExpiryDate(argv[3], argv[4]);

this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
this.getCardType = getCardType;  // getCardType method.
this.isCardNumber = isCardNumber;  // isCardNumber method.
this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
this.luhnCheck = luhnCheck;// luhnCheck method.
return this;
}


/*************************************************************************\
boolean checkCardNumber([String cardnumber, int year, int month])
return true if cardnumber pass the luhncheck and the expiry date is
valid, else return false.
\*************************************************************************/
function checkCardNumber() {
var argv = checkCardNumber.arguments;
var argc = checkCardNumber.arguments.length;
var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
var year = (argc > 1) ? argv[1] : this.year;
var month = (argc > 2) ? argv[2] : this.month;

this.setCardNumber(cardnumber);
this.setExpiryDate(year, month);

if (!this.isCardNumber())
return false;
if (!this.isExpiryDate())
return false;

return true;
}


/*************************************************************************\
String getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
return this.cardtype;
}


/*************************************************************************\
String getExpiryDate()
return the expiry date.
\*************************************************************************/
function getExpiryDate() {
return this.month + "/" + this.year;
}


/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return
false.
\*************************************************************************/
function isCardNumber() {
var argv = isCardNumber.arguments;
var argc = isCardNumber.arguments.length;
var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
if (!this.luhnCheck())
return false;

for (var n = 0; n < this.len.size; n++)
if (cardnumber.toString().length == this.len[n]) {
for (var m = 0; m < this.rules.size; m++) {
var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
if (headdigit == this.rules[m])
return true;
}
return false;
}
return false;
}



/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate() {
var argv = isExpiryDate.arguments;
var argc = isExpiryDate.arguments.length;

year = argc > 0 ? argv[0] : this.year;
month = argc > 1 ? argv[1] : this.month;

if (!isNum(year+""))
return false;
if (!isNum(month+""))
return false;
today = new Date();
expiry = new Date(year, month);
if (today.getTime() > expiry.getTime())
return false;
else
return true;
}



/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
argvalue = argvalue.toString();

if (argvalue.length == 0)
return false;

for (var n = 0; n < argvalue.length; n++)
if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
return false;

return true;
}



/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
var argv = luhnCheck.arguments;
var argc = luhnCheck.arguments.length;

var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

if (! isNum(CardNumber)) {
return false;
  }

var no_digit = CardNumber.length;
var oddoeven = no_digit & 1;
var sum = 0;

for (var count = 0; count < no_digit; count++) {
var digit = parseInt(CardNumber.charAt(count));
if (!((count & 1) ^ oddoeven)) {
digit *= 2;
if (digit > 9)
digit -= 9;
}
sum += digit;
}
if (sum % 10 == 0)
return true;
else
return false;
}



/*************************************************************************\
ArrayObject makeArray(int size)
return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
this.size = size;
return this;
}



/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
this.cardnumber = cardnumber;
return this;
}



/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
this.cardtype = cardtype;
return this;
}



/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
this.year = year;
this.month = month;
return this;
}



/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
// Create the len array.
if (len.length == 0 || len == null)
len = "13,14,15,16,19";

var tmplen = len;
n = 1;
while (tmplen.indexOf(",") != -1) {
tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
n++;
}
this.len = new makeArray(n);
n = 0;
while (len.indexOf(",") != -1) {
var tmpstr = len.substring(0, len.indexOf(","));
this.len[n] = tmpstr;
len = len.substring(len.indexOf(",") + 1, len.length);
n++;
}
this.len[n] = len;
return this;
}



/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
// Create the rules array.
if (rules.length == 0 || rules == null)
rules = "0,1,2,3,4,5,6,7,8,9";
  
var tmprules = rules;
n = 1;
while (tmprules.indexOf(",") != -1) {
tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
n++;
}
this.rules = new makeArray(n);
n = 0;
while (rules.indexOf(",") != -1) {
var tmpstr = rules.substring(0, rules.indexOf(","));
this.rules[n] = tmpstr;
rules = rules.substring(rules.indexOf(",") + 1, rules.length);
n++;
}
this.rules[n] = rules;
return this;
}

/*************************************************************************/
//////////////////////////////////////////////////////////////////////////
//END CREDIT CARD VALIDATION
//////////////////////////////////////////////////////////////////////////
/*************************************************************************/



function ValidateVisitorBookingForm(form) {
	numChecked = 0;
	players = form.VisitorNumPlayers;
	plen = players.length;
	if (plen == undefined) {
		if (players.checked) numChecked++;
	} else {
		for (i=0; i < plen; i++) {
			if (players[i].checked) numChecked++;
		}
	}
   
   if (numChecked != 1) {
      alert("Please select the number of players you wish to book for.");
      return false;
   }

   return true;
}


function ValidateVisitorPersonalDetails(form)
   {
   if ((form.FirstName.value == "") ||
       (form.LastName.value  == ""))
      {
      alert("Error: You must complete all fields marked with an *.");
      return false;
      }
   return true;
   }


function ValidateOpenBookingSingle(form, Player1, Player2, Player3, Player4)
   {
   if (Player1 == 1) { if (form.Open_Player_1.value != "") { return true; } }
   if (Player2 == 1) { if (form.Open_Player_2.value != "") { return true; } }
   if (Player3 == 1) { if (form.Open_Player_3.value != "") { return true; } }
   if (Player4 == 1) { if (form.Open_Player_4.value != "") { return true; } }

   alert("Error: You must select at least one player.");
   return false;
   }


function ValidateOpenBookingPair(form, Pair1, Pair2)
   {
   if (Pair1 == 1) { if (form.Open_Pair_1.value != "") { return true; } }
   if (Pair2 == 1) { if (form.Open_Pair_2.value != "") { return true; } }

   alert("Error: You must select at least one player.");
   return false;
   }


function ValidateOpenBooking3PlayerTeams(form)
   {
   if (form.Open_3_Player_Team.value == "")
      {
      alert("Error: You must select a team.");
      return false;
      }

   return true;
   }


function ValidateOpenBooking4PlayerTeams(form)
   {
   if (form.Open_4_Player_Team.value == "")
      {
      alert("Error: You must select a team.");
      return false;
      }

   return true;
   }


function newWindow(filename,chooser,winWidth,winHeight) 
	{
	if (chooser == 0)
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, width=" + winWidth + ",height=" + winHeight);}
	 
	if (chooser == 1)
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, width=" + winWidth + ",height=" + winHeight);}
	
	if (chooser == 2)//Scroll bars
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, scrollbars=yes, width=" + winWidth + ",height=" + winHeight);}
	
	if (chooser == 3)
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, width=" + winWidth + ",height=" + winHeight);}

	if (chooser == 4)
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, width=" + winWidth + ",height=" + winHeight);}

	if (chooser == 5)
	{chooserWin = window.open(filename, "chooserWin", "resizable=yes, scrollbars=yes, menubar=yes, width=" + winWidth + ",height=" + winHeight);}

	}


