function validate(myForm) {
        var errorMessage = "";
        eval("currArray = " + myForm.name + "Validation");
        for (var i=0; i<currArray.length; i++) {
                currField = currArray[i];

				if (currField[1]=="string") {
                		eval("errorMessage += validateString(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="integer") {
		                eval("errorMessage += validateInteger(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="double") {
		                eval("errorMessage += validateDouble(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="price") {
		                eval("errorMessage += validatePrice(myForm." + currField[0] + ".value, currField[2], currField[3], currField[4], currField[5])");
		        } else if (currField[1]=="date") {
		                eval("errorMessage += validateDate(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="email") {
		                eval("errorMessage += validateEmail(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="creditCardNumber") {
		                eval("errorMessage += validateCreditCardNumber(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else if (currField[1]=="select") {
		                eval("errorMessage += validateSelectList(myForm." + currField[0] + ".selectedIndex, currField[2], currField[3])");
				} else if (currField[1]=="multi") {
		                eval("errorMessage += validateMultiSelectList(myForm." + currField[0] + ".selectedIndex, currField[2], currField[3])");		
		        } else if (currField[1]=="radio") {
		                eval("errorMessage += validateRadioButtons(myForm." + currField[0] + ", currField[2], currField[3])");
		        } else if (currField[1]=="password") {
		                eval("errorMessage += validatePassword(myForm." + currField[0] + ".value, currField[2], currField[3], myForm." + currField[4] + ".value, currField[5])");
		        } else if (currField[1]=="phone") {
		                eval("errorMessage += validatePhone(myForm." + currField[0] + ".value, currField[2], currField[3])");
		        } else {
		                return "Illegal type!";
		        }

				//var functionName = getFunctionName(currField[1]);
                	//alert("errorMessage += " + functionName + "(myForm." + currField[0] + ".value, currField[2], currField[3])");
                	//eval("errorMessage += " + functionName + "(myForm." + currField[0] + ".value, currField[2], currField[3])");
                	//alert("errorMessage is now:" + errorMessage + ".");
        }
        if (errorMessage!="") {
                errorMessage = "The following errors were reported:\n\n" + errorMessage;
                alert(errorMessage);
                return false;
        } else {
                return true;
        }
}

function getFunctionName(someType) {
        if (someType=="string") {
                return "validateString";
        } else if (someType=="integer") {
                return "validateInteger";
        } else if (someType=="double") {
                return "validateDouble";
        } else if (someType=="date") {
                return "validateDate";
        } else if (someType=="email") {
                return "validateEmail";
        } else if (someType=="creditCardNumber") {
                return "validateCreditCardNumber";
        } else if (someType=="select") {
                return "validateSelectList";
        } else if (someType=="multi") {
                return "validateMultiSelectList";
        } else {
                return "Illegal type!";
        }
}

function validateString(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else {
                return "";
        }
}

function validateInteger(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else if (isNaN(someValue)) {
                return someLabel + " must be a number (no dashes or spaces).\n";
        } else if (("" + someValue).indexOf('.') > -1) { //note forcible cast to string...
                return someLabel + " must be an integer.\n";
        } else {
                return "";
        }
}

function validateDouble(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else if (isNaN(someValue)) {
                return someLabel + " must be a number.\n";
        } else {
                return "";
        }
}

function validatePrice(someValue, someLabel, isRequired, minimum, maximum) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else if (isNaN(someValue)) {
                return someLabel + " must be a number.\n";
        } else if (minimum!="" && (someValue < minimum)) {
				return someLabel + " must be at least $" + minimum + "\n";
		} else if (maximum!="" && (someValue > maximum)) {
				return someLabel + " must be less than $" + maximum + "\n";
		} else {
                return "";
        }
}

function validateDate(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else {
			if(isDate(someValue)) {				
				return "";
			} else {
				return someValue + " is not a valid date in the mm/dd/yyyy format.\n";
			}
        }
}

function validateEmail(someValue, someLabel, isRequired) {
        if (isRequired) {
			if(someValue=="") {
                return someLabel + " is a required field.\n";
			} else {
				if(!checkEmail(someValue)) {
					return someValue + " is not a valid e-mail address.\n";
				} else {
					return "";
				}
			}
        } else {
             if(someValue=="") {
                return "";
			} else {
				if(!checkEmail(someValue)) {
					return someValue + " is not a valid e-mail address.\n";
				} else {
					return "";
				}
			}
        }
}

/*
function checkEmail(someValue) {
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(someValue)){
		return (true)
	}
	//alert("Invalid E-mail Address! Please re-enter.")
	return (false)
}
*/

function checkEmail(emailStr) {
	/* The following variable tells the rest of the function whether or not to verify that the address ends in a two-letter country or well-known TLD.  1 means check it, 0 means don't. */
	var checkTLD=1;
	
	/* The following is the list of known TLDs that an e-mail address must end with. */
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	
	/* The following pattern is used to check if the entered e-mail address fits the user@domain format.  It also is used to separate the username from the domain. */
	var emailPat=/^(.+)@(.+)$/;
	
	/* The following string represents the pattern for matching all special characters.  We don't want to allow special characters in the address.  These characters include ( ) < > @ , ; : \ " . [ ] */
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	
	/* The following string represents the range of characters allowed in a username or domainname.  It really states which chars aren't allowed.*/
	var validChars="\[^\\s" + specialChars + "\]";
	
	/* The following pattern applies if the "user" is a quoted string (in which case, there are no rules about which characters are allowed and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com is a legal e-mail address. */
	var quotedUser="(\"[^\"]*\")";
	
	/* The following pattern applies for domains that are IP addresses, rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal e-mail address. NOTE: The square brackets are required. */
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	
	/* The following string represents an atom (basically a series of non-special characters.) */
	var atom=validChars + '+';
	
	/* The following string represents one word in the typical username. For example, in john.doe@somewhere.com, john and doe are words. Basically, a word is either an atom or quoted string. */
	var word="(" + atom + "|" + quotedUser + ")";
	
	// The following pattern describes the structure of the user
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	
	/* The following pattern describes the structure of a normal symbolic domain, as opposed to ipDomainPat, shown above. */
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	
	/* Finally, let's start trying to figure out if the supplied address is valid. */
	/* Begin with the coarse pattern to simply break up user@domain into different pieces that are easy to analyze. */
	var matchArray=emailStr.match(emailPat);
	
	if (matchArray==null) {
		/* Too many/few @'s or something; basically, this address doesn't even fit the general mould of a valid e-mail address. */
		//alert("Email address seems incorrect (check @ and .'s)");
		return false;
	}
	
	var user=matchArray[1];
	var domain=matchArray[2];
	
	// Start by checking that only basic ASCII characters are in the strings (0-127).
	
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			//alert("Ths username contains invalid characters.");
			return false;
	   }
	}
	
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			//alert("Ths domain name contains invalid characters.");
			return false;
	   }
	}
	
	// See if "user" is valid 
	
	if (user.match(userPat)==null) {
		// user is not valid
		//alert("The username doesn't seem to be valid.");
		return false;
	}
	
	/* if the e-mail address is at an IP address (as opposed to a symbolic host name) make sure the IP address is valid. */
	
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		// this is an IP address
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				//alert("Destination IP address is invalid!");
				return false;
		   }
		}
		return true;
	}
	
	// Domain is symbolic name.  Check if it's valid.
	 
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			//alert("The domain name does not seem to be valid.");
			return false;
	   	}
	}
	
	/* domain name seems valid, but now make sure that it ends in a known top-level domain (like com, edu, gov) or a two-letter word, representing country (uk, nl), and that there's a hostname preceding the domain or country. */
	
	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		//alert("The address must end in a well-known domain or two letter " + "country.");
		return false;
	}
	
	// Make sure there's a host name preceding the domain.
	if (len<2) {
		//alert("This address is missing a hostname!");
		return false;
	}
	
	// If we've gotten this far, everything's valid!
	return true;
}

function validateSelectList(someValue, someLabel, isRequired) {
        if (isRequired && someValue==0) {
                return someLabel + " is a required field.\n";
        } else {
                return "";
        }
}

function validateMultiSelectList(someValue, someLabel, isRequired) {
        if (isRequired && someValue==-1) {
                return someLabel + " is a required field.\n";
        } else {
                return "";
        }
}

function validateCreditCardNumber(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
                return someLabel + " is a required field.\n";
        } else if (!luhnCheck(someValue)) {
                return someLabel + " is not a valid credit card number.\n";
        } else {
                return "";
        }
}

function validateRadioButtons(someField, someLabel, isRequired) {
        if (!isRequired) {
                return "";
        } else {
                for (var i=0; i<someField.length; i++) {
                        if (someField[i].checked) {
                                return "";
                        }
                }
                return someLabel + " must be selected.\n"
        }
}

function validatePassword(someValue, someLabel, isRequired, anotherValue, anotherLabel) {
    	var theVal = "";
		if (isRequired && (someValue=="" || anotherValue=="")) {
        	if(someValue=="") { theVal += someLabel + " is a required field.\n"; } 
			if(anotherValue=="") { theVal += anotherLabel + " is a required field.\n"; }
        } else if((someValue.length < 5) || (anotherValue.length < 5)) {
			if(someValue.length < 5) { theVal += someLabel + " must be at least 5 characters.\n"; } 
			if(anotherValue.length < 5) { theVal += anotherLabel + " must be at least 5 characters.\n"; }
		} else if(someValue != anotherValue) {
			theVal += someLabel + " and " + anotherLabel + " are not the same.\n";
		}
		return theVal;
}

function validatePhone(someValue, someLabel, isRequired) {
        if (isRequired && someValue=="") {
			return someLabel + " is a required field.\n";
        } else if(someValue!="") {
			var phoneNumberDelimiters = "()-. ";
			var minDigitsInIPhoneNumber = 10;
			var s=stripCharsInBag(someValue,phoneNumberDelimiters);
			if(!isInteger(s) || s.length != minDigitsInIPhoneNumber){
				return someValue + " is not a valid phone number.\n"
			} else {
            	return "";
        	} 
		}
		return "";
}

function isInteger(s) {   
	var i;
    for (i = 0; i < s.length; i++) {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag) {   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++) {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function clearForm(o) {
	if(o && o.form) { o = o.form; }	

	var e;
	if(o && (e = o.elements)) {
		var len = e.length;
		var tn;
		var ty;
		for(var i = 0; i < len; i++) {
			o = e[i];
			if((tn = o.tagName) && (ty = o.type) && ((tn = tn.toLowerCase()) == "input" && ty.toLowerCase() == "text") || tn == "textarea") {
				o.value = "";
			} else if(tn == "select") {
				if(ty.toLowerCase() == "select-one") { 
					o.selectedIndex = 0;
				} else {
					o.selectedIndex = -1;
				}
			}
		}
	}
}

function checkButton() {
	if(document.couponEntry.couponCode.value == "") {
		document.forms.couponEntry.removeButton.disabled = true;
	} else {
		document.forms.couponEntry.removeButton.disabled = false;
	}
}

function isDate(DateToCheck){
	if(DateToCheck==""){return true;}
	var m_strDate = FormatDate(DateToCheck, "mm/dd/yyyy");
	if(m_strDate==""){
		return false;
	}
	var m_arrDate = m_strDate.split("/");
	var m_DAY = m_arrDate[1];
	var m_MONTH = m_arrDate[0];
	var m_YEAR = m_arrDate[2];

	if(m_DAY.length != 2){return false;}
	if(m_MONTH.length != 2){return false;}
	if(m_YEAR.length != 4){return false;}
	
	m_strDate = m_MONTH + "/" + m_DAY + "/" + m_YEAR;

	var testDate=new Date(m_strDate);

	if(testDate.getMonth()+1==m_MONTH){
		return true;
	} else{
		return false;
	}
}

function FormatDate(DateToFormat,FormatAs){
	if(DateToFormat==""){return"";}
	if(!FormatAs){FormatAs="dd/mm/yyyy";}
	
	var strReturnDate;
	FormatAs = FormatAs.toLowerCase();
	DateToFormat = DateToFormat.toLowerCase();
	var arrDate
	var arrMonths = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	var strMONTH;
	var Separator;
	
	while(DateToFormat.indexOf("st")>-1){ DateToFormat = DateToFormat.replace("st",""); }
	while(DateToFormat.indexOf("nd")>-1){ DateToFormat = DateToFormat.replace("nd",""); }
	while(DateToFormat.indexOf("rd")>-1){ DateToFormat = DateToFormat.replace("rd",""); }
	while(DateToFormat.indexOf("th")>-1){ DateToFormat = DateToFormat.replace("th",""); }
	
	if(DateToFormat.indexOf(".")>-1){ Separator = "."; }
	if(DateToFormat.indexOf("-")>-1){ Separator = "-"; }
	if(DateToFormat.indexOf("/")>-1){ Separator = "/"; }
	if(DateToFormat.indexOf(" ")>-1){ Separator = " "; }
	
	arrDate = DateToFormat.split(Separator);
	DateToFormat = "";
		for(var iSD = 0;iSD < arrDate.length;iSD++){
			if(arrDate[iSD]!=""){ 
				DateToFormat += arrDate[iSD] + Separator;
			}
		}
	DateToFormat = DateToFormat.substring(0,DateToFormat.length-1);
	arrDate = DateToFormat.split(Separator);
	
	if(arrDate.length < 3){ return ""; }
	
	var whatsFirst = FormatAs.substr(0,1);
	
	if(whatsFirst=="d") {
		var DAY = arrDate[0];
		var MONTH = arrDate[1];
	} else if (whatsFirst=="m") {
		var DAY = arrDate[1];
		var MONTH = arrDate[0];
	}
	var YEAR = arrDate[2];
		
	//if(parseFloat(arrDate[1]) > 12){
	//	DAY = arrDate[1];
	//	MONTH = arrDate[0];
	//}
	
	if(parseFloat(DAY) && DAY.toString().length==4){
		YEAR = arrDate[0];
		DAY = arrDate[2];
		MONTH = arrDate[1];
	}
	
	for(var iSD = 0;iSD < arrMonths.length;iSD++){
	var ShortMonth = arrMonths[iSD].substring(0,3).toLowerCase();
	var MonthPosition = DateToFormat.indexOf(ShortMonth);
		if(MonthPosition > -1){
			MONTH = iSD + 1;
				if(MonthPosition == 0){
					DAY = arrDate[1];
					YEAR = arrDate[2];
				}
			break;
		}
	}
	
	var strTemp = YEAR.toString();
	if(strTemp.length==2){
		if(parseFloat(YEAR)>40){
			YEAR = "19" + YEAR;
		} else {
			YEAR = "20" + YEAR;
		}
	}
	
	if(parseInt(MONTH)< 10 && MONTH.toString().length < 2){ MONTH = "0" + MONTH; }
	if(parseInt(DAY)< 10 && DAY.toString().length < 2){ DAY = "0" + DAY; }
	
	switch (FormatAs){
		case "dd/mm/yyyy":
			return DAY + "/" + MONTH + "/" + YEAR;
		case "mm/dd/yyyy":
			return MONTH + "/" + DAY + "/" + YEAR;
		case "dd/mmm/yyyy":
			return DAY + " " + arrMonths[MONTH -1].substring(0,3) + " " + YEAR;
		case "mmm/dd/yyyy":
			return arrMonths[MONTH -1].substring(0,3) + " " + DAY + " " + YEAR;
		case "dd/mmmm/yyyy":
			return DAY + " " + arrMonths[MONTH -1] + " " + YEAR;	
		case "mmmm/dd/yyyy":
			return arrMonths[MONTH -1] + " " + DAY + " " + YEAR;
	}
	
	return DAY + "/" + strMONTH + "/" + YEAR;;
}


//CRAZY CREDIT-CARD CRAP STOLEN FROM JAVASCRIPT.COM STARTS HERE

var Cards = new makeArray(8);
Cards[0] = new CardType("MasterCard", "51,52,53,54,55", "16");
var MasterCard = Cards[0];
Cards[1] = new CardType("VisaCard", "4", "13,16");
var VisaCard = Cards[1];
Cards[2] = new CardType("AmExCard", "34,37", "15");
var AmExCard = Cards[2];
Cards[3] = new CardType("DinersClubCard", "30,36,38", "14");
var DinersClubCard = Cards[3];
Cards[4] = new CardType("DiscoverCard", "6011", "16");
var DiscoverCard = Cards[4];
Cards[5] = new CardType("enRouteCard", "2014,2149", "15");
var enRouteCard = Cards[5];
Cards[6] = new CardType("JCBCard", "3088,3096,3112,3158,3337,3528", "16");
var JCBCard = Cards[6];
var LuhnCheckSum = Cards[7] = new CardType();

/*************************************************************************\
CheckCardNumber(form)
function called when users click the "check" button.
\*************************************************************************/
function CheckCardNumber(form) {
        var tmpyear;
        if (form.CardNumber.value.length == 0) {
                alert("Please enter a Card Number.");
                form.CardNumber.focus();
                return;
        }
        if (form.ExpYear.value.length == 0) {
                alert("Please enter the Expiration Year.");
                form.ExpYear.focus();
                return;
        }
        if (form.ExpYear.value > 96)
                tmpyear = "19" + form.ExpYear.value;
        else if (form.ExpYear.value < 21)
                tmpyear = "20" + form.ExpYear.value;
        else {
                alert("The Expiration Year is not valid.");
                return;
        }

        tmpmonth = form.ExpMon.options[form.ExpMon.selectedIndex].value;
        // The following line doesn't work in IE3, you need to change it
        // to something like "(new CardType())...".
        // if (!CardType().isExpiryDate(tmpyear, tmpmonth)) {
        if (!(new CardType()).isExpiryDate(tmpyear, tmpmonth)) {
                alert("This card has already expired.");
                return;
        }
        card = form.CardType.options[form.CardType.selectedIndex].value;
        var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value + "\", " + tmpyear + ", " + tmpmonth + ");");
        cardname = "";
        if (retval)
                // comment this out if used on an order form
                alert("This card number appears to be valid.");
        else {
                // The cardnumber has the valid luhn checksum, but we want to know which
                // cardtype it belongs to.
                for (var n = 0; n < Cards.size; n++) {
                        if (Cards[n].checkCardNumber(form.CardNumber.value, tmpyear, tmpmonth)) {
                                cardname = Cards[n].getCardType();
                                break;
                        }
                }
                if (cardname.length > 0) {
                        alert("This looks like a " + cardname + " number, not a " + card + " number.");
                } else {
                        alert("This card number is not valid.");
                }
        }
}

/*************************************************************************\
Object CardType([String cardtype, String rules, String len, int year,
                                        int month])
cardtype    : type of card, eg: MasterCard, Visa, etc.
rules       : rules of the cardnumber, eg: "4", "6011", "34,37".
len         : valid length of cardnumber, eg: "16,19", "13,16".
year        : year of expiry date.
month       : month of expiry date.
eg:
var VisaCard = new CardType("Visa", "4", "16");
var AmExCard = new CardType("AmEx", "34,37", "15");
\*************************************************************************/
function CardType() {
        var n;
        var argv = CardType.arguments;
        var argc = CardType.arguments.length;

        this.objname = "object CardType";

        var tmpcardtype = (argc > 0) ? argv[0] : "CardObject";
        var tmprules = (argc > 1) ? argv[1] : "0,1,2,3,4,5,6,7,8,9";
        var tmplen = (argc > 2) ? argv[2] : "13,14,15,16,19";

        this.setCardNumber = setCardNumber;  // set CardNumber method.
        this.setCardType = setCardType;  // setCardType method.
        this.setLen = setLen;  // setLen method.
        this.setRules = setRules;  // setRules method.
        this.setExpiryDate = setExpiryDate;  // setExpiryDate method.

        this.setCardType(tmpcardtype);
        this.setLen(tmplen);
        this.setRules(tmprules);
        if (argc > 4)
                this.setExpiryDate(argv[3], argv[4]);

        this.checkCardNumber = checkCardNumber;  // checkCardNumber method.
        this.getExpiryDate = getExpiryDate;  // getExpiryDate method.
        this.getCardType = getCardType;  // getCardType method.
        this.isCardNumber = isCardNumber;  // isCardNumber method.
        this.isExpiryDate = isExpiryDate;  // isExpiryDate method.
        this.luhnCheck = luhnCheck;// luhnCheck method.

        return this;
}

/*************************************************************************\
boolean checkCardNumber([String cardnumber, int year, int month])
return true if cardnumber pass the luhncheck and the expiry date is
valid, else return false.
\*************************************************************************/
function checkCardNumber() {
        var argv = checkCardNumber.arguments;
        var argc = checkCardNumber.arguments.length;
        var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
        var year = (argc > 1) ? argv[1] : this.year;
        var month = (argc > 2) ? argv[2] : this.month;

        this.setCardNumber(cardnumber);
        this.setExpiryDate(year, month);

        if (!this.isCardNumber())
                return false;
        if (!this.isExpiryDate())
                return false;

        return true;
}
/*************************************************************************\
String getCardType()
return the cardtype.
\*************************************************************************/
function getCardType() {
        return this.cardtype;
}
/*************************************************************************\
String getExpiryDate()
return the expiry date.
\*************************************************************************/
function getExpiryDate() {
        return this.month + "/" + this.year;
}
/*************************************************************************\
boolean isCardNumber([String cardnumber])
return true if cardnumber pass the luhncheck and the rules, else return
false.
\*************************************************************************/
function isCardNumber() {
        var argv = isCardNumber.arguments;
        var argc = isCardNumber.arguments.length;
        var cardnumber = (argc > 0) ? argv[0] : this.cardnumber;
        if (!this.luhnCheck())
                return false;

        for (var n = 0; n < this.len.size; n++)
                if (cardnumber.toString().length == this.len[n]) {
                        for (var m = 0; m < this.rules.size; m++) {
                                var headdigit = cardnumber.substring(0, this.rules[m].toString().length);
                                if (headdigit == this.rules[m])
                                        return true;
                        }
                        return false;
                }
        return false;
}

/*************************************************************************\
boolean isExpiryDate([int year, int month])
return true if the date is a valid expiry date,
else return false.
\*************************************************************************/
function isExpiryDate() {
        var argv = isExpiryDate.arguments;
        var argc = isExpiryDate.arguments.length;

        year = argc > 0 ? argv[0] : this.year;
        month = argc > 1 ? argv[1] : this.month;

        if (!isNum(year+""))
                return false;
        if (!isNum(month+""))
                return false;
        today = new Date();
        expiry = new Date(year, month);
        if (today.getTime() > expiry.getTime())
                return false;
        else
                return true;
}

/*************************************************************************\
boolean isNum(String argvalue)
return true if argvalue contains only numeric characters,
else return false.
\*************************************************************************/
function isNum(argvalue) {
        argvalue = argvalue.toString();

        if (argvalue.length == 0)
                return false;

        for (var n = 0; n < argvalue.length; n++)
                if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n, n+1) > "9")
                        return false;

        return true;
}

/*************************************************************************\
boolean luhnCheck([String CardNumber])
return true if CardNumber pass the luhn check else return false.
Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
\*************************************************************************/
function luhnCheck() {
        var argv = luhnCheck.arguments;
        var argc = luhnCheck.arguments.length;

        var CardNumber = argc > 0 ? argv[0] : this.cardnumber;

        if (! isNum(CardNumber)) {
                return false;
        }

        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)
                return true;
        else
                return false;
}

/*************************************************************************\
ArrayObject makeArray(int size)
return the array object in the size specified.
\*************************************************************************/
function makeArray(size) {
        this.size = size;
return this;
}

/*************************************************************************\
CardType setCardNumber(cardnumber)
return the CardType object.
\*************************************************************************/
function setCardNumber(cardnumber) {
        this.cardnumber = cardnumber;
        return this;
}

/*************************************************************************\
CardType setCardType(cardtype)
return the CardType object.
\*************************************************************************/
function setCardType(cardtype) {
        this.cardtype = cardtype;
        return this;
}

/*************************************************************************\
CardType setExpiryDate(year, month)
return the CardType object.
\*************************************************************************/
function setExpiryDate(year, month) {
        this.year = year;
        this.month = month;
        return this;
}

/*************************************************************************\
CardType setLen(len)
return the CardType object.
\*************************************************************************/
function setLen(len) {
        // Create the len array.
        if (len.length == 0 || len == null)
                len = "13,14,15,16,19";

        var tmplen = len;
        n = 1;
        while (tmplen.indexOf(",") != -1) {
                tmplen = tmplen.substring(tmplen.indexOf(",") + 1, tmplen.length);
                n++;
        }
        this.len = new makeArray(n);
        n = 0;
        while (len.indexOf(",") != -1) {
                var tmpstr = len.substring(0, len.indexOf(","));
                this.len[n] = tmpstr;
                len = len.substring(len.indexOf(",") + 1, len.length);
                n++;
        }
        this.len[n] = len;
        return this;
}

/*************************************************************************\
CardType setRules()
return the CardType object.
\*************************************************************************/
function setRules(rules) {
        // Create the rules array.
        if (rules.length == 0 || rules == null)
        rules = "0,1,2,3,4,5,6,7,8,9";

        var tmprules = rules;
        n = 1;
        while (tmprules.indexOf(",") != -1) {
                tmprules = tmprules.substring(tmprules.indexOf(",") + 1, tmprules.length);
                n++;
        }
        this.rules = new makeArray(n);
        n = 0;
        while (rules.indexOf(",") != -1) {
                var tmpstr = rules.substring(0, rules.indexOf(","));
                this.rules[n] = tmpstr;
                rules = rules.substring(rules.indexOf(",") + 1, rules.length);
                n++;
        }
        this.rules[n] = rules;
        return this;
}

//END CRAZY CREDIT CARD CRAP

