/**
 * 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);
	},

	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);
	},

	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);
	},

	/**
	 * 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] == '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] == '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);
			} else if (ids[0] == 'popddd') {
				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);
	}
};

