function getCheckedRadioValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

function setShipToCountry() {
	var sab = document.getElementById("fSAB").checked;
	var indexCountry = document.getElementById("fBill_country").selectedIndex;
	var indexProv = document.getElementById("fBill_prov").selectedIndex;
	if (sab) {
		document.getElementById("fShip_country").options[indexCountry+1].selected = true;
		updatePrice();
	}
	if ((indexCountry == 0 && indexProv > 12) || (indexCountry == 1 && indexProv < 14)) {
		document.getElementById("errBill").style.display = "block";
	} else {
		document.getElementById("errBill").style.display = "none";
	}
}

function validateShipCountryProv() {
	var indexCountry = document.getElementById("fShip_country").selectedIndex;
	var indexProv = document.getElementById("fShip_prov").selectedIndex;
	if ( indexCountry == 0 && (indexProv != 0 || indexProv != 13) ) {
		document.getElementById("errShip").style.display = "block";
	} else if (indexCountry == 1 && (indexProv < 1 || indexProv > 12)) {
		document.getElementById("errShip").style.display = "block";
	} else if (indexCountry == 2 && indexProv < 15) {
			document.getElementById("errShip").style.display = "block";
	} else {
		document.getElementById("errShip").style.display = "none";
	}
	updatePrice();
}

function setShipToProvince() {
	var sab = document.getElementById("fSAB").checked;
	var indexCountry = document.getElementById("fBill_country").selectedIndex;
	var indexProv = document.getElementById("fBill_prov").selectedIndex;
	if (sab) {
		document.getElementById("fShip_prov").options[indexProv+1].selected = true;
	}
	if ((indexCountry == 0 && indexProv > 12) || (indexCountry == 1 && indexProv < 14)) {
		document.getElementById("errBill").style.display = "block";
	} else {
		document.getElementById("errBill").style.display = "none";
	}
}

function resetShipping() {
	var sab = document.getElementById("fSAB").checked;
	if(sab) {
		/* Populate all ship to values, with the billing values */
		document.getElementById("tblShipping").style.display = "none";
		document.getElementById("fShip_fname").value = document.getElementById("fBill_fname").value;
		document.getElementById("fShip_lname").value = document.getElementById("fBill_lname").value;
		document.getElementById("fShip_addr1").value = document.getElementById("fBill_addr1").value;
		document.getElementById("fShip_addr2").value = document.getElementById("fBill_addr2").value;
		document.getElementById("fShip_city").value = document.getElementById("fBill_city").value;
		var indexCountry = document.getElementById("fBill_country").selectedIndex + 1;
		document.getElementById("fShip_country").options[indexCountry].selected = true;
		var indexProv = document.getElementById("fBill_prov").selectedIndex + 1;
		document.getElementById("fShip_prov").options[indexProv].selected = true;
		document.getElementById("fShip_postal").value = document.getElementById("fBill_postal").value;
		document.getElementById("fShip_email").value = document.getElementById("fBill_email").value;
		document.getElementById("fShip_phone").value = document.getElementById("fBill_phone").value;
		updatePrice();
	} else {
		/* Clear all ship to values */
		document.getElementById("tblShipping").style.display = "block";
		document.getElementById("fShip_fname").value = "";
		document.getElementById("fShip_lname").value = "";
		document.getElementById("fShip_addr1").value = "";
		document.getElementById("fShip_addr2").value = "";
		document.getElementById("fShip_city").value = "";
		document.getElementById("fShip_prov").options[0].selected = true;
		document.getElementById("fShip_country").options[0].selected = true;
		document.getElementById("fShip_postal").value = "";
		document.getElementById("fShip_email").value = "";
		document.getElementById("fShip_phone").value = "";
	}
}

function FormatAmount(obj) 
{
	var newValue = ""
	if (obj.value == "") {obj.value="0.00"; return}
	obj.value = MoneyChopValue(obj.value);
	if (obj.value < 0) {
		objValue = parseFloat(obj.value) - parseFloat('0.005');
	}
	else {
		objValue = parseFloat(obj.value) + parseFloat('0.005');
	}
	objValue = eval("'" + objValue + "'")
	if (objValue.length > 0) {
		if (objValue.charAt(0) == '.') {objValue = "0" + objValue}
	}
	for (x=0; x < objValue.length; x++) {
		if (objValue.charAt(x) == '.') {
			if (x == (objValue.length - 1)) {
				newValue = newValue + ".00"
			}
			else if (x == (objValue.length - 2)) {
				newValue = newValue + "." + objValue.charAt(x+1) + "0"
			}
			else {
				newValue = newValue + "." + objValue.charAt(x+1) + objValue.charAt(x+2)
			}
			obj.value = newValue
			return;
		}
		newValue = newValue + objValue.charAt(x)
	} 
	obj.value = newValue + ".00"
}

var reMoney = /^-?[0-9]*\.?[0-9]{0,4}/;
function MoneyChopValue(value) 
{
	// Purpose: Chops numbers off to four decimal places to work around the
	//          JavaScript math errors.
	// Comments: Finds 0 or 1 '-' then any digits then 0 or 1 decimal points then 
	//           up to four more digits.
	// Stephen McGrath
	value += "";
	return parseFloat(value.match(reMoney));
}

function updatePrice() {
	// get the required values.
	var product = getCheckedRadioValue(document.frmMedia.fMedia);
	var subtotal = 0;
	if (product == "full") { subtotal = document.getElementById("dvdFull").value * document.getElementById("fQuantity").value; }
	else if (product == "edited") { subtotal = document.getElementById("dvdEdited").value * document.getElementById("fQuantity").value; }

	var gst = (subtotal * document.getElementById("taxGST").value) / 100;
	var shipCountry = document.getElementById("fShip_country").selectedIndex;
	var shipping = 0;
	if (shipCountry == 1) { shipping = document.getElementById("shipCDA").value * 1; }
	else if (shipCountry == 2) { shipping = document.getElementById("shipUSA").value * 1; }
	else if (shipCountry == 0) { 
		// use the billing country.
		var billCountry = document.getElementById("fBill_country").selectedIndex;
		if (billCountry == 0) { shipping = document.getElementById("shipCDA").value * 1; }
		else if (billCountry == 1) { shipping = document.getElementById("shipUSA").value * 1; }
	}
	var total = subtotal + gst + shipping;	
	// set the form values.
	document.getElementById("fSub_total").value = subtotal;
	FormatAmount(document.getElementById("fSub_total"));
	document.getElementById("fGst").value = gst;
	FormatAmount(document.getElementById("fGst"));
	document.getElementById("fShipping").value = shipping;
	FormatAmount(document.getElementById("fShipping"));
	document.getElementById("fTotal").value = total;
	FormatAmount(document.getElementById("fTotal"));
	
	var showTotal = document.getElementById("fTotal").value;
	document.getElementById("showTotal").innerHTML = " ($"+showTotal+" CDN)";
}

function setExpireVal() {
	// sets the mm/yy value for the hidden expiration field.
	var fExpire_month = document.getElementById("fExpire_month").value;
	var fExpire_year = document.getElementById("fExpire_year").value;
	document.getElementById("fCardexpires").value = fExpire_month+"/"+fExpire_year;
}

function trim(str, chars) {
    return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
    chars = chars || "\\s";
    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function postalCodeValidation(postal) {
	//create regular expression for testing
	reg_exp_pcode = new RegExp(/(^s*([a-z](\s)?\d(\s)?){3}$)s*/i);
	if(!reg_exp_pcode.test(postal))
	{
		return(false);
	}
	return(true);
}

function zipCodeValidation(zip) {
	// Check for correct zip code
	reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
	if (!reZip.test(zip)) {
		return false;
	}
	return true;
}

function echeck(str) {
	var err = 0;
	var at = "@";
	var dot = ".";
	var lat = str.indexOf(at);
	var lstr = str.length;
	var ldot = str.indexOf(dot);
	if (str.indexOf(at)==-1) { err++; }
	if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){ err++; }
	if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){ err++; }
	if (str.indexOf(at,(lat+1))!=-1){err++; }
	if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){ err++; }
	if (str.indexOf(dot,(lat+2))==-1){ err++; }
	if (str.indexOf(" ")!=-1){ err++; }

	if (err > 0) { return false; }
	else { return true; }					
}

function isValidCreditCardNumber(cardNumber, cardType)
{
  	var isValid = false;
  	var ccCheckRegExp = /[^\d ]/;
  	isValid = !ccCheckRegExp.test(cardNumber);

  	if (isValid)
  	{
    	var cardNumbersOnly = cardNumber.replace(/ /g,"");
    	var cardNumberLength = cardNumbersOnly.length;
    	var lengthIsValid = false;
    	var prefixIsValid = false;
    	var prefixRegExp;

    	switch(cardType)
    	{
      		case "MC":
        		lengthIsValid = (cardNumberLength == 16);
        		prefixRegExp = /^5[1-5]/;
        		break;
      		case "VISA":
        		lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
        		prefixRegExp = /^4/;
        		break;
      		case "AMEX":
        		lengthIsValid = (cardNumberLength == 15);
        		prefixRegExp = /^3(4|7)/;
        		break;
      		default:
        		prefixRegExp = /^$/;
        		//alert("Card type not found");
    	}
    	prefixIsValid = prefixRegExp.test(cardNumbersOnly);
    	isValid = prefixIsValid && lengthIsValid;
  	}

  	if (isValid)
  	{
    	var numberProduct;
    	var numberProductDigitIndex;
    	var checkSumTotal = 0;

    	for (digitCounter = cardNumberLength - 1; digitCounter >= 0; digitCounter--)
    	{
      		checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
      		digitCounter--;
      		numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
      		for (var productDigitCounter = 0; productDigitCounter < numberProduct.length; productDigitCounter++)
      		{
        		checkSumTotal += 
          		parseInt(numberProduct.charAt(productDigitCounter));
      		}
    	}
    	isValid = (checkSumTotal % 10 == 0);
  	}

  	return isValid;
}


function validateOrderForm() {
	var errors = "";
	var errorMsg = "<strong>Please correct the following error(s):</strong><br />\r\n";
	var el = document.getElementById("lyrError");
	el.style.display = "none";
	
	// Validate the form fields.
	var fBroadcast_desc = document.getElementById("fBroadcast_desc").value;
	var fBill_fname = document.getElementById("fBill_fname").value;
	var fBill_lname = document.getElementById("fBill_lname").value;
	var fBill_addr1 = document.getElementById("fBill_addr1").value;
	var fBill_addr2 = document.getElementById("fBill_addr2").value;
	var fBill_city = document.getElementById("fBill_city").value;
	var fBill_country = document.getElementById("fBill_country").selectedIndex;
	var fBill_prov = document.getElementById("fBill_prov").selectedIndex;
	var fBill_postal = document.getElementById("fBill_postal").value;
	var fBill_email = document.getElementById("fBill_email").value;
	var fBill_phone = document.getElementById("fBill_phone").value;
	
	if (trim(fBroadcast_desc) == "") { errors += " - Description: A Description is required.<br />\r\n"; }
	if (trim(fBill_fname) == "") { errors += " - Billing: First Name is required.<br />\r\n"; }
	if (trim(fBill_lname) == "") { errors += " - Billing: Last Name is required.<br />\r\n"; }
	if (trim(fBill_addr1) == "") { errors += " - Billing: Address 1 is required.<br />\r\n"; }
	if (trim(fBill_city) == "") { errors += " - Billing: City is required.<br />\r\n"; }
	if ((fBill_country == 0 && fBill_prov > 12) || (fBill_country == 1 && fBill_prov < 14)) {
		errors += " - Billing: Prov/State or Country is not correct.<br />\r\n";
	}
	if (fBill_country == 0) {
		if (!postalCodeValidation(fBill_postal)) {
			errors += " - Billing: Postal Code is not valid.<br />\r\n";
		}
	} else {
		if (!zipCodeValidation(fBill_postal)) {
			errors += " - Billing: Zip Code is not valid.<br />\r\n";
		}
	}
	if (!echeck(fBill_email)) {errors += " - Billing: Email Address is not valid.<br />\r\n"; }
	
	var sab = document.getElementById("fSAB").checked;
	if (!sab) {
		var fShip_fname = document.getElementById("fShip_fname").value;
		var fShip_lname = document.getElementById("fShip_lname").value;
		var fShip_addr1 = document.getElementById("fShip_addr1").value;
		var fShip_addr2 = document.getElementById("fShip_addr2").value;
		var fShip_city = document.getElementById("fShip_city").value;
		var fShip_country = document.getElementById("fShip_country").selectedIndex;
		var fShip_prov = document.getElementById("fShip_prov").selectedIndex;
		var fShip_postal = document.getElementById("fShip_postal").value;
		var fShip_email = document.getElementById("fShip_email").value;
		var fShip_phone = document.getElementById("fShip_phone").value;
		
		if (trim(fShip_fname) == "") { errors += " - Shipping: First Name is required.<br />\r\n"; }
		if (trim(fShip_lname) == "") { errors += " - Shipping: Last Name is required.<br />\r\n"; }
		if (trim(fShip_addr1) == "") { errors += " - Shipping: Address 1 is required.<br />\r\n"; }
		if (trim(fShip_city) == "") { errors += " - Shipping: City is required.<br />\r\n"; }
		var cp = 0;
		if (fShip_prov == 0 || fShip_prov == 14) {
			errors += " - Shipping: Prov/State selection is required.<br />\r\n";
			cp++;
		}
		if (fShip_country == 0) {
			errors += " - Shipping: Country selection is required.<br />\r\n";
			cp++;
		}
		if (cp == 0) {
			if (fShip_country == 1 && fShip_prov > 13) {
				errors += " - Shipping: Prov/State or Country is not correct.<br />\r\n";
			} else if (fShip_country == 2 && fShip_prov < 15) {
				errors += " - Shipping: Prov/State or Country is not correct.<br />\r\n";
			}
		}
		if (fShip_country == 1) {
			if (!postalCodeValidation(fShip_postal)) {
				errors += " - Shipping: Postal Code is not valid.<br />\r\n";
			}
		} else if (fShip_country == 2) {
			if (!zipCodeValidation(fShip_postal)) {
				errors += " - Shipping: Zip Code is not valid.<br />\r\n";
			}
		}
		if (!echeck(fShip_email)) {errors += " - Shipping: Email Address is not valid.<br />\r\n"; }
	}
	
	var fCardholder = document.getElementById("fCardholder").value;
	var fCardindex = document.getElementById("fCardname").selectedIndex;
	var fCardname = document.getElementById("fCardname").options[fCardindex].value;
	var fCardnumber = document.getElementById("fCardnumber").value;
	var fExpire_month = document.getElementById("fExpire_month").value * 1;
	var fExpire_year = document.getElementById("fExpire_year").value * 1;
	var currentMonth = document.getElementById("currentMonth").value * 1;
	var currentYear = document.getElementById("currentYear").value * 1;
	
	if (trim(fCardholder) == "") { errors += " - Payment: Cardholder Name is required.<br />\r\n"; }

	var validCard = isValidCreditCardNumber(fCardnumber, fCardname);
	if (!validCard) {
		errors += " - Payment: Card Number does not appear to be valid.<br />\r\n";
	}

	if (fExpire_year > currentYear) { // valid
	} else if (fExpire_year == currentYear) {
		if (fExpire_month >= currentMonth) { // valid
		} else { errors += " - Payment: Card Expiration is not valid.<br />\r\n"; } 
	} else { errors += " - Payment: Card Expiration is not valid.<br />\r\n"; } 

	if (errors == "") {
		document.frmMedia.submit();
	} else {
		el.innerHTML = errorMsg + errors + "\r\n<a href=\"errAnchor\" name=\"errAnchor\" id=\"errAnchor\"></a>\r\n";
		el.style.display = "block";
		document.getElementById("errAnchor").focus();
		return false;
	}
}

function initForm()
{
	document.getElementById("fMedia_full").checked = true;
	setShipToCountry();
	setExpireVal();
	updatePrice();
}