/// <reference path="Common/Common.js" />
/// <reference path="Common/jQuery/jquery-1.4.1-vsdoc.js" />
/// <reference path="Admin.js" />
function LoadProducts() {
	var my = this;
	this.bProductsLoaded = false;
	this.bPricesHidden = true;
	this.bCartProductsTagged = false;
	this.bCartLoaded = false;
	this.bCartEmpty = true;
	this.ViewState = "catalog";
	this.bCartExists = false;
	this.ReceivingSchedule = "";
	this.intShipMinAmount = 0;
	this.nDiscount = 0;

	this.AddCartObjects = new Array();
	this.EditCartObjects = new Array();
	this.nCartUpdateRefreshTime = 300000;
	this.CartInterval = window.setInterval("ProductsPane.UpdateCartData()", my.nCartUpdateRefreshTime);
	
	var ShopButton = {
		onMouseDown: function(oX) {
			var jthis = $(oX);
			var cPos = (jthis.hasClass("active")) ? "-330px " : "-220px ";
			jthis.css("background-position", cPos + String(Number(jthis.attr("imageid")) * -30) + "px");
		},
		onMouseUp: function(oX) {
			var jthis = $(oX);
			var cPos = (jthis.hasClass("active")) ? "-110px " : "-330px ";
			jthis.css("background-position", cPos + String(Number(jthis.attr("imageid")) * -30) + "px");
			if (jthis.hasClass("togglebutton")) {
				if (jthis.hasClass("active")) jthis.removeClass("active");
				else jthis.addClass("active");
			}
		},
		hoverIn: function(oX) {
			var jthis = $(oX);
			var cPos = (jthis.hasClass("active")) ? "-330px " : "-110px ";
			jthis.css("background-position", cPos + String(Number(jthis.attr("imageid")) * -30) + "px");
		},
		hoverOut: function(oX) {
			var jthis = $(oX);
			var cPos = (jthis.hasClass("active")) ? "-220px " : "0px ";
			jthis.css("background-position", cPos + String(Number(jthis.attr("imageid")) * -30) + "px");
		}
	};

	this.TextSearch = function(cVal) {
		var eInput = document.getElementById("txtProductSearch");
		var aProducts = $("#PaneHolder #Warehouse #ProductObjects .ProductItem")
		cInputVal = $(eInput).val().toLowerCase();
		if (cInputVal == "") {
			aProducts.removeClass("ProductSearchFilter");
			return;
		}
		for (nX = 0; nX < aProducts.length; nX++) {
			var oProduct = $(aProducts[nX])
			var cProduct = oProduct.find(".ProductItemName").text().toLowerCase() + oProduct.attr("categories").toLowerCase() + oProduct.attr("productcode");
			if (cProduct.indexOf(cInputVal) == -1) oProduct.addClass("ProductSearchFilter");
			else oProduct.removeClass("ProductSearchFilter");
		}
	}
	this.ToggleFilterOption = function (eButton) {
		eButton = $(eButton);
		var jPOs = $("#ProductObjects");
		var nCurPadding = Number(jPOs.css("padding-top").slice(0, jPOs.css("padding-top").indexOf("px")));

		if (!eButton.hasClass("active")) {

			LogEntry(eButton.attr("toggle") + " deactivated.");

			$("#" + eButton.attr("toggle") + "_clone").slideUp(500);
			$("#" + eButton.attr("toggle")).slideUp(500);

			$("#" + eButton.attr("toggle")).find(".togglebutton").removeClass("ui-state-active")
			$("#Warehouse #ProductObjects .ProductItem").removeClass(eButton.attr("toggle"))
			if (eButton.attr("toggle") == "ProductAgeGenderFilter") $("#Warehouse #ProductObjects .ProductItem").removeClass("ProductAgeFilter ProductGenderFilter");
			if (eButton.parent().find(".ShopButton.active").length == 0) $("#btnRemoveFilters").fadeOut(1000);
		}
		else {
			$("#btnRemoveFilters").fadeIn(1000);

			//LogEntry(eButton.attr("toggle") + " activated.");

			if (eButton.attr("toggle") == "ProductCategoryFilter") my.SortCategoryButtons();
			var jX = "";
			if ($("#" + eButton.attr("toggle") + "_clone").length == 0) {
				jX = $("#" + eButton.attr("toggle")).clone();
				jX.attr("id", eButton.attr("toggle") + "_clone").css({ "opacity": "0", "filter": "alpha(opacity = 0)" });
				jX.hide().find("*").attr("id", "");
				jPOs.prepend(jX);
			} else { jX = $("#" + eButton.attr("toggle") + "_clone"); }
			jX.slideDown(500).find("*").attr("visible", "false");
			$("#" + eButton.attr("toggle")).slideDown(500, function () {

				if (eButton.attr("toggle") == "ProductSearchFilter") {
					LogEntry("Text Search activated.");
					oInput = document.getElementById('txtProductSearch');
					my.TextSearch(oInput);
					oInput.focus();
				}
			});
		}
	}
	this.ToggleFilter = function (eButton) {
		eButton = $(eButton);
		var bFilter = false;
		var aProducts = $("#ProductObjects .ProductItem")
		var cFilter = eButton.parent().attr("id");
		var cSubFilter = cFilter;
		var cSelectorAdd = "";
		var cLogNote = "";

		if (cFilter == "ProductAgeGenderFilter") {
			if (eButton.attr("targettype") == "age") {
				cSelectorAdd = '[targettype="age"]';
				cSubFilter = "ProductAgeFilter";
			}
			else {
				cSelectorAdd = '[targettype="gender"]';
				cSubFilter = "ProductGenderFilter";
			}
		}

		if (cFilter == "ProductCartFilter") {
			aProducts.removeClass(cFilter);
			if (!eButton.hasClass('active')) {
				eButton.attr("title", "Click to show only the items in your shopping cart.");
				//my.RemoveFilters(true);
				return;
			} else eButton.attr("title", "Click to go back to showing items in the shop.");

		}
		else {
			if (eButton.hasClass("ui-state-active")) {
				eButton.removeClass("ui-state-active");
				bFilter = true;
				if ($("#" + cFilter + " .ui-state-active" + cSelectorAdd).length == 0) {
					aProducts.removeClass(cSubFilter)
					return;
				}
			}
			else {
				eButton.addClass("ui-state-active");
				if ($("#ProductObjects ." + cSubFilter).length == 0) aProducts.addClass(cSubFilter);
				LogEntry(cSubFilter + ": " + eButton.text() + " filter activated.");
			}
		}
		switch (cSubFilter) {
			case "ProductPriceFilter":
				var nLow = Number(eButton.attr("rangelow"));
				var nHigh = Number(eButton.attr("rangehigh"));
				break;
			case "ProductAgeFilter":
				var aActiveFilters = eButton.parent().find('.ui-state-active[targettype="age"]');
				break;
			case "ProductCategoryFilter":
				var aActiveFilters = eButton.parent().find('.ui-state-active');
				break;
		}

		for (var nX = 0; nX < aProducts.length; nX++) {
			var oProduct = $(aProducts[nX]);
			switch (cSubFilter) {
				case "ProductGenderFilter":
					if (oProduct.attr("gender").toLowerCase() == eButton.attr("target")) {
						if (bFilter) oProduct.addClass("ProductGenderFilter");
						else oProduct.removeClass("ProductGenderFilter");
					}
					break;
				case "ProductPriceFilter":
					nProductPrice = oProduct.attr("price");
					if (nProductPrice >= nLow && nProductPrice <= nHigh) {
						// in range
						if (bFilter) oProduct.addClass("ProductPriceFilter");
						else oProduct.removeClass("ProductPriceFilter");
					}
					break;
				case "ProductAgeFilter":
					var bMatch = false;
					aActiveFilters.each(
						function () {
							if (oProduct.attr("age" + $(this).attr("target")) == "T")
								bMatch = true;
						}
					);

					if (bMatch) oProduct.removeClass("ProductAgeFilter");
					else oProduct.addClass("ProductAgeFilter");

					break;
				case "ProductCategoryFilter":
					var bMatch = false;
					aActiveFilters.each(
						function () {
							var aProdCats = oProduct.attr("categories").split(",");
							var cCatFilter = $(this).text();
							for (var nY = 0; nY < aProdCats.length; nY++) {
								if (aProdCats[nY] == cCatFilter) {
									bMatch = true;
									return false;
								}
							}
						}
					);

					if (bMatch) oProduct.removeClass("ProductCategoryFilter");
					else oProduct.addClass("ProductCategoryFilter");

					break;
				case "ProductCartFilter":
					if (!oProduct.attr("qtyincart") || Number(oProduct.attr("qtyincart")) == 0) {
						oProduct.addClass("ProductCartFilter");
					}
					break;
			}
		}

	}
	this.RemoveFilters = function (bFromCartButton) {
		LogEntry("Reset Filters clicked.");
		if (!bFromCartButton) {
			var jCartButton = $("#btnFilterCart");
			if (jCartButton.hasClass("active")) {
				ShopButton.onMouseUp(jCartButton[0]); ShopButton.hoverOut(jCartButton[0]);
				my.ToggleFilter(jCartButton[0]);
			}
		}
		var cSelector = "#ProductFilterOptions .active"
		$(cSelector).each(function () {
			if ($(this).hasClass("active")) {
				ShopButton.onMouseUp(this); ShopButton.hoverOut(this);
				my.ToggleFilterOption(this);
			}
		});
		var jTriggers = $("#Warehouse #ProductObjects .ProductItem")
		//eTriggers.find('.ProductItemAddToCart').hide();
		jTriggers.each(function () { var eX = $(this); if (eX.attr('qtyincart') == undefined) eX.find('.ProductItemName').show(); });
		$("#btnRemoveFilters").hide(1000);
	}

	this.SetAGFilter = function (oClicked) {
		var jX = $("#ProductFilterOptions .togglebutton[toggle='ProductAgeGenderFilter']")
		if (!jX.hasClass("active")) {
			//jX.css("background-position", "-220px " + String(Number(jX.attr("imageid")) * -30) + "px").addClass("active");
			ShopButton.onMouseUp(jX[0]); ShopButton.hoverOut(jX[0]);
			my.ToggleFilterOption(jX[0]);
		}

		var jClicked = $(oClicked);


		//		var jCartButton = $("#btnFilterCart");
		//		if ((jCartButton.hasClass("active") && ((jClicked.hasClass('CartBarToBalance') && jClicked.html().indexOf("Over") < 0) || jClicked.hasClass('BudBar')))
		//		|| (!jCartButton.hasClass("active") && ((jClicked.hasClass('CartBarToBalance') && jClicked.html().indexOf("Over") > 0) || jClicked.hasClass('CartBar')))) {
		//			ShopButton.onMouseUp(jCartButton[0]); ShopButton.hoverOut(jCartButton[0]);
		//			my.ToggleFilter(jCartButton[0]);
		//		}


		var cAge = jClicked.attr("agegroup");
		var cN_Age = cAge == "B" ? 2 : cAge == "C" ? 3 : cAge == "D" ? 4 : 5;
		var cGender = jClicked.attr("gender").toLowerCase();
		$("#ProductAgeGenderFilter .togglebutton[targettype='gender']").each(
			function () {
				var jThis = $(this);
				if (jThis.hasClass("ui-state-active")) {
					if (cGender == undefined || (jThis.attr("target") != cGender && jThis.attr("target") != "b")) {
						jThis.click();
					}
				}
				else {
					if (jThis.attr("target") == cGender || jThis.attr("target") == "b") jThis.click();
				}
			}
		);

		$("#ProductAgeGenderFilter .togglebutton[targettype='age']").each(
			function () {
				var jThis = $(this);
				if (jThis.hasClass("ui-state-active")) {
					if (jThis.attr("target") != cN_Age) {
						jThis.click();
					}
				}
				else {
					if (jThis.attr("target") == cN_Age) jThis.click();
				}
			}
		);
	}

	this.AppendProduct = function (oProduct, oX, bFindPrice) {
		my.InsertCategories(oProduct.CATS);
		var eProduct = document.createElement('div');
		var nRetail = Number(oProduct.PRICE);
		var oPrice = my.priceDiscount(nRetail);

		eProduct.className = "ProductItem";
		var eProductImage = document.createElement("img");
		eProductImage.className = "ProductItemImage";
		eProductImage.src = "http://tokenrewards.com/product_images/small/" + oProduct.CODE + ".gif";
		eProduct.appendChild(eProductImage);

		var eProductName = document.createElement("div");
		eProductName.className = "ProductItemName";
		eProductName.appendChild(document.createTextNode(oProduct.NAME));
		eProduct.appendChild(eProductName);

		var eX = document.createElement("div");
		eX.className = "Product-Item-Price";
		$(eX).append(formatCurrency(nRetail, true));
		eProduct.appendChild(eX);

		if ($.browser.mozilla && Number($.browser.version) > 2.9 && Number($.browser.version) < 3.5) {
			eProduct.style.display = "inline";
		}

		var jqProduct = $(eProduct);
		jqProduct
			.click(function () {
				var oPopUp = new ProductsPane.ProductTriggerClicked(this);
			})
			.data("description", oProduct.DESCRIPTION).data("qoh", oProduct.QTYONHAND)
			.attr({ "price": oPrice.nDisPrice,
				"retail": nRetail,
				"gender": oProduct.GENDER,
				"age1": oProduct.AGE1,
				"age2": oProduct.AGE2,
				"age3": oProduct.AGE3,
				"age4": oProduct.AGE4,
				"age5": oProduct.AGE5,
				"categories": oProduct.CATS,
				"productid": oProduct.ID,
				"productcode": oProduct.CODE
			});

		if (my.nDiscount > 0) {
			jqProduct
			.append('<div class="Product-Item-Discount"><span style="font-size:85%">Save!</span><br/>' +
				formatCurrency(oPrice.nDisAmount, true, false) + '</div>')
			.hover(
				function () {
					if (ui.IE8) $(this).find(".Product-Item-Discount").show()
					else $(this).find(".Product-Item-Discount").fadeIn(250);
				},
				function () {
					if (ui.IE8) $(this).find(".Product-Item-Discount").hide()
					else $(this).find(".Product-Item-Discount").fadeOut(1000);
				}
			);
		}

		if (bFindPrice) {
			var aProducts = $(oX).find(".ProductItem");
			for (var nX = 0; nX < aProducts.length; nX++) {
				if (Number($(aProducts[nX]).attr("price")) <= Number(oProduct.PRICE)) {
					//$(eWarehousePopup).
					//jqProduct.insertBefore(eWarehousePopup);
					jqProduct.insertBefore(aProducts[nX]);
					break;
				}
			}
		} else {
			oX.appendChild(eProduct);
		}

		return jqProduct;
	}
	this.ShrinkImage = function(oImg, nSpeed) {
		if (!nSpeed) nSpeed = 750;

		var oParent = oImg.parent();
		if (ui.IE8) {
			oImg.css({ width: "90px", height: "90px" });
			oParent.find(".WarehousePopupDetails").show();
			oParent.find(".WarehousePopupShrink").hide();
		}

		else {
			oImg.stop();
			oImg.animate({ width: "90px", height: "90px" }, nSpeed, "easeOutBack", function() {});			
//			oImg.animate({ width: "72px", height: "72px" }, nSpeed, "",
//						function() {
//							oImg.animate({ width: "90px", height: "90px" }, 250);
//						});
			oParent.find(".WarehousePopupDetails").fadeIn(nSpeed);
			oParent.find(".WarehousePopupShrink").fadeOut(nSpeed);
		}
	}

	this.InsertCategories = function(cCats) {
		var aX = cCats.split(/,/);
		if (aX[0].length == 0) return;

		var oX = $("#ProductCategoryFilter");

		for (var nX = 0; nX < aX.length; nX++ ) {
			var oButton = oX.find("button[category='" + aX[nX] + "']")
			if (oButton.length == 0) {
						
				oX.append('<button category="' + aX[nX] + '" count="1" class="ui-corner-all ui-state-default CategoryFilterButton fg-button togglebutton" \
				onclick="ProductsPane.ToggleFilter(this,' + "'Category'" + ')">' + aX[nX] + '</button>');
			}
			else {
				oButton.attr("count", Number(oButton.attr("count")) + 1);
			}
		}
	}
	this.SortCategoryButtons = function() {
		var mylist = $('#ProductCategoryFilter');
		var listitems = mylist.children('button').get();
		listitems.sort(function(a, b) {
			var compA = $(a).attr('category').toUpperCase();
			var compB = $(b).attr('category').toUpperCase();
			return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
		})
		$.each(listitems, function(idx, itm) { mylist.append(itm); });
	}

	this.priceDiscount = function (nPrice) {
		nPrice = Number(nPrice);
		var nDiscount = my.nDiscount;
		var nDisAmount = Math.floor(nPrice * nDiscount) / 100;
		var nDisPrice = nPrice - nDisAmount;
		return { "nDisPrice": nDisPrice, "nDisAmount": nDisAmount }
	}

	this.ProductTriggerClicked = function (oClicked) {
		var self = this;

		var CreatePopUp = function () {

			var AddContent = function () {

				var eProductDetails = document.createElement("div");
				eProductDetails.className = "WarehousePopupDetails";

				var eSpan = document.createElement("span");
				eSpan.className = "WarehousePopupEnlarge";
				eSpan.appendChild(document.createTextNode("(enlarge image)"));
				eProductDetails.appendChild(eSpan);
				var cAgeGroups = "";
				if (trigger.attr("age1") == "T") cAgeGroups += "3 to 5";
				if (trigger.attr("age2") == "T") { if (cAgeGroups.length > 0) cAgeGroups += ", "; cAgeGroups += "6 to 9"; }
				if (trigger.attr("age3") == "T") { if (cAgeGroups.length > 0) cAgeGroups += ", "; cAgeGroups += "10 to 12"; }
				if (trigger.attr("age4") == "T") { if (cAgeGroups.length > 0) cAgeGroups += ", "; cAgeGroups += "13 to 15"; }
				if (trigger.attr("age5") == "T") { if (cAgeGroups.length > 0) cAgeGroups += ", "; cAgeGroups += "16+"; }

				var cGender = "";
				switch (trigger.attr("gender")) {
					case "M": cGender = "Male"; break;
					case "F": cGender = "Female"; break;
					case "B": cGender = "Male & Female"; break;
				}
				$(eProductDetails).append(
				'<span class="WarehousePopup-Categories"><b>Categories:</b> ' + trigger.attr("categories") + '</span>' +
				'<span class="WarehousePopup-Age"><b>Age Groups:</b> ' + cAgeGroups + '</span>' +
				'<span class="WarehousePopup-Gender"><b>Target Gender:</b> ' + cGender + '</span>' +
				'<span class="WarehousePopup-Code"><b>Product ID Code:</b> ' + trigger.attr("productcode") + '</span>'
				);

				var eWarehousePopupName = document.createElement("div");
				eWarehousePopupName.className = "WarehousePopupName";
				eWarehousePopupName.appendChild(document.createTextNode(trigger.find(".ProductItemName").text()));
				eProductDetails.appendChild(eWarehousePopupName);

				var eProductDiscript = document.createElement("p");
				eProductDiscript.className = "WarehousePopupDescript";
				$(eProductDiscript).html(trigger.data("description") + "<br/><br /><b>Warning:</b> CHOKING HAZARD - Not for Children Under 3 years.");
				//$(eProductDiscript).html(trigger.find(".Product-Item-Description").text() + "<br/><br /><b>Warning:</b> CHOKING HAZARD - Not for Children Under 3 years.");
				//eProductDiscript.appendChild(document.createTextNode(aProducts[nX].DESCRIPTION));
				eProductDetails.appendChild(eProductDiscript);

				tip[0].appendChild(eProductDetails);
				tip.append('<div class="WarehousePopupClose" onclick="$(this).parent().hide()"></div>');

				var eX = document.createElement("div");
				eX.className = "ProductZoomTrigger";
				$(eX).hover(
						function () {
							var oImg = $(this).siblings("img");
							oImg.stop();
							if (oImg.width() == 288) return;
							oImg.animate({ width: "288px", height: "288px" }, 750);
							$(this).siblings(".WarehousePopupDetails").fadeOut(500);
							$(this).siblings(".WarehousePopupShrink").fadeIn(500);
						},
						function () {
							my.ShrinkImage($(this).siblings("img"));
						});

				tip[0].appendChild(eX);
			}
			var productPricing = function () {
				eX = tip.find(".Product-Pricing");
				if (eX.length == 0) {
					var nPrice = Number(trigger.attr("price"));
					var nRetail = Number(trigger.attr("retail"));
					var jDiv = $(
					'<div class="Product-Pricing" price=' + nPrice + '>' +
						'<div class="ProductItemInCartPopUp">' +
							'<div class="ProductItemInCartQty">Qty in Cart: <span class="Qty"></span></div>' +
							'<div class="EditQtyInCartButton ProductItemButton" productid="' + trigger.attr("productid") +
								'"><span>Edit Order...</span></div>' +
						'</div>' +
						'<div class="ProductItemAddToCart">' +
							'<div class="ProductCartQtyInput">' +
								'<span>Qty:</span>' +
								'<input type="text" maxlength="3" style="width:25px; text-align:center;" onkeypress="validateNumeric(event);" value="1"/>' +
							'</div>' +
							'<div productid="' + trigger.attr("productid") + '" class="ProductAddCartButton ProductItemButton"><span>Add to Cart</span></div>' +
						'</div>' +
						((my.nDiscount > 0) ?
							'<div class="Product-Discount-Price"><span style="font-size:50%">Your Price!</span><br/>' + formatCurrency(nPrice, true) + '</div>'
								: '<div class="Product-Price">' + formatCurrency(nPrice, true) + '</div>') +
						'<span class="Product-RewardUnits" price="' + nRetail + '">' + Math.ceil(Number(tokenrate) * nRetail) + '</span>' +
						'<span class="Product-TextRewardUnits TextRewardUnits">' + strRewardUnit + 's</span>' +
					'</div>');

					$(".ProductCartQtyInput input", jDiv)
					.constrainNumeric({ absolute: true, integer: true, minValue: 1 });

					tip.append(jDiv);
					tip.find(".ProductAddCartButton").click(function (event) { event.stopPropagation(); my.AddToCart(this) });
					tip.find(".EditQtyInCartButton").click(function (event) { event.stopPropagation(); my.editOrder.openDialog(trigger.attr("productid")); });
					return;
				}
			}


			var eWarehousePopup = document.createElement('div');
			eWarehousePopup.className = "WarehousePopup";
			eWarehousePopup.id = cWarehousePopupId;

			var eProductImage2 = document.createElement("img");
			eProductImage2.src = "http://tokenrewards.com/product_images/large/" + cProductCode + ".gif";
			$(eProductImage2).hover(function () {
				oImg = $(this);
				if (oImg.width() == 288) my.ShrinkImage(oImg);
			});
			eWarehousePopup.appendChild(eProductImage2);
			$("body")[0].appendChild(eWarehousePopup);
			var tip = $(eWarehousePopup);
			AddContent();
			productPricing();

		}

		var ShowPopUp = function () {

			var SetPosition = function () {
				var TestPosition = function (aPos, aOffset) {
					var nWithin = -50;
					var bVSuccess = false, bHSuccess = false;
					var nTipTop = 0, nTipLeft = 0;
					switch (aPos[0]) {
						case "top":
							nTipTop = aOffset[0] + nTriggerTop - nTipHeight;
							bVSuccess = nTipTop > nWithin;
							break;
						case "center":
							nTipTop = aOffset[0] + nTriggerTop + nTriggerHeight / 2 - nTipHeight / 2;
							var nTipBottom = aOffset[0] + nTriggerTop + nTriggerHeight / 2 + nTipHeight / 2;
							bVSuccess = (nTipTop > nWithin && nTipBottom < nViewHeight - nWithin);
							break;
						case "bottom":
							nTipTop = aOffset[0] + nTriggerTop + nTriggerHeight;
							bVSuccess = (nTipTop + nTipHeight < nViewHeight - nWithin);
							break;
					}
					switch (aPos[1]) {
						case "left":
							nTipLeft = aOffset[1] + nTriggerLeft - nTipWidth;
							bHSuccess = nTipLeft > nWithin;
							break;
						case "center":
							nTipLeft = aOffset[1] + nTriggerLeft + nTriggerWidth / 2 - nTipWidth / 2;
							var nTipRight = aOffset[1] + nTriggerLeft + nTriggerWidth / 2 + nTipWidth / 2;
							bHSuccess = (nTipLeft > nWithin && nTipRight < nViewWidth - nWithin);
							break;
						case "right":
							nTipLeft = aOffset[1] + nTriggerLeft + nTriggerWidth;
							bHSuccess = (nTipLeft + nTipWidth < nViewWidth - nWithin);
							break;
					}
					if (bVSuccess && bHSuccess) {
						tip.css({ top: String(nTipTop) + "px", left: String(nTipLeft) + "px" });
						return true;
					} else return false;
				}

				var viewport = $(window);
				var nViewHeight = Number(viewport.height());
				var nViewWidth = Number(viewport.width());


				var nTipHeight = Number(tip.height());
				var nTipWidth = Number(tip.width());

				var nTriggerHeight = Number(trigger.height());
				var nTriggerWidth = Number(trigger.width());

				var TriggerOffset = trigger.offset();

				var nTriggerTop = TriggerOffset.top
				var nTriggerLeft = TriggerOffset.left;

				tip.removeClass("n e s w nw ne sw se");
				var aTestOffSet = [0, 0];
				if (TestPosition(["bottom", "center"], [-15, 0])) { tip.addClass("n"); return true; }
				if (TestPosition(["center", "left"], [0, 20])) { tip.addClass("e"); return true; }
				if (TestPosition(["top", "center"], [20, 0])) { tip.addClass("s"); return true; }
				if (TestPosition(["center", "right"], [0, -20])) { tip.addClass("w"); return true; }
				if (TestPosition(["top", "left"], [nTriggerHeight + 20, 20])) { tip.addClass("se"); return true; }
				if (TestPosition(["top", "right"], [nTriggerHeight + 20, -20])) { tip.addClass("sw"); return true; }
				//				if (TestPosition(["bottom", "left"], [0, 0])) { tip.addClass("ne"); return true; }
				//				if (TestPosition(["bottom", "right"], [0, 0])) { tip.addClass("nw"); return true; }

				//If doesn't fit anywhere else, then middle of screen
				tip.css({ top: String((nViewHeight / 2) - (nTipHeight / 2)) + "px", left: String((nViewWidth / 2) - (nTipWidth / 2)) + "px" }).addClass("n");

			}

			var oImg = tip.find("img");
			oImg.css({ width: "288px", height: "288px" });
			tip.find(".WarehousePopupDetails").css("display", "none");

			SetPosition();

			tip.show(10, function () {
				my.ShrinkImage(oImg, 1000);
				LogEntry("Product #" + trigger.attr("productcode") + " (" + trigger.find(".ProductItemName").text() + ") Viewed.");
				$(this).find(".ProductCartQtyInput input")
					.constrainNumeric({ integer: true, absolute: true })
					.keyup(function (e) {
						var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
						if (key == 13) { tip.find(".ProductAddCartButton").click(); }
					})
					.focus();
				var nQty = Number(trigger.attr("qtyincart"));
				if (nQty > 0) {
					tip.find(".ProductItemAddToCart").hide();
					tip.find(".ProductItemInCartPopUp").show().find(".ProductItemInCartQty .Qty").text(nQty);
				} else {
					tip.find(".ProductItemAddToCart").show();
					tip.find(".ProductItemInCartPopUp").hide();
				}

				if (my.nDiscount > 0) {
					//tip.find(".Product-Price").fadeOut(750, function () { tip.find(".Product-Discount-Price").fadeIn(500); });
				}
			});
		}


		var trigger = $(oClicked);
		var cProductId = trigger.attr("productid");
		var cProductCode = trigger.attr("productcode");
		var cWarehousePopupId = "WarehousePopup_" + cProductId;
		var tip = $("#" + cWarehousePopupId);
		if (tip.length == 0) {
			CreatePopUp();
			tip = $("#" + cWarehousePopupId);
		} else {
			if (tip.is(":visible")) { tip.hide(); return; }
		}
		ShowPopUp();
		trigger.hover(
			function () {
				clearTimeout(self.tiptimer);
				clearTimeout(self.triggertimer);
			},
			function () { self.triggertimer = setTimeout(function () { tip.hide(); }, 2000); });

		tip.hover(
			function () {
				clearTimeout(self.tiptimer)
				clearTimeout(self.triggertimer)
			},
			function () { self.tiptimer = setTimeout(function () { tip.hide(); }, 2000) });

	}

	this.AdjustCartItemQty = function(cId, nQty) {
		var jqTrigger = $("#ProductObjects .ProductItem[productid='" + cId + "']");
		// Adjust qty on the trigger
		my.UpdateProductTriggerCartQty(cId, nQty, jqTrigger);
	}
	this.AddToCart = function (eX) {
		this.AddToCartObject = function (eX, nIndex) {
			eX = $(eX);
			this.cProductId = eX.attr("productid");
			$("#WarehousePopup_" + this.cProductId).hide();
			this.nPrice = eX.parent().parent().attr("price");
			this.nQty = Number(eX.siblings('.ProductCartQtyInput').find('input').val());
			my.AdjustCartItemQty(this.cProductId, this.nQty);

			var cSQL = "EXECUTE PROCEDURE adm$OrderItem_create " +
							quoteSQL(customer_id) + "," +
							quoteSQL(this.cProductId) + "," +
							quoteSQL(this.nQty) + "," +
							"'',null;" + String.fromCharCode(13) +   //Last parameter is Wisher/Tag text
							"SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";
			var oCGI = new execQuery( cSQL, function (aTables) { 
				my.dataFetched.openOrderedItems(aTables[1]);
			});

			/*
			var AddToCartCallBack = function(aResults) {
			my.AddCartObjects.splice(nIndex, 1);
			}
			my.CartUpdateQueue.AppendToCGIQueue(Application.cDataScript, this.cSQL, function(aResults) { AddToCartCallBack(aResults) });
			*/
		}

		var nLast = my.AddCartObjects.length - 1;
		my.AddCartObjects[nLast] = new this.AddToCartObject(eX, nLast);

	}

	this.UpdateProductTriggerCartQty = function (cId, nQty, jqTrigger, bSkipGraph) {
		var nCurQty = Number(jqTrigger.attr("qtyincart"));
		nCurQty = (isNaN(nCurQty)) ? 0 : nCurQty;
		if (nCurQty == nQty) return;

		if (!bSkipGraph) my.purchasingGraph.adjustPurchases(Number(cId), nCurQty, nQty);

		if (nQty == 0) {
			jqTrigger.find(".ProductItemInCart").hide();
			jqTrigger.find(".ProductItemName").show();
			jqTrigger.removeAttr("qtyincart");
			return
		}

		if (jqTrigger.find(".ProductItemInCart").length == 0) {
			jqTrigger.append(
				'<div class="ProductItemInCart">' +
					'<div class="ProductItemInCartQty">Qty in Cart: <span class="Qty">' + nQty + '</span></div>' +
					'<div class="EditQtyInCartButton ProductItemButton" productid="' + cId +
						'"><span>Edit Order...</span></div>' +
				'</div>');
			jqTrigger.find(".EditQtyInCartButton").click(function (event) { event.stopPropagation(); my.editOrder.singleProduct(this); });
		}
		else {
			jqTrigger.find(".ProductItemInCartQty .Qty").text(nQty);
		}
		jqTrigger.find(".ProductItemName").hide();
		jqTrigger.attr("qtyincart", nQty);
		jqTrigger.find(".ProductItemInCart").show();
	}
	this.UpdateCatalogCartItems = function(aItemsOrdered) {
		var AddCartItemToProducts = function(oProduct) {
			var eItem = $("#PaneHolder #Warehouse #ProductObjects").find(".ProductItem[productid='" + oProduct.ID + "']");
			if (eItem.length == 0) {
				eItem = my.AppendProduct(oProduct, document.getElementById('ProductObjects'), true);
			}
			my.UpdateProductTriggerCartQty(oProduct.ID, oProduct.QTY, eItem);
		}
		var ItemRemovedFromCart = function(eItem) {
			eItem = $(eItem);
			eItem.find(".ProductItemInCart").remove()
			eItem.removeAttr("qtyincart");
			eItem.find(".ProductItemName").show();
		}

		$("#ProductObjects .ProductItem[qtyincart]").attr("qtyincart", "0");

		for (var nX = 0; nX < aItemsOrdered.length; nX++) {
			// ITEM_NUM =0 is a Header object NOT a product.
			if (aItemsOrdered[nX].ITEM_NUM != 0) AddCartItemToProducts(aItemsOrdered[nX]);
		}
		$("#ProductObjects .ProductItem[qtyincart='0']").each(function() {
			ItemRemovedFromCart(this);
		});

		if (Application.PostLogin == "ShowCart") {
			//$("#diagPostLoginCart").dialog("close");
			ShopButton.onMouseUp($("#btnFilterCart")[0]);
			ShopButton.hoverOut($("#btnFilterCart")[0]);
			my.ToggleFilter($("#btnFilterCart")[0]);
			$("#diagPostLoginCart").dialog("destroy");
		}
	}

	this.UpdateCartData = function () {
		if (!my.bProductsLoaded || !Application.bLoggedIn) return;
		if (my.AddCartObjects.length > 0 || my.EditCartObjects.length > 0) return;

		LatestCartUpdateFetched = function (aResults) {
			if (aResults[0].QTY_LAST_UPDATE != my.CartUpdated) {
				my.CartUpdated = aResults[0].QTY_LAST_UPDATE;
				var oCGI = new execQuery(
				"SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");",
				function (aTable) { my.dataFetched.openOrderedItems(aTable); });
			}
		}

		var cSQL = "SELECT * FROM adm$open_orders_updated(" + quoteSQL(customer_id) + ");";
		var oSQL = new execQuery( cSQL, function (aResults) { LatestCartUpdateFetched(aResults) });
	}

	this.setupOrder = {
		order_id: null,
		budgetSettings: {
			BUDGET_CALC_PREF: null,
			BUDGET: 0,
			BUDGET_PARTY: 0
		},
		budgetSettings_old: {
			BUDGET_CALC_PREF: null,
			BUDGET: 0,
			BUDGET_PARTY: 0
		},
		population: {
			MB: 0, MC: 0, MD: 0, ME: 0,
			FB: 0, FC: 0, FD: 0, FE: 0,
			TOTALPOP: 0
		},
		population_old: {
			MB: 0, MC: 0, MD: 0, ME: 0,
			FB: 0, FC: 0, FD: 0, FE: 0,
			TOTALPOP: 0
		},
		timer: null,
		inputTimeout: 10,
		initialized: false,
		initialize: function () {
			if (ui.IE8) this.inputTimeout = 500;
			//Perserve pop and bud settings in case of cancel
			for (var oX in this.population) {
				this.population_old[oX] = this.population[oX];
			}
			for (var oX in this.budgetSettings) {
				this.budgetSettings_old[oX] = this.budgetSettings[oX];
			}

			var jSetup = $("#diagCartSetup");

			jSetup.find("#setupGraphWrapper").empty();
			var jGraph = $(".CartGraph").clone();
			jGraph.find(".budgetNotSet").remove();
			jSetup.find("#setupGraphWrapper").append(jGraph);
			this.refreshInputs();
			this.refreshPopBudElements();
			my.setupOrder.budgetCalcPrefChanged();

			if (!this.initialized) {
				jSetup.find("input:radio").click(function () { my.setupOrder.budgetCalcPrefChanged(); });
				jSetup.find(".CartSetupBudgets input:text").keyup(function () { my.setupOrder.budgetKeyUp(this); });
				jSetup.find("#CartBudget").constrainNumeric({ integer: true, absolute: true });
				jSetup.find("#CartPartyBudget").constrainNumeric({ integer: false, absolute: true });
				jSetup.find("#CartDemographics input:text").keyup(function () { my.setupOrder.demographicKeyUp(this); }).constrainNumeric({ integer: true, absolute: true })
			}
			this.initialized = true;
		},
		refreshInputs: function () {
			var jSetup = $("#diagCartSetup");
			var oRec = this.budgetSettings;
			var oBudget = my.purchasingGraph.budget

			if (oRec.BUDGET_CALC_PREF == 1) {
				jSetup.find("#radioCartPartyBudget").attr("checked", "checked")
				jSetup.find("#radioCartBudget").attr("checked", false)
			}
			else {
				jSetup.find("#radioCartPartyBudget").attr("checked", false)
				jSetup.find("#radioCartBudget").attr("checked", "checked")
			}

			jSetup.find("#CartBudget").val(Number(oRec.BUDGET));
			jSetup.find("#CartPartyBudget").val(Number(oRec.BUDGET_PARTY));

			for (var oX in oBudget) {
				var jPopGroup = jSetup.find("div[popgroup='" + oX + "']");
				jPopGroup.find("input").val(this.population[oX]);
				jPopGroup.find(".GenderAgeBud").text(formatCurrency(oBudget[oX], false, true, true));
			}
		},
		refreshPopBudElements: function () {
			var jSetup = $("#diagCartSetup");

			var oBudget = my.purchasingGraph.budget
			for (var oX in oBudget) {
				var jPopGroup = jSetup.find("div[popgroup='" + oX + "']");
				jPopGroup.find(".GenderAgeBud").text(formatCurrency(oBudget[oX], false, true, true));
			}
			var oAges = { B: null, C: null, D: null, E: null };
			for (var cX in oAges) {
				jSetup.find("div[popgroup='T" + cX + "'] .AgeTotal").text(this.population["M" + cX] + this.population["F" + cX]);
				jSetup.find("div[popgroup='T" + cX + "'] .AgeTotalBud").text(formatCurrency(oBudget["M" + cX] + oBudget["F" + cX], false, true, true));
			}
			var oX = this.population;
			jSetup.find(".GenderTotal[gender='M']").text(oX.MB + oX.MC + oX.MD + oX.ME);
			jSetup.find(".GenderTotal[gender='F']").text(oX.FB + oX.FC + oX.FD + oX.FE);
			jSetup.find(".CartDemoTotals .AgeTotal").text(oX.TOTALPOP);

			var oX = oBudget;
			jSetup.find(".GenderAgeBud[gender='M']").text(formatCurrency(oX.MB + oX.MC + oX.MD + oX.ME, false, true, true));
			jSetup.find(".GenderAgeBud[gender='F']").text(formatCurrency(oX.FB + oX.FC + oX.FD + oX.FE, false, true, true));
			jSetup.find(".CartDemoTotals .AgeTotalBud").text(formatCurrency(this.budgetSettings.BUDGET, false, true, true));
		},
		recalcPopBudObjects: function () {
			//calc totalpop
			var nTot = 0;
			var oPops = this.population;
			var oBuds = my.purchasingGraph.budget;

			for (var cX in oBuds) {
				nTot += oPops[cX];
			}
			oPops.TOTALPOP = nTot;


			var jSetup = $("#diagCartSetup");

			// if bud_pref = 1, recalc bud (totalpop*bud_party)
			// else recalc bud_party (bud/totalpop)
			// refresh associated input - doesn't fit here with plan but works
			var oBudSet = this.budgetSettings;
			if (oBudSet.BUDGET_CALC_PREF == 1) {
				oBudSet.BUDGET = Math.floor(nTot * oBudSet.BUDGET_PARTY);

				jSetup.find("#CartBudget").val(Number(oBudSet.BUDGET));
			} else {
				oBudSet.BUDGET_CALC_PREF = 0;  //Sets value to zero from null if saved.
				if (nTot > 0) { oBudSet.BUDGET_PARTY = Math.round(oBudSet.BUDGET / nTot * 100) / 100 }
				else { oBudSet.BUDGET_PARTY = 0; }

				jSetup.find("#CartPartyBudget").val(oBudSet.BUDGET_PARTY);
			}

			//calc popgroup bud's
			for (var cX in oBuds) {
				oBuds[cX] = oPops[cX] * this.budgetSettings.BUDGET_PARTY;
			}


		},
		open: function () {
			if ($("#ProductHeader .CartSetup").hasClass("ui-state-disabled")) return;

			this.initialize();
			LogEntry("Setup Cart clicked");
			$("#diagCartSetup").dialog({
				autoOpen: true,
				width: 750,
				modal: true,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
					jBtns.eq(0).button({ disabled: true, icons: { primary: "ui-icon-check"} });
					jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				},
				close: function (event, ui) {
					// write old values to new (should be same in case of save)
					var oSetup = my.setupOrder;

					for (var oX in oSetup.population) {
						oSetup.population[oX] = oSetup.population_old[oX];
					}
					for (var oX in oSetup.budgetSettings) {
						oSetup.budgetSettings[oX] = oSetup.budgetSettings_old[oX];
					}
					$(this).dialog('destroy');
				},
				buttons: {
					'Save Setup': function () {
						my.setupOrder.save();
					},
					'Cancel': function () {
						$(this).dialog('close');
						LogEntry("Cart Setup edits canceled/dialog closed.");
					}

				}
			});

		},
		budgetChanged: function (eInput) {
			var jInput = $(eInput);
			var nTot = this.population.TOTALPOP;
			var oBudSet = this.budgetSettings;
			if (oBudSet.BUDGET_CALC_PREF == 1) {
				oBudSet.BUDGET_PARTY = Number(jInput.val());
			} else {
				oBudSet.BUDGET = Number(jInput.val());
			}

			this.recalcPopBudObjects();
			this.refreshPopBudElements();
			my.purchasingGraph.refreshGraph();
			this.enableSave();
		},
		budgetKeyUp: function (element) {
			if (this.timer) clearTimeout(this.timer);
			this.timer = setTimeout(function () { my.setupOrder.budgetChanged(element); }, this.inputTimeout);
		},
		budgetCalcPrefChanged: function () {
			var bX;
			if ($("#diagCartSetup #radioCartBudget")[0].checked) {
				bX = true;
				this.budgetSettings.BUDGET_CALC_PREF = 0;
				$("#diagCartSetup #lblCartPartyBudget").addClass("ui-state-disabled");
				$("#diagCartSetup #lblCartBudget").removeClass("ui-state-disabled");
			} else {
				bX = false;
				$("#diagCartSetup #lblCartPartyBudget").removeClass("ui-state-disabled");
				$("#diagCartSetup #lblCartBudget").addClass("ui-state-disabled");
				this.budgetSettings.BUDGET_CALC_PREF = 1;
			}


			$("#diagCartSetup #CartBudget")[0].disabled = !bX;
			$("#diagCartSetup #CartPartyBudget ")[0].disabled = bX;
			this.enableSave();
		},
		demographicChanged: function (eInput) {
			//recalculate objects and refresh
			this.recalcPopBudObjects();
			this.refreshPopBudElements();
			my.purchasingGraph.refreshGraph();
			this.enableSave();
		},
		demographicKeyUp: function (element) {
			// set the element's related pop object's value
			var jInput = $(element);
			var cPG = jInput.parent().attr("popgroup");
			this.population[cPG] = Number(jInput.val());

			if (this.timer) clearTimeout(this.timer);
			this.timer = setTimeout(function () { my.setupOrder.demographicChanged(element); }, this.inputTimeout);
		},
		enableSave: function () {
			bEnable = false;

			var oSetup = my.setupOrder;
			for (var oX in oSetup.population) {
				if (oSetup.population[oX] != oSetup.population_old[oX]) {
					bEnable = true;
					break;
				}
			}
			if (!bEnable) {
				for (var oX in oSetup.budgetSettings) {
					if (oSetup.budgetSettings[oX] != oSetup.budgetSettings_old[oX]) {
						bEnable = true;
						break;
					}
				}
			}
			var jBtn = $("#diagCartSetup").siblings(".ui-dialog-buttonpane").find("button").eq(0).button({ disabled: !bEnable });

		},
		save: function () {
			ui.openWait("Saving your cart setup...");
			LogEntry("Cart Setup edited/saved.");
			// write new values to old
			var cX;
			var oSetup = my.setupOrder;

			for (cX in oSetup.budgetSettings) {
				oSetup.budgetSettings_old[cX] = oSetup.budgetSettings[cX];
			}
			for (cX in oSetup.population) {
				oSetup.population_old[cX] = oSetup.population[cX];
			}

			// write changes to database
			var cSQL = "execute procedure ADM$ORDER_UPDATE(" + quoteSQL(my.setupOrder.order_id);
			for (cX in oSetup.budgetSettings) {
				cSQL += "," + quoteSQL(oSetup.budgetSettings[cX]);
			}
			for (cX in my.purchasingGraph.budget) {
				cSQL += "," + quoteSQL(oSetup.population[cX]);
			}
			cSQL += ");" + String.fromCharCode(13) +
						"SELECT * FROM adm$order_fetch_current(" + quoteSQL(customer_id) + ");" + String.fromCharCode(13) +
						"SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";

			var oSQL = new execQuery(cSQL, function (aTables) {
				ui.closeWait();
				$("#diagCartSetup").dialog('close');
				my.dataFetched.currentOrder(aTables[1][0]);
				my.dataFetched.openOrderedItems(aTables[2]);
				my.purchasingGraph.refreshGraph();
			});
		}
	};
	this.editOrder = {
		clearQtys: function () {
			$("#diagEditCart .txtEditQty").each(function () {
				this.value = "0";
				my.editOrder.itemEdited(this);
			});
		},
		itemEdited: function (eInput) {
			if (eInput) {
				var jInput = $(eInput);
				if (jInput.hasClass("txtEditQty")) {
					jInput.parents(".divEditCartRow").data("qty", Number(jInput.val()));
				}
			}
			var oSummary = {
				qty: 0,
				save: 0,
				ship: 0,
				tax: 0,
				total: 0
			}
			var jEC = $("#diagEditCart");
			var bEnableSave = false;
			jEC.find(".divEditCartRow").each(function () {

				var jThis = $(this);

				var nQty = jThis.data("qty");
				//add to summary values - STORED HERE IN CENTS (integer vals)
				oSummary.qty += nQty;
				oSummary.save += nQty * jThis.data("save");
				oSummary.ship += nQty * jThis.data("ship");
				oSummary.tax += nQty * jThis.data("tax");
				oSummary.total += (jThis.data("ship") + jThis.data("tax") + jThis.data("price")) * nQty;

				//set the line item total
				jThis.find(".divEditOrderTotal").text(formatCurrency(jThis.data("price") * nQty / 100));

				//You can't edit student orders - so get out here if so
				if (jThis.data("source") != 0) return;

				// enable save if val has changed
				if (!bEnableSave) {
					jThis.find("input").each(function () {
						var jInput = $(this);
						if (jInput.val() != jInput.attr("currentval")) bEnableSave = true;
					});
				}

				var jInput = $(this).find("input.txtEditQty");
				if (jInput.val() == "0") jInput.next().hide()
				else jInput.next().show();

			});

			var jSummary = jEC.find(".divEditCartSummary");
			if (oSummary.qty > 0) {
				jSummary.find(".ECS_qty").text(oSummary.qty);
				if (oSummary.save > 0) jSummary.find(".ECS_save").text(formatCurrency(oSummary.save / 100)).parent().show();
				else jSummary.find(".ECS_save").parent().hide();

				if (oSummary.ship < my.intShipMinAmount) {
					oSummary.total += (my.intShipMinAmount - oSummary.ship);
					oSummary.ship = my.intShipMinAmount;
				}
				jSummary.find(".ECS_ship").text(formatCurrency(oSummary.ship / 100));


				if (oSummary.tax > 0) jSummary.find(".ECS_tax").text(formatCurrency(oSummary.tax / 100)).parent().show();
				else jSummary.find(".ECS_tax").parent().hide();
				jSummary.find(".ECS_total").text(formatCurrency(oSummary.total / 100));
				jSummary.show();
			} else { jSummary.hide(); }

			jEC.siblings(".ui-dialog-buttonpane").find("button").eq(0).button({ disabled: !bEnableSave });
		},
		saveEdits: function () {
			ui.openWait('Saving changes to your order...');

			var cSQL = "", bEdited = false, nEdits = 0;

			$("#diagEditCart").find(".divEditCartRow").each(function () {
				var jThis = $(this);
				if (jThis.data("source") != 0) return;

				jThis.find("input").each(function () {
					if ($(this).val() != $(this).attr("currentval"))
						bEdited = true;
				});
				if (!bEdited) return;

				var jRow = $(this)
				var cNewQty = jRow.find(".txtEditQty").val();
				cNewQty = (cNewQty == "") ? "0" : cNewQty;
				var cWishID = jRow.data("wish_id");
				var cProductID = jRow.data("product_id")
				var cNewWisher = jRow.find(".txtEditSoldTag").val();

				if (cWishID == '') {
					if (Number(cNewQty) > 0) {
						cSQL += "EXECUTE PROCEDURE adm$OrderItem_create " +
							quoteSQL(customer_id) + "," +
							quoteSQL(cProductID) + "," +
							quoteSQL(cNewQty) + "," +
							quoteSQL(cNewWisher) + ",null;" + String.fromCharCode(13);
						nEdits++;
					}
				}
				else {
					cSQL += "EXECUTE PROCEDURE adm$OrderItem_update " +
						quoteSQL(cWishID) + "," +
						quoteSQL(cNewQty) + "," +
						quoteSQL(cNewWisher) + ";" + String.fromCharCode(13);
					nEdits++;
				}
			});

			if (nEdits == 0) {
				//No edit worth saving (or something weird)
				ui.closeWait();
				return;
			}
			cSQL += "SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";
			var oCGI = new execQuery(cSQL, function (aTables) {
				my.dataFetched.openOrderedItems(aTables[nEdits]);
				my.purchasingGraph.refreshGraph();
				ui.closeWait();
			});
		},
		bSingleProduct: false,
		singleProduct: function (oClicked) {
			var cProductID = $(oClicked).parent().parent().attr("productid");
			var cCode = $(oClicked).parent().parent().attr("productcode");
			$("#WarehousePopup_" + this.cId).hide();
			this.openDialog(cProductID);
		},
		openDialog: function (cProductID) {
			if (my.bCartEmpty) return;
			this.bSingleProduct = (cProductID) ? true : false;

			ui.openWait("Loading...");
			LogEntry("List Cart clicked");
			$("#diagEditCart").dialog(
				{ autoOpen: false,
					title: cDialogTitle,
					width: 800,
					modal: true,
					open: function (event, ui) {
						var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button");
						jBtns.eq(0).button({ icons: { primary: "ui-icon-check"} });
						jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
					},
					close: function (event, ui) { $(this).dialog('destroy'); },
					buttons:
						{
							'Save': function () {
								$(this).hide();
								ProductsPane.editOrder.saveEdits();
								$(this).dialog('close');
							},
							'Cancel': function () { $(this).dialog('close'); }
						}
				});

			var cSQL = "SELECT * FROM adm$open_orders( " + quoteSQL(customer_id) + ")";
			var cDialogTitle = "Shopping Cart Orders"
			if (this.bSingleProduct) {
				cSQL += String.fromCharCode(13) + "  WHERE id = " + quoteSQL(cProductID);
			}
			cSQL += ";"
			var oCGI = new execQuery(cSQL, function (aResults) {
				my.editOrder.dataFetched(aResults);
			});

		},
		dataFetched: function (aResults) {
			//var myEditCart = this;
			var jRows = $("#diagEditCart .divEditCartRows");
			if (aResults.length == 0) {
				// Product removed in another instance? Just refresh cart
				var cSQL = "SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";
				var oCGI = new execQuery(cSQL, function (aTable) {
					my.dataFetched.openOrderedItems(aTable);
					my.purchasingGraph.refreshGraph();
					ui.closeWait();
				});
				return;
			}

			var InsertOrderRow = function (cWishId, cUpdated, cOrderedBy, cQtyCell, nX, nQty, nSource) {
				jRows.append(
					'<div class="divEditCartRow" wishid="' + cWishId + '">' +
						'<div class="divCellWrap1 divCellWrap">' +
							'<img  class="imgEditItem" src="http://tokenrewards.com/product_images/small/' + aResults[nX].CODE + '.gif" />' +
							'<div class="divEditOrderWhat">' + aResults[nX].NAME + '</div>' +
							'<div class="divEditOrderWho"><label class="lblEditOrder">Ordered by:&nbsp&nbsp</label>' + cOrderedBy + ', ' + cUpdated + '</div>' +
							'<div class="divEditOrderTag"><label class="lblEditOrder">Label/Tag:&nbsp&nbsp</label><br/>' +
								cSoldTagText +
							'</div>' +
							'<div class="divEditOrderRetail">' +
								'<label class="lblEditOrder">Reg. Price:&nbsp;</label>' + formatCurrency(aResults[nX].RETAIL, true) +
							'</div>' +

							((Number(aResults[nX].PRICE) < Number(aResults[nX].RETAIL)) ? //discount applied
							('<div class="divEditOrderPrice">' +
								'<label class="lblEditOrder">Your Price!&nbsp;</label>' + formatCurrency(aResults[nX].PRICE, true) +
							'</div>') : '') +
						'</div>' +

						'<div class="divCellWrap2 divCellWrap">' +

							'<div class="divEditOrderQty"><label class="lblEditQty lblEditOrder">Qty:</label>' +
								cQtyCell +
							'</div>' +
							'<div class="divEditOrderTotal divCellWrap3div">' +
							'</div>' +
						'</div>' +
					'</div>');

				jRows.find('.divEditCartRow[wishid="' + cWishId + '"]')
					.data("wish_id", cWishId)
					.data("source", nSource)
					.data("product_id", aResults[nX].ID)
					.data("qty", parseInt(nQty))
					.data("price", parseInt(Number(aResults[nX].PRICE) * 100))
					.data("save", parseInt(Number(aResults[nX].RETAIL) * 100) - parseInt(Number(aResults[nX].PRICE) * 100))
					.data("ship", parseInt(Number(aResults[nX].SHIPPING) * 100))
					.data("tax", parseInt(Number(aResults[nX].TAX) * 100));
			}

			var cQtyCell = "", cWisher = "", cSoldTagText = "";
			var cQtyCellHead =
						'<input class="txtEditQty" maxlength="4" type="text" ' +
							'productprice="' + aResults[0].PRICE + '"' +
							'productid="' + aResults[0].ID + '"';

			jRows.empty();
			if (this.bSingleProduct) {
				cDialogTitle = "Orders for " + aResults[0].PRODUCT_NAME;
				$("#diagEditCart .ECS_ship,#diagEditCart .ECS_tax,#diagEditCart .ECS_total").parent().addClass("hidden");
			} else {
				$("#diagEditCart .ECS_ship,#diagEditCart .ECS_tax,#diagEditCart .ECS_total").parent().removeClass("hidden");
			}

			// Allow Admin User to order more if already ordered in shop
			if (this.bSingleProduct || aResults.length < 10) {
				aResults.dataSort("SOURCE");
				var nCurId = aResults[0].ID, bAllowAdd = true;
				for (var nX = 0; nX < aResults.length; nX++) {
					if (aResults[nX].SOURCE == "0" || aResults[nX].ID != nCurId)
					{ bAllowAdd = false; break; }
				}
				if (bAllowAdd) {
					cQtyCell = cQtyCellHead + 'currentval="0" ' + 'value="0"/>';
					cSoldTagText = '<input class="txtEditSoldTag" currentval="" value="" wishid="" type="text" maxlength="40">';
					InsertOrderRow("", "", "Admin Account", cQtyCell, 0, 0, 0);
				}
			}

			for (var nX = 0; nX < aResults.length; nX++) {
				if (!aResults[nX].PARTY_CODE) {
					cQtyCell = cQtyCellHead +
							'currentval="' + aResults[nX].QTY + '" ' +
							'value="' + aResults[nX].QTY + '"/>' +
							'<div class="EditCartItem-ZeroQty"' +
								'onclick="jInput = $(this).prev(); jInput.val(0); ProductsPane.editOrder.itemEdited(jInput[0],false)">' +
							'</div>';
					cWisher = "Admin Account";
					cSoldTagText = ' <input class="txtEditSoldTag" currentval="' + aResults[nX].WISHER + '" value="' + aResults[nX].WISHER + '"' +
												 ' wishid="' + aResults[nX].WISH_ID + '" type="text" maxlength="40" />'
				}
				else {
					cWisher = (aResults[nX].SOURCE == 0) ? "Admin Account" : aResults[nX].WISHER;
					if (cWisher.indexOf("(") > 0) { cWisher = cWisher.substring(0, cWisher.indexOf("(")); }
					cQtyCell = cQtyCellHead + 'value="' + aResults[nX].QTY + '" disabled="disabled"/>';
					cSoldTagText = '<div class="divItemSoldTag">' + aResults[nX].WISHER + '</div>';
				}

				InsertOrderRow(
						aResults[nX].WISH_ID,
						((aResults[nX].LAST_UPDATED == "") ? "" : new Date(aResults[nX].LAST_UPDATED).format("shortDateTime")),
						cWisher, cQtyCell, nX, aResults[nX].QTY, aResults[nX].SOURCE
					);
			}

			$(".txtEditSoldTag, .txtEditQty").keyup(function () { my.editOrder.itemEdited(this); });
			$(".txtEditQty").constrainNumeric({ absolute: true, integer: true });
			$("#diagEditCart .ECS_qty").dblclick(function () { my.editOrder.clearQtys(); });

			if (aResults.length >= 9) {
				jRows.css({ height: "405px", overflow: "auto" });
				if (ui.IE7) jRows.css({ overflow: "scroll" });
			} else {
				jRows.css({ height: "auto", overflow: "hidden" });
				$("#diagEditCart").dialog("option", "width", 785);
			}

			this.itemEdited(false);
			ui.closeWait();

			$("#diagEditCart").dialog('open');
		}
	};
	this.checkOut = {
		intialized: false,
		init: function () {
			if (this.intialized) return;
			$("#btnEditShippingAddress_CheckOut").button({ icons: { primary: "ui-icon-pencil"} })
			.click(function () {
				contact.open('ship');
			});

			$("#divCartShippingAddress").html(ContactAddress(contact.data.ship, ""));

			this.intialized = true;
		},

		ordersFetched: function (aRecs) {
			//calculate final shipping, tax, and total
			var oSummary = {
				qty: 0,
				subtotal: 0,
				save: 0,
				ship: 0,
				tax: 0,
				total: 0
			}
			for (var nX = 0; nX < aRecs.length; nX++) {
				//convery to data vals to integer (fix floating point errors)
				var nQty = parseInt(aRecs[nX].QTY);
				aRecs[nX].PRICE = parseInt(Number(aRecs[nX].PRICE) * 100);
				aRecs[nX].RETAIL = parseInt(Number(aRecs[nX].RETAIL) * 100);
				aRecs[nX].SHIPPING = parseInt(Number(aRecs[nX].SHIPPING) * 100);
				aRecs[nX].TAX = parseInt(Number(aRecs[nX].TAX) * 100);
				//add to summary values
				oSummary.qty += nQty;
				oSummary.subtotal += nQty * aRecs[nX].PRICE;
				oSummary.save += nQty * (aRecs[nX].RETAIL - aRecs[nX].PRICE);
				oSummary.ship += nQty * aRecs[nX].SHIPPING;
				oSummary.tax += nQty * aRecs[nX].TAX;
				oSummary.total += (aRecs[nX].SHIPPING + aRecs[nX].TAX + aRecs[nX].PRICE) * nQty;
			}
			if (oSummary.ship < my.intShipMinAmount) {
				oSummary.total += (my.intShipMinAmount - oSummary.ship);
				oSummary.ship = my.intShipMinAmount;
			}

			var jCheckOut = $("#diagCheckOut");
			jCheckOut.find(".InvoiceSubTotal").text(formatCurrency(oSummary.subtotal / 100));
			jCheckOut.find(".InvoiceShipping").text(formatCurrency(oSummary.ship / 100));

			if (oSummary.tax > 0) {
				jCheckOut.find(".InvoiceTaxRow").show();
				jCheckOut.find(".InvoiceTaxAmount").text(formatCurrency(oSummary.tax / 100));
			} else jCheckOut.find(".InvoiceTaxRow").hide();

			jCheckOut.find(".InvoiceTotal").text(formatCurrency(oSummary.total / 100));

			if (oSummary.save > 0) {
				jCheckOut.find("#CheckOutSaveAmt").html(formatCurrency(oSummary.save / 100));
				jCheckOut.find("#CheckOutSavings").show();
			} else jCheckOut.find("#CheckOutSavings").hide();
		},
		fetchAddress: function () {
			var oSQL = new execQuery(my.checkOut.addressSQL, function (aResults) {
				my.checkOut.addressFetched(aResults);
			});
		},
		fetchData: function () {
			ui.openWait("Loading Checkout...");
			var cSQL = "SELECT * FROM adm$open_orders( " + quoteSQL(customer_id) + ");";

			var oSQL = new execQuery(cSQL, function (aTables) {
				my.checkOut.ordersFetched(aTables);
				ui.closeWait();
				my.checkOut.showDialog();
			});
		},

		open: function () {
			if (my.bCartEmpty) return;
			my.checkOut.init();

			LogEntry("Proceed to Checkout clicked.");
			if (my.ReceivingSchedule > "") {
				$("#CheckOutReceivingSchedule").html(my.ReceivingSchedule);
				$("#diagCheckOutScheduleAlert").dialog(
					{ autoOpen: true,
						modal: true,
						width: 430,
						open: function (event, ui) {
							var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button").removeClass("ui-state-focus");
							jBtns.eq(0).button({ icons: { primary: "ui-icon-check"} });
							jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
						},
						close: function () { $(this).dialog('destroy'); },
						buttons: {
							"Proceed With Checkout...": function () {
								$(this).dialog("close");
								LogEntry("Continued with checkout even after seeing receiving schedule alert.");
								my.checkOut.fetchData();
							},
							"Cancel": function () {
								$(this).dialog("close");
								LogEntry("Checkout cancelled after viewing receiving schedule alert.");
							}
						}
					}
				);
			}
			else my.checkOut.fetchData();

		},
		submit: function () {
			$("#diagCheckOut").dialog('close');

			ui.openWait("Submitting your shopping cart orders...");
			var cNote = $("#InvoiceNote").val();
			var cSQL = "EXECUTE PROCEDURE ADM$ORDER_SUBMIT(" + quoteSQL(customer_id) + "," + cNote.prepSQL(true) + ");";

			cSQL += String.fromCharCode(13) +
			"SELECT * FROM adm$order_fetch_current(" + quoteSQL(customer_id) + ");";
			cSQL += String.fromCharCode(13) +
			"SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";
			cSQL += String.fromCharCode(13) +
			"SELECT * FROM adm$open_orders_updated(" + quoteSQL(customer_id) + ");";
			cSQL += String.fromCharCode(13) +
			"EXECUTE PROCEDURE MAKENOTEEVENT('Web Order Submitted'," +
				cNote + ", 30," + quoteSQL(customer_id) + ", 'WEB_ORDER', 'now');";

			var oSQL = new execQuery(cSQL, function (aTables) {

				Email.send({
					to_contact_id: '',
					to_name: "Token Employees",
					to_address: "info@tokenrewards.com",

					subject: 'Admin Warehouse Fulfufillment Checkout - ' + Application.oUser.CODE,
					contents: "Notes from Customer: <br/><br/>" + ((cNote) ? cNote.encodeHTML() : "(No notes from customer)"),
					callback: function (bSuccess, cSentTo) {
						ui.closeWait();
						ui.modalMessage({
							title: "Order Submitted",
							message: "Thank you for your order.<br/><br/>" + 
								"If necessary, we will be contacting you shortly for final confirmation and payment information."
						});
					}
				});

				var oCurrentOrder = aTables[1][0];
				my.dataFetched.currentOrder(oCurrentOrder);
				my.dataFetched.openOrderedItems(aTables[2]);

				my.CartUpdated = aTables[3][0].QTY_LAST_UPDATE;
				my.dataFetched.schedule(oCurrentOrder);

				my.purchasingGraph.refreshGraph();

			});

		},
		showDialog: function () {
			var jX = $("#diagCheckOut").dialog({
				autoOpen: true,
				width: 600,
				modal: true,
				open: function (event, ui) {
					var jBtns = $(this).siblings(".ui-dialog-buttonpane").find("button").removeClass("ui-state-focus");
					jBtns.eq(0).button({ icons: { primary: "ui-icon-check"} });
					jBtns.eq(1).button({ icons: { primary: "ui-icon-closethick"} });
				},
				close: function (event, ui) {
					$("#EditInvoiceShippingAddress").hide();
					$("#ShowInvoiceShippingAddressContainer").show();
					$(this).dialog('destroy');
				},
				buttons: {
					'Submit Cart': function () { my.checkOut.submit(); },
					'Cancel': function () { $(this).dialog('close'); }
				}
			});

		}
	};
	this.showDiscount = {
		iCnt: 0,
		execute: function (bForceHide) {
			if (bForceHide) {
				this.iCnt = 0;
				clearInterval(this.interval);
				this.interval = window.setInterval(function () {
					my.showDiscount.intervalActions();
				}, 15000);
			}
			var jBudRem = $(".CartInfo .Line3,.CartInfo .Line4");
			var jDiscountInfo = $(".CartInfo .DiscountInfo");
			if (my.nDiscount == 0) {
				$(".CartInfo .Line3,.CartInfo .Line4").show();
				$(".CartInfo .DiscountInfo").hide();
				return;
			}
			if (my.showDiscount.iCnt % 2 == 1) {
				jDiscountInfo.find(".spanDiscountPcnt").text(my.nDiscount);
				//hide it and show discount
				jBudRem.hide(1000);
				jDiscountInfo.show(1000);
				//jDiscountInfo.effect("pulsate", { mode: "show", times: 2 },700);
			} else {
				jDiscountInfo.hide(1000);
				jBudRem.show(1000);
			}
		},
		interval: window.setInterval(function () {
			my.showDiscount.intervalActions();
		}, 15000),
		intervalActions: function () {
			my.showDiscount.iCnt++;
			my.showDiscount.execute();
		}

	};
	this.purchasingGraph = {
		nGraphHeight: 110,
		budget: {
			MB: 0, MC: 0, MD: 0, ME: 0,
			FB: 0, FC: 0, FD: 0, FE: 0
		},
		purchase: {
			MB: 0, MC: 0, MD: 0, ME: 0,
			FB: 0, FC: 0, FD: 0, FE: 0
		},
		adjustPurchases: function (nProductID, nOldQty, nNewQty) {
			var jProduct = $("#ProductObjects .ProductItem[productcode=" + nProductID + "]");
			var nAdjustBy = Number(jProduct.attr("price")) * (nNewQty - nOldQty);

			this.markers = {
				MA: 0, MB: 0, MC: 0, MD: 0, ME: 0,
				FA: 0, FB: 0, FC: 0, FD: 0, FE: 0
			};

			var nTotMarkers = 0;
			var oX;

			var cGender = jProduct.attr("gender");
			if (cGender.search(/M|B/) > -1) {
				if (jProduct.attr("age1") == "T") this.markers.MA = 1;
				if (jProduct.attr("age2") == "T") this.markers.MB = 1;
				if (jProduct.attr("age3") == "T") this.markers.MC = 1;
				if (jProduct.attr("age4") == "T") this.markers.MD = 1;
				if (jProduct.attr("age5") == "T") this.markers.ME = 1;
			}
			if (cGender.search(/F|B/) > -1) {
				if (jProduct.attr("age1") == "T") this.markers.FA = 1;
				if (jProduct.attr("age2") == "T") this.markers.FB = 1;
				if (jProduct.attr("age3") == "T") this.markers.FC = 1;
				if (jProduct.attr("age4") == "T") this.markers.FD = 1;
				if (jProduct.attr("age5") == "T") this.markers.FE = 1;
			}

			for (oX in this.markers) {
				nTotMarkers += this.markers[oX];
			}
			if (nTotMarkers == 0) {
				// demographics for product not assign, assume global, except ignore age group A
				for (oX in this.markers) {
					nTotMarkers = 8;
					if (!/A/.test(oX)) this.markers[oX] = 1;
				}
			}
			for (oX in this.markers) {
				this.purchase[oX] += (this.markers[oX] / nTotMarkers) * nAdjustBy;
			}

			this.refreshGraph();

		},
		adjustBudgets: function () {
			for (var oX in this.budget) {
				this.budget[oX] = my.setupOrder.population[oX] * my.setupOrder.budgetSettings.BUDGET_PARTY;
			}
		},
		refreshGraph: function () {
			var nTotPop = 0, nTotBud = 0, nMaxBud = 0.001, nPop = 0, nMaxCart = 0.001, nGraphHeight = this.nGraphHeight;
			var nCapHeight = 4, nBudOffSet = 4;

			var jCartGraphs;
			if ($("#diagCartSetup").is(':visible')) {
				jCartGraphs = $("#diagCartSetup .CartGraph")
			} else {
				jCartGraphs = $("#ProductGraphAndButtons .CartGraph"); 
			}

			var jCartBars = jCartGraphs.find(".CartBar");

			for (var oX in this.purchase) {
				if (this.purchase[oX] > nMaxCart) nMaxCart = this.purchase[oX];
				if (this.budget[oX] > nMaxBud) nMaxBud = this.budget[oX];
			}

			if (nMaxCart > nMaxBud) nMaxBud = nMaxCart;

			if (nMaxBud < 0.05) {
				jCartGraphs.find(".budgetNotSet").show();
				jCartGraphs.find(".CartGraph_YAxis_Labels").children().hide();
				jCartGraphs.find(".CartBarToBalance").hide();
			} else {
				jCartGraphs.find(".budgetNotSet").hide();
				jCartGraphs.find(".CartGraph_YAxis_Labels").children().show()
				jCartGraphs.find(".CartBarToBalance").show();

				jCartGraphs.find(".Pcnt100").text(formatCurrency(nMaxBud, false, true, true));
				jCartGraphs.find(".Pcnt50").text(formatCurrency(Math.round(nMaxBud / 2), false, true, true));
			}


			for (var oX in this.purchase) {
				var nBud = this.budget[oX];
				var nCart = this.purchase[oX];
				var nPixels = Math.round((nBud / nMaxBud) * (nGraphHeight - (nCapHeight * 2)));
				var nCartPixels = Math.round((nCart / nMaxBud) * (nGraphHeight - (nCapHeight * 2)));

				var cGender = oX.substr(0, 1);
				var cAgeGroup = oX.substr(1, 1);

				var jBudBar = jCartGraphs.find(".BudBar[gender='" + cGender + "'][agegroup='" + cAgeGroup + "']");
				var jCartBar = jCartGraphs.find(".CartBar[gender='" + cGender + "'][agegroup='" + cAgeGroup + "']");

				if (nCart == nBud) {
					var cToBalance = "<br/>$0";
					if (nBud == 0) {
						cToBalance = ""; //"<br/>Budget<br/>Not Set";
					}
				}
				else {
					var cToBalance = (nBud > nCart) ? ('<span>Add</span><br/>' + formatCurrency(nBud - nCart, false, true)) :
								('<span>Over</span><br/>' + formatCurrency(nCart - nBud, false, true));
				}

				var cToBalColor = "White";
				var nToBalHeight = ((nBud >= nCart) ? nPixels + nBudOffSet + 7 : nCartPixels + 2) + nCapHeight;
				if (nToBalHeight < 32) {
					if (nBud > nCart) nToBalHeight += 26;
					else nToBalHeight += 31;
					cToBalColor = "Black"
				}

				if (my.setupOrder.budgetSettings.BUDGET > 1) {
					jCartGraphs.find(".CartBarToBalance[gender='" + cGender + "'][agegroup='" + cAgeGroup + "']")
					.css({ "top": String(nGraphHeight - nToBalHeight + 10) + "px", "color": cToBalColor, "height": "30px" })
					.html(cToBalance);
				}

				if (nPixels == 0) {
					jBudBar.hide();
				}
				else {
					nPixels += nBudOffSet;
					jBudBar.show().attr("title", formatCurrency(nBud, false, true) + " budgeted.");
					jBudBar.eq(1).css("height", String(nPixels) + "px");
					jBudBar.eq(4).css("height", String(nPixels) + "px");
					jBudBar.eq(2).css("bottom", nPixels + nCapHeight + 3 + "px");
					jBudBar.eq(5).css("bottom", nPixels + nCapHeight + 3 + "px");
				}

				if (nCartPixels == 0) {
					jCartBar.hide();
				}
				else {
					jCartBar.show().attr("title", formatCurrency(nCart, false, true) + " in cart.");
					jCartBar.eq(1).css("height", String(nCartPixels) + "px");
					jCartBar.eq(4).css("height", String(nCartPixels) + "px");
					jCartBar.eq(2).css("bottom", nCartPixels + nCapHeight + 1 + "px");
					jCartBar.eq(5).css("bottom", nCartPixels + nCapHeight + 1 + "px");
				}

			};

		}
	};
	this.dataFetched = {
		products: function (aProducts, oRec) {
			tokenrate = Number(oRec.EXCHANGE_RATE);
			my.nDiscount = Number(oRec.DISCOUNT);
			if (my.nDiscount > 0) {
				$(".CartEmpty").text("Receive a " + my.nDiscount + "% discount on all items in this order!");
			} else $(".CartEmpty").text("Your cart is empty.");

			SetRewardUnitElements("#diagCheckOut");

			if (!aProducts || aProducts.length == 0) {
				$("#ProductObjects").append('<div>We appear to be having technical difficulties showing our products. Please try reloading the web site.</div>');
				return;
			}
			var oX = document.getElementById('ProductObjects');

			$("#ShopOpeningNote").remove()
			for (var nX = 0; nX < aProducts.length; nX++) {
				my.AppendProduct(aProducts[nX], oX);
			}
			HoverClickButtons("#ProductCategoryFilter");
			my.bProductsLoaded = true;
		},
		schedule: function (oRec) {
			var cX = '';
			if (Application.oUser.LANDINGS == 0) {
				my.ReceivingSchedule = "";
			} else {
				var nBudget = Number(Application.oUser.MONTHLYBUDGET);
				var aLandings = Application.oUser.LANDINGS.split(",");
				nBudget = nBudget / aLandings.length;
				for (var nX = 0; nX < aLandings.length; nX++)
					cX += Number(Number(aLandings[nX])).toOrdinal() + " of each month, " + formatCurrency(nBudget, false, true) + ". <br/>";
				my.ReceivingSchedule = cX;
			};
		},
		openOrderedItems: function (aItemsOrdered) {
			var AddCartItemToProducts = function (oProduct) {
				var eItem = $("#PaneHolder #Warehouse #ProductObjects").find(".ProductItem[productid='" + oProduct.ID + "']");
				if (eItem.length == 0) {
					eItem = my.AppendProduct(oProduct, document.getElementById('ProductObjects'), true);
				}
				my.UpdateProductTriggerCartQty(oProduct.ID, oProduct.QTY, eItem, true);
			}
			var ItemRemovedFromCart = function (eItem) {
				eItem = $(eItem);
				eItem.find(".ProductItemInCart").remove()
				eItem.removeAttr("qtyincart");
				eItem.find(".ProductItemName").show();
			}

			$("#ProductObjects .ProductItem[qtyincart]").attr("qtyincart", "0");

			for (var nX = 0; nX < aItemsOrdered.length - 1; nX++) {
				if (aItemsOrdered[nX].SUMMARY$ROW != "1")
					AddCartItemToProducts(aItemsOrdered[nX]);
			}
			$("#ProductObjects .ProductItem[qtyincart='0']").each(function () {
				ItemRemovedFromCart(this);
			});

			var nSummaryRec = aItemsOrdered.length - 1;
			for (var oX in my.purchasingGraph.purchase) {
				my.purchasingGraph.purchase[oX] = Number(aItemsOrdered[nSummaryRec][oX]);
			}

			if (aItemsOrdered[nSummaryRec].QTY == 0) {
				my.bCartEmpty = true;
				$("#ProductHeader").find(".ListCart,.CheckOut").addClass("ui-state-disabled");
				$("#ShopingCartInside .CartEmpty").show()
				$(".CartInfo").hide();

				//Reset the Shop-Cart Toggle
				$("#ProductCartToggle").data("mode", "shop").hide().children().mouseleave();
				$("#ProductObjects .ProductItem").removeClass("ProductCartFilter");
			}
			else {
				my.bCartEmpty = false;
				$("#ProductHeader").find(".ListCart,.CheckOut").removeClass("ui-state-disabled");
				var oCurrentOrder = my.setupOrder.budgetSettings;
				$("#ShopingCartInside .CartEmpty").hide();
				$("#ProductCartToggle").show();
				$(".CartInfo .Line1").text("Shopping Cart");
				$(".CartInfo .Line2").html(aItemsOrdered[nSummaryRec].QTY + 
					" Item".toPlural(aItemsOrdered[nSummaryRec].QTY) + ", " +
					 formatCurrency(aItemsOrdered[nSummaryRec].SUBTOTAL, true, true));
				$(".CartInfo .Line3").html("Budget: " + formatCurrency(oCurrentOrder.BUDGET, true, true));

				if (Number(oCurrentOrder.BUDGET) == 0) $(".CartInfo .Line4").addClass("hidden");
				else {
					var nRemaining = Number(oCurrentOrder.BUDGET) - Number(aItemsOrdered[nSummaryRec].SUBTOTAL);
					var cRemaining = '<span style="color: ' + ((nRemaining > 0) ? 'White">Remaining: ' : 'Red">Over By: ') +
						formatCurrency(Math.abs(nRemaining), true, true) + '</span>';
					$(".CartInfo .Line4").html(cRemaining).removeClass("hidden");
				}
				$(".DiscountInfo").hide();
				$(".CartInfo,#ProductCartFilter").show();
			}
			my.showDiscount.execute(true);

			if (Application.PostLogin == "ShowCart") {
				$("#CartToggle").click();
				//$("#diagPostLoginCart").dialog("close");
				//				ShopButton.onMouseUp($("#btnFilterCart")[0]);
				//				ShopButton.hoverOut($("#btnFilterCart")[0]);
				//				my.ToggleFilter($("#btnFilterCart")[0]);
				$("#diagPostLoginCart").dialog("destroy");
			}
		},
		currentOrder: function (oRec) {
			my.setupOrder.order_id = oRec.ORDER_ID;
			for (var oX in my.setupOrder.population) {
				my.setupOrder.population[oX] = Number(oRec[oX]);
			}
			for (var oX in my.setupOrder.budgetSettings) {
				my.setupOrder.budgetSettings[oX] = Number(oRec[oX]);
			}
			my.purchasingGraph.adjustBudgets();
			my.intShipMinAmount = parseInt(Number(oRec.SHIP_MIN_AMOUNT) * 100);

			$("#ProductHeader .CartSetup").removeClass("ui-state-disabled");
		}
	};
	this.init = function () {
		var cSQL = "";
		cSQL += "SELECT * FROM adm$products(1); " + 
			String.fromCharCode(13) +
			"SELECT * FROM adm$order_fetch_current(" + quoteSQL(customer_id) + ");";
		cSQL += String.fromCharCode(13) +
			"SELECT * FROM adm$open_orders_summary(" + quoteSQL(customer_id) + ");";
		cSQL += String.fromCharCode(13) +
			"SELECT * FROM adm$open_orders_updated(" + quoteSQL(customer_id) + ");";

		var oSQL = new execQuery( cSQL, function (aTables) {
			var oCurrentOrder = aTables[1][0];
			my.dataFetched.products(aTables[0], oCurrentOrder);
			my.dataFetched.currentOrder(oCurrentOrder);
			my.dataFetched.openOrderedItems(aTables[2]);

			my.CartUpdated = aTables[3][0].QTY_LAST_UPDATE;
			my.dataFetched.schedule(oCurrentOrder);

			my.purchasingGraph.refreshGraph();
		});

		$(".ShopButton")
		.each(function () { ShopButton.hoverOut(this); })
		.mouseup(function () { ShopButton.onMouseUp(this); })
		.mousedown(function () { ShopButton.onMouseDown(this); })
		.hover(function () { ShopButton.hoverIn(this); }, function () { ShopButton.hoverOut(this); });

		$(".ShopButton[imageid=9]").click(function () { UsageTips.HelpMenu(2); });

		$(".CartBar,.BudBar,.CartBarToBalance").click(function (event) {
			event.stopPropagation();
			ProductsPane.SetAGFilter(this);
			LogEntry("Graph Clicked.");
		});

		my.ToggleFilter($("#btnFilterCart")[0]);
		if (Application.PostLogin == "ShowCart") {
			UsageTips.ShowTip("ShopCartButton", false);
			$("#diagPostLoginCart").dialog({
				autoOpen: true,
				width: 450,
				modal: true
			});
		}



		$("#CartPartyBudget").change(function () {
			if ($(this).val() == "0.0254") {
				LogEntry("QoH Easter Egg activated.");
				$(document.body).append('<div ' +
					'style="position:absolute; top:5px; left:5px; width:auto; height:auto; padding:5px; ' +
					'border:solid 1px black; background-color:White; color:black; z-index:99">' +
					'<input type="checkbox" id="chkQoHFilter" />QoH Filter</div>');
				$("#chkQoHFilter").change(function () {
					var qoh_done = $(this).data("qoh_done");
					var qoh_on = $(this).attr("checked");
					$(".ProductItem").each(function () {
						jProduct = $(this);
						if (qoh_on) {
							if (jProduct.data("qoh") > 0) {
								if (!qoh_done) {
									jProduct.css("outline", "solid 1px red").append(
						'<span class="qtyOnHand" style="position:absolute; right:3px; top:3px; font-weight:bold; color:red;">QoH: ' + jProduct.data("qoh") + '</span>');
								}
							} else jProduct.addClass("hidden");
						} else jProduct.removeClass("hidden");

					});
					$(this).data("qoh_done", true);
				});
			}
		});


		$("#ProductCartToggle").data("mode", "shop");
		$("#ProductToggle")
		.mouseenter(function () {
			var cBackPos = $(this).parent().data("mode") == "shop" ? "left -60px" : "left -30px";
			$(this).css({ "background-position": cBackPos });
		})
		.mouseleave(function () {
			var cBackPos = $(this).parent().data("mode") == "shop" ? "left -60px" : "left 0px";
			$(this).css({ "background-position": cBackPos });
		})
		.click(function () {
			if ($(this).parent().data("mode") == "shop") return;

			LogEntry("Switched to Shop Mode");

			$(this).css("cursor", "default");
			$(this).parent().data("mode", "shop").find("#CartToggle").mouseleave().css("cursor", "pointer");
			$(this).mouseenter();
			$("#ProductObjects .ProductItem").removeClass("ProductCartFilter");
		});

		$("#CartToggle")
		.mouseenter(function () {
			var cBackPos = $(this).parent().data("mode") == "cart" ? "right -60px" : "right -30px";
			$(this).css({ "background-position": cBackPos });
		})
		.mouseleave(function () {
			var cBackPos = $(this).parent().data("mode") == "cart" ? "right -60px" : "right 0px";
			$(this).css({ "background-position": cBackPos });
		})
		.click(function () {
			if ($(this).parent().data("mode") == "cart") return;

			LogEntry("Switched to Cart Mode");

			$(this).css("cursor", "default");
			$(this).parent().data("mode", "cart").find("#ProductToggle").mouseleave().css("cursor", "pointer");
			$(this).mouseenter();
			$("#ProductObjects .ProductItem").each(function () {
				var jThis = $(this);
				if (!jThis.attr("qtyincart"))
					jThis.addClass("ProductCartFilter");
			});
		});

	} ();

}


function HoverClickButtons(cSelector){
	//all hover and click logic for buttons and anchors having ui-state-default
	if (!cSelector) cSelector = ""; else cSelector += " ";
	$(cSelector + "button:not(.ui-state-disabled).ui-state-default," + 
		cSelector + "a:not(.ui-state-disabled).ui-state-default," +
		cSelector + "input[type='submit']")
	.hover(
		function() {
			$(this).addClass("ui-state-hover");
		},
		function() {
			$(this).removeClass("ui-state-hover");
		}
	)
	.mousedown(function() {
		if (!$(this).hasClass('togglebutton')) {
			if ($(this).is('.ui-state-active'))
			{ $(this).removeClass("ui-state-active"); }
			else { $(this).addClass("ui-state-active"); }
		} 
	})
	.mouseup(function() {
		if (!$(this).hasClass('togglebutton')) {
			$(this).removeClass("ui-state-active");
		}
	}
	);
}

