/*
	Test Credit Card: Visa, 4221-3456-1243-1639
*/

var ccErrors = new Array ();
ccErrors [0] = "Credit Card Number is in an Invalid Format";
ccErrors [-1] = "Credit Card Number is Invalid";
ccErrors [-2] = "Credit Card Number Has an Invalid Number of Digits";

/*	validate digits, length and prefixes of a credit card number
*/
function checkCreditCard(thetype, thenum) {
	var ccErrorNo = 1;
	var cards = new Array();
	cards [0] = {name: "X",
		length: "0",
		prefixes: "0"};
	cards [1] = {name: "Visa", 
		length: "13,16", 
		prefixes: "4"};
	cards [2] = {name: "MC", 
		length: "16", 
		prefixes: "51,52,53,54,55"};
	cards [3] = {name: "AmEx", 
		length: "15", 
		prefixes: "34,37"};	
	cards [4] = {name: "Disc", 
		length: "16", 
		prefixes: "6011"};			   		   
	cards [5] = {name: "DC", 
		length: "14,", 
		prefixes: "300,301,302,303,304,305,36,38"};
	
	if (thenum.match(/[^0-9]/)) {
		ccErrorNo = 0;
		return ccErrorNo;
	}
	
	thetype = parseInt(thetype);
	var checksum = 0;                                                             
	var j = 1;                                         
	var calc;
	
	// check digits with luhn algorithm
	for (var i = thenum.length - 1; i >= 0; i--) {
		calc = Number(thenum.charAt(i)) * j;
		if (calc > 9) {
			calc -= 9;
		}
		checksum += calc;	     
		if (j ==1) j = 2; else j = 1;
	} 
	
	if (checksum % 10 != 0) {
		ccErrorNo = -1;
		return ccErrorNo; 
	}

	// check prefixes
	var PrefixValid = false; 
	var prefix = new Array ();
	prefix = cards[thetype].prefixes.split(",");
	
	for (i=0; i<prefix.length; i++) {
		var exp = new RegExp ("^" + prefix[i]);
		if (exp.test (thenum)) PrefixValid = true;
	}
	
	if (!PrefixValid) {
		ccErrorNo = -1;
		return ccErrorNo;
	}
	
	// check length
	var LengthValid = false;
	var lengths = new Array ();
	
	lengths = cards[thetype].length.split(",");
	for (j=0; j<lengths.length; j++) {
		if (thenum.length == lengths[j]) LengthValid = true;
	}
	
	if (!LengthValid) {
		ccErrorNo = -2;
		return ccErrorNo;
	}
	
	return ccErrorNo;
}

/*	check whether the element has an empty value */
function isEmpty(value) {
	if (!value) return true;
	if ((value.length == 0) || (value.length == null)) return true; else return false;
}

/*	check whether an array of elements is empty
	format = name : response, name2 : response2
*/
function verifyElements(form, elements) {
	for (var i in elements) {
		//debugger;
		if (!form[i]) return true;
		if (isEmpty(form[i].value)) {
			alert("Please enter " + elements[i] + ".");
			return false;
		}
	}
	
	return true;
}

/* verify the formatting of an e-mail address
*/
function verifyEmail(value) {
	var pattern = /^[._a-z0-9-]+@[.a-z0-9-]+[.]{1}[a-z]{2,4}$/i;
	return pattern.test(value)
}

/*	verify the formatting of a phone number
*/
function verifyPhone(value) {
	var pattern = /^(\([0-9]{3}\){0,1}[0-9]{3}-{0,1}[0-9]{4}|[0-9]{3}-{0,1}[0-9]{3}-{0,1}[0-9]{4})$/i;
	return pattern.test(value)
}

/*	verify the formatting of a date
*/
function verifyDate(value) {
	var pattern = /^[0-9]{2}\/[0-9]{2}\/[0-9]{2,4}$/i;
	return pattern.test(value)
}

/*	clean a credit card number of formatting
*/
function cleanCreditCardNumber(value) {
	var number = value;
	var i;
	
	while ((i = number.indexOf('-')) > -1) {
		number = number.substring(0, i) +  number.substring((i + 1), number.length);
	}
	while ((i = number.indexOf(' ')) > -1) {
		number = number.substring(0, i) +  number.substring((i + 1), number.length);
	}
	
	return number;
}