function moreInfo(product){
  var popup = '/sales/more_info/' + product;
  window.open(popup,"More Info", "menubar=no,location=no,toolbar=no,directories=no,scrollbars=yes,status=no,width=620,height=360");
}


// ################ PRICING FUNCTIONS ############### //

// *******************
// SETS TAX DATA BASED ON STATE & COUNTRY
function getTaxData() {
  $.ajax({
    url: 'taxman',
    type: 'GET',
    data: "COUNTRY_CODE=" + form.COUNTRY_CODE.value + "&STATE=" + form.STATE.value,
    dataType: 'xml',
    timeout: 30000,
    success: function(xml){
      $(xml).find('tax').each(function(){
        var percent = $(this).find("percent").text()
        var type = $(this).find("type").text()
        var applies = $(this).find("applies_to").text()
        if(percent) {
          $("#tax_type").attr('innerHTML', percent + '% ' + type);
          form.tax_percent.value = percent;
          form.tax_applies_to.value = applies;
        } else {
          $("#tax_type").attr('innerHTML','&nbsp;');
          form.tax_percent.value = '';
          form.tax_applies_to.value = '';
        }            
      });
      updateSummary();
    }    
  });
}

// *******************
// UPDATES THE SUBTOTAL FIELDS
function updateSubtotal() {
  var subTotal = 0;
  var cart = $.cartToArray();
  for(var i in cart){
    if(cart[i].productType != 'shipping'){
      subTotal += cart[i].price * cart[i].qty;
    }
  }
  $("#subtotal").attr('innerHTML', FormatPrice($("[@name='CURRENCY']").val(),subTotal));
}

// *******************
//update both the subtotal and the order summary
function updateSums() {
  updateSubtotal();
  updateSummary();
}

// *******************
// UPDATE THE SUMMARY
function updateSummary() {
  checkCartForEmpty();
  var lineItem = new Array();
  var total = 0;
  var tax = 0;
  var shipping = 0;
  var taxRate = form.tax_percent.value * .01;
  var cur = $("[@name='CURRENCY']").val();
  for(var i in products){
    var curSym = products[i].CUR_SYMBOL;
    break;
  }
  var subLine = '';
  var upgLine = '';
  var otherLine = '';
  var cart = $.cartToArray();
  // LOOP THROUGH THE PRODUCTS
  for(var i in cart){
    if(cart[i].productType != 'shipping'){
      total += parseFloat(cart[i].price) * cart[i].qty;
    } else {
      shipping = parseFloat(cart[i].price);
    }
    if(cart[i].taxable){
      tax += cart[i].price * taxRate * cart[i].qty;
    }
    var itemLine = "<div class=\"summaryLineItem\"><div class=\"itemQuantity\">" + cart[i].qty + ' x </div><div class=\"itemDescription\">' + cart[i].description + "</div><div class=\"itemPrice\">" + curSym + cart[i].price + "</div></div>";
    if(cart[i].productType == 'subscription'){
      subLine = itemLine;
    } else if(cart[i].productType == 'upgrade'){
      upgLine = itemLine;
    } else if(cart[i].productType != 'shipping'){
      otherLine += itemLine;
    }
  }
  // UPDATE THE SUMMARY
  $("#summary_products").attr('innerHTML', subLine + upgLine + otherLine);
  $("#tax_total").attr('innerHTML', FormatPrice(cur, tax));
  $("#summary_subtotal").attr('innerHTML', FormatPrice(cur, total));
  $("#summary_total").attr('innerHTML', FormatPrice(cur, (total + tax + shipping)));
}

// ################ UI CHANGE FUNCTIONS ############### //

  // *******************
  // TOGGLE THE EMPTY CART MESSAGE
  function checkCartForEmpty(){
    if($.cartIsEmpty()){
      $("#cart_is_empty").fadeIn("slow");
    } else {
      $("#cart_is_empty").fadeOut("slow");
    }
  }

  // *******************
  // CHANGES TABS AND UPDATES THE PAGE
  function selectTab(tab){
    var n = $(tab).attr('id').replace("tab","");
    // 0 = CDS & DVDS
    // 1 = Gold
    // 2 = Platinum
    // 3 = Pro
    var scheme = ['cartCds','cartGold','cartPlat','cartPro'];
    // RESET TABS
    $("#tabs a").removeClass("tabSelected").blur();
    // SELECT NEW TAB
    $(tab).addClass("tabSelected");
    // TOGGLE MEMBERSHIP PRODUCT
    changeLevel(n);
    // TOGGLE BACKGROUND GRADIENT
    $("#shopping_cart").removeClass("cartCds cartGold cartPlat cartPro").addClass(scheme[n]);
    $(".productRow:visible .qty_content:visible input").trigger("change");
  }

  // *******************
  // REMOVES THE SUBSCRIPTION FROM THE CART & COOKIE
  function removeSubscription($obj){
    $obj.attr('checked',false).parents(".productRow").fadeOut("slow");
    $.removeSubscriptions();
    $("#upgrade_plat_pro input").attr('checked',false);
    toggleBonusCDs();
    if(!$.upgradeInCart()){
      showCdTab();
    }
  }

  // *******************
  // PRESENTS THE CD/DVD TAB
  function showCdTab(){
    // TABS NEED TO BE SHRUNK IF THERE ARE 4 OF THEM
    if($("#tabs a").length == 4 && $("#tab0").css("display")=='none'){
      // SET THE CD TAB TO 0, THEN SHRINK THE TABS TO 170 WHILE
      // EXPANDING THE CD TAB TO 170, THEN SELECT IT
      $("#tab0").css({width:"0px"});
      $("#tabs a").not("tab0").animate({width:"170px"},1500);
      $("#tab0").animate({width:"170px"},1500).click();
    } else {
      // SHOW THE CD TAB AND SELECT IT
      $("#tab0").fadeIn("slow").click();
    }
  }

  // *******************
  // CHANGES THE SELECTED UPGRADE PRODUCTS
  function removeUpgradeProduct($input){
    var prod = $input.val();
    $.removeUpgrades();
    $.removeSubscriptions();
    $("#cart_" + prod).fadeOut("slow").find("#"+prod).attr('checked',false);
    showCdTab();
  }

  // *******************
  // TOGGLES STATE MENUS BASE ON THE PASSED COUNTRY FIELD IN THE FORM OF A JQUERY OBJECT
  function changeCountry($country){
    // SET SHIPPING, VALUE, AND NEW MENU VARS
    var s = $country.attr('name').match("SHIPPING") ? 'SHIPPING_' : '';
    var v = $country.fieldValue() == 'US' || $country.fieldValue() == 'CA' ? '_'+$country.fieldValue() : '_O';
    var menu = "[@name='" + s + "STATE" + v + "']";
    $(menu)
      // HIDE SIBLING FIELDS
      .siblings("select, :text").hide(1000)
      // SHOW NEW MENU
      .siblings(menu).show(1000,function(){
        // IF NEW MENU IS STATE_O, SHOW THE OPTIONAL TAG AS WELL
        $(this).filter("#" + s + "STATE_O").css({display:"inline"})
        .siblings(".opt").fadeIn("slow");
      });
    // UPDATE FIELD VALUES
    $("[@name='" + s + "STATE']").val($(menu).fieldValue());
    $("[@name='" + s + "COUNTRY']").val($country.fieldValue());
    // TOGGLE VAT FIELD
    if(s != 'SHIPPING_' && v != '_O'){
      $("#vatspace").fadeOut("slow");
    } else if(s != 'SHIPPING_'){
      $("#vatspace").fadeIn("slow");
    }
    // HIDE OPTIONAL TAG IF NEW MENU IS NOW STATE_O & TOGGLE STATE/ZIP VALIDATION
    if(v != '_O'){
      $(menu).siblings(".opt").fadeOut("slow");
      if(v == '_US'){
        $("[@name='" + s + "STATE_US']").addClass("required");
        $("[@name='" + s + "STATE_CA']").removeClass("required");
      } else {
        $("[@name='" + s + "STATE_CA']").addClass("required");
        $("[@name='" + s + "STATE_US']").removeClass("required");
      }
      $("[@name='" + s + "ZIP']").addClass("required");
    } else {
      $("[@name='" + s + "STATE_US']").removeClass("required");
      $("[@name='" + s + "STATE_CA']").removeClass("required");
      $("[@name='" + s + "ZIP']").removeClass("required");
    }
    if(s != 'SHIPPING_'){
      getTaxData();
    } else {
      updateSummary();
    }
    if(s == 'SHIPPING_' || $("#shipping_same:checked").length){
      toggleShipping();
    }
  }


  // *******************
  // TOGGLE THE SHIPPING DROPDOWN
  function toggleShipping(){
    var country = $("#shipping_same").attr('checked') ? $("#COUNTRY_CODE").fieldValue() : $("#SHIPPING_COUNTRY_CODE").fieldValue();
    var shipping_products = country == 'US' ? us_shipping_products : int_shipping_products;
    var shipping_product = $("#shipping_list").fieldValue();
    $.removeShipping();
    $("#shipping_list").attr('innerHTML','');
    if($.discInCart()){
      for(var i in shipping_products){
        $("#shipping_list").append("<option value=\""+products[shipping_products[i]].PRODUCT_ID+"\">"+products[shipping_products[i]].DESCRIPTION+" - "+products[shipping_products[i]].PRICE+"<\/option>");
        //make sure we keep the selected shipping product, if one was already selected
        if(shipping_product == products[shipping_products[i]].PRODUCT_ID){
          $("#shipping_list")[0].selectedIndex = i;
        }
      }
      //figure out which shipping product is selected
      var selectedShippingProduct = $("#shipping_list").fieldValue();
      //add the selected shipping product to the cart
      $.addToCart(selectedShippingProduct);
      //show the shipping price
      $("#shipping_price").attr('innerHTML',products[selectedShippingProduct].PRICE);
      //show shipping dropdown
      $("#shipping_dropdown").fadeIn("slow");
      //show shipping info section
      $("#shipping_form").slideDown("slow").find(".shipReq").addClass("required");
    } else {
      //clear out the shipping price
      $("#shipping_price").attr('innerHTML','');
      //hide shipping dropdown
      $("#shipping_dropdown").fadeOut("slow");
      //hide shipping info section
      $("#shipping_form").slideUp("slow").find(".shipReq,[@name='SHIPPING_STATE_CA'],[@name='SHIPPING_STATE_US'],[@name='SHIPPING_ZIP']").removeClass("required");
    }
  }

  // *******************
  // TOGGLE CREDIT CARD FIELDS
  function changePayment(v) {
    if(v.fieldValue() != 'cc'){
      $("#cc_info").slideUp("slow");
      // CHANGE VALIDATION AND UNFLAG THE FIELD IN CASE PRIOR VALIDATION FAILED
      $(".ccVal").removeClass("required").css({backgroundColor : "", color : ""});
    }else{
      $("#cc_info").slideDown("slow");
      $(".ccVal").addClass("required");
    }
  }

  // *******************
  // TOGGLES THE SHIPPING FIELDS
  function copyShippingFields(){
    if($("#shipping_same").attr('checked')){
      $("#shipaddr").slideUp("slow").find(".shipReq,[@name='SHIPPING_STATE_CA'],[@name='SHIPPING_STATE_US'],[@name='SHIPPING_ZIP']").removeClass("required");
      setTimeout(function(){
        $(".shippingField").each(function(){
          $(this).val($("[@name='" + $(this).attr('name').replace("SHIPPING_","") + "']").val());
        });
        changeCountry($("#SHIPPING_COUNTRY_CODE"));
      },1000);
    } else {
      $("#shipaddr").slideDown("slow").find(".shipReq").addClass("required");
    }
  }

  // *******************
  // TOGGLE UPSELL MESSAGING
  function toggleUpSell(level) {
    if((!user.signedIn && level ==3) || user.accessLevel == 3 || level < 1 || user.aws) {
      $("#upgrade_plat_pro").slideUp("slow");
    } else {
      var tab = level == 1 ? '.usGold' : level == 2 ? '.usPlat' : '.usPro';
      $("#upgrade_plat_pro").slideDown("slow");
      $(".upsell").hide().find("input").attr('checked',false);
      $(tab).show();
    }
  }

  // *******************
  // TOGGLE BONUS CD SELECTIONS
  function toggleBonusCDs() {
    if(($.inCart('AF_L2_1Y') || $.inCart('AF_L3_1Y')) && !user.aws) {
      //show the bonus cd area
      $("#bonus_cd").slideDown("slow");
    } else {
      //hide the bonus cd area and remove any selected bonus cd product
      $("#NO_CD").trigger("click");
      $("#bonus_cd").slideUp("slow");
    }
  }

// ################## MISC FUNCTIONS ################## //

// *******************
// CHANGES CURRENCY VALUE AND REDISPLAYS (CALLED BY THE CURRENCY POPUP)
function changeCurrency(c){
  $("[@name='CURRENCY']").val(c);
  $("[@name='redisp']").val(1);
  form.submit();
}

// *******************
// UNKNOWN - NEEDS TO BE REMOVED
function takeFocus(){
  return true;
}

// *******************
// SETS REDISP AND SUBMITS THE FORM
function redisplay() {
  form.redisp.value = 1;
  form.submit();
}

// *******************
// SETS STATE VALUE AND GETS TAX RATE
function changeState($state){
  var s = $state.attr('name').match("SHIPPING") ? 'SHIPPING_' : '';
  $("#" + s + "STATE").val($state.fieldValue());
  if(s == ''){
    getTaxData();  
  }
}

// *******************
// VALIDATES THE QTY FIELDS ON THE FLY
function validateQty(v) {
  var sub = new RegExp(/^AF_L\d_1Y/);
  var ntest = new RegExp(/^\d+$/);
  if(!v.value.match(ntest) || v.value < 1 || (v.value > 50 && v.id.match(sub))) {
    alert(jsloc.invalidQty);
    v.value = 1;
    return false;
   }
  return true;
}

// *******************
// UPDATES THE QUANTITY OF A PRODUCT FORM THE _QTY FIELDS
function updateQty(field) {
  var sub = new RegExp(/^AF_L\d_1Y/);
  if(field.id.match(sub)){
    if(validateQty(field)) {
      updateProductQty(field);
      updateTierPricing(field.id.replace('_QTY',''));
    }
  } else {
    updateProductQty(field);
  }
}

// *******************
// UPDATES THE QUANTITY OF A PRODUCT BASED ON THE QTY FIELD.
function updateProductQty(qtyField){
  var id = qtyField.id.replace('_QTY','');
  var prodPromoPair = id.split(':');
  var pid = prodPromoPair[0];
  var promo = prodPromoPair[1];
  var qty = qtyField.value;
  $.removeFromCart(pid,promo);
  $.addToCart(pid,promo,qty);
}

// *******************
// ADJUSTS THE TIER PRICING OF A PRODUCT
function updateTierPricing(product){
  var priceId = product + "_PRICE";
  for(var i in products){
    var curSym = products[i].CUR_SYMBOL;
    break;
  }
  var cart = $.cartToArray();
  for(var i in cart){
    if(cart[i].productId == product){
      $("#" + priceId).attr('innerHTML',curSym + cart[i].price);
    }
  }
}

// *******************
//figure out which pricing tier applies
function getTier(seats){
  var tiers = new Array(4, 10, 20, 35, 50);
  var i;
  for (i=0; i < tiers.length; i++){
    if(seats <= tiers[i]){
      break;
    }
  }
  return(i+1);
}

// *******************
//all the stuff we need to do when the user changes levels
function changeLevel(level) {
  $.removeUpgrades();
  $(".upgradeProduct").attr('checked',false).parents(".productRow").fadeOut("slow");

  if(user.signedIn && level > user.accessLevel && !user.expired && !user.aws){
    // REMOVE SUBSCRIPTIONS AND ADD THE UPGRADE PRODUCT
    changeSubscriptionProduct(0);
    var upgProduct = level == 2 ? 'AF12_L2_1Y' : user.accessLevel == 1 ? 'AF13_L3_1Y' : 'AF23_L3_1Y';
    $("#cart_" + upgProduct).fadeIn("slow").find("#"+upgProduct).attr('checked',true);
    var seats = user.seats ? user.seats : 1;
    $.addToCart(upgProduct,'', seats);
  } else {
    // ADD THE SUBSCRIPTION PRODUCT
    changeSubscriptionProduct(level);
  }

  //update the upsell radio buttons
  toggleUpSell(level);
  toggleBonusCDs();
}

// *******************
//
function changeSubscriptionProduct(level) {
  $.removeSubscriptions();
  //hide all subscription products
  for(var i=1; i<4; i++) {
    $("#cart_AF_L" + i + "_1Y").hide().find("input").attr('checked',false);
  }
  if(level == 0){updateSums();return;}
  $.addToCart("AF_L" + level + "_1Y", '', $("#AF_L" + level + "_1Y_QTY").val());
  //display the subscription product at the new level
  $("#cart_AF_L" + level + "_1Y").show().find("input").attr('checked',true);
  updateSums();
}

// ################## CART FUNCTIONS ################## //

// *******************
//update the cart when the selected shipping value changes
function updateShipping() {
  //check for hard goods in cart -- we should NOT get here if there aren't hard goods in cart-- but just in case
  if($.discInCart()) {
    //clear out any old shipping product from the cart
    $.removeShipping();
    //figure out which shipping product is selected
    var selectedShippingProduct = $("#shipping_list").fieldValue();
    //add the selected shipping product to the cart
    $.addToCart(selectedShippingProduct);
    //show the shipping price
    $("#shipping_price").attr('innerHTML',products[selectedShippingProduct].PRICE);
  } else {
    //set shipping price to zero and hide shipping stuff
    //clear out the shipping dropdown
    $("#shipping_list").attr('innerHTML','');
    //take the shipping product out of the cart
    $.removeShipping();
    //clear out the shipping price
    $("#shipping_price").attr('innerHTML','');
    //hide shipping dropdown
    $("#shipping_dropdown").hide();
    //hide shipping info section
    $("#shipping_form").slideUp("slow").find(".shipReq,[@name='SHIPPING_STATE_CA'],[@name='SHIPPING_STATE_US'],[@name='SHIPPING_ZIP']").removeClass("required");
  }
}

// *******************
// TOGGLES ADDING/REMOVING CD PRODUCTS TO/FROM THE CART
function toggleCart($input){
  var $row = $input.parents(".productRow");
  if($input.attr('checked')){
    // MOVE TO THE CART AND ADD TO THE COOKIE
    $row.fadeOut("slow",function(){$(this).appendTo("#cart_products").fadeIn("slow");});
    $input.addToCart();
  } else {
    // TAKE IT OUT OF THE CART AND REMOVE THE CART COOKIE
    $row.fadeOut("slow",function(){$(this).appendTo("#cd_products").fadeIn("slow");});
    $input.removeFromCart();
  }
  checkCartForEmpty();
}


// *******************
// TOGGLES THE SELECTED COMPLIMENTARY CD IN THE CART
function updateCartPromo(){

  var comp = $("[@name='free_cd_choice']").fieldValue();
  var compProduct = comp == 'bonus_cd' ? $("#bonus_cd_drop").val() : comp;
  var compArray = compProduct.split(":");
  var productId = compArray[0];
  var promoId = compArray[1];
  var $existingCompProduct = $(".compPromo:visible");
  if($existingCompProduct.length < 1 && compProduct){
    $.addToCart(productId,promoId);
    $("#cart_" + compProduct.replace(":","\\:")).fadeIn("slow").find("input").attr('checked',true);
  } else {
    $existingCompProduct.each(function(){
      $(this).find("input").removeFromCart();
      $(this).fadeOut("slow",function(){
        if(compProduct){
          $.addToCart(productId,promoId);
          $("#cart_" + compProduct.replace(":","\\:")).fadeIn("slow").find("input").attr('checked',true);
        }
      }).find("input").attr('checked',false);
    });
  }
  setTimeout(function(){
    toggleShipping();
    updateSums();
  },2000);
}
