/*

  Keep-Britain-Smiling.js
  
  (c) 2009 Interphace Ltd.

*/



/*

*/

function trace(msg) {
  $("#trace").html($("#trace").html() + "<br />" + msg);
}

var ShoppingCart = (function() {

  var settings = {
    affiliate: "",
    checkoutUrl: ""
  };

  var trace = function() { };

  var regionalCharges = null;

  var product = null,
      region = "uk",
      quantity = 1,
      itemPrice = 6.95,
      totalBeforeTax = updateTotal();

  function calcShippingRates() {
    var rates = regionalCharges[region];
    return rates.base + rates.item * quantity;
  }

  function updateTotal() {
    trace("updateTotal = " + quantity + " * " + itemPrice + " = " + (quantity * itemPrice));
    totalBeforeTax = quantity * itemPrice;
  }

  function calculateCharges() {
    return {
      shipping: calcShippingRates(),
      subtotal: totalBeforeTax,
      //      tax: totalBeforeTax * regionalCharges[region].tax,
      //      total: calcShippingRates() + totalBeforeTax + regionalCharges[region].tax
      tax: 0,
      total: calcShippingRates() + totalBeforeTax
    };
  }

  function invalidate() {
    var cartCharges = calculateCharges(quantity);

    $("#subtotal").numeric(cartCharges.subtotal, "0.00");
    $("#shipping").numeric(cartCharges.shipping, "0.00");
    $("#tax").numeric(cartCharges.tax);
    $("#total").numeric(cartCharges.total, "0.00");

    return;

    ["shipping", "tax", "total"].each(function() {
      $("#" + this).text(cartCharges[this]);
    });
  }

  return {
    initialise: function(config) {
      regionalCharges = config.destinations;
      for (var region in regionalCharges) {
        region = regionalCharges[region];
        region.base -= region.item;
      }

      region = config.defaultRegion;

      product = config.products.where("name", config.defaultProduct);
      itemPrice = product.price;

      settings = config.settings;

      updateTotal();

      $("#quantity").attr("value", "1");

      ShoppingCart.updateQuantity(1, true);
    },
    setTracer: function(tracer) {
      trace = tracer;
    },
    beginCheckOut: function(success, failure) {
      if (!quantity) {
        // TODO: notify user of problem
        alert('Please enter a quantity between 1 and 100');
        return;
      }

      var url = settings.checkoutUrl;

      var data = {
        product: product.id,
        quantity: quantity,
        region: region,
        affiliate: settings.affiliate
      };

      $.getJSON(url, data, function(data) {
        success(data.d);
      });

      var s = {
        method: "post",
        success: function(o) {
          if (o.d) {
            success(o.d);
          } else if (o.e) {
            failure(o.e);
          }
        },
        error: function() {
          // how should we handle errors?
        }
      };
    },
    updateQuantity: function(newQuantity, overrideChecks) {
      if (isNaN(newQuantity) || newQuantity < 1 || newQuantity > 100) {
        this.invalidEntry();
        return;
      }
      if (newQuantity == quantity && !overrideChecks) {
        return;
      }
      $("table").removeClass("error");
      quantity = newQuantity;
      updateTotal();
      invalidate();
    },
    changeDestination: function(destination) {
      var found = regionalCharges[destination];
      if (!found) {
        throw new Error("Destination '{0}' is not known".format(destination));
      }
      region = destination;
      invalidate();
    },
    invalidEntry: function() {
      quantity = false;

      $("table").addClass("error");
      ["subtotal", "shipping", "tax", "total"].each(function() {
        $("#" + this).text("");
      });
    },
    serialise: function() {
      return {
        region: region,
        quantity: quantity,
        itemPrice: itemPrice
      };
    }
  };

})();

$(function() {
  var dialog = new Boxy("#ShippingDestinationList", { modal: true, show: false });

  $("#quantity").keyup(function() {
    $("#trace").text("keypress");

    var quantity = $parser.parseInt(this.value, 1);
    if (isNaN(quantity)) {
      // display error & bail
      ShoppingCart.invalidEntry();
      return;
    }

    ShoppingCart.updateQuantity(quantity);
  });

  $("#ShippingDestinationList input").click(function() {
    dialog.hide();
    ShoppingCart.changeDestination(this.value);
    $("#CurrentDestination").text($(this).parent().next().text());

    var name = $(this).attr("value").toUpperCase();
    if (name == "RW") {
      name = "Worldwide";
    }
    $("#Shipping").text(name);
  });

  $(".CurrentDestination").click(function() {
    dialog.show();
    return false;
  });

  LoadShoppingCartData();
});


function LoadShoppingCartData() {

  var products = $.parseEmbeddedData(".products li", ["id", "name"]);
  
  var destinations = $.parseEmbeddedData(".shipping li", ["id", "name"], { "base-rate": "base", "additional-items": "item" });  // "base-rate", "additional-items", "tax");

  /*
  var config = $("#config").parse();
  config.defaultRegion = config.defaults.region;
  config.defaultProduct = config.defaults.product;

  ShoppingCart.initialise(config);    
  */

  var config = {
    destinations: {
      "uk": { base: 3,   item: 2,   tax: 0.15 },
      "eu": { base: 4,   item: 3.5, tax: 0.20 },
      "us": { base: 5.5, item: 3,   tax: 0.15 },
      "rw": { base: 6,   item: 4,   tax: 0.15 }
    },
    products: [
      { id: products[3].id, name: "stress", price: 4.99 }
    ],
    defaultRegion: "uk",
    defaultProduct: "stress",
    settings: {
      affiliate: "scool",
      checkoutUrl: "/keep-britain-smiling/checkout.ashx"
    }
  };

  $("#BeginCheckOut").click(function() {
    ShoppingCart.beginCheckOut(function(formData) {
      //$("#formtrace")[0].value = formData;

      $("#paypalcheckoutFields").html(formData);

      $("#paypalcheckout")[0].submit();

    }, function(e) {
      alert('error on checkout');
    });
  });

  ShoppingCart.initialise(config);

  $("#TermsMenu li").mouseover(function() {
    $(this).addClass("hover");
  }).mouseout(function() {
    $(this).removeClass("hover");
  });

  $("#TermsMenu li a").boxy({
    modal: true
  });
};


