function highlight_row(name){
    document.getElementById(name+'_row').className = 'current';
    //alert("highlighting row:"+name);
}

function dehighlight_row(name){
    document.getElementById(name+'_row').className = null;
    //alert("dehighlighting row:"+name);
}

function updateTotal() {
	num = document.getElementById('number');
	rate = document.getElementById('rate');
	total = document.getElementById('total');
	total.value = '$' + (rate.value * num.value);
}

default_cvv_notice = "off";
function toggleCVVNotice() {
	notice = document.getElementById('what_is_cvv');
	if (default_cvv_notice == "off") {
		notice.style.display = "table-row";
		default_cvv_notice = "on";
	} else {
		notice.style.display = "none";
		default_cvv_notice = "off";
	}
}

function luhn_checksum(ccnum) {
	var checksum = 0;
	// add the even digits in even-length nums or odd digits in odd-length nums
	for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
		checksum += parseInt(ccnum.charAt(i-1));
	}
	// now pick up the digits we skipped earlier, but here,
	// we double each digit and use  (1 + remainder modulo 10)
	for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
		var digit = parseInt(ccnum.charAt(i-1)) * 2;
		if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
	}
	if ((checksum % 10) == 0) return true; else return false;
}

function match_name_digits(cctype, ccnum) {
	if (cctype == "Visa") {
		// 13 or 16 digits, prefix 4
		var re = /4\d{12}$/;
		if (re.test(ccnum)) return true;
		var re = /4\d{15}$/;
		if (re.test(ccnum)) return true;
	} else if (cctype == "MasterCard") {
		// 16 digits, prefix 51-55
		var re = /5[1-5]\d{14}$/;
		if (re.test(ccnum)) return true;
	} else if (cctype == "Discover") {
		// 16 digits, prefix 6011
		var re = /6011\d{12}$/;
		if (re.test(ccnum)) return true;
	} else if (cctype == "Amex") {
		// 15 digits, prefix 34 or 37
		var re = /3[4,7]\d{13}$/;
		if (re.test(ccnum)) return true;
	} 
	return false;
}

function validate_number() {
	var cctype = document.getElementById('credit_card_type').value;
	var ccnum  = document.getElementById('credit_card_number').value;
	
	//first, strip out spaces, dashes, etc
	ccnum = ccnum.replace(/[^0-9]/gi,"");
	//do we have the right digits for this card type?
	if ( ! match_name_digits(cctype, ccnum)) {
		alert("Please re-check card type and number.");
		return false;
	}
	if ( ! luhn_checksum(ccnum)) {
		alert("Please re-check card number.");
		return false;
	}
	return true;
}

function expire_date_ok() {
	var ccyear = document.getElementById('credit_card_expires_year').value;
	var ccmonth= document.getElementById('credit_card_expires_month').value;
	target = new Date();
	expiry = new Date(ccyear, ccmonth);
	if (target.getTime() > expiry.getTime()) {
		alert("Card has expired.");
		return false;
	}
	return true; //it has not expired
}

function checkCreditForm() {
	if ( ! validate_number()) return false;
	if ( ! expire_date_ok()) return false;
	// disable save button, show spinner
	document.getElementById('submit_button').disabled = true;
	document.getElementById('progress_spinner').style.display='inline';
	return true;
}

