 /**
 * This file contains functions to dynamically update a customers cart.
 * 
 * Frameworks used: 
 * DWR (direct web remoting - http://getahead.ltd.uk/dwr/)
 *  - manages the remote calling of server side code.
 * 
 * YAHOO! UI (http://developer.yahoo.com/yui/)
 *  - javascript utilities to make various things simpler such as: event 
 *    management, effects, etc.
 * 
 * Jack Slocum YAHOO! UI extensions (http://jackslocum.com/yui/index.php)
 *  - more javascript utilities that add onto the YAHOO! UI.
 * 
 * NOTES: 
 * - Event listeners see http://developer.yahoo.com/yui/event/ for a better 
 *   understanding of how to associate listeners to events.  For the most part
 *   in this script we will be using custom objects to send in parameters to
 *   an event listeners callback function.
 */
 
//var Y_DOM_HELPER = YAHOO.ext.DomHelper;
var Y_EVENT = YAHOO.util.Event;
//dwr.engine.setErrorHandler(errorHandler);
var CART_MOVING = false;
var TIMER_STARTED = false;

var Cart={
  reloadTimer:"",
  /**
   * Retrieves the cart and displays it on first loading of the page.
   */
  init:function(e) {    
		Cart.drawCartHtml();
  },
  
    /**
   * Add a pizza product to the cart
   * 
   * TODO: look into just adding the item to the cart rather than refreshing the
   * whole cart when an item is added (similar to how deletePizzaItem does things).
   */
  addItemToCart:function(mId) {
    CartManager.addOrderItem(mId, Cart.htmlCart);
  },
  
  addDonation:function(){
    this.addItemToCart('2711');
  },
  
  /**
   * Deletes a pizza item from the cart (via the server) and removes it from 
   * the page.
   * 
   * @param e - the event that caused this method to be called.
   * @param obj - the object containing the information required to perform this
   *  operation.
   */
  deleteItemFromCart:function(e, obj)
  {
    CartManager.deleteOrderItem(obj.itemId, Cart.htmlCart);
  },

  /**
   * 
   */    
  removeOption:function(e, option) {
    if(option.addOnItemId)
    {
      CartManager.removeOption(option.parentItemId, option.addOnItemId, {
        callback:function(data) {Cart.htmlCart(data);}, async:false});
    }
  },    
    
  /**
   * 
   */
  addSecondChoice:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    if(pick != "-- Choose your second item --")
    {
      Cart.addItemToCart(pick);
    }
  },
  
  addFourPakItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemToFourPak(pick, obj.menuItemId, Cart.htmlCart);
  },

  addfwpItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemTofwp(pick, obj.menuItemId, Cart.htmlCart);
  },  
  
  addfwpCanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemTofwp(pick, obj.menuItemId, Cart.htmlCart);
  }, 
  
  addfwpWingsItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addWingsItemTofwp(pick, obj.menuItemId, Cart.htmlCart);
  },

  addfwp12Item:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemTofwp12(pick, obj.menuItemId, Cart.htmlCart);
  },  
  
  addfwp12CanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemTofwp12(pick, obj.menuItemId, Cart.htmlCart);
  }, 
  
  addfwp12WingsItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addWingsItemTofwp12(pick, obj.menuItemId, Cart.htmlCart);
  },

  addf5f5CanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemTof5f5(pick, obj.menuItemId, Cart.htmlCart);
  },              

  addMegaMealItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemToMegaMeal(pick, obj.menuItemId, Cart.htmlCart);
  },

  addMegaMealCanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemToMegaMeal(pick, obj.menuItemId, Cart.htmlCart);
  },

  addMovieDealCanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemToMovieDeal(pick, obj.menuItemId, Cart.htmlCart);
  },  

  addMegaMealChipItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addChipItemToMegaMeal(pick, obj.menuItemId, Cart.htmlCart);
  },  

  addMegaMealDipItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addDipItemToMegaMeal(pick, obj.menuItemId, Cart.htmlCart);
  },

  addCustAppItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemToCustApp(pick, obj.menuItemId, Cart.htmlCart);
  },

  addCustAppCanItem:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addCanItemToCustApp(pick, obj.menuItemId, Cart.htmlCart);
  },  
  
  addAddon:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addItemToAddonDeal(pick, obj.menuItemId, Cart.htmlCart);
  },

  addAddonPizza:function(e, obj){
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.addPizzaItemToAddonDeal(pick, obj.menuItemId, Cart.htmlCart);
  },
  
  /**
   * Updates a particular pizzas option.
   * 
   */
  addOption:function(e, option){    
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = option.toppingProductId;
    if(index)
    {
      pick = tar.options[index].value;
    }
    CartManager.addOption(option.parentItemId, option.addOnItemId, pick,{
      callback:function(data) {
        Cart.htmlCart(data);}, async:false});
  },   

  /**
   * 
   */  
  updateQuantity:function(e, option) {
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    var text = tar.options[index].text;

    dwr.util.setValue(option.elementId, text);
    CartManager.updateQuantity(option.id, pick, Cart.htmlTotal);
  },
  
  /**
   * 
   */
  updateOption:function(e, option) {
    var tar = Y_EVENT.getTarget(e);
    var index = tar.selectedIndex;
    var pick = tar.options[index].value;
    CartManager.updateOption(option.id, pick);
    var text = tar.options[index].text;
    dwr.util.setValue(option.elementId, text);
  },
  
  updateNoMoreDips:function(e, option) {
    CartManager.setNoMoreDips(option.id);
  },
    
  checkForEmptyCart:function()
  {
    CartManager.isCartEmpty(Cart.redrawRequired);
  },
  
  redrawRequired:function(required)
  {
    if(required)
    {
      var itemDivsPay = YAHOO.util.Dom.getElementsByClassName("item pay", "div");
      var itemDivsFree = YAHOO.util.Dom.getElementsByClassName("item free", "div");
      if(itemDivsPay.length > 0 || itemDivsFree.length >0)
      {
        Cart.drawCartHtml();
      }
    }
  },
  
  drawCompleteCartHtml:function()
  {
	  CartManager.htmlCart({callback:function(data) {
      Cart.completeHtmlCart(data);}, async:false
    });
	  CartManager.htmlTotal({callback:function(data) {
      Cart.htmlTotal(data);}, async:false
    });
  },
  
  completeHtmlCart:function(data)
  {
    dwr.util.setValue("theCart", data, { escapeHtml:false });
  },
  
  drawCartHtml:function()
  {
	  CartManager.htmlCart({callback:function(data) {
      Cart.htmlCart(data);}, async:false
    });
	  CartManager.htmlTotal({callback:function(data) {
      Cart.htmlTotal(data);}, async:false
    });
    CartManager.htmlOrderButtons({callback:function(data) {
      Cart.htmlOrderButtons(data);}, async:false
    });
  },
  
  
  htmlCart:function(data)
  {
    dwr.util.setValue("theCart", data, { escapeHtml:false });
 	  Cart.initActions();
  },
  
  htmlTotal:function(data)
  {
    dwr.util.setValue("cost", data, { escapeHtml:false });
  },
  
  drawHtmlOrderButtons:function()
  {
    CartManager.htmlOrderButtons({callback:function(data) {
      Cart.htmlOrderButtons(data);}, async:false
    });
  },
  
  htmlOrderButtons:function(data)
  {
    dwr.util.setValue("actionButtons", data, { escapeHtml:false });
  },
  
  initActions:function ()
  {
    var deleteAnchors = YAHOO.util.Dom.getElementsByClassName("delete", "a");
    //remove listeners before re-adding them.
    for(i = 0; i < deleteAnchors.length; i++)
    {
      var anchor = deleteAnchors[i];
      YAHOO.util.Event.removeListener(anchor.id + "", "click");
    }
    for(i = 0; i < deleteAnchors.length; i++)
    {
      var anchor = deleteAnchors[i];
      var ids = anchor.id.split(':');
      if(ids[0] == 'product')
      {
        var deleteItem = new PIZZA73_OBJ.OrderItem(anchor.id, ids[1]);   
        Y_EVENT.addListener(anchor.id + "", "click", Cart.deleteItemFromCart, deleteItem);
        var couponCode = document.getElementById("couponCode");
        if(couponCode)
        {
          Y_EVENT.addListener(anchor.id + "", "click", Demographic.validateCoupon);
        }
      }
      else
      {
        var addOnObject = new PIZZA73_OBJ.AddOnItem(ids[1], ids[2]);
        if(ids[0] == 'pOptionDelete')
        {
          Y_EVENT.addListener(anchor.id, 'click', Cart.removeOption, addOnObject);
        }
        else
        {
          Y_EVENT.addListener(anchor.id, 'click', Cart.addOption, addOnObject);
        }
      }
    }
    
    var selects = YAHOO.util.Dom.getElementsByClassName("options", "select");
    //remove listeners before re-adding them.
    for(i = 0; i < selects.length; i++)
    {
      var anchor = selects[i];
      YAHOO.util.Event.removeListener(anchor.id + "", "click");
    }
    for(i = 0; i < selects.length; i++)
    {
      var select = selects[i];
      var ids = select.id.split(':');
      if(ids[0] == 'toppingdd')
      {
        var addOnObject = new PIZZA73_OBJ.AddOnItem(ids[1], null);
        Y_EVENT.addListener(select.id, 'change', Cart.addOption, addOnObject);
      }
      else if(ids[0] == 'wing_dipdd')
      {
        var addOnObject = new PIZZA73_OBJ.AddOnItem(ids[1], null);
        Y_EVENT.addListener(select.id, 'change', Cart.addOption, addOnObject);
      }
      else if(ids[0] == 'saucedd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
     		Y_EVENT.addListener(select.id, 'change', Cart.updateOption, optionObj);    
      } 
      else if(ids[0] == 'crustdd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
     		Y_EVENT.addListener(select.id, 'change', Cart.updateOption, optionObj);
      } 
      else if(ids[0] == 'secondItemdd')
      {
        Y_EVENT.addListener(select.id, 'change', Cart.addSecondChoice);    
      }
      else if(ids[0] == 'addOndd')
      { var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addAddon,optionObj);    
      }
      else if(ids[0] == 'addonPizzaItemdd1')
      { var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addAddonPizza,optionObj);    
      }
      else if(ids[0] == 'addonPizzaItemdd2')
      { var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addAddonPizza,optionObj);    
      }            
      else if(ids[0] == 'fourPakItemdd1')
      {  
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addFourPakItem, optionObj);    
      }
      else if(ids[0] == 'fourPakItemdd2')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addFourPakItem, optionObj);    
      }
      else if(ids[0] == 'fourPakItemdd3')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addFourPakItem, optionObj);    
      }
      else if(ids[0] == 'fourPakItemdd4')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addFourPakItem, optionObj);    
      }
      else if(ids[0] == 'fwpItemdd1')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpItem, optionObj);    
      } 
      else if(ids[0] == 'fwpItemdd2')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpItem, optionObj);    
      }
      else if(ids[0] == 'fwpCanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpCanItem, optionObj);    
      }
      else if(ids[0] == 'fwpWingsItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpWingsItem, optionObj);    
      }
      else if(ids[0] == 'f5f5CanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addf5f5CanItem, optionObj);    
      } 
      else if(ids[0] == 'fwp12Itemdd1')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpItem, optionObj);    
      } 
      else if(ids[0] == 'fwp12Itemdd2')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpItem, optionObj);    
      }
      else if(ids[0] == 'fwp12CanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpCanItem, optionObj);    
      }
      else if(ids[0] == 'fwp12WingsItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addfwpWingsItem, optionObj);    
      }                         
       else if(ids[0] == 'megaMealItemdd1')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMegaMealItem, optionObj);    
      } 
      else if(ids[0] == 'megaMealItemdd2')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMegaMealItem, optionObj);    
      }
      else if(ids[0] == 'megaMealCanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMegaMealCanItem, optionObj);    
      }
      else if(ids[0] == 'megaMealChipItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMegaMealChipItem, optionObj);    
      }
      else if(ids[0] == 'megaMealDipItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMegaMealDipItem, optionObj);    
      }
      else if(ids[0] == 'movieDealCanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addMovieDealCanItem, optionObj);    
      } 
      else if(ids[0] == 'custAppItemdd1')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addCustAppItem, optionObj);    
      } 
      else if(ids[0] == 'custAppItemdd2')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addCustAppItem, optionObj);    
      }
      else if(ids[0] == 'custAppCanItemdd')
      {
        var optionObj = new PIZZA73_OBJ.MenuItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.addCustAppCanItem, optionObj);    
      }                       
      else if(ids[0] == 'chipdd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.updateOption, optionObj);    
      }
      
      else if(ids[0] == 'popdd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, 'change', Cart.updateOption, optionObj);    
      }
    }
    
    selects = YAHOO.util.Dom.getElementsByClassName("quantity", "select");
    //remove listeners before re-adding them.
    for(i = 0; i < selects.length; i++)
    {
      var anchor = selects[i];
      YAHOO.util.Event.removeListener(anchor.id + "", "click");
    }
    for(i = 0; i < selects.length; i++)
    {
      var select = selects[i];
      var ids = select.id.split(':');
      if(ids[0] == 'quantitydd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
        Y_EVENT.addListener(select.id, "change", Cart.updateQuantity, optionObj);
        var couponCode = document.getElementById("couponCode");
        if(couponCode)
        {
          Y_EVENT.addListener(anchor.id + "", "click", Demographic.validateCoupon);
        }
      } 
      else if(ids[0] == 'wing_boxdd')
      {
        var optionObj = new PIZZA73_OBJ.OptionItem(select.id, ids[1]);
     		Y_EVENT.addListener(select.id, 'change', Cart.updateOption, optionObj);
      }
    }
    
    var inputs = YAHOO.util.Dom.getElementsByClassName("p73cb", "input");
    //remove listeners before re-adding them.
    for(i = 0; i < inputs.length; i++)
    {
      var anchor = inputs[i];
      YAHOO.util.Event.removeListener(anchor.id + "", "click");
    }
    for(i = 0; i < inputs.length; i++)
    {
      var input = inputs[i];
      var ids = input.id.split(':');
      if(ids[0] == 'cb')
      {
        var optionItem = new PIZZA73_OBJ.OptionItem(null, ids[1]);
        Y_EVENT.addListener(input.id, 'change', Cart.updateNoMoreDips, optionItem);
      } 
    }
  },
  
  mover:function()
  {
    //timer one sec
    var header = document.getElementById("header");
    var orderPanel = document.getElementById('orderPanel');
    var orderReceipt = document.getElementById('orderReceipt');
    var page = document.getElementById("page");
    var footer = document.getElementById("footer");
    
    var nScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
    var oSteps = document.getElementById("orderSteps");
    var y1 = eval(nScrollTop + header.offsetHeight + oSteps.offsetHeight);
    var orXY = YAHOO.util.Dom.getXY('orderReceipt');
    var orTop = orXY[1];
    var or2XY = YAHOO.util.Dom.getXY('orderPanel');
    
    var orderPanelHeight = orderPanel.offsetHeight;
    
    var orderReceiptHeight = orderReceipt.offsetHeight;
    var orBottom = orderReceiptHeight + nScrollTop;
    
    var maxBottom = eval(page.offsetHeight - footer.offsetHeight);
    var osTo = nScrollTop;
    if(osTo < or2XY[1])
    {
      osTo = or2XY[1];
    }
    var attributes = { 
    	   points: { 
    	      to: [orXY[0], osTo]
    	   } 
	  }; 
	  SCROLL_MOTION = new YAHOO.util.Motion('orderReceipt', attributes)
   	if(!Cart.CART_MOVING)
   	{
      Cart.CART_MOVING = true;
      if(orTop != y1 && orBottom < maxBottom)
      {
      	SCROLL_MOTION.animate(); 
      }
      else if(orBottom > maxBottom)
      {
        osTo = eval(maxBottom - orderReceipt.offsetHeight);
        if(osTo < or2XY[1])
        {
          osTo = or2XY[1];
        }
        attributes = {points: {to: [orXY[0], osTo]}};
        SCROLL_MOTION.attributes = attributes;
        SCROLL_MOTION.animate();
      }
   	  Cart.CART_MOVING = false;
   	}
  }, 

	reload:function () {
		Cart.mover();
	},

	autoReload:function () {
		if (Cart.reloadTimer) Cart.reload();
		Cart.reloadTimer = setTimeout(Cart.autoReload, 2000);
	} 
};
