// AddToCart.js

// newFunction
var busy = false;
var quantityLabel = "Qty:";
var priceLabel = "Price:";
var boxTimer = 5000;
var closeBoxesTimer = 0;
var bagPopup;

function AddToCart(quantity) {
	if (busy) {
		return;
	}	

	busy = true;
	if (!addToCartParameters.catEntryId || addToCartParameters.catEntryId == '??') {
		showInfo(noItemChosenError, '');
		location.href="#tab1";
		busy = false;
		return;
	}

	var d = doSimpleXMLHttpRequest("OrderItemAdd", addToCartParameters);
	d.addCallbacks(handleResponce, defaultErrorHandle);
	d.addCallbacks(function() {
		log("Item added");
		bag.update();
		bag.show(quantity);
	}, defaultErrorHandle);
	
	busy = false;
}

function DeleteItemFromCart(orderItemId) 
{
	if (busy) return;
	busy = true;
	
	deleteFromCartParameters.orderItemId = orderItemId;

	var d = doSimpleXMLHttpRequest("OrderItemDelete", deleteFromCartParameters);
	d.addCallbacks(handleResponce, defaultErrorHandle);
	d.addCallbacks(function(result) {
		log("Item deleted");
		bag.repaintMyBag(result);
	}, defaultErrorHandle);
}

function UpdateItemFromCart(quantityLabel, origQuantityValue) 
{
	if (busy) return;
	busy = true;
	
	updateFromCartParameters[quantityLabel] = $(quantityLabel).value;

	var d = doSimpleXMLHttpRequest("OrderItemUpdate", updateFromCartParameters);
	d.addCallbacks(handleResponce, function(error) { 
		updateFromCartParameters[quantityLabel] = origQuantityValue;
		$(quantityLabel).value = origQuantityValue; 
		defaultErrorHandle(error); 
	});
	d.addCallbacks(function(result) {
		log("Item updated");
		bag.repaintMyBag(result);
	}, function(error) { 
		updateFromCartParameters[quantityLabel] = origQuantityValue;
		$(quantityLabel).value = origQuantityValue; 
		defaultErrorHandle(error); 
	});
}

function MoveItemToWishlist(orderItemId, catEntryId) 
{
	if (busy) return;
	busy = true;
	
	moveToWishlistParameters.orderItemId = orderItemId;
	moveToWishlistParameters.catEntryId = catEntryId;

	var d = doSimpleXMLHttpRequest("OrderItemDelete", moveToWishlistParameters);
	d.addCallbacks(handleResponce, defaultErrorHandle);
	d.addCallbacks(function(result) {
		log("Item moved to wishList");
		bag.repaintMyBag(result);
	}, defaultErrorHandle);
}

function AddToCartFromWishlist(catEntryId) 
{
	if (busy) return;
	busy = true;
	
	addToCartFromWishlistParameters.catEntryId = catEntryId;

	var d = doSimpleXMLHttpRequest("OrderItemAdd", addToCartFromWishlistParameters);
	d.addCallbacks(handleResponce, defaultErrorHandle);
	d.addCallbacks(function(result) {
		log("Item added to cart from wishList");
		bag.repaintMyBag(result);
	}, defaultErrorHandle);
}

function DeleteItemFromWishlist(catEntryId) 
{
	if (busy) return;
	busy = true;
	
	deleteFromWishlistParameters.catEntryId = catEntryId;

	var d = doSimpleXMLHttpRequest("InterestItemDelete", deleteFromWishlistParameters);
	d.addCallbacks(handleResponce, defaultErrorHandle);
	d.addCallbacks(function(result) {
		log("Item deleted from wishList");
		bag.repaintMyBag(result);
	}, defaultErrorHandle);
}

function handleResponce(result) {
	var jsonResult = evalJSONRequest(result);
	if (jsonResult.status == "error") {
		throw jsonResult.exception.message;
	}
	busy = false;
	return jsonResult;
}

function defaultErrorHandle(error) {
	if (!error.logged) {
		error.logged = true
		logError(error);
		if (error.error != "") {
			showInfo(error.message, '');
		}
	}
	busy = false;	
	throw error;
}

var bag = {
	"update": function() {
			if (isNull(bag.updating)) {
				bag.updating = doSimpleXMLHttpRequest("JSONShoppingBag", shoppingBagUpdateParameters);
				var result = bag.updating;
				bag.updating.addCallbacks(handleResponce, defaultErrorHandle);
				bag.updating.addCallbacks(function(result) {
					bag.loaded = true;
					bag.count = 0;
					if (result.status == "empty" || result.items.length == 0) {
						log("empty");
						$("checkoutButton").addClass("hidden");
						$("checkoutButton2").addClass("hidden");
					} else {
						log("not empty");
						bag.items = result.items;
						bag.items.each(function(item) {
							bag.count += item.quantity;
						});
						bag.total = result.grandTotal;
						bag.repaint();
						$("checkoutButton").removeClass("hidden");
						$("checkoutButton2").removeClass("hidden");

					}
					bag.updating = null;
				}, defaultErrorHandle);
				return result;
			}
			return bag.updating;
		},		
	"repaint": function() {
			log("repainting");
			$('basket-item-count').innerHTML = bag.count;
			$('bagItemCount').set('text', bag.count);
//			$('basket-item-count-header').innerHTML = bag.count;
			var itemList = $('latestProduct');
			itemList.empty();
			
			var lastItem = bag.items.length -1;
			
			itemList.adopt(new Element("img", {"src": bag.items[lastItem].image, "width": 41, "height": 49, "class": "product"}));	
			var itemDiv = new Element("div", {"class": "productInfo"}).adopt(
					new Element("p", {"class": "name"}).appendText(bag.items[lastItem].name),					
					new Element("p", {"class": "label"}).appendText(priceLabel),
					new Element("p", {"class": "value"}).appendText(bag.items[lastItem].unitPrice)
				);
			Hash.each(bag.items[lastItem].attributes, function(value, name){
				itemDiv.adopt(new Element("p", {"class": "label"}).appendText(name + ":"), new Element("p", {"class": "value"}).appendText(value));
			});
			itemDiv.adopt(
				new Element("br" , {"class": "clearBoth"}),
				new Element("p", {"class": "label"}).appendText(quantityLabel), 
				new Element("p", {"class": "value"}).appendText(bag.items[lastItem].quantity)
			);
			itemList.adopt(itemDiv);
			
			$('basketTotal').set('text', bag.total);
			
		},		
	"repaintMyBag": function(result) {
			if (!result) return;
			log("repainting my bag");
						
			// if it's an empty bag
			if (result.status == "empty" || result.items.length == 0) {
				// reload the page, an empty shopping bag will appear
				window.location.reload();
				return;
			}
			
			// the minibag must be reloaded
			this.loaded = false;

			// clear the old values
			for (var i = 0; updateFromCartParameters.orderItems && i < updateFromCartParameters.orderItems; i++) {
				updateFromCartParameters["orderItemId_" + i] = null;
				updateFromCartParameters["quantity_" + i] = null;
			}
			updateFromCartParameters.orderItems = result.items.length;
			
			// repaint the items
			var itemsElement = $('myBagItems');
			if (itemsElement) {
				var elements = [];
				for (var i = result.items.length - 1, j = 0; i >= 0; i--, j++) {
					var item = result.items[i];

					// update parameters with the new values
					updateFromCartParameters["orderItemId_" + j] = item.orderItemId;
					updateFromCartParameters["quantity_" + j] = item.quantity;

					// attributes element
					var attributesElement = P();
					for (attributeName in item.attributes) {
						appendChildNodes(attributesElement, attributeName + ": " + item.attributes[attributeName], BR());
					}
					// prices elements
					var priceCell = null;
					var totalPriceCell = null;
					if ($defined(item.unitListPrice)) {
						priceCell = TD({"class": "td6"}, SPAN({"class":"oldPrice"}, item.unitListPrice), SPAN({"class":"newPrice"}, item.unitPrice));
						totalPriceCell = TD({"class": "td7"}, SPAN({"class":"oldPrice"}, item.totalListPrice), SPAN({"class":"newPrice"}, item.totalPrice));
					} else {
						priceCell = TD({"class": "td6"}, SPAN({"class":"newPrice"}, item.unitPrice));
						totalPriceCell = TD({"class": "td7"}, SPAN({"class":"newPrice"}, item.totalPrice));
					}
					
					// quantity select element
					var quantityElement = SELECT({"id": "quantity_" + j, "name": "quantity_" + j, "class": "width_41", "onchange": "javascript:UpdateItemFromCart('quantity_" + j + "'," + item.quantity + ")"});
					for (var x = 1; x <= Math.max(item.quantity + 2, 6); x++) {
						appendChildNodes(quantityElement, OPTION((item.quantity == x ? {"value": x, "selected": "selected"} : {"value": x}), x));
					}

					// item element, as TR
					var itemElement = TR(null,
						TD({"class": "td1"},
							INPUT({"type": "hidden", "name": "orderItemId_" + j, "value": item.orderItemId}),
							UL(null, 
								(updateFromCartParameters.wishList ? LI(null, A({"href": "javascript:MoveItemToWishlist('" + item.orderItemId + "','" + item.itemId + "')"}, shoppingCartLabels.addToWishlist)) : null),
								LI(null, A({"href": "javascript:DeleteItemFromCart('" + item.orderItemId + "')"}, shoppingCartLabels.removeItem))
							)
						),
						TD({"class": "td11"}, IMG({"src": item.image})),
						TD({"class": "td12"}, item.name),
						TD({"class": "td2"}, item.description),
						TD({"class": "td3"}, "-"),
						TD({"class": "td4"}, attributesElement),
						TD({"class": "td5"}, quantityElement),
						priceCell,
						totalPriceCell
					);
					elements.push(itemElement);	
					
					// row separator
					if (i != 0) elements.push(TR(null, TD({"colspan": "9", "class": "table-line"}, " ")));	
				}
				replaceChildNodes(itemsElement, elements);
			}
			
			// replace grand total
			var grandTotalElement = $('myBagGrandTotal');
			if (grandTotalElement) grandTotalElement.innerHTML = result.grandTotal;
			
			// repaint the wishList
			if (result.wishList) 
			{		
				// show/hide the header
				var headerWishlistElement = $('wishList');
				if (headerWishlistElement) {
					if (result.wishList.length && result.wishList.length > 0) {
						removeElementClass(headerWishlistElement, "hidden");
					} else {
						addElementClass(headerWishlistElement, "hidden");
					}
				}
					
				var wishlistElement = $('myBagWishlist');
				if (wishlistElement) 
				{			
					var elements = [];
					for (var i = 0; i < result.wishList.length; i++) {
						var item = result.wishList[i];
	
						// attributes element
						var attributesElement = P();
						for (attributeName in item.attributes) {
							appendChildNodes(attributesElement, attributeName + ": " + item.attributes[attributeName], BR());
						}
						// prices elements
						var unitPriceElement = P();
						unitPriceElement.innerHTML = item.unitPrice;
	
						// item element, as TR
						var itemElement = TR(null,
							TD({"class": "td1"},
								UL(null, 
									LI(null, A({"href": "javascript:AddToCartFromWishlist('" + item.catEntryId + "')", "class": "active"}, shoppingCartLabels.addToCart)),
									LI(null, A({"href": "javascript:DeleteItemFromWishlist('" + item.catEntryId + "')"}, shoppingCartLabels.removeItem))
								)
							),
							TD({"class": "td11"}, IMG({"src": item.image})),
							TD({"class": "td12"}, item.name),
							TD({"class": "td2"}, item.description),
							TD({"class": "td3"}, "-"),
							TD({"class": "td4"}, attributesElement),
							TD({"class": "td6"}, unitPriceElement)
						);
						elements.push(itemElement);	
						
						// row separator
						if (i != result.wishList.length - 1) elements.push(TR(null, TD({"colspan": "7", "class": "table-line"}, " ")));	
					}
					replaceChildNodes(wishlistElement, elements);
				}
			}
		},
	"toggle": function() {
			if (!bag.loaded) {
				var d = bag.update();
				d.addCallback(bag.show);
			} else {
				toggleElementClass("bag", "active");
			}
		},
	"show": function(quantityText,priceText) {
			quantityLabel = quantityText; /*PKL: hvad med de andre steder hvor qtylabel brliver brugt ?*/
			priceLabel = priceText;
			if (!bag.loaded) {
				bag.update().addCallback(bag.show);
			} else {
				removeElementClass("basket-drop-down", "hidden");
				bag.effect.start({"height": "181px"});
			}
		},
	"hide": function() {
			bag.effect1.start({"height": "0px"});
		},
	"items": [],
	"loaded": false,
	"updating": null,
	"shoppingBagElement": null,
	"shoppingBagContentElement": null,
	"openElement": null,
	"closeElement": null
	
};

window.addEvent('domready', function() {
	bag.effect = new Fx.Morph("basket-drop-down", {duration: 300, transition: 'expo:InOut'});
	bag.effect1 = new Fx.Morph("basket-drop-down", {duration: 500});
	bagPopup = $("basket-drop-down");
	
	if(bagPopup != null) {
		bagPopup.addEvent('mouseleave', function(){
			closeBoxesTimer = bag.hide.delay(boxTimer);									  
		}).addEvent('mouseenter', function(){ 
			if($defined(closeBoxesTimer)) $clear(closeBoxesTimer); 
		});
	}
	
	var itemCount = Cookie.read(shoppingBagItemCountCookieName);
	if (itemCount > 0) {
		if 	($('checkoutButton') != null) {
			$('checkoutButton').removeClass('hidden');
			$('bagItemCount').set('text', itemCount);
		}
	}
});