
<!-- Extends the standard String by adding trim() method -->

String.prototype.trim = function() 
{
  // skip leading and trailing whitespace
  // and return everything in between
  var x=this;
  x=x.replace(/^\s*(.*)/, "$1");
//  x=x.replace(/(.*?)\s*$/, "$1"); - this works in IE6 but not in IE 5
  x=x.replace(/(.?)\s*$/, "$1");
  return x;
}

<!-- Simple helper to check a single text field, give a propmt and move the focus as required -->

function testTextField( form, fldName, fldPrompt )
{
   var _obj = form.elements[fldName];
   if ( _obj == null )
   {
	alert ("There is no field '" + fldName + "' on this form");
	return false;
   }

   var fldvalue = _obj.value;
   fldvalue = fldvalue.trim();

   if (fldvalue.length == 0)
   {
	alert( fldPrompt );
	_obj.focus();
	return false;
   }

   return true;
}


<!-- -------------------------------------------------------------------------------------- -->
<!-- Original:  Simon Tneoh (tneohcb@pc.jaring.my)                                          -->

<!-- Begin
var Cards = new makeArray(8);
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();

/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/




/*************************************************************************\
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] : "CardObject";
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 -->




function isValidDate(dateStr) 
{


// Checks for the following valid date formats:
// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
// Also separates date into month, day, and year variables

var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

// To require a 4 digit year entry, use this line instead:
// var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) 
{
   alert("The Date is invalid")
   return false;
}

month = matchArray[1]; // parse date into variables
day = matchArray[3];
year = matchArray[4];

if (month < 1 || month > 12) 
{ // check month range
   alert("The 'month' must be between 1 and 12");
   return false;
}

if (day < 1 || day > 31) 
{
   alert("The 'day' must be between 1 and 31");
   return false;
}

if ((month==4 || month==6 || month==9 || month==11) && day==31) 
{
   alert("Month "+month+" doesn't have 31 days!")
   return false;
}

if (month == 2) 
{ // check for february 29th
   var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
   if (day>29 || (day==29 && !isleap)) 
   {
      alert("February " + year + " doesn't have " + day + " days!");
      return false;
   }
}
 
return true;
}


//*******************************************************************	
// Checks if time is in HH:MM[:SS] AM/PM format.
// The seconds are optional.

function IsValidTime(timeStr) 
{
   var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s+(AM|PM))?$/i;
   var matchArray = timeStr.match(timePat);

   if (matchArray == null) 
   {
	alert("Invalid time format\nPlease make sure the time is entered as hh:mm AM|PM\nExample: 12:59 PM");
	return false;
   }

   hour = matchArray[1];
   minute = matchArray[2];
   second = matchArray[4];

   ampm = matchArray[6];

   if (second=="") { second = null; }
   if (ampm=="") { ampm = null; }

   if (hour < 0  || hour > 12) 
   {
	alert("Hour must be between 1 and 12");
	return false;
   }

   if (ampm == null) 
   {
	alert("You must specify AM or PM.");
	return false;
   }

   if (minute<0 || minute > 59) 
   {
	alert ("Minute must be between 0 and 59.");
	return false;
   }


   if (second != null && (second<0 || second > 59) )
   {
	alert ("Second must be between 0 and 59.");
	return false;
   }

   return true;
}




//************************************************************************
//	This routine verifies the Payment Type selection 
//	(pay to the driver vs. enter CC info now) and submits the form
//	if the first option (pay to driver) is selected and no validation 
//	needed
//*************************************************************************

function paymenttype_checkselection(form)
{
   if(form.elements("selection",0).checked)
   {
      form.submit();
   }
}


function reservation_checkEmail(form)
{
   var email = form.email.value;
   email.trim();

   if (email.length == 0)
   {
	alert("Please enter e-mail address.");
	form.email.focus();
	return false;
   }
  
   var emailPat = /^([A-Za-z]+[\w\.\-]*)@(\[\d{1,3}(\.\d{1,3}){3}]|[A-Za-z]+[\w\-]*(\.[A-Za-z]\w*)+)$/; 
   var matchArray = email.match(emailPat);

   if (matchArray == null) 
   {
	alert("Your email address seems incorrect.\nPlease try again (check the '@' and '.'s in the email address)");
	form.email.focus();
	return false;
   }

   return true;
}



//function reservation_checkFullName(form)
//{
//   return testTextField( form, "fullname", "Please don't forget to enter you name" );
//}



function reservation_checkPickupAddress(form)
{
   return testTextField( form, "pickupAddress", "Where should we pick you up?" );
}



function reservation_checkDestAddress(form)
{
   return testTextField( form, "destAddress", "What is your destination address?" );
}


//function reservation_checkAirline(form)
//{
//   return testTextField( form, "airline", "What Airline you will be flying?" );
//}
//
//
//function reservation_checkDeparture(form)
//{
//   return testTextField( form, "departure", "What is your departure city?" );
//}


//function reservation_checkFlightNo(form)
//{
//   return testTextField( form, "flightNo", "Please enter the Flight Number" );
//}

function reservation_checkFullName(form)
{
   return testTextField( form, "fullname", "Please don't forget to enter you name" );
}

function reservation_checkPhone(form)
{
   return testTextField( form, "phone", "Please enter the phone number - just in case\nour driver needs to contact you" );
}



function reservation_validateCardNumber(form) 
{
   var tmpyear, tmpmonth;

   

 if (form.CardType.value.length == 0) 
   {
	alert("Please enter a Card Type.");
	form.CardType.focus();
	return false;
   }

  if (form.CardNumber.value.length == 0) 
   {
	alert("Please enter a Card Number.");
	form.CardNumber.focus();
	return false;
   }

  if (form.ExpMon.value.length == 0) 
   {
	alert("Please enter an Expiration Month.");
	form.ExpMon.focus();
	return false;
   }
  if (form.ExpYear.value.length == 0) 
   {
	alert("Please enter an Expiration Year.");
	form.ExpYear.focus();
	return false;
   }
 

   tmpyear = form.ExpYear.options[form.ExpYear.selectedIndex].value;
   tmpmonth = form.ExpMon.options[form.ExpMon.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.");
      form.CardNumber.focus();
      return false;
   }

   card = form.CardType.options[form.CardType.selectedIndex].value;
   var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value +
                     "\", " + tmpyear + ", " + tmpmonth + ");");
   cardname = "";
   if (retval)
   {
	return true;
   }
   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.");
	   form.CardNumber.focus();
	   return false;
	}
	else 
	{
	   alert("This card number is not valid.");
	   form.CardNumber.focus();
	   return false;	   
        }
   }
}


