//		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

// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;

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 trim(s)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not a whitespace, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (c != " ") returnString += c;
    }
    return returnString;
}
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 checkInternationalPhone(strPhone){
var bracket=3
strPhone=trim(strPhone)
if(strPhone.indexOf("+")>1) return false
if(strPhone.indexOf("-")!=-1)bracket=bracket+1
if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)return false
var brchr=strPhone.indexOf("(")
if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")return false
if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)return false
s=stripCharsInBag(strPhone,validWorldPhoneChars);
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}


function phoneValidator(phone)
{
	if ((phone == null) || (phone == ""))
		return false;
	
	if ((phone.indexOf('"') != -1) || (phone.indexOf("'") != -1))
		return false;

	return checkInternationalPhone(phone);
}

//		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)
{

	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
   	if(reg.test(email) == false) 
	{
      	return false;
   	}
	else
	{
		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 4:
			for(j = 0; j < 4; j++)
			{
				if (checkOK.indexOf(zip.charAt(j)) == -1)
					return false;
			}
			return true;
		case 5:
			for(j = 0; j < 5; j++)
			{
				if (checkOK.indexOf(zip.charAt(j)) == -1)
					return false;
			}
			return true;
		case 6:
			return true;
		case 7:
			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 (fieldNamesArray)
{

//	<% fieldary = array("chrName","txtDescription","chrPhone","chrEmail","chrZip","boolDisabled") %>
	var fieldName, fieldValue, reqFields, reqFieldsAry;

/*	Use ASP to write out the javascript array
	<%
	jscriptarraystring = "var jFieldArray = new Array("
	jscriptarraystring = jscriptarraystring & "'" & fieldary(0) & "'"
	for i=1 to	ubound(fieldary)
		jscriptarraystring = jscriptarraystring & ", " & "'" & fieldary(i) & "'"
	next

	jscriptarraystring = jscriptarraystring & ");"
	Response.write jscriptarraystring
	%> */

	reqFields = fieldNamesArray._requiredFields.value;
	reqFieldNames = fieldNamesArray._requiredFieldNames.value;
	reqFieldsAry = reqFields.split(",");
	reqFieldNamesAry = reqFieldNames.split(",");
	
	for(i = 0; i < fieldNamesArray.elements.length; i++)
	{
		if (fieldNamesArray.elements[i].type == 'text')
		{
			fieldName = fieldNamesArray.elements[i].name;
			fieldValue = fieldNamesArray.elements[i].value;
	
			var fieldNameLC = fieldName.toLowerCase();
			
			for(j = 0; j < reqFieldsAry.length; j++)
			{
				fieldNameHR = reqFieldNamesAry[j].toLowerCase();
				
				if (reqFieldsAry[j].toLowerCase() == fieldNameLC)
				{
					if ((fieldValue == null) || (fieldValue == ""))
					{
						alert("Please enter a value for the " + fieldNameHR + " field.");
						fieldNamesArray.elements[i].focus();
						return false;
					}
					
					if ((fieldValue.indexOf('"') != -1) || (fieldValue.indexOf("'") != -1))
					{
						alert("Please remove any single or double quotes from the " + fieldNameHR + " field.");
						fieldNamesArray.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");
							fieldNamesArray.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");
							fieldNamesArray.elements[i].focus();
							return false;
						}
					}
					else if (fieldNameLC.indexOf('zip') != -1)
					{
						if (zipValidator(fieldValue) == false)
						{
							alert("Invalid zip code. Please use the '1234', '01234', 'GL20 6AT' or '98765-1234' format.");
							fieldNamesArray.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_address3.value = form.shipping_address3.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_address3.value = "";	
		form.billing_city.value = "";	
		form.billing_state.value = "";	
		form.billing_zip.value = "";	
	}
}

function checkLoginInfo(form){
	if (form.first_name.value == "" || form.last_name.value == "" || form.email.value=="" || form.password.value == "" || form.billing_address1.value == "" || form.billing_city.value == "" || form.billing_state.value == "" || form.billing_zip.value == ""){
		alert("Must fill out the required fields marked with a *.");
		return false;
	}else{
		return true;
	}
}

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;
		}
	}
}
						
function chkCodes(thisform){
	//alert(shit.form.referralcode.value);
	
	if (thisform.form.referral_code.value != ""){
			popupWin = window.open("test_code.php?c="+thisform.form.referral_code.value+"&c_id="+thisform.form.c_id.value,"verify", 'width=300,height=150,left=25,top=25');	
	}else{
		alert("No code entered");
	}
	
}

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;
}

			
