/*	Credit Card Validator by vsim
	This code is copyrighted and has limited warranties.
	http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=2493&lngWId=2
*/

//Migrated from Janus "scripts/" folder for Titanized Account Manager
//-dw 7/14/2009

// LUHN Formula for validation of credit card numbers.
function mod10( cardNumber ) {
	var ar = new Array( cardNumber.length );
	var i = 0,sum = 0;
	for (i = 0; i < cardNumber.length; ++i ) {
		ar[i] = parseInt(cardNumber.charAt(i));
	}
	// you have to start from the right, and work back.
	for (i = ar.length -2; i >= 0; i-=2 ) {
		// every second digit starting with the right most (check digit)
		// will be doubled, and summed with the skipped digits.
		// if the double digit is > 9, ADD those individual digits together
		ar[i] *= 2;
		if (ar[i] > 9 ) ar[i]-=9;
	}
	for (i = 0; i < ar.length; ++i ) {
		// if the sum is divisible by 10 mod10 succeeds
		sum += ar[i];
	}
	return (((sum%10)==0)?true:false);
}

// this function is designed to be Y2K compliant.
function expired( month, year ) {
	var now = new Date();
	// create an expired on date object with valid thru expiration date
	var expiresIn = new Date(year,month,0,0,0);
	// adjust the month, to first day, hour, minute & second of expired month
	expiresIn.setMonth(expiresIn.getMonth()+1);
	// then we get the miliseconds, and do a long integer comparison
	if (now.getTime() < expiresIn.getTime() )
		return false;

	return true;
}

//simplify the validate card parameters
function validate(formName) {
	var cardNumber = document.forms[formName].ccNumber.value;
	var cardType = document.forms[formName].ccType.value;
	var cardMonth = document.forms[formName].ccMonth.value;
	var cardYear = document.forms[formName].ccYear.value;
	//alert(cardNumber + "\n" + cardType + "\n" + cardMonth + "/" + cardYear);
	var walletType = document.forms[formName].walletType.value;

        if ((walletType.length > 0) && (walletType == 'Account'))
        	return true;

	return validateCard(cardNumber,cardType,cardMonth,cardYear);
}

function validateDateOnly(formName) {
	var cardMonth = document.forms[formName].ccMonth.value;
	var cardYear = document.forms[formName].ccYear.value;
	//alert(cardMonth + "/" + cardYear);
	
	if (expired( cardMonth, cardYear ) ) {
		alert("Please enter a valid expiration date.");
		return false;
	}	
}

function formatCCNumber(cardNumberField) {
	cardNumber = cardNumberField.value;

	cardNumber = cardNumber.replace(/ /g, "");	
	cardNumber = cardNumber.replace(/-/g, "");

	cardNumberField.value = cardNumber;
}

function validateCard(cardNumber,cardType,cardMonth,cardYear) {
	var errorMsg = "Please enter a valid [cctype] card number.";

	if ((cardNumber.length == 0) || (cardNumber.length < 13) || (cardNumber.length > 16) ) {
		alert(errorMsg.replace("[cctype] ", ""));
		return false;
	}
	// make sure the number is all digits.
	for (var i = 0; i < cardNumber.length; ++i ) {
		var c = cardNumber.charAt(i);
		if (c < '0' || c > '9' ) {
			alert(errorMsg.replace("[cctype] ", "") + "\nUse only digits. Do not use letters, spaces or punctuation.");
			return false;
		}
	}
	//perform card specific length and prefix tests
	var length = cardNumber.length;

	switch( cardType ) {
		case 'AX':
			var prefix = parseInt( cardNumber.substring(0,2));
			if ((length != 15) || (prefix != 34 && prefix != 37)) {
				alert(errorMsg.replace("[cctype]", "American Express"));
				return false;
			}
		break;

		case 'DI':
			var prefix = parseInt( cardNumber.substring(0,4));
			if ((length != 16) || (prefix != 6011)) {
				alert(errorMsg.replace("[cctype]", "Discover"));
				return false;
			}
		break;

		case 'MC':
			var prefix = parseInt( cardNumber.substring(0,2));
			if ((length != 16 ) || (prefix < 51 || prefix > 55)) {
				alert(errorMsg.replace("[cctype]", "MasterCard"));
				return false;
			}
		break;

		case 'VI':
			var prefix = parseInt( cardNumber.substring(0,1));
			if ((length != 16 && length != 13) || (prefix != 4)) {
				alert(errorMsg.replace("[cctype]", "Visa"));
				return false;
			}
		break;
	}
	// run the check digit algorithm
	if (!mod10( cardNumber ) ) {
		alert(errorMsg.replace("[cctype] ", ""));
		return false;
	}
	// check if entered date is already expired.
	if (expired( cardMonth, cardYear ) ) {
		alert("Please enter a valid expiration date.");
		return false;
	}

	// at this point card has not been proven to be invalid
	return true;
}
function validateCurrentForm(formObject) {
	var cardNumber = formObject.ccNumber.value;
	var cardType = formObject.ccType.value;
	var cardMonth = formObject.ccMonth.value;
	var cardYear = formObject.ccYear.value;
	//alert(cardNumber + "\n" + cardType + "\n" + cardMonth + "/" + cardYear);
	var walletType = formObject.walletType.value;
    if ((walletType.length > 0) && (walletType == 'Account'))
      	return true;

	return validateCard(cardNumber,cardType,cardMonth,cardYear);
}
