globalErrors = 0;
function validate(form,name,display,options) {
	
	/* Mike's big, long, evil validation script...  7/6/00
	 * --------------------------------------------------
	 * 
	 * Normal Syntax: valdate(name, display, options)
	 * 
	 * name: the field's name, no reference need
	 * display: the output string in an error msg
	 * options: validation requirements (default on left)
	 *		required = yes | no
	 *		minLength = none | #
	 *		maxLength = none | #
	 *		setLength = none | #
	 *			(same as setting min and max length to the same value)
	 *		content = any | onlynumbers | onlyletters | numbersandletters
	 * 		requiredCharacters = none | 'abc123'
	 * 
	 * (yes, 1, or true are the same)
	 * (no, 0, false, none, or any are the same)
	 * seperate the requirements with a "," and don't use any spaces
	 * 
	 * example: validate("firstName","first name","required=yes,content=lettersonly");
	 *              validate("zip","zip code","required=yes,setLength=5,content=numbersonly");
	 *              validate("eMail","e-mail address","required=yes,requiredCharacters='@.',minLength=7");
	 * 
	 * 
	 * Preset's Syntax: validate(name, preset code)
	 * name: the field's name, no reference need
	 * preset code: !firstname | !lastname | !address | !city | !state | !zipcode | !email
	 *
	 * example: validate("zip","!zipcode");
	 * 
	 */
	if (globalErrors != 0) return;
	objRef = eval("form." + name);
	
	// Set Defult Values
	setLength = maxLength = minLength = none = no = 0;
	required = yes = 1;
	content = any = 0;
		onlynumbers = numbersonly = 1;
		onlyletters = lettersonly = 2;
		numbersandletters = lettersandnumbers = 3;
	requiredCharacters = "";
	
	// Presets
	if (display == "!firstname") {
		display = "first name";
		options = "required=yes,content=lettersonly";
	} else if (display == "!lastname") {
		display = "last name";
		options = "required=yes,content=lettersonly";
	} else if (display == "!address") {
		display = "address";
		options = "required=yes,content=lettersandnumbers";
	} else if (display == "!city") {
		display = "City";
		options = "required=yes,content=lettersonly";
	} else if (display == "!state") {
		display = "State";
		options = "required=yes,content=lettersonly,setLength=2";
	} else if (display == "!zipcode") {
		display = "zip code";
		options = "required=yes,minLength=5,maxlength=10,content=numbersonly";
	} else if (display == "!email") {
		display = "e-mail address";
		options = "required=yes,requiredCharacters='@.',minLength=7";
	} else if (display == "!phone") {
		display = "phone number";
		options = "required=yes,minLength=10";
	} else if (display == "!fax") {
		display = "fax number";
		options = "required=yes,minLength=10";
	}
	
	// Overide above values
	options += ",";	
	while (options.length > 0) {
		eval(options.substring(0,options.indexOf(",")));
		options = options.substring(options.indexOf(",") + 1,1000);
	}
	
	// find content type
	numbers = (objRef.value.indexOf("0") != -1 || objRef.value.indexOf("1") != -1 || objRef.value.indexOf("2") != -1 || objRef.value.indexOf("3") != -1 || objRef.value.indexOf("4") != -1 || objRef.value.indexOf("5") != -1 || objRef.value.indexOf("6") != -1 || objRef.value.indexOf("7") != -1 || objRef.value.indexOf("8") != -1 || objRef.value.indexOf("9") != -1 || objRef.value.indexOf("0") != -1);
	str = objRef.value.toLowerCase();
	letters = (str.indexOf("a") != -1 || str.indexOf("b") != -1 || str.indexOf("c") != -1 || str.indexOf("d") != -1 || str.indexOf("e") != -1 || str.indexOf("f") != -1 || str.indexOf("g") != -1 || str.indexOf("h") != -1 || str.indexOf("i") != -1 || str.indexOf("j") != -1 || str.indexOf("k") != -1 || str.indexOf("l") != -1 || str.indexOf("m") != -1 || str.indexOf("n") != -1 || str.indexOf("o") != -1 || str.indexOf("p") != -1 || str.indexOf("q") != -1 || str.indexOf("r") != -1 || str.indexOf("s") != -1 || str.indexOf("t") != -1 || str.indexOf("u") != -1 || str.indexOf("v") != -1 || str.indexOf("w") > 0 || str.indexOf("x") != -1 || str.indexOf("y") != -1 || str.indexOf("z") != -1);
	contentType = 0;
	if (letters && numbers)
		contentType = 3;
	if (letters && !numbers)
		contentType = 2;
	if (!letters && numbers)
		contentType = 1;
	
	// Start validation
	error = 0;
	if (content && content != contentType)
		error = 5;
	if (requiredCharacters.length) {
		for (loop = 0; loop < requiredCharacters.length; loop++) {
			if (objRef.value.indexOf(requiredCharacters.charAt(loop)) == -1)
				error = 5;
		}
	}
	if (setLength && objRef.value.length != setLength)
		error = 4;
	if (maxLength && objRef.value.length > maxLength)
		error = 3;
	if (minLength && objRef.value.length < minLength)
		error = 2;
	if (required && objRef.value.length == 0)
		error = 1;
	// Display error msg, if any
	if (error == 1)
		alert("You forgot to enter your " + display + ".");
	if (error == 2)
		alert("Your " + display + " must be at least " + minLength + " characters long.");
	if (error == 3)
		alert("Your " + display + " can be no more than " + maxLength + " characters long.");
	if (error == 4)
		alert("Your " + display + " must be " + setLength + " characters long.");
	if (error == 5)
		alert("You entered an invalid " + display + ".");
	
	if (error) {
		objRef.focus();
		globalErrors += 1;
	}
	return (error ? 1 : 0);
}
// Start mike's evil credit card validation script of doom...
function ValidateCard(cardType,cardNumber) {
cardType = cardType.toLowerCase();
cardNumber = cardNumber.toString();
// strip unwanted characters
cardNumberTemp = "";
for (loop = 0; loop < cardNumber.length; loop++) {
	if (cardNumber.charAt(loop) == "0" || cardNumber.charAt(loop) == "1" || cardNumber.charAt(loop) == "2" || cardNumber.charAt(loop) == "3" || cardNumber.charAt(loop) == "4" || cardNumber.charAt(loop) == "5" || cardNumber.charAt(loop) == "6" || cardNumber.charAt(loop) == "7" || cardNumber.charAt(loop) == "8" || cardNumber.charAt(loop) == "9")
		cardNumberTemp += cardNumber.charAt(loop);
}
cardNumber = cardNumberTemp;
// look for a length error
cardLengthError = false;
if (cardNumber.length <13)
	cardLengthError = "short";
if (cardNumber.length > 19)
	cardLengthError = "long";
// find card type
cardKeys = new Array('@mastercard','51','52','53','54','55','@visa','4','13','@american express','34','37','@dinersclub','30','36','38','@discover','6011','@enroute','2014','2149','@jcb','3088','3096','3112','3158','3337','3528');
realCardType = "unknown";
for (loop = 0; loop < cardKeys.length; loop++) {
	if (cardKeys[loop].indexOf('@') == 0) {
		cardCheckType = cardKeys[loop].substring(1,99);
	} else if (cardNumber.indexOf(cardKeys[loop]) == 0) {
			realCardType = cardCheckType;
	}
}
// look for a card type mismatch
cardTypeError = false;
if (cardType != realCardType)
	cardTypeError = true;
// algorythm from hell
var no_digit = cardNumber.length;
var oddoeven = no_digit & 1;
var sum = 0;
for (var count = 0; count < no_digit; count++) {
var digit = parseInt(cardNumber.charAt(count));
if (!((count & 1) ^ oddoeven)) {
digit *= 2;
if (digit > 9)
digit -= 9;
}
sum += digit;
}
if (sum % 10 == 0)
cardNumberError = false;
else
cardNumberError = true;
if (cardLengthError) {
alert('Credit card number invalid: too ' + cardLengthError);
} else if (cardTypeError) {
alert('Credit card number invalid: wrong card type');
} else if (cardNumberError) {
alert('Credit card number invalid');
}
return !(cardLengthError || cardTypeError || cardNumberError);
}
// END
