	var format=
	{	"EMAIL"							:	/^[\w-\.]+\@[\w\.-]+\.[a-zA-Z]{2,4}$/,
		"ENGTHAIALPHA"		:	/^[\s\r¡-ù0-9a-zA-Z]+$/,
		"ENGTHAINAME"			:	/^[\s\r\.\'¡-ëa-zA-Z]+$/,
		"NUMBER"					:	/^[\r0-9]+$/,
		"NOTNUMBER"			:	/^[^0-9)]+$/,					//cannot press enter from in this type. Must remove '^' by Invert CharSet
		"ENGALPHA"				:	/^[\ra-zA-Z]+$/,
		"ENGALPHALOWER"	:	/^[\ra-z]+$/,
		"ENGALPHAUPPER"	:	/^[\rA-Z]+$/
	};
	function validation (inputform,customfunction)
	{	for (i=0;i<inputform.length;i++ )
		{	if(inputform[i].type=='text'||inputform[i].type=='textarea'||inputform[i].type=='select-one')
			{	if(inputform[i].error!=undefined)
				{	if(inputform[i].value=='')
					{	alert(inputform[i].error);
						inputform[i].focus();
						return false;
					}else if(inputform[i].property!=undefined)
					{	if(!format[getType(inputform[i].property)].test(inputform[i].value))								
							return errorAction(inputform[i]);
					}
				}
			}
		}
		if(customfunction)
		{	if(inputform.useremail.value!=inputform.useremailconfirm.value)
			{	alert('email and confirm email are not same');
				inputform.useremailconfirm.focus();
				return false;
			}else if(inputform.usercardtype.value=='AmExCard')
			{	if(inputform.usercardcvccode.value.length!=4)
				{	alert("cvc code invalid");
					inputform.usercardcvccode.focus();
					return false;
				}
			}else if(!CheckCardNumber(inputform))
			{	return false;
			}else if(inputform.usercardcvccode.value.length!=3)
			{	alert("cvc code invalid");
				inputform.usercardcvccode.focus();
				return false;
			}else if(inputform.useragentnumber.value!=''&&inputform.useragentname.value.length==0)
			{	alert('Please enter your name');
				inputform.useragentname.focus();
				return false;
			}else if(inputform.useragentname.value!=''&&inputform.useragentnumber.value.length!=8)
			{	if(inputform.useragentnumber.value.length==0)
					alert('Please enter your agency\'s IATA number');
				else
					alert('Please enter a valid agency IATA number');
				inputform.useragentnumber.focus();
				return false;
			}else if(inputform.useragentname.value!='')
			{	return confirm('Dear Travel Agent,\n\nPlease ensure that the \'Personal Information\' is that of your customer, \nexcept for the email address which should be yours.  \n\nThe email confirmation needs to be sent directly to you as it contains \ncommission information.\n\nPress \'OK\' to proceed with payment.  Press \'Cancel\' to change email address.');
			}
		}
	}
	function getType(property)
	{	return property.substr(0,property.indexOf("="));
	}
	function getMess(property)
	{	return property.substr(property.indexOf("=")+1,property.length);
	}
	function errorAction(element)
	{	alert(getMess(element.property));
		element.select();
		return false;
	}
	function keyFilter(element)
	{	if(element.property!=undefined)
		{	if(getType(element.property)=="EMAIL")
			{	if(!String.fromCharCode(event.keyCode).match(/[\r\w-\.\@]/))
					return false;
			}else if(getType(element.property)=="CUSTOM")
			{	if(!String.fromCharCode(event.keyCode).match(/test@hotmail.com/))
					return false;
			}else
			{	if(!String.fromCharCode(event.keyCode).match(format[getType(element.property)]))
					return false;
			}
		}
	}










	var Cards = new makeArray(8);
	Cards[0] = new usercardtype("MasterCard", "51,52,53,54,55", "16");
	var MasterCard = Cards[0];
	Cards[1] = new usercardtype("VisaCard", "4", "13,16");
	var VisaCard = Cards[1];
	Cards[2] = new usercardtype("AmExCard", "34,37", "15");
	var AmExCard = Cards[2];
	Cards[3] = new usercardtype("DinersClubCard", "30,36,38", "14");
	var DinersClubCard = Cards[3];
	Cards[4] = new usercardtype("DiscoverCard", "6011", "16");
	var DiscoverCard = Cards[4];
	Cards[5] = new usercardtype("enRouteCard", "2014,2149", "15");
	var enRouteCard = Cards[5];
	Cards[6] = new usercardtype("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
	var JCBCard = Cards[6];
	var LuhnCheckSum = Cards[7] = new usercardtype();

	/*************************************************************************\
	CheckCardNumber(form)
	function called when users click the "check" button.
	\*************************************************************************/
	function CheckCardNumber(form) 
	{	var tmpyear;
		if (form.usercardnumber.value.length == 0) 
		{	alert("Please enter a Card Number.");
			form.usercardnumber.focus();
			return false;
		}
		if (form.usercardexpireyear.value.length == 0) 
		{	alert("Please enter the Expiration Year.");
			form.usercardexpireyear.focus();
			return false;
		}
		if (form.usercardexpireyear.value > 96)
			tmpyear = "19" + form.usercardexpireyear.value;
		else if (form.usercardexpireyear.value < 21)
			tmpyear = "20" + form.usercardexpireyear.value;
		else 
		{	alert("The Expiration Year is not valid.");
			form.usercardexpireyear.focus();
			return false;
		}
		tmpmonth = form.usercardexpiremonth.options[form.usercardexpiremonth.selectedIndex].value;
		// The following line doesn't work in IE3, you need to change it
		// to something like "(new usercardtype())...".
		// if (!usercardtype().isExpiryDate(tmpyear, tmpmonth)) {
		if (!(new usercardtype()).isExpiryDate(tmpyear, tmpmonth)) 
		{	alert("This card has already expired.");
			form.usercardexpireyear.focus();
			return false;
		}
		card = form.usercardtype.options[form.usercardtype.selectedIndex].value;
		var retval = eval(card + ".checkCardNumber(\"" + form.usercardnumber.value + "\", " + tmpyear + ", " + tmpmonth + ");");
		cardname = "";
		if (!retval)
		{	// The cardnumber has the valid luhn checksum, but we want to know which
			// usercardtype it belongs to.
			for (var n = 0; n < Cards.size; n++) 
			{	if (Cards[n].checkCardNumber(form.usercardnumber.value, tmpyear, tmpmonth)) 
				{	cardname = Cards[n].getusercardtype();
					break;
				}
			}
			if (cardname.length > 0) 
			{	alert("This card number is not valid.");
				form.usercardnumber.focus();
				return false;
			}else
			{	alert("This card number is not valid.");
				form.usercardnumber.focus();
				return false;
			}
		}else
			return true;
	}
	/*************************************************************************\
	Object usercardtype([String usercardtype, String rules, String len, int year, 
											int month])
	usercardtype    : 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 usercardtype("Visa", "4", "16");
	var AmExCard = new usercardtype("AmEx", "34,37", "15");
	\*************************************************************************/
	function usercardtype() {
		var n;
		var argv = usercardtype.arguments;
		var argc = usercardtype.arguments.length;

		this.objname = "object usercardtype";

		var tmpusercardtype = (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.setusercardtype = setusercardtype;  // setusercardtype method.
		this.setLen = setLen;  // setLen method.
		this.setRules = setRules;  // setRules method.
		this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

		this.setusercardtype(tmpusercardtype);
		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.getusercardtype = getusercardtype;  // getusercardtype 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.usercardnumber;
		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 getusercardtype()
		return the usercardtype.
		\*************************************************************************/
	function getusercardtype() {
		return this.usercardtype;
		}
		/*************************************************************************\
		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.usercardnumber;
		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.usercardnumber;

		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;
		}

		/*************************************************************************\
		usercardtype setCardNumber(cardnumber)
		return the usercardtype object.
		\*************************************************************************/
	function setCardNumber(cardnumber) {
		this.usercardnumber = cardnumber;
		return this;
		}

		/*************************************************************************\
		usercardtype setusercardtype(usercardtype)
		return the usercardtype object.
		\*************************************************************************/
	function setusercardtype(usercardtype) {
		this.usercardtype = usercardtype;
		return this;
		}

		/*************************************************************************\
		usercardtype setExpiryDate(year, month)
		return the usercardtype object.
		\*************************************************************************/
	function setExpiryDate(year, month) {
		this.year = year;
		this.month = month;
		return this;
		}

		/*************************************************************************\
		usercardtype setLen(len)
		return the usercardtype 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;
		}

		/*************************************************************************\
		usercardtype setRules()
		return the usercardtype 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;
		}
