
function myGetElementById(e) {
	if(typeof(e)!='string') return e;
	if(document.getElementById) e=document.getElementById(e);
	else if(document.all) e=document.all[e];
	else e=null;
	return e;
	}

function checkPrompt (field, String) {
	alert (String);
	field.focus();
	return;
}

function checkCreditCardInfo (form) {
	if ( checkExpirationDate(form) && validateCardNumber(form) && checkCardHolder(form) ) {
		return (true);
	} else
		return (false);
}

function parseNumber (string) {
	var numString = "";
	for (i = 0; i < string.length; i++) {
		var next = string.substring(i,i + 1);
		if ( "0" <= next && next <= "9" ) {
			numString = numString + next;
		}
	}
	return numString;
}

function checkSum ( z, flag ) {
	if ( z == 0 ) {
		return 0;
	} else {
			var quot = Math.floor( z / 10 );
			var rem = z % 10;
			if ( flag == 0 ) {
				return rem + checkSum( quot, 1 );
			} else {
					var tailx2 = 2 * rem;
					return Math.floor( tailx2 / 10 ) +
						 ( tailx2 % 10) + checkSum( quot, 0 );
		  }
	}
}

function checkExpirationDate (form) {
	var mindex = myGetElementById('expiremonth').selectedIndex;
	var month = myGetElementById('expiremonth').options[mindex].text;

	var yindex = myGetElementById('expireyear').selectedIndex;
	var year = myGetElementById('expireyear').options[yindex].text;

	var orderDate = new Date();
	var orderYear = orderDate.getFullYear();
	var orderMonth = orderDate.getMonth();

	if ( orderYear < year ||
		( orderYear == year && ( orderMonth < month ) ) ) {
		return (true);
	} else {
		checkPrompt( form.expiremonth, "Please use a card that expires\nnext month or later." );
		return (false);
	}
}

function validateCardNumber (form) {
	var cardNum = parseNumber(myGetElementById('cardnumber').value);
	var index = myGetElementById('cardtype').selectedIndex;
	var cardType = myGetElementById('cardtype').options[index].value;
	var expt = Math.floor(Math.log(cardNum) / Math.LN10);
	if (cardNum == '4111111111111111') {
		// use a special number for testing purposes
		return (true);
	}
	if (cardType == "Visa") {
		if ( ( expt == 12 || expt == 15 ) &&
			( Math.floor( cardNum / Math.pow(10, expt)) == 4 ) &&
			( ( checkSum( cardNum, 0 ) % 10 ) == 0 ) ) {
			return (true);
		} else {
			checkPrompt( form.cardnumber, "The number entered appears not\nto be a valid Visa card number.");
			return (false);
		}
	}
	if (cardType == "Mastercard") {
		var prefix = Math.floor( cardNum / Math.pow(10, 14));
		if ( ( expt == 15 ) &&
			( 50 < prefix ) && ( prefix < 56 ) &&
			( ( checkSum( cardNum, 0 ) % 10 ) == 0 ) ) {
			return (true);
		} else {
			checkPrompt( form.cardnumber, "The number entered appears not\nto be a valid Mastercard number.");
			return (false);
		}
	}
	if (cardType == "American Express") {
		var prefix = Math.floor( cardNum / Math.pow(10, 13));
		if ( ( expt == 14 ) &&
			( ( prefix == 34 ) || ( prefix == 37 ) ) &&
			( ( checkSum( cardNum, 0 ) % 10 ) == 0 ) ) {
			return (true);
		} else {
			checkPrompt( form.cardnumber, "The number entered appears not to be\na valid American Express card number.");
			return (false);
		}
	}
	else {
		checkPrompt( form.cardnumber, "The credit card or type is not supported.");
		return (false);
	}
}

function checkCardHolder (form) {
	var cardHolder = myGetElementById('cardholder').value;
	if ( cardHolder != "" ) {
		return (true);
	} else {
		checkPrompt( form.cardholder, "Please provide the name of the credit card holder." );
		return (false);
	}
}
