 /*  
   # COPYRIGHT NOTICE                                                           
   # Copyright 2003 Naper Solutions          All Rights Reserved.               
   #                                                                            
   # By using order.php you agree to accept full responsibility
   # for its use, and agree to indemnify Naper Solutions Inc., its employees or officers
   # from damages of any sort. This code is not to be used for illegal purposes.
   #
   #  See http://www.napersolutions.com/policies.html for the complete license agreement.
   #  This license agreement applies to this software.
   #
   # Selling the code for this program or redistribuiting it without prior written
   # consent is expressly forbidden.  If you would like to distribute or include it in
   # another product, please contact us.
   #

   TITLE:  process_payment_javascript.php
    
   PURPOSE:  Defines the JavaScript functions to be used on the client side
   
   CONTACT INFORMATION:
   Naper Solutions, Inc.
   http://www.napersolutions.com
   info@napersolutions.com   
   Last Update: November 22, 2003
   Author:		Maggie Strevell
   
   FOR MORE INFORMATION:
   http://www.authorizenet.com/support/AIM_guide.pdf
 */


// for popup window use
function openWindow(url) {
 wndHandle = window.open(url,'500x350','toolbar=yes,status=yes,scrollbars=yes,resizable=yes,location=yes,menubar=yes,directories=yes,width=500,height=350')
 wndHandle.focus();
}

// basic error checking
function validateCardNumber() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var CardNum  = new Number(document.orderInfo.CardNumber.value.length);
	
	if (CardNum < 13 | CardNum > 20) {
		errorMsg += "The credit card number must be 13 to 20 digits depending on the card type.\n";
		valid = false;
	}	
	if (!valid)	{ 
		document.orderInfo.CardNumber.focus();
		alert (errorMsg);
	}
	return valid;
}

// basic error checking
function validateCardCode() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
	var CardCode  = new Number(document.orderInfo.CardCode.value.length);

	if (CardCode < 3 | CardCode > 4) {
		errorMsg += "The verification code is either 3 or 4 digits.\n";
		valid = false;
	}

	if (!valid)	{ 
		document.orderInfo.CardCode.focus();
		alert (errorMsg);
	}
	return valid;
}

// basic error checking for ABA Routing Number
function validateABARoutingNumber() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var ABARoutingNumber  = new Number(document.orderInfo.ABARoutingNumber.value.length);
	
	if (ABARoutingNumber != 9) {
		errorMsg += "The ABA Routing Number must be 9 digits.\n";
		valid = false;
	}	
	if (!valid)	{ 
       document.orderInfo.ABARoutingNumber.focus();
	   alert (errorMsg);
	}
	return valid;
}

// basic error checking for Bank name
function validateBankName() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var bankName  = document.orderInfo.BankName.value.length;
	
	if (bankName == 0) {
		errorMsg += "The bank name cannot be blank.\n";
		valid = false;
	}	
	if (!valid)	{ 
       document.orderInfo.BankName.focus();
	   alert (errorMsg);
	}
	return valid;
}

// basic error checking for account number
function validateAccountNumber() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var bankName  = document.orderInfo.AccountNumber.value.length;
	
	if (bankName == 0) {
		errorMsg += "The account number cannot be blank.\n";
		valid = false;
	}	
	if (!valid)	{ 
       document.orderInfo.AccountNumber.focus();
	   alert (errorMsg);
	}
	return valid;
}

// basic error checking for account name
function validateAccountName() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var bankName  = document.orderInfo.AccountName.value.length;
	
	if (bankName == 0) {
		errorMsg += "The account name cannot be blank.\n";
		valid = false;
	}	
	if (!valid)	{ 
       document.orderInfo.AccountName.focus();
	   alert (errorMsg);
	}
	return valid;
}

// basic error checking for email address
function validateEmailAddress() {
    var valid = true;
    var errorMsg = 'The following errors occurred :\n\n';
    var emailAddress  = document.orderInfo.PayPalEmailAddress.value.length;
	
	if (emailAddress == 0) {
		errorMsg += "The paypal email address cannot be blank.\n";
		valid = false;
	}	
	if (!valid)	{ 
       document.orderInfo.PayPalEmailAddress.focus();
	   alert (errorMsg);
	}
	return valid;
}

// When the user wants to use the ECheck payment option, the credit
// card fields are cleared...
function clearCardFields() 
{
	
    if (
		(
		 (document.orderInfo.UsingECheck != null) &&
		 (document.orderInfo.UsingECheck.checked == true)
		)
		||
	    (
		 (document.orderInfo.UsingPayPal != null) &&
		 (document.orderInfo.UsingPayPal.checked == true)
		 )
	    )
	{ 
	   document.orderInfo.CardNumber.value = "";
	   document.orderInfo.ExpMonth.selectedIndex = 0;
	   document.orderInfo.ExpYear.selectedIndex = 0;
	   document.orderInfo.CardCode.value = "";
    }
    
}

// When the user wants does not use the ECheck payment option, the ECheck
// fields are cleared...
function clearECheckFields() 
{
    if (document.orderInfo.UsingECheck.checked == false)
	{ 
	   document.orderInfo.ABARoutingNumber.value = "";
       document.orderInfo.BankName.value = "";
	   document.orderInfo.AccountNumber.value = "";
	   document.orderInfo.AccountType.selectedIndex = 0;
	   document.orderInfo.AccountName.value = "";
	   
	   document.orderInfo.TaxID_SSN.value = "";
	   document.orderInfo.LicenseNum.value = "";
	   document.orderInfo.LicenseState.value = "";
	   document.orderInfo.LicenseDOB.value = "";

    }
}

// This function enables the ECheck section fields. By default the 
// ECheck section fields are disabled.
function enableECheckFields()
{
    if (document.orderInfo.UsingECheck.checked == true)
	{ 
	   document.orderInfo.ABARoutingNumber.disabled = false;
	   document.orderInfo.BankName.disabled = false;
	   document.orderInfo.AccountNumber.disabled = false;
	   document.orderInfo.AccountType.disabled = false;
	   document.orderInfo.AccountName.disabled = false;
	   
	   document.orderInfo.OrganizationType.disabled = false;
	   document.orderInfo.Tax_ID.disabled = false;
	   document.orderInfo.DriverLicense.disabled = false;
	   document.orderInfo.TaxID_SSN.disabled = false;
    }
}

// This function disables the License section fields when Tax_ID/SSN 
//Radio button is checked. By default the TAX_ID/SSN fields are enabled.
function disableLicenseFields()
{
    if (document.orderInfo.UsingECheck.checked == true) {
    if(document.orderInfo.DriverLicense.checked == false)
	{ 
	   document.orderInfo.TaxID_SSN.disabled = false;
	   document.orderInfo.LicenseNum.disabled = true;
	   document.orderInfo.LicenseState.disabled = true;
	   document.orderInfo.LicenseDOB.disabled = true;
	   
	   document.orderInfo.LicenseNum.value = "";
	   document.orderInfo.LicenseState.value = "";
	   document.orderInfo.LicenseDOB.value = "";
    }
    }
}

// This function enables the License section fields when Driver's License Details 
//Radio button is checked. By default the License section fields are disabled.
function enableLicenseFields()
{
    if (document.orderInfo.UsingECheck.checked == true) {
    if (document.orderInfo.DriverLicense.checked == true)
	{ 
	   document.orderInfo.TaxID_SSN.disabled = true;
	   document.orderInfo.LicenseNum.disabled = false;
	   document.orderInfo.LicenseState.disabled = false;
	   document.orderInfo.LicenseDOB.disabled = false;
	   
	   document.orderInfo.TaxID_SSN.value = "";
    }
    }
}

// When the user wants does not use the PayPal payment option, the PayPal
// fields are cleared...
function clearPayPalFields() 
{
    if (document.orderInfo.UsingPayPal.checked == false)
	{ 
	   document.orderInfo.PayPalEmailAddress.value = "";

	   document.orderInfo.PayPalEmailAddress.disabled = true;

	   document.orderInfo.action = "process_payment.php";
    }
}

// This function enables the PayPal section fields. By default the 
// PayPal section fields are disabled.
function enablePayPalFields()
{
    if (document.orderInfo.UsingPayPal.checked == true)
	{ 
	   document.orderInfo.PayPalEmailAddress.disabled = false;

	   document.orderInfo.action = "process_payment_paypal.php";
	   
    }
}

// Shipping information is the same as billing information
function CopyBillingInfo()
{
	if (document.orderInfo.same_as_billing.checked == false)
	{ 
	   document.orderInfo.same_as_billing.value = "0";
	   document.orderInfo.ShipAddress.value = "";
	   document.orderInfo.ShipCity.value = "";
	   document.orderInfo.ShipState.selectedIndex = 0;
	   document.orderInfo.ShipZip.value = "";
	   document.orderInfo.ShipCountry.selectedIndex = 0;
	}	else  { 
	   document.orderInfo.same_as_billing.value = "1";
	   document.orderInfo.ShipAddress.value = document.orderInfo.BillAddress.value;
	   document.orderInfo.ShipCity.value = document.orderInfo.BillCity.value;
	   document.orderInfo.ShipState.selectedIndex = document.orderInfo.BillState.selectedIndex;
	   document.orderInfo.ShipZip.value = document.orderInfo.BillZip.value;
	   document.orderInfo.ShipCountry.selectedIndex = document.orderInfo.BillCountry.selectedIndex;
	}		
}

// Format Total
function formatorderAmount(orderAmount)
{
	orderAmount = orderAmount.toString().replace(/\$|\,/g,'');
	if(isNaN(orderAmount))  orderAmount = "0";
	sign = (orderAmount == (orderAmount = Math.abs(orderAmount)));
	orderAmount = Math.floor(orderAmount*100+0.50000000001);
	cents = orderAmount%100;
	orderAmount = Math.floor(orderAmount/100).toString();
	if (cents < 10) cents = "0" + cents;
	for (var i = 0; i < Math.floor((orderAmount.length-(1+i))/3); i++)
		orderAmount = orderAmount.substring(0,orderAmount.length-(4*i+3))+','+
			  orderAmount.substring(orderAmount.length-(4*i+3));
	return (((sign)?'':'-') + orderAmount + '.' + cents);
}


/*************************************************************************\
	validatePaymentOption(form)
    function that delegates the validation to the the appropriate
	function based on the payment option selected
                                         
\*************************************************************************/
function validatePaymentOption(form) {
	
	if (form.UsingECheck != null) {
		if (form.UsingECheck.checked == true) {
			return CheckECheck(form);
		}
	}

	if (form.UsingPayPal != null) {
		if(form.UsingPayPal.checked == true) {
			return CheckPayPal(form);
		}
	}

	return CheckCardNumber(form);
}

/*************************************************************************\
	CheckPayPal(form)
                                         
\*************************************************************************/
function CheckPayPal(form) {
	var validEmailAddress	= false;

	validEmailAddress = validateEmailAddress();
	if (!validEmailAddress)
	{
		return false;
	}

	return true;
}

/*************************************************************************\
	CheckECheck(form)
                                         
\*************************************************************************/
function CheckECheck(form) {
	var validABARoutingNumber	= false;
	var validBankName			= false;
	var validAccountNumber		= false;
	var validAccountName		= false;

	validABARoutingNumber = validateABARoutingNumber();
	if (!validABARoutingNumber) {
		return false;
	}

	validBankName = validateBankName();
	if (!validBankName) {
		return false;
	}

	validAccountNumber = validateAccountNumber();
	if (!validAccountNumber) {
		return false;
	}

	validAccountName = validateAccountName();
	if (!validAccountName) {
		return false;
	}

	return true;

}

/*************************************************************************\
	CheckCardNumber(form)
        function called when users click the "check" button.
                                         
\*************************************************************************/
function CheckCardNumber(form) {
	var validCardNumber	= false;
	var validCardCode	= false;

	
	var validFields = false;
	validFields = validateRequiredFields();
	if(!validFields) {
		return false;
	}

	validCardNumber = validateCardNumber();
	if (!validCardNumber) {
		return false;
	}

    validCardCode = validateCardCode();
	if (!validCardCode) {
		return false;
	}

	var tmpyear;
	if (form.CardNumber.value.length == 0) {
		alert("The following errors occurred :\n\nPlease enter a Card Number.");
                form.CardNumber.focus();
                //return;
				return false;
	}
	if (form.ExpYear.value.length == 0) {
		alert("The following errors occurred :\n\nPlease enter the Expiration Year.");
		form.ExpYear.focus();
                //return;
				return false;
	}
	if (form.ExpYear.value > 96)
		tmpyear = "19" + form.ExpYear.value;
    else if (form.ExpYear.value < 21)
		tmpyear = "20" + form.ExpYear.value;
    else {
		alert("The following errors occurred :\n\nThe Expiration Year is not valid.");
		return false;
	}

	tmpmonth = form.ExpMonth.options[form.ExpMonth.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("The following errors occurred :\n\nThis card has already expired.");
		//return;
		form.ExpYear.focus();
		return false;
	}
	card = form.CardType.options[form.CardType.selectedIndex].value;
	card_ = eval(card + ".getCardType()");
	
	var retval = eval(card + ".checkCardNumber(\"" + form.CardNumber.value + "\", " + tmpyear + ", " + tmpmonth + ");");
	
	cardname = "";

	if (retval)
		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("The following errors occurred :\n\nThis looks like a " + cardname + " number, not a " + card_ + " number.");
            form.CardType.focus();
		}
		else {
			alert("The following errors occurred :\n\nThis card number is not valid.  Please recheck your card number.  Do not use any dashes or spaces.");
            form.CardNumber.focus();    
		}
			
	}
        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;
}
//  End -->


                                         
/*************************************************************************\
	isThereCC()
	return CCinfo in and user doesn't click use credit card.
                                         
\*************************************************************************/
function isThereCC(cclen) {
	if (cclen != 0) 
	{
		alert("Please Clear Card Number or click Pay with Credit Card Button.");
		return false;
	}
}
                                         
/*************************************************************************\
	checkName()
	return True or False based on the name value.
                                         
\*************************************************************************/
function validateRequiredFields() {
	var isValid = true;
	var errorMsg = 'Please Fill the Following Required Fields\n';
	// check if FirstName is Empty
	var firstName  = document.orderInfo.FirstName.value.length;
	if(firstName == 0)
	{
		errorMsg += '         FirstName\n';
		isValid = false;
	}
	// check if LastName is Empty
	var lastName = document.orderInfo.LastName.value.length;
	if(lastName == 0)
	{
		errorMsg += '         LastName\n';
		isValid = false;
	}
	// check if CompanyName is Empty
	var isCompNameReq = document.orderInfo.CompanyName.id;
	if( isCompNameReq == "CompanyNameReq")
	{
		var companyName = document.orderInfo.CompanyName.value.length;
		if(companyName == 0)
		{
			errorMsg += '         CompanyName\n';
			isValid = false;
		}
	}
	// check if PhoneNumber is Empty
	var phoneNum = document.orderInfo.Phone.value.length;
	if(phoneNum == 0)
	{
		errorMsg += '         Phone Number\n';
		isValid = false;
	}
	// check if EmailAddress is Empty
	var eMail = document.orderInfo.EmailAddress.value.length;
	if(eMail == 0)
	{
		errorMsg += '         Email Address\n';
		isValid = false;
	}
	// check if Billing Address is Empty
	var address = document.orderInfo.BillAddress.value.length;
	if(address == 0)
	{
		errorMsg += '         Billing Address\n';
		isValid = false;
	}
	// check if Billing City is Empty
	var bCity = document.orderInfo.BillCity.value.length;
	if(bCity == 0)
	{
		errorMsg += '         Billing City\n';
		isValid = false;
	}
	// check if Billing State is Empty
	var bState = document.orderInfo.BillState.value.length;
	if(bState == 0)
	{
		errorMsg += '         Billing State\n';
		isValid = false;
	}
	// check if Billing ZipCode is Empty
	var bZip = document.orderInfo.BillZip.value.length;
	if(bZip == 0)
	{
		errorMsg += '         Billing ZipCode\n';
		isValid = false;
	}
	// check if Billing Country is Empty
	var bCountry = document.orderInfo.BillCountry.value.length;
	if(bCountry == 0)
	{
		errorMsg += '     Billing Country\n';
		isValid = false;
	}
	if(!isValid)
	{
		alert(errorMsg);
	}
	return isValid;
}