var _addToBasketTimeout = 10000; // in milliseconds
var _addToBasketActionPath;
var _addToBasketStoreId;
var _addToBasketLanguageId;
var _addToBasketCategoryId = "";

function _setAddToBasketActionPath(contextPath) {
	_addToBasketActionPath = contextPath;
}

function _getAddToBasketActionPath() {
	return _addToBasketActionPath;
}

function _setAddToBasketStoreId(storeId) {
	_addToBasketStoreId = storeId;
}

function _getAddToBasketStoreId() {
	return _addToBasketStoreId;
}

function _setAddToBasketLanguageId(languageId) {
	_addToBasketLanguageId = languageId;
}

function _getAddToBasketLanguageId() {
	return _addToBasketLanguageId;
}

function _setAddToBasketCategoryId(categoryId) {
	_addToBasketCategoryId = categoryId;
}

function _getAddToBasketCategoryId() {
	return _addToBasketCategoryId;
}

function _getAddToBasketTimeout() {
	return _addToBasketTimeout;
}

function _setAddToBasketLinks() {
	$(".add_to_basket_link").each(function() {
		$(this).attr('href', '#');
	});
}

// Add To Basket (Add To Basket Overlay with Close & Continue Shopping)
function _addToBasket1(productId, quantity) {
	_addToBasket(productId, quantity, true, true);
	return false;
}

// Add To Basket (Add To Basket Overlay without Close or Continue Shopping)
function _addToBasket2(productId, quantity) {
	_addToBasket(productId, quantity, false, false);
	return false;
}

// Add To Basket
function _addToBasket(productId, quantity, closeByCustomer, showContinue) {
	var msg = {
		catentryIds:[],
		quantities:[]
	};
	
	msg.catentryIds[msg.catentryIds.length] = {
		catentryId:productId
	};
	
	msg.quantities[msg.quantities.length] = {
		quantity:quantity
	};

	_submitAddToBasket(msg, closeByCustomer, showContinue);
	return false;
}

// Submit Request to Add To Basket
function _submitAddToBasket(msg, closeByCustomer, showContinue) {
	var addToBasketUrl = 'action=addToBasket&storeId=' + _getAddToBasketStoreId() + '&langId=' + _getAddToBasketLanguageId();
	if (_getAddToBasketCategoryId().length > 0) {
		addToBasketUrl = addToBasketUrl + "&cmCategoryId=" + _getAddToBasketCategoryId(); 
	}
	addToBasketUrl = addToBasketUrl + '&msg=' + JSON.stringify(msg);
	$.ajax({
		type: "POST",
		url: _getAddToBasketActionPath(),
		timeout: _getAddToBasketTimeout(),
		data: addToBasketUrl,
		success: function(msg) {
			var response = JSON.parse(msg);
			if (response.status == "ok") {
				if (!response.basketOverlayOrder.empty) {
					_setBasket(response, closeByCustomer, showContinue);
				}
			}
		}
	});
}

// Dynamically Set Basket after Ajax Add to Basket
function _setBasket(basketData, closeByCustomer, showContinue) {
	_setMiniBasketContents(basketData);
	_setBasketSummaryOverlay(basketData);
	_setAddToBasketOverlay(basketData, closeByCustomer, showContinue);
}

// Set Mini Basket Contents
function _setMiniBasketContents(basketData) {
	// Remove current details
	_removeBasketElement("mini-basket-icon");
	_removeBasketElement("mini-basket-contents-items");
	_removeBasketElement("mini-basket-contents-items-price");
	
	// Generate new details
	var parentElementId = "mini-basket-icon-details";
	_appendBasketElement(parentElementId, "<span id=\"mini-basket-icon\" class=\"fullBsk bskIcon\">Full Basket</span>");
	parentElementId = "mini-basket-contents-details";
	_appendBasketElement(parentElementId, "<span id=\"mini-basket-contents-items\">" + basketData.basketOverlayOrder.totalItems + " item(s)</span>");
	_appendBasketElement(parentElementId, "<span id=\"mini-basket-contents-items-price\" class=\"total\">" + basketData.basketOverlayOrder.totalAfterAdjustments + "</span>");
}

// Set Basket Summary Overlay
function _setBasketSummaryOverlay(basketData) {
	// Remove current details
	_removeBasketElement("basket-contents-summary-overlay-details-ul");
	
	// Generate new details
	_appendBasketElement("basket-contents-summary-overlay-details", "<ul id=\"basket-contents-summary-overlay-details-ul\"></ul>");
	var parentElementId = "basket-contents-summary-overlay-details-ul";
	_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>" + basketData.basketOverlayOrder.totalItems + " item(s)</span><span class=\"price\">" + basketData.basketOverlayOrder.totalBeforeAdjustments + "</span></li>");
	if (basketData.basketOverlayOrder.promotionApplied) {
		_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>Promotions</span><span class=\"price\">" + basketData.basketOverlayOrder.promotionsTotal + "</span></li>");
	}
	_appendBasketElement(parentElementId, "<li class=\"desc total\"><span class=\dText\>Subtotal</span><span class=\"price\">" + basketData.basketOverlayOrder.totalAfterAdjustments + "</span></li>");
}

// Set Add To Basket Overlay
function _setAddToBasketOverlay(basketData, closeByCustomer, showContinue) {
	// Remove current details
	_removeBasketElement("basket-contents-add-to-basket-overlay-details-ul");
	
	// Generate new details
	_appendBasketElement("basket-contents-add-to-basket-overlay-details", "<ul id=\"basket-contents-add-to-basket-overlay-details-ul\"></ul>");
	var parentElementId = "basket-contents-add-to-basket-overlay-details-ul";
	for (i=0; i<basketData.basketOverlayOrder.items.length; i++) {
		var _basketOverlayPrimaryOrderItem = basketData.basketOverlayOrder.items[i];
		if (_basketOverlayPrimaryOrderItem.addedToBasket) {
			if (_basketOverlayPrimaryOrderItem.qty == "1") {
				_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>" + _basketOverlayPrimaryOrderItem.description + "</span><span class=\"price\">" + _basketOverlayPrimaryOrderItem.totalBeforeAdjustments + "</span></li>");
			} else {
				_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>" + _basketOverlayPrimaryOrderItem.qty + " x " + _basketOverlayPrimaryOrderItem.description + "</span><span class=\"price\">" + _basketOverlayPrimaryOrderItem.totalBeforeAdjustments + "</span></li>");
				_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>" + _basketOverlayPrimaryOrderItem.unitPrice + "</span></li>");
			}
			if (_basketOverlayPrimaryOrderItem.promotionApplied) {
				_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>" + _basketOverlayPrimaryOrderItem.promotionDescription + "</span><span class=\"price\">" + _basketOverlayPrimaryOrderItem.promotionsTotal + "</span></li>");
			}
			_appendBasketElement(parentElementId, "<li class=\"desc total\"><span class=\dText\>Subtotal</span><span class=\"price\">" + _basketOverlayPrimaryOrderItem.totalAfterAdjustments + "</span></li>");
			for (j=0; j<_basketOverlayPrimaryOrderItem.associatedItems.length; j++) {
				var _basketOverlaySecondaryOrderItem = _basketOverlayPrimaryOrderItem.associatedItems[j];
				if (_basketOverlaySecondaryOrderItem.addedToBasket) {
					if (_basketOverlaySecondaryOrderItem.qty == "1") {
						_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>" + _basketOverlaySecondaryOrderItem.description + "</span><span class=\"price\">" + _basketOverlaySecondaryOrderItem.totalBeforeAdjustments + "</span></li>");
					} else {
						_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>" + _basketOverlaySecondaryOrderItem.qty + " x " + _basketOverlaySecondaryOrderItem.description + "</span><span class=\"price\">" + _basketOverlaySecondaryOrderItem.totalBeforeAdjustments + "</span></li>");
						_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>" + _basketOverlaySecondaryOrderItem.unitPrice + "</span></li>");
					}
					if (_basketOverlaySecondaryOrderItem.promotionApplied) {
						_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>" + _basketOverlaySecondaryOrderItem.promotionDescription + "</span><span class=\"price\">" + _basketOverlaySecondaryOrderItem.promotionsTotal + "</span></li>");
					}
					_appendBasketElement(parentElementId, "<li class=\"desc total\"><span class=\dText\>Subtotal</span><span class=\"price\">" + _basketOverlaySecondaryOrderItem.totalAfterAdjustments + "</span></li>");
				}
			}
		}
	}
	_appendBasketElement(parentElementId, "<li class=\"desc\"><span class=\dText\>Total Items(" + basketData.basketOverlayOrder.totalItems + ")</span><span class=\"price\">" + basketData.basketOverlayOrder.totalBeforeAdjustments + "</span></li>");
	if (basketData.basketOverlayOrder.promotionApplied) {
		_appendBasketElement(parentElementId, "<li class=\"desc save\"><span class=\dText\>Promotions</span><span class=\"price\">" + basketData.basketOverlayOrder.promotionsTotal + "</span></li>");
	}
	_appendBasketElement(parentElementId, "<li class=\"desc total\"><span class=\dText\>Total</span><span class=\"price\">" + basketData.basketOverlayOrder.totalAfterAdjustments + "</span></li>");
	
	// Show Overlay	for plp or pdp
	if (closeByCustomer) _openAddedBasket();
	else _openAddedBasketPlp();
}

function _appendBasketElement(basketParentElementId, basketChildElement) {
	var appendElementId = "#" + basketParentElementId;
	$(appendElementId).append(basketChildElement);
}

function _removeBasketElement(basketElementId) {
	var removeElementId = "#" + basketElementId;
	$(removeElementId).remove();
}

//Set up the close function
function _closeBasket() {
	$("#basket-contents").fadeOut(500, function() {
		$("#basket-contents .close").hide();
		$("#basket-contents #basket-contents-add-to-basket-overlay").hide();
		$("#basket-contents").css("top","34px");
		//rebind the hoverIntent
		_setHoverIntent();
		//remove the scroll detector
		$(window).unbind();		
	});
	
}
//Set up the open added
function _openAddedBasket() {
	$("#mini-basket").unbind();
	$("#basket-contents .close").show();
	$("#basket-contents #basket-contents-add-to-basket-overlay").show();
	$("#basket-contents #basket-contents-summary-overlay").hide();	
	$("#basket-contents").fadeIn(500);
	_repositionBasketToTop();
	$(window).scroll(function() {
	  //move to top
	  _repositionBasketToTop();
	});
}

//Set up the open added plp view
function _openAddedBasketPlp() {	
	$("#basket-contents .close").hide();
	$("#basket-contents #basket-contents-add-to-basket-overlay").show();
	$("#basket-contents #basket-contents-summary-overlay").hide();
	_repositionBasketToTop();
	$("#basket-contents").fadeIn(500, function() {
        // set up timed fade out
        closeTimed=setTimeout(function(){_closeBasket()}, 4000);        
      })
      .mouseover(function(){
      	//if user stays on the basket stop close basket
      	 clearTimeout(closeTimed);      	
      });
      //detect scroll function
      $(window).scroll(function() {
		  //move to top
		  _repositionBasketToTop();
		});	
}

//set up open overlay
function _openOverlayBasket() {
	//check to see if added view is open already
	var isAddedViewOpen = $("#basket-contents-add-to-basket-overlay").css("display");
	if (isAddedViewOpen == "none") {
		$("#basket-contents #basket-contents-summary-overlay").show();		
		$("#basket-contents").fadeIn(500);
	}
}

function _setHoverIntent() {
	//hoverintent request for the basket		
	var config = {    
	     over: _openOverlayBasket, 
	     timeout: 500,  
	     out: _closeBasket 
	};
	//set up hoverIntent
	$("#mini-basket").hoverIntent(config);
}
function _repositionBasketToTop() {

	//if page has scrolled past the basket display (62) it at the top
	var currentTop = $(window).scrollTop();	
	if (currentTop > 62) {
		$("#basket-contents").css("top",(currentTop-20)+"px");
	}
	else $("#basket-contents").css("top","34px");
}

/* Basket overlay functions */
$(document).ready(function(){

	//fix for ie6 overlay
	$("#basket-contents").bgIframe({opacity:true});	
	
	//bind the close function to specified events
	$("#basket-contents .close").click(function() {_closeBasket();return false;});
	
	//hide added basket initially untill added and close buttons
	$("#basket-contents #basket-contents-add-to-basket-overlay").hide();
	$("#basket-contents .close").hide();
	
	//hoverintent request for the basket		
	_setHoverIntent();
	
	
});
