function LuhnCheck(str){
  var result = true;

  var sum = 0; 
  var mul = 1; 
  var strLen = str.length;
  
  for (i = 0; i < strLen; i++){
    var digit = str.substring(strLen-i-1,strLen-i);
    var tproduct = parseInt(digit ,10)*mul;
    if (tproduct >= 10)
      sum += (tproduct % 10) + 1;
    else
      sum += tproduct;
    if (mul == 1)
      mul++;
    else
      mul--;
  }
  if ((sum % 10) != 0)
    result = false;
    
  return result;
}


function validateCCNum(cardNum){
	var result = false;
	var cardLen = cardNum.length;
	var firstdig = cardNum.substring(0,1);
	var seconddig = cardNum.substring(1,2);
	var first4digs = cardNum.substring(0,4);

	//cascade validation
	for(i=0; i<5; i++){
		switch(i){
			case 0: //"VISA":
				result = ((cardLen == 16) || (cardLen == 13)) && (firstdig == "4");
				break;
			case 1: //"AMEX":
				var validNums = "47";
				result = (cardLen == 15) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
				break;
			case 2: //"MASTERCARD":
				var validNums = "12345";
				result = (cardLen == 16) && (firstdig == "5") && (validNums.indexOf(seconddig)>=0);
				break;
			case 3: //"DISCOVER":
				result = (cardLen == 16) && (first4digs == "6011");
				break;
			case 4: //"DINERS":
				var validNums = "068";
				result = (cardLen == 14) && (firstdig == "3") && (validNums.indexOf(seconddig)>=0);
				break;
		}
		if(result) return true;
	}
	return false;
}

function validateExpDate(expDate){
	//valid are  mmyy, mm/yy, mm20yy, mm/20yy
	var rex = /^(([0]\d{1})|([1]([012])))(\/?)(([2][0])?)(\d{2})$/;
	return rex.test(expDate);
}

function validateExpMonth(expDate){
	//valid are  01-12
	var rex = /^(([0]?\d{1})|([1]([012])))$/;
	return rex.test(expDate);
}

function validateExpYear(expDate){
	//valid are  mmyy, mm/yy, mm20yy, mm/20yy
	var rex = /^(([2][0])?)(\d{2})$/;
	return rex.test(expDate);
}


function validateCVC2(cvc2){
	//valid are ddd or dddd
	var rex = /^(\d{3,4})$/;
	return cvc2==""?true:rex.test(cvc2);
}

function validateName(name){
	var rex = /^[a-zA-Z \-\']+$/;
	return rex.test(name);
}
function CheckField(frm, fname, ftitle){
// ccmod emily.  trim the string before validating it
//	if(frm.elements[fname].value == ""){
	if(trim(frm.elements[fname].value) == ""){
		alert(msg_please_enter + ' ' + ftitle);
		frm.elements[fname].focus();
		return false;
	}
	else{
		return true;
	}
}

function CheckCustomFields(frm, place){
	var irex = /^custom_field\[(\d{1,})\]$/;
	for(i=0; i<frm.elements.length; i++){
		if(irex.test(frm.elements[i].name)){
		//	alert(frm.elements[i].name);
			var s = frm.elements[i].name;
			var id = s.substring(13, s.length-1);
			if(frm.elements['custom_field_place[' + id + ']'].value == place){
				if(frm.elements['custom_field_required[' + id + ']'].value == 'yes'){
					//alert(frm.elements[i].type);
					if(frm.elements[i].type == "checkbox" && !frm.elements[i].checked){
					//alert(msg_to_continue_please_check + ' ' + frm.elements['custom_field_name[' + id + ']'].value);
                        alert(msg_please_enter + ' ' + frm.elements['custom_field_name[' + id + ']'].value);   
						frm.elements[i].focus();
						return false;
					}
					else if(frm.elements[i].value == ""){
						alert(msg_please_enter + ' ' + frm.elements['custom_field_name[' + id + ']'].value);
						frm.elements[i].focus();
						return false;
					}
				}
			}
		}
	}
	return true;
}

function CheckAddProduct(frm, min_order, max_order, allowed_max){
	var rex = /^(\d{1,})$/
	if(!rex.test(frm.elements["oa_quantity"].value)){
		alert(msg_numeric_product_quantity);
		frm.elements["oa_quantity"].focus();
		return false;
	}
	if((frm.elements["oa_quantity"].value *1) < min_order){
        /* ccmod emily. Made nicer */
        alert(msg_number_of_items_less_than_min + ".\n" + "(" + msg_minimum + "=" + min_order + ")"  );
		frm.elements["oa_quantity"].focus();
		return false;
	}
	if((max_order != "-") && (frm.elements["oa_quantity"].value * 1 > max_order)){
        /* ccmod emily. Made nicer */
        alert(msg_number_of_items_exceeded_max + ".\n" + "(" + msg_maximum + "=" + max_order + ")"  );
		frm.elements["oa_quantity"].focus();
		return false;
	}
	if((allowed_max != "-") && (frm.elements["oa_quantity"].value * 1 > allowed_max)){
		/* ccmod emily. Made nicer. Intentionally EXCLUDE num in stock though. */
        alert(msg_number_of_items_exceeds_inventory);
		frm.elements["oa_quantity"].focus();
		return false;
	}
	return true;
}

function CheckResetPassword(frm){
	if(!CheckField(frm, "login", "username")) return false;
	if(!isEmail(frm.elements["email"].value)){
		alert(msg_enter_valid_email);
		frm.elements["email"].focus();
		return false;
	}
	return true;
}

// ccmod emily. The cart tells us the quantity per ocid. Need the quantity per pid
// to see if person is under or over the minimum
function CheckCartForm(frm){
// ccmod emily.
//	var irex = /^oa_quantity\[([\d]{1,})\]$/;
	var irex = /^oa_quantity\[([\d_]{1,})\]$/;
	var drex = /^(\d{1,})$/

    var quantities_by_pid = new Array();

	for(i=0; i<frm.elements.length; i++){
		if(irex.test(frm.elements[i].name)){
			if(!drex.test(frm.elements[i].value)){
				alert(msg_numeric_product_quantity);
				frm.elements[i].focus();
				return false;	
			}

			// ccmod emily
            var qty = parseInt(frm.elements[i].value) * 1  ;

	        var pid_ocid_rex = /^oa_quantity\[([\d_]{1,})\]$/;
         	var pid_ocid = frm.elements[i].name.replace(pid_ocid_rex, "$1");
         	var pid = pid_ocid.replace(/^([\d]{1,})_(\d{1,})$/, "$1");
         	var ocid = pid_ocid.replace(/^([\d]{1,})_(\d{1,})$/, "$2");

         	if (typeof(quantities_by_pid[pid]) == "undefined") {
         	   quantities_by_pid[pid] = qty;
         	} else {
         	   quantities_by_pid[pid] += qty;
         	}

			/* Check min */
			if(frm.elements[i].value != 0 && quantities_by_pid[pid] * 1 < (frm.elements["min_" + frm.elements[i].name].value) * 1){
                /* ccmod emily. Made nicer */
		        alert(msg_number_of_items_less_than_min + ".\n"
				  + "(" + msg_minimum + "=" 
		          + (frm.elements["min_" + frm.elements[i].name].value) * 1
				  + ")"
                );
				frm.elements[i].focus();
				return false;
			}

			/* Check max */
			if(
				(frm.elements["max_" + frm.elements[i].name].value != "-") && 
				(quantities_by_pid[pid] * 1 > frm.elements["max_" + frm.elements[i].name].value * 1)
			){
                /* ccmod emily. Made nicer */
		        alert(msg_number_of_items_exceeded_max + ".\n"
				  + "(" + msg_maximum + "=" 
		          + (frm.elements["max_" + frm.elements[i].name].value) * 1
				  + ")"
                );
				frm.elements[i].focus();
				return false;
            }

			/* Check inventory */
			if(
				(frm.elements["allowed_" + frm.elements[i].name].value != "-") && 
				(quantities_by_pid[pid] * 1 > frm.elements["allowed_" + frm.elements[i].name].value * 1)
			){
		        alert(msg_number_of_items_exceeds_inventory);
				frm.elements[i].focus();
				return false;
			}

		}
	}
   return true;
}

// ccmod emily. Rewrote subscribe entirely, to work like unsubscribe, and to include validation of email
function CheckNewsletters(frm){
	if(!isEmail(frm.elements["email"].value)){
		alert(msg_enter_valid_email);
		frm.elements["email"].focus();
		return false;
	}
    // ccmod emily. renamed checkboxes
	if((!frm.elements["email_updates"].checked) && (!frm.elements["email_newsletters"].checked)){
		alert(msg_choose_min_1checkbox);
		frm.elements["email_updates"].focus();
		return false;
	}
    return true;
}

function CheckUnsubscribe(frm){
	if(!isEmail(frm.elements["email"].value)){
		alert(msg_enter_valid_email);
		frm.elements["email"].focus();
		return false;
	}
    // ccmod emily. renamed checkboxes
	if((!frm.elements["cancel_updates"].checked) && (!frm.elements["cancel_newsletters"].checked)){
		alert(msg_choose_min_1checkbox);
		frm.elements["cancel_updates"].focus();
		return false;
	}
	/* ccmod emily. unsubscribe now works very differently--there's no need to confirm. See public_unsubscribe.php */
    return true;
}

function CheckLoginForm(frm){
	if(!CheckField(frm, "login", msg_your_username)) return false;
	if(!CheckField(frm, "password", msg_your_password)) return false;
	return true;
}

/////////////////////////////
// CHECK SIGNUP FORM
function CheckSignupForm(frm, fm_company, fm_address2, fm_phone, ship2all, ship2countries){
	if(!CheckField(frm, "form[fname]", msg_first_name)) return false;
	if(!CheckField(frm, "form[lname]", msg_last_name)) return false;
	if(fm_company == "Required" && (!CheckField(frm, "form[company]", msg_company_name))) return false;
	if(!CheckField(frm, "form[address1]", msg_address_line1)) return false;
	if(fm_address2 == "Required" && (!CheckField(frm, "form[address2]", msg_address_line2))) return false;
	if(!CheckField(frm, "form[city]", msg_city_name)) return false;
	if(!CheckField(frm, "form[country]", msg_country)) return false;
	//check is there USA or Canada
	if(frm.elements["form[country]"].value == 1 || frm.elements["form[country]"].value == 2){
		if(frm.elements["form[country]"].value == 1){	
		    //check USA state. ccmod emily. added Military states AA, AE, AP
            var stid = frm.elements["form[state]"].value;
			if(stid<1 || (stid>51 && stid!=65 && stid!=66 && stid!=67)){
				alert(msg_select_usa_state);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
		//check Canadian Province
		if(frm.elements["form[country]"].value == 2){	
			if(frm.elements["form[state]"].value < 51 || frm.elements["form[state]"].value > 64){
				alert(msg_select_canada_province);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
	}
	else{
		//check custom province/state
        // ccmod emily. Puerto Rico (166) does not have states
	   if(frm.elements["form[country]"].value != 166) {
		   if(!CheckField(frm, "form[province]", msg_custom_province_state)) return false;
       }

	}
	
	if(!CheckField(frm, "form[zip]", msg_zip_postal_code)) return false;
	if(fm_phone == "Required" && (!CheckField(frm, "form[phone]", msg_phone_number))) return false;
	
	if(!CheckCustomFields(frm, 'billing')){
		return false;	
	}
	
	if(!ship2all && frm.elements["form[thesame]"].checked){
		//check shipping country
		c = frm.elements["form[country]"].value;
		is_country = false;
		for(i=1; i<= ship2countries.length; i++){
			if(ship2countries[i] == c){
				is_country = true;
			}
		}
		if(!is_country){
			alert(msg_incorrect_shipping_address);
			return false;
		}
	}
	
	if(!CheckField(frm, "form[email]", msg_email_address)) return false;
	if(!isEmail(frm.elements["form[email]"].value)){
		alert(msg_enter_valid_email);
		frm.elements["form[email]"].focus();
		return false;
	}
	if(!CheckField(frm, "form[login]", msg_username)) return false;
	if(!CheckField(frm, "form[password]", msg_password)) return false;
	if(!CheckField(frm, "form[password2]", msg_password_confirmation)) return false;
	
	if(!CheckCustomFields(frm, 'account')){
		return false;	
	}
	
	if(!CheckCustomFields(frm, 'signup')){
		return false;	
	}
	
/* ccmod emily. Obsolete as of verison 2.0. Use custom fields instead.
	if(frm.elements["form[agree]"].checked == false){
		alert(msg_read_terms_before_registration);
		return false;
	}
*/
	return true;
}


function CheckShippingAddress(frm, fm_company, fm_address2){
	if(!CheckField(frm, "form[name]", msg_name)) return false;
	if(fm_company == "Required" && (!CheckField(frm, "form[company]", msg_company_name))) return false;
	if(!CheckField(frm, "form[address1]", msg_address_line1)) return false;
	if(fm_address2 == "Required" && (!CheckField(frm, "form[address2]", msg_address_line2))) return false;
	if(!CheckField(frm, "form[city]", msg_city_name)) return false;
	if(!CheckField(frm, "form[country]", msg_country)) return false;
	//check if country is  USA(1) or Canada (2)
	if(frm.elements["form[country]"].value == 1 || frm.elements["form[country]"].value == 2){
		//check USA state
		if(frm.elements["form[country]"].value == 1){	
		    //check USA state. ccmod emily. added Military states AA, AE, AP
            var stid = frm.elements["form[state]"].value;
			if(stid<1 || (stid>51 && stid!=65 && stid!=66 && stid!=67)){
				alert(msg_select_usa_state);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
		//check Canadian Province
		if(frm.elements["form[country]"].value == 2){	
			if(frm.elements["form[state]"].value < 51 || frm.elements["form[state]"].value >64){
				alert(msg_select_canada_province);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
	}
	else{
		//check custom province/state
        // ccmod emily. Puerto Rico (166) does not have states
	   if(frm.elements["form[country]"].value != 166) {
		   if(!CheckField(frm, "form[province]", msg_custom_province_state)) return false;
       }
	}
	if(!CheckField(frm, "form[zip]", msg_zip_postal_code)) return false;
	
	if(!CheckCustomFields(frm, 'shipping')){
		return false;	
	}
	
	return true;
}

function CheckShippingForm(frm, fm_company, fm_address2, ship2all, ship2countries){
	var address_selected = false;
	if(!ship2all){
		for(i=0;i<frm.elements.length;i++){
			if(frm.elements[i].name == "shipping_address"){
				if(frm.elements[i] && frm.elements[i].checked && frm.elements[i].value){
					//check country
					if(frm.elements[i].value == "new"){
						//address_selected = frm.elements["form[country]"].value;
					}
					else{
						address_selected = frm.elements["country_" + frm.elements[i].value].value;
					}
				}
			}
		}
		//check shipping country
		if(address_selected){
			is_country = false;
			for(i=1; i<= ship2countries.length; i++){
				if(ship2countries[i] == address_selected){
					is_country = true;
				}
			}
			if(!is_country){
			    /* ccmod emily. new language snippet */
			    alert(msg_incorrect_shipping_address2);
				return false;
			}
		}
	}
	
	ra = document.getElementById("id_new_address_radio");
	hi = document.getElementById("id_new_address_hidden");
	he = document.getElementById("id_express_address_hidden");
	if((ra && ra.checked) || hi || he){
		if(!CheckShippingAddress(frm, fm_company, fm_address2)) return false;
		if(!ship2all){
			is_country = false;
			for(i=1; i<= ship2countries.length; i++){
				if(ship2countries[i] == frm.elements["form[country]"].value){
					is_country = true;
				}
			}
			if(!is_country){
			    /* ccmod emily. new language snippet */
			    alert(msg_incorrect_shipping_address2);
				return false;
			}
		}
	}
	return true;
}

///////////////////////////////
// CHECK BILLING FORM
function CheckBillingForm(frm, fm_company, fm_address2, fm_phone){
	if(!CheckField(frm, "form[fname]", msg_first_name)) return false;
	if(!CheckField(frm, "form[lname]", msg_last_name)) return false;
	if(fm_company == "Required" && (!CheckField(frm, "form[company]", msg_company_name))) return false;
	if(!CheckField(frm, "form[address1]", msg_address_line1)) return false;
	if(fm_address2 == "Required" && (!CheckField(frm, "form[address2]", msg_address_line2))) return false;
	if(!CheckField(frm, "form[city]", msg_city_name)) return false;
	//check is there USA or Canada
	if(frm.elements["form[country]"].value == 1 || frm.elements["form[country]"].value == 2){
		//check USA state
		if(frm.elements["form[country]"].value == 1){	
		    //check USA state. ccmod emily. added Military states AA, AE, AP
            var stid = frm.elements["form[state]"].value;
			if(stid<1 || (stid>51 && stid!=65 && stid!=66 && stid!=67)){
				alert(msg_select_usa_state);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
		//check Canadian Province
		if(frm.elements["form[country]"].value == 2){	
			if(frm.elements["form[state]"].value < 51 || frm.elements["form[state]"].value > 64){
				alert(msg_select_canada_province);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
	}
	else{
		//check custom province/state
        // ccmod emily. Puerto Rico (166) does not have states
	    if(frm.elements["form[country]"].value != 166) {
		   if(!CheckField(frm, "form[province]", msg_custom_province_state)) return false;
        }
	}
	if(!CheckField(frm, "form[zip]", msg_zip_postal_code)) return false;
	if(fm_phone == "Required" && (!CheckField(frm, "form[phone]", msg_phone_number))) return false;
	if(!CheckField(frm, "form[email]", msg_email_address)) return false;
	if(!isEmail(frm.elements["form[email]"].value)){
		alert(msg_enter_valid_email);
		frm.elements["form[email]"].focus();
		return false;
	}
	if(!CheckCustomFields(frm, 'billing')){
		return false;	
	}
	if(!CheckCustomFields(frm, 'invoice')){
		return false;	
	}
	return true;
}

///////////////////////////////
// CHECK PROFILE FORM
function CheckProfileForm(frm, fm_company, fm_address2, fm_phone){
	if(!CheckField(frm, "form[fname]", msg_first_name)) return false;
	if(!CheckField(frm, "form[lname]", msg_last_name)) return false;
	if(fm_company == "Required" && (!CheckField(frm, "form[company]", msg_company_name))) return false;
	if(!CheckField(frm, "form[address1]", msg_address_line1)) return false;
	if(fm_address2 == "Required" && (!CheckField(frm, "form[address2]", msg_address_line2))) return false;
	if(!CheckField(frm, "form[city]", msg_city_name)) return false;
	if(!CheckField(frm, "form[country]", msg_country)) return false;
	//check is there USA or Canada
	if(frm.elements["form[country]"].value == 1 || frm.elements["form[country]"].value == 2){
		//check USA state
		if(frm.elements["form[country]"].value == 1){	
		    //check USA state. ccmod emily. added Military states AA, AE, AP
            var stid = frm.elements["form[state]"].value;
			if(stid<1 || (stid>51 && stid!=65 && stid!=66 && stid!=67)){
				alert(msg_select_usa_state);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
		//check Canadian Province
		if(frm.elements["form[country]"].value == 2){	
			if(frm.elements["form[state]"].value < 51 || frm.elements["form[state]"].value > 64){
				alert(msg_select_canada_province);
				frm.elements["form[state]"].focus();
				return false;
			}
		}
	}
	else{
		//check custom province/state
        // ccmod emily. Puerto Rico (166) does not have states
	    if(frm.elements["form[country]"].value != 166) {
		   if(!CheckField(frm, "form[province]", msg_custom_province_state)) return false;
        }
	}
	if(!CheckField(frm, "form[zip]", msg_zip_postal_code)) return false;
	if(fm_phone == "Required" && (!CheckField(frm, "form[phone]", msg_phone_number))) return false;
	if(!CheckField(frm, "form[email]", msg_email_address)) return false;
	if(!isEmail(frm.elements["form[email]"].value)){
		alert(msg_enter_valid_email);
		frm.elements["form[email]"].focus();
		return false;
	}
	
	if(!CheckCustomFields(frm, 'billing')){
		return false;	
	}
	
	if(frm.elements["form[password]"].value != ""){
		if(frm.elements["form[password]"].value != frm.elements["form[password2]"].value){
			alert(msg_different_password_and_comfirmation);
			frm.elements["form[password]"].focus();
			return false;
		}
	}
	
	if(!CheckCustomFields(frm, 'account')){
		return false;	
	}
	
	return true;
}

// ccmod emily. Nixed Email2Friend function

function ConfirmDeleteShippingAddress(delete_url){
	if(confirm(msg_confirm_delete_shipping_address)){
		document.location = delete_url;
	}
}

/* ccmod emily. for panel_contactform.html */
function CheckContact(frm){
	if(!CheckField(frm, "partnum", msg_your_name)) return false;
	if(!CheckField(frm, "avail", msg_your_email_address)) return false;
	if(!isEmail(frm.elements["avail"].value)){
		alert(msg_enter_valid_email);
		frm.elements["avail"].focus();
		return false;
	}


	if(!CheckField(frm, "shipping", msg_your_message)) return false;
	return true;
}
