function mask(value, type, message, no) {
if(value == "") return true;
type = type.toLowerCase();
var msg = "";
switch(type) {
case "address": if(!/^[a-zA-Z0-9-', \/]+$/.test(value)) msg = "Please enter your address."; break;
case "ax":
case "amex": if(!isValidCreditCard(value, type)) msg = "Please enter a valid American Express number."; break;
case "birthyear": if(!isValidBirthYear(value, 0)) msg = "Please enter a valid date of birth."; break;
case "creditcard": if(!isValidCreditCard(value, type)) msg = "Please enter a valid credit card number."; break;
case "ccbirthyear": if(!isValidBirthYear(value, 18)) msg = "The credit card holder needs to be older than 18."; break;
case "delta": value = value.replace(/[ -]/g, "");
if(!/^(4)(1|4|5|6|9)\d{14}$/.test(value)) msg = "Please enter a valid Delta number."; break;
case "di":
case "dc":
case "diners": if(!isValidCreditCard(value, type)) msg = "Please enter a valid Diners Card number."; break;
case "email": if(!/^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&amp;\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&amp;\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/.test(value)) msg = "Please enter a valid email address."; break;
case "euro": value = value.replace(/[ -]/g, "");
if(!/^\d{16}$/.test(value)) msg = "Please enter a valid Eurocard number."; break;
case "ca":
case "master": if(!isValidCreditCard(value, type)) msg = "Please enter a valid Mastercard number."; break;
case "name": 
	//Enable this when TTL 1.8 goes live. Added by Jack (25/11/03)
	//if(!/^[a-zåäöüéèáàêëûãç\s-\'\d]{2,}$/i.test(value) || !isNaN(value)) msg = "Please enter your name."; break;
	if(!/^[a-z\s-\'\d]{2,}$/i.test(value) || !isNaN(value)) msg = "Please enter your name."; break;
case "number": 
if(/\s/.test(value)){
	msg = "Please enter a number without spaces."; 
}
if (!isNaN(value)) {
	if (no != null && parseInt(no) != value.length) {
		msg = "Your security code is a " + no + " digit number."; 
	}
}
else {
	msg = "Please fill in your " + no + " digit security code."; 	
}
break;
case "phone": if(!/^[^-](\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/.test(value)) msg = "Please enter a valid telephone number."; break;
case "postcode": if(!/^[a-zA-Z0-9- ]+$/.test(value)) msg = "Please enter a valid postcode."; break;
case "switch": value = value.replace(/[ -]/g, "");
if(!/^(49|56|63|67)\d{14,17}$/.test(value)) msg = "Please enter a valid Switch number."; break;
case "switch-bos": value = value.replace(/[ -]/g, "");
if(!/^(4)\d{15,17}$/.test(value)) msg = "Please enter a valid Switch number."; break;
case "string": if(!isNaN(value)) msg = "Please enter text."; break;
case "text": if(!/^[a-zA-Z-\, \[\]]+$/.test(value) || !isNaN(value)) msg = "Please enter text."; break;
case "vi":
case "visa": if(!isValidCreditCard(value, type)) msg = "Please enter a valid Visa Card number."; break;
default: var type = new RegExp(type); if(!type.test(value)) msg = "Error";
}
if(msg != "") {
alert(message ? message : msg);
return false;
}
return true;
}
function isValidBirthYear(value, num) {
if(isNaN(value)) return false;
var d = new Date();
var maxYear = d.getFullYear();
var minYear = maxYear - 120;
return !(value > (maxYear - num) || value < minYear);
}
function isValidCreditCard(value, type) {
value = value.replace(/[ -]/g, "");
var reg;
switch(type) {
case "ax":
case "amex": reg = /^(37|34)\d{13}$/; break;
case "delta": reg = /^(4)(1|4|5|6|9)\d{14}$/; break;
case "di":
case "diners": reg = /^(3)(0|6|8)\d{12,13}$/; break;
case "euro": reg = /^\d{16}$/; break;
case "ca":
case "master": reg = /^(5)\d{15}$/; break;
case "switch": reg = /^(49|56|63|67)\d{14,17}$/; break;
case "switch-bos": reg = /^(4)\d{15,17}$/; break;
case "vi":
case "visa": reg = /^(4)\d{15}$/; break;
default: reg = /^\d{12,18}$/;
}
return (reg.test(value) && luhn(value));
}
function luhn(ccNumber) {
var checksum = 0;
var doubleFlag = (ccNumber.length % 2 == 0);
var currentDigitValue;
for(var i = 0; i < ccNumber.length; i++) {
currentDigitValue = ccNumber.substr(i, 1);
if(doubleFlag) {
currentDigitValue = currentDigitValue * 2;
if(currentDigitValue > 9) currentDigitValue = currentDigitValue - 9; 
}
checksum = checksum + parseInt(currentDigitValue);
doubleFlag = !doubleFlag;
}
return (checksum % 10 == 0);
}
function checkValue(field, type, msg, no) {
if(!mask(field.value, type, msg, no)) {
	field.focus();
	field.select();
return false;
}
return true;
}
function checkCardValue(field1, field2, type, msg) {
if(!mask(field1.value, type || "creditcard", msg)) {
field2.selectedIndex = 0;
field1.value = "";
field2.focus();
return false;
}
return true;
}

