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

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 _setAddToBasketTimeout(atbTimeout) {
	_addToBasketTimeout = atbTimeout;
}

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

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

// Add To Basket (Add To Basket Overlay without Close or Continue Shopping and throw a Page View tags)
function _addToBasket3(productId, quantity, bvRating, fulfilmentMethod, webExclusive, promoName) {
	resetCMCookie(productId, bvRating, '', '', fulfilmentMethod, webExclusive, promoName, '', '');
	_addToBasket2(productId, quantity);
	return false;
}

//Add To Basket (10CMS: Add To Basket Overlay without Close or Continue Shopping)
function tencmsInvokeAction(data,moduleID) {
	_addToBasket(data, 1, false, false, true);
	return false;
}

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

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

function _addToBasketDoubleClick() {
	if (_addToBasketInProgress) {
		return true;
	} else {
		_addToBasketInProgress = true;
		return false;
	};
}

// Submit Request to Add To Basket
function _submitAddToBasket(msg, closeByCustomer, showContinue, isSkus) {
	if (_addToBasketDoubleClick()) {
		return false;
	}
	
	var addToBasketUrl = 'action=addToBasket&storeId=' + _getAddToBasketStoreId() + '&langId=' + _getAddToBasketLanguageId();
	if (_getAddToBasketCategoryId().length > 0) {
		addToBasketUrl = addToBasketUrl + "&cmCategoryId=" + _getAddToBasketCategoryId(); 
	}
	if (isSkus) {
		addToBasketUrl = addToBasketUrl + "&isSkus=Y"; 
	} else {
		addToBasketUrl = addToBasketUrl + "&isSkus=N"; 
	}
	addToBasketUrl = addToBasketUrl + '&msg=' + JSON.stringify(msg);
	$.ajax({
		type: "POST",
		url: _getAddToBasketActionPath(),
		timeout: _getAddToBasketTimeout(),
		data: addToBasketUrl,
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			_addToBasketInProgress = false;
		},
		success: function(msg) {
			try {
				var response = JSON.parse(msg);
				if (response.status == "ok") {
					if (!response.basketOverlayOrder.empty) {
						_setBasket(response, closeByCustomer, showContinue);
// CMTODO: Start
//						var tagThrown = false;
//						for (i=0; i<response.basketOverlayOrder.items.length; i++) {
//							var _basketOverlayPrimaryOrderItem = response.basketOverlayOrder.items[i];
//							if (_basketOverlayPrimaryOrderItem.addedToBasket) {
//								cmCreateShopAction5Tag(
//									_basketOverlayPrimaryOrderItem.partNumber, 
//									_basketOverlayPrimaryOrderItem.description, 
//									_basketOverlayPrimaryOrderItem.qty, 
//									_basketOverlayPrimaryOrderItem.totalAfterAdjustmentsRaw, 
//									_basketOverlayPrimaryOrderItem.categoryId, 
//									_basketOverlayPrimaryOrderItem.storeId, 
//									_basketOverlayPrimaryOrderItem.currency, 
//									"", 
//									"", 
//									""
//								); 
//								tagThrown = true;
//							}
//						}
//						if (tagThrown) {
//							cmDisplayShop5s();
//						}						
// CMTODO: End
					}
				}
			} catch (e) {}
			_addToBasketInProgress = false;
		}
	});
}

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

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return "";
}

function resetCMCookie(productId,
						avgRating,
						numOfReviews,
						buyAgainPerc,
						fulfillmentMethod,
						webExclusive,
						promoName,
						productType,
						ioZone)
{
	var cmCookieName = 'CM_COOKIE';
	var cmSessionCookie = readCookie(cmCookieName);
	var cookieStr = productId + '%5e%3a'
		+ 'a%5e%3d' + avgRating + '%5e%7c'
		+ 'b%5e%3d' + numOfReviews + '%5e%7c'
		+ 'c%5e%3d' + buyAgainPerc + '%5e%7c'
		+ 'd%5e%3d' + fulfillmentMethod + '%5e%7c'
		+ 'e%5e%3d' + webExclusive + '%5e%7c'
		+ 'f%5e%3d' + promoName + '%5e%7c'
		+ 'g%5e%3d' + productType + '%5e%7c'
		+ 'h%5e%3d' + ioZone + '%5e%7c'
	
	var pProductIndex = cmSessionCookie.indexOf(escape(productId));
	if(pProductIndex < 0)
	{
		cmSessionCookie += cookieStr + "%5e%3b";
	}
	else
	{
		var pEndIndex = cmSessionCookie.indexOf('%5e%3b', pProductIndex);
		cmSessionCookie = cmSessionCookie.substring(0, pProductIndex) + cmSessionCookie.substring(pEndIndex + 6) + cookieStr + "%5e%3b";
	}
		
	document.cookie = cmCookieName + '=' + cmSessionCookie;
}

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

