	var format=
	{	"NOTENTER"				:	/^[^\r]+$/,
		"EMAIL"							:	/^[\w-\.]+\@[\w\.-]+\.[a-zA-Z]{2,4}$/,
		"ENGTHAIALPHA"		:	/^[\s\r¡-ù0-9a-zA-Z]+$/,
		"ENGTHAINAME"			:	/^[\s\r\.\'¡-ëa-zA-Z]+$/,
		"NUMBER"					:	/^[0-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]+$/,
		"ZIPCODE"					:	/^[\-\s()0-9]+$/,
		"PHONE"						:	/^[\-\s()0-9]+$/
			
	};
	function validation (inputform,customfunction)
	{	for (i=0;i<inputform.length;i++)
		{	if((inputform[i].type=='text'||inputform[i].type=='password')&&inputform[i].style.display!='none')
			{	if(inputform[i].alt!='')
				{	if(inputform[i].value=='')
					{	alert(inputform[i].alt);
						inputform[i].focus();
						return false;
					}else if(inputform[i].id!='')
					{	if(!format[getType(inputform[i].id)].test(inputform[i].value))
							return errorAction(inputform[i]);
					}
				}
			}
		}
		if(customfunction)
		{	if (typeof(shipping_form) != 'undefined')
			{	if (typeof(document.all['customer[cust_province]']) != 'undefined')
				{	if(document.all['customer[cust_province]'].selectedIndex==0)
					{	alert('Please select your province');
						document.all['customer[cust_province]'].focus();
						return false;
					}
				}
				if (typeof(document.all['order[ship_id]']) != 'undefined')
				{	if(document.all['order[ship_id]'].selectedIndex==0)
					{	alert('Please select a shipping cost');
						document.all['order[ship_id]'].focus();
						return false;
					}
				}
				if (typeof(document.all['customer[cust_password]']) != 'undefined')
				{	if(document.all['customer[cust_password]'].type!='hidden')
						if(document.all['customer[cust_password]'].value.search(/ /g)>0||document.all['customer[cust_password]'].value.length<4)
						{	alert("Your password must be at least 4 characters in length (no spaces)");
							document.all['customer[cust_password]'].focus();
							return false;
						}
					if(document.all['customer[cust_password]'].value!=''||document.all['customer[cust_password_reenter]'].value!='')
						if(document.all['customer[cust_password]'].value != document.all['customer[cust_password_reenter]'].value)
						{	alert('password and reenter password are not same');
							document.all['customer[cust_password]'].focus();
							return false;
						}
				}
				if (typeof(document.all['order[order_deliverdate][day]']) != 'undefined')
				{	deliverdate = new Date(document.all['order[order_deliverdate][year]'].value,document.all['order[order_deliverdate][month]'].value-1,document.all['order[order_deliverdate][day]'].value);
					var today = new Date(document.all['toyear'].value,document.all['tomonth'].value-1,document.all['today'].value);
					if(deliverdate<today)
					{	alert('Shipping date invalid.');
						document.all['order[order_deliverdate][day]'].focus();
						return false;
					}
				}
			} else if (inputform.name=='payment_form')
			{	if(inputform.order_paymenttype.value=='Credit Card')
				{	if (typeof(document.all['order_cardtype']) != 'undefined')
					{	if(document.all['order_cardtype'].selectedIndex==0)
						{	alert('Please select your card type');
							document.all['order_cardtype'].focus();
							return false;
						}
					}
					if(inputform.order_cardtype.value=='AmExCard')
					{	if(inputform.order_verifinum.value.length!=4)
						{	alert("cvc code invalid");
							inputform.order_verifinum.focus();
							return false;
						}
					}else if(!CheckCardNumber(inputform))
					{	return false;
					}else if(inputform.order_verifinum.value.length!=3)
					{	alert("cvc code invalid");
						inputform.order_verifinum.focus();
						return false;
					}
				}
			}
		}
	}
	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.id));
		element.select();
		return false;
	}
	function keyFilter(element)
	{	if(element.id!=undefined)
		{	if(getType(element.id)=="EMAIL")
			{	if(!String.fromCharCode(event.keyCode).match(/[\r\w-\.\@]/))
					return false;
			}else if(getType(element.id)=="CUSTOM")
			{	if(!String.fromCharCode(event.keyCode).match(/test@hotmail.com/))
					return false;
			}else
			{	if(!String.fromCharCode(event.keyCode).match(format[getType(element.id)]))
					return false;
			}
		}
	}










	var Cards = new makeArray(8);
	Cards[0] = new order_cardtype("MasterCard", "51,52,53,54,55", "16");
	var MasterCard = Cards[0];
	Cards[1] = new order_cardtype("VisaCard", "4", "13,16");
	var VisaCard = Cards[1];
	Cards[2] = new order_cardtype("AmExCard", "34,37", "15");
	var AmExCard = Cards[2];
	Cards[3] = new order_cardtype("DinersClubCard", "30,36,38", "14");
	var DinersClubCard = Cards[3];
	Cards[4] = new order_cardtype("DiscoverCard", "6011", "16");
	var DiscoverCard = Cards[4];
	Cards[5] = new order_cardtype("enRouteCard", "2014,2149", "15");
	var enRouteCard = Cards[5];
	Cards[6] = new order_cardtype("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
	var JCBCard = Cards[6];
	var LuhnCheckSum = Cards[7] = new order_cardtype();

	/*************************************************************************\
	CheckCardNumber(form)
	function called when users click the "check" button.
	\*************************************************************************/
	function CheckCardNumber(form) 
	{	var tmpyear;
		if (form.order_cardnumber.value.length == 0) 
		{	alert("Please enter a Card Number.");
			form.order_cardnumber.focus();
			return false;
		}
		if (document.all['order_expirydate[year]'].value.length == 0) 
		{	alert("Please enter the Expiration Year.");
			document.all['order_expirydate[year]'].focus();
			return false;
		}
		if (document.all['order_expirydate[year]'].value > 96)
			tmpyear = "19" + document.all['order_expirydate[year]'].value;
		else if (document.all['order_expirydate[year]'].value < 21)
			tmpyear = "20" + document.all['order_expirydate[year]'].value;
		else 
		{	alert("The Expiration Year is not valid.");
			document.all['order_expirydate[year]'].focus();
			return false;
		}
		tmpmonth = document.all['order_expirydate[month]'].options[document.all['order_expirydate[month]'].selectedIndex].value;
		// The following line doesn't work in IE3, you need to change it
		// to something like "(new order_cardtype())...".
		// if (!order_cardtype().isExpiryDate(tmpyear, tmpmonth)) {
		if (!(new order_cardtype()).isExpiryDate(tmpyear, tmpmonth)) 
		{	alert("Please enter a valid expiry date.");
			document.all['order_expirydate[year]'].focus();
			return false;
		}
		card = form.order_cardtype.options[form.order_cardtype.selectedIndex].value;
		var retval = eval(card + ".checkCardNumber(\"" + form.order_cardnumber.value + "\", " + tmpyear + ", " + tmpmonth + ");");
		cardname = "";
		if (!retval)
		{	// The cardnumber has the valid luhn checksum, but we want to know which
			// order_cardtype it belongs to.
			for (var n = 0; n < Cards.size; n++) 
			{	if (Cards[n].checkCardNumber(form.order_cardnumber.value, tmpyear, tmpmonth)) 
				{	cardname = Cards[n].getorder_cardtype();
					break;
				}
			}
			if (cardname.length > 0) 
			{	alert("This card number is not valid.");
				form.order_cardnumber.focus();
				return false;
			}else
			{	alert("This card number is not valid.");
				form.order_cardnumber.focus();
				return false;
			}
		}else
			return true;
	}
	/*************************************************************************\
	Object order_cardtype([String order_cardtype, String rules, String len, int year, 
											int month])
	order_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 order_cardtype("Visa", "4", "16");
	var AmExCard = new order_cardtype("AmEx", "34,37", "15");
	\*************************************************************************/
	function order_cardtype() {
		var n;
		var argv = order_cardtype.arguments;
		var argc = order_cardtype.arguments.length;

		this.objname = "object order_cardtype";

		var tmporder_cardtype = (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.setorder_cardtype = setorder_cardtype;  // setorder_cardtype method.
		this.setLen = setLen;  // setLen method.
		this.setRules = setRules;  // setRules method.
		this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

		this.setorder_cardtype(tmporder_cardtype);
		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.getorder_cardtype = getorder_cardtype;  // getorder_cardtype 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.order_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 getorder_cardtype()
		return the order_cardtype.
		\*************************************************************************/
	function getorder_cardtype() {
		return this.order_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.order_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.order_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;
		}

		/*************************************************************************\
		order_cardtype setCardNumber(cardnumber)
		return the order_cardtype object.
		\*************************************************************************/
	function setCardNumber(cardnumber) {
		this.order_cardnumber = cardnumber;
		return this;
		}

		/*************************************************************************\
		order_cardtype setorder_cardtype(order_cardtype)
		return the order_cardtype object.
		\*************************************************************************/
	function setorder_cardtype(order_cardtype) {
		this.order_cardtype = order_cardtype;
		return this;
		}

		/*************************************************************************\
		order_cardtype setExpiryDate(year, month)
		return the order_cardtype object.
		\*************************************************************************/
	function setExpiryDate(year, month) {
		this.year = year;
		this.month = month;
		return this;
		}

		/*************************************************************************\
		order_cardtype setLen(len)
		return the order_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;
		}

		/*************************************************************************\
		order_cardtype setRules()
		return the order_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;
		}