//		phoneValidator:	Input: string 'phone' containing the phone number to be validated
//						Return: false if there is an error, true otherwise
//		This function returns a boolean: false if there is an error
//		in the phone number string, true otherwise
function phoneValidator(phone)
{
	if ((phone == null) || (phone == ""))
		return false;
	
	if ((phone.indexOf('"') != -1) || (phone.indexOf("'") != -1))
		return false;

	var checkOK = "0123456789";
	
	switch(phone.length)
	{
		case 8:
			if (phone.charAt(3) != '-')
				return false;
			
			if ((checkOK.indexOf(phone.charAt(0)) == -1) || (checkOK.indexOf(phone.charAt(1)) == -1)
				|| (checkOK.indexOf(phone.charAt(2)) == -1) || (checkOK.indexOf(phone.charAt(4)) == -1)
				|| (checkOK.indexOf(phone.charAt(5)) == -1) || (checkOK.indexOf(phone.charAt(6)) == -1)
				|| (checkOK.indexOf(phone.charAt(7)) == -1))
				return false;

			return true;
		
		case 12:
			if ((phone.charAt(3) != '-') || (phone.charAt(7) != '-'))
				return false;
			
			if ((checkOK.indexOf(phone.charAt(0)) == -1) || (checkOK.indexOf(phone.charAt(1)) == -1)
				|| (checkOK.indexOf(phone.charAt(2)) == -1) || (checkOK.indexOf(phone.charAt(4)) == -1)
				|| (checkOK.indexOf(phone.charAt(5)) == -1) || (checkOK.indexOf(phone.charAt(6)) == -1)
				|| (checkOK.indexOf(phone.charAt(8)) == -1) || (checkOK.indexOf(phone.charAt(9)) == -1)
				|| (checkOK.indexOf(phone.charAt(10)) == -1) || (checkOK.indexOf(phone.charAt(11)) == -1))
				return false;

			return true;

		case 14:
			if ((phone.charAt(1) != '-') || (phone.charAt(5) != '-') || (phone.charAt(9) != '-'))
				return false;
			
			if ((checkOK.indexOf(phone.charAt(0)) == -1) || (checkOK.indexOf(phone.charAt(2)) == -1)
				|| (checkOK.indexOf(phone.charAt(3)) == -1) || (checkOK.indexOf(phone.charAt(4)) == -1)
				|| (checkOK.indexOf(phone.charAt(6)) == -1) || (checkOK.indexOf(phone.charAt(7)) == -1)
				|| (checkOK.indexOf(phone.charAt(8)) == -1) || (checkOK.indexOf(phone.charAt(10)) == -1)
				|| (checkOK.indexOf(phone.charAt(11)) == -1) || (checkOK.indexOf(phone.charAt(12)) == -1)
				|| (checkOK.indexOf(phone.charAt(13)) == -1))
				return false;

			return true;
		
		default:
			return false;
	}
}

//		emailValidator:	Input: string 'email' containing the email address to be validated
//						Return: false if there is an error, true otherwise
//		This function returns a boolean: false if there is an error
//		in the email address string, true otherwise
function emailValidator(email)
{

	if ((email == null) || (email == ""))
		return false;

	if ((email.indexOf('"') != -1) || (email.indexOf("'") != -1))
		return false;

	var atCharIndex = email.indexOf('@');
	var dotCharIndex = email.indexOf('.');

	if ((atCharIndex <= 0) || (atCharIndex == 0) || (dotCharIndex <= 2) || (atCharIndex > dotCharIndex))
		return false;
		
	if ((email.indexOf('.com') == -1) && (email.indexOf('.org') == -1) && (email.indexOf('.net') == -1))
		return false;
	
	var checkOK = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789_-.";

	for(j = 0; j < atCharIndex; j++)
	{
		if (checkOK.indexOf(email.charAt(j)) == -1)
			return false;
	}

	for(j = atCharIndex + 1; j < dotCharIndex; j++)
	{
		if (checkOK.indexOf(email.charAt(j)) == -1)
			return false;
	}

	return true;
}

//		zipValidator:	Input: string 'zip' containing the zip code to be validated
//						Return: false if there is an error, true otherwise
//		This function returns a boolean: false if there is an error
//		in the zip code string, true otherwise
function zipValidator(zip)
{
	if ((zip == null) || (zip == ""))
		return false;
	
	if ((zip.indexOf('"') != -1) || (zip.indexOf("'") != -1))
		return false;

	var checkOK = "0123456789";

	switch(zip.length)
	{
		case 5:
			for(j = 0; j < 5; j++)
			{
				if (checkOK.indexOf(zip.charAt(j)) == -1)
					return false;
			}
			return true;
			
		case 10:
			for(j = 0; j < 5; j++)
			{
				if (checkOK.indexOf(zip.charAt(j)) == -1)
					return false;
			}

			for(j = 6; j < 10; j++)
			{
				if (checkOK.indexOf(zip.charAt(j)) == -1)
					return false;
			}

			return true;

		default:
			return false;
	}
	
	return true;
}

//		modForm:	Input: array of field names from the form
//					Return: false if there is an error, true otherwise
//		This function returns a boolean: false if there is an error
//		in the appropriate string variable, true otherwise. It will also
//		create an alert with a message containing the error, if there is one
function modForm (formCheck)
{
	var fieldName, fieldValue, reqFields, reqFieldsAry;

	reqFields = formCheck._requiredFields.value
	reqFieldsAry = reqFields.split(",")
	reqFieldNames = formCheck._requiredFieldNames.value
	reqFieldNamesAry = reqFieldNames.split(",")
	
	for(i = 0; i < formCheck.elements.length; i++)
	{
		if (formCheck.elements[i].type == 'text' || formCheck.elements[i].type == 'password')
		{
			fieldName = formCheck.elements[i].name;
			fieldValue = formCheck.elements[i].value;
							
			var fieldNameLC = fieldName.toLowerCase();
			
			for(j = 0; j < reqFieldsAry.length; j++)
			{
				fieldShowName = reqFieldNamesAry[j]
				if (reqFieldsAry[j].toLowerCase() == fieldNameLC)
				{
					if ((fieldValue == null) || (fieldValue == ""))
					{
						alert("Please enter a value for the " + fieldShowName.toUpperCase() + " field.");
						formCheck.elements[i].focus();
						return false;
					}
					

					if (fieldNameLC.indexOf('phone') != -1)
					{
						if (phoneValidator(fieldValue) == false)
						{
							alert("Invalid phone number. Please use one of the following formats:\n\t1-234-567-8901\n\t123-456-7890\n\t123-4567");
							formCheck.elements[i].focus();
							return false;
						}
					}
					else if (fieldNameLC.indexOf('email') != -1)
					{
						if (emailValidator(fieldValue) == false)
						{
							alert("Invalid email address. Please use the 'name@domain' format, for example:\n\ttjones@rayindustries.org\n\tbillray89@myemaildomain.com\n\tthewiz@techwizards.net");
							formCheck.elements[i].focus();
							return false;
						}
					}
					else if (fieldNameLC.indexOf('zip') != -1)
					{
						if (zipValidator(fieldValue) == false)
						{
							alert("Invalid zip code. Please use the '01234' or '98765-1234' format.");
							formCheck.elements[i].focus();
							return false;
						}
					}
					else
					{
						// do nothing
					}
					j = reqFieldsAry.length;
				}
			}
		}
	}

	return true;
}
function copyAddress(form){
	if (form.same.checked == true) {
		form.billing_address1.value = form.shipping_address1.value;	
		form.billing_address2.value = form.shipping_address2.value;	
		form.billing_city.value = form.shipping_city.value;	
		form.billing_state.value = form.shipping_state.value;	
		form.billing_zip.value = form.shipping_zip.value;	
	}else{
		form.billing_address1.value = "";	
		form.billing_address2.value = "";	
		form.billing_city.value = "";	
		form.billing_state.value = "";	
		form.billing_zip.value = "";	
	}
}

	function chkCCForm(form){
		if (form.CardName.value =="" || form.CardNumber.value ==""){
			alert("Please fill in all fields.");
			return false;
		}else{
			if(CheckCardNumber(form)==true){
				form.take_action.disabled=true;
				return true; //change to true 
			}else{
				return false;
			}
		}
	}


	
	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 false;
		}
		if (form.ExpYear.options[form.ExpYear.selectedIndex].value.length == 0) {
			alert("Please enter the Expiration Year.");
			//form.ExpYear.focus();
			return false;
		}
		if (form.ExpYear.options[form.ExpYear.selectedIndex].value > 96)
			tmpyear = "19" + form.ExpYear.options[form.ExpYear.selectedIndex].value;
		else if (form.ExpYear.value < 21)
			tmpyear = "20" + form.ExpYear.options[form.ExpYear.selectedIndex].value;
		else {
			alert("The Expiration Year is not valid.");
			return false;
		}
		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 false;
		}
		retval=false;
		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.");
			return true;
		}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.");
			}
			return false;
		}
	}
	/*************************************************************************\
	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;
	}

