    /* Global javascript functions for common store actions. */
    
    function QuickSearch(searchtext) 
    {
      window.location = "/search/?q=" + encodeURIComponent(searchtext);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
    function Login(email, password, persistent) 
    {
      __doStoreAction('StoreLogin', email + '\036' + password + '\036' + persistent);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
    function LoginWithRedirect(email, password, persistent, redirectUrl) 
    {
       __doStoreAction('StoreLogin', email + '\036' + password + '\036' + persistent + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;
    }

    function fcLogin(email, password, persistent) {
      __doStoreAction('StoreLogin', email + '\036' + password + '\036' + persistent);
      try { event.returnValue = false; } catch (err) { };
      return false;
    }

    function fcLoginWithRedirect(email, password, persistent, redirectUrl) {
        __doStoreAction('StoreLogin', email + '\036' + password + '\036' + persistent + '\036' + redirectUrl);
        try { event.returnValue = false; } catch (err) { };
        return false;
    }

    function SetBasketQuantity(productID, guideMeasurementID, quantity) 
    {
      __doStoreAction('SetBasketQuantity', productID + '\036' + guideMeasurementID + '\036' + quantity);
      try { event.returnValue = false; } catch(err) {};
      return false; 
    }

    function SetBasketQuantityWithRedirect(productID, guideMeasurementID, quantity, redirectUrl) 
    {
      __doStoreAction('SetBasketQuantity', productID + '\036' + guideMeasurementID + '\036' + quantity + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function IncrementBasketQuantity(productID, guideMeasurementID, quantity) 
    {
      __doStoreAction('IncrementBasketQuantity', productID + '\036' + guideMeasurementID + '\036' + quantity);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function IncrementBasketQuantityWithRedirect(productID, guideMeasurementID, quantity, redirectUrl) 
    {
      __doStoreAction('IncrementBasketQuantity', productID + '\036' + guideMeasurementID + '\036' + quantity + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function EmptyBasket() 
    {
      __doStoreAction('EmptyBasket', '');
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
    function EmptyBasketWithRedirect(redirectUrl) 
    {
      __doStoreAction('EmptyBasket', redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function AddClaimCode(claimCode) 
    {
      __doStoreAction('AddClaimCode', claimCode);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function AddClaimCodeWithRedirect(claimCode, redirectUrl) 
    {
      __doStoreAction('AddClaimCode', claimCode + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
    function RemoveClaimCode(claimCode) 
    {
      __doStoreAction('RemoveClaimCode', claimCode);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }

    function RemoveClaimCodeWithRedirect(claimCode, redirectUrl) 
    {
      __doStoreAction('RemoveClaimCode', claimCode + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
    function ReserveSlot(slotID) 
    {
      __doStoreAction('ReserveSlot', slotID);
      try { event.returnValue = false; } catch(err) {};
      return false;     
    }
    
     function ReserveSlotWithRedirect(slotID, redirectUrl) 
    {
      __doStoreAction('ReserveSlot', slotID + '\036' + redirectUrl);
      try { event.returnValue = false; } catch(err) {};
      return false;
    }

    function SetGuestPostcode(postcode) {
      __doStoreAction('SetGuestPostcode', postcode);
      try { event.returnValue = false; } catch (err) { };
      return false;
    }
    
	var ajaxErrorMessage = "There was an error performing your request."; 
 
	function SetBasketQuantityAjax(productId, guideMeasurementId, quantity, extraInformationRequest, userContext, successCallback, failureCallback) 
	{
		return UpdateBasketQuantityAjax(productId, guideMeasurementId, quantity, false, extraInformationRequest, userContext, successCallback, failureCallback);
	}
      
    function IncrementBasketQuantityAjax(productId, guideMeasurementId, quantity, extraInformationRequest, userContext, successCallback, failureCallback) 
	{
	    return UpdateBasketQuantityAjax(productId, guideMeasurementId, quantity, true, extraInformationRequest, userContext, successCallback, failureCallback);
	}

	function UpdateBasketQuantityAjax(productId, guideMeasurementId, quantity, increment, extraInformationRequest, userContext, successCallback, failureCallback) {
	    if (browserSupportsAjax() === true) {
	        var userContextArray = new Array();
	        userContextArray[0] = successCallback;
	        userContextArray[1] = failureCallback;
	        userContextArray[2] = userContext;
	        userContextArray[3] = extraInformationRequest;
	        jQuery.ajax({
	            type: "POST",
	            url: "/fcAjax/",
	            data: "fcStoreAction=UpdateBasket&increment=" + (increment ? "true" : "false") + "&quantity_" + productId + ((guideMeasurementId) ? "_" + guideMeasurementId : "") + "=" + quantity + "&xsrftoken=" + theForm.XsrfToken.value,
	            dataType: "json",
	            context: userContextArray,
	            success: UpdateBasketQuantityAjaxSuccessCallback,
	            error: function () { alert(ajaxErrorMessage); }
	        });
	        try { event.returnValue = false; } catch (err) { };
	        return false;
	    } else {
            if (increment) {
	            return IncrementBasketQuantity(productId, guideMeasurementId, quantity);
            } else {
                return SetBasketQuantity(productId, guideMeasurementId, quantity);
            }
	    }
    }

    function UpdateBasketQuantityAjaxSuccessCallback(jsonObject) {
        var userContext = this[2];
        if (jsonObject.fcAjaxResult.success) {
            var successCallback = this[0];
            var extraInformationRequest = this[3];
            var productId = jsonObject.fcAjaxResult.data.updatedBasketItems[0].productId.replace(/\-/g,"");
            var guideMeasurementId = jsonObject.fcAjaxResult.data.updatedBasketItems[0].guideMeasurementId;
            if (guideMeasurementId === null) {
                guideMeasurementId = "";
            } else {
                guideMeasurementId = guideMeasurementId.replace(/\-/g,"");
            }
            var quantity = jsonObject.fcAjaxResult.data.updatedBasketItems[0].quantityInBasket;
            var extraInformationResponse = new Array();
            if (typeof extraInformationRequest == "string" && extraInformationRequest.length > 0) {
                extraInformationRequest = extraInformationRequest.toLowerCase().split(",");
                var htmlEscape = false;
                for (var i = 0; i < extraInformationRequest.length; i++) {
                    extraInformationRequest[i] = jQuery.trim(extraInformationRequest[i]);
                    htmlEscape = (extraInformationRequest[i].charAt(0) == "*");
                    if (htmlEscape) {
                        extraInformationRequest[i] = extraInformationRequest[i].substring(1);
                    }
                    switch (extraInformationRequest[i]) {
                        case "product.name":
                            extraInformationResponse[i] = jsonObject.fcAjaxResult.data.updatedBasketItems[0].productName;
                            break;
                        case "product.url":
                            extraInformationResponse[i] = jsonObject.fcAjaxResult.data.updatedBasketItems[0].productUrl;
                            break;
                        case "basket.subtotalafterdiscounttext":
                            extraInformationResponse[i] = '\u00A3' + jsonObject.fcAjaxResult.data.basketSubtotalAfterDiscount.toFixed(2);
                            break;
                        case "guidemeasurement.guidemeasurementtext":
                            extraInformationResponse[i] = jsonObject.fcAjaxResult.data.updatedBasketItems[0].guideMeasurementText;
                            break;
                        case "guidemeasurement.name":
                            extraInformationResponse[i] = jsonObject.fcAjaxResult.data.updatedBasketItems[0].guideMeasurementName;
                            break;
                        case "basket.linecount":
                            extraInformationResponse[i] = jsonObject.fcAjaxResult.data.basketItemsCount.toFixed();
                            break;
                        default:
                            extraInformationResponse[i] = "unknown";
                            break;
                    }
                    if (htmlEscape) {
                        extraInformationResponse[i] = extraInformationResponse[i].replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                    }
                }
            }
            if (typeof successCallback == "function") {
                successCallback(productId, guideMeasurementId, quantity, extraInformationResponse, userContext);
            }
        } else {
            var failureCallback = this[1];
            if (typeof failureCallback == "function") {
                failureCallback(null, null, userContext);
            }
        }
    }
    
    var submitCount=0;
    
    function pressedEnter(e) {
        var kc = (e.charCode || e.keyCode);
	    if (kc == 13){ 
		    return true; 
		} 
	    return false;
	}

	function clickButton(e, buttonid) {
	    var bt = document.getElementById(buttonid);
	    if (typeof bt == 'object') {
	        if (pressedEnter(e)) {
	            bt.click();
	            try { event.returnValue = false; } catch (err) { };
	            return false;
	        }
        }
	}

    var browserSupportsAjaxSave = false;
    
    function browserSupportsAjax()
    {
        if (browserSupportsAjaxSave === true) {
            return true;
        }
        
        var xmlHttp = null;
        try
        {
            // Firefox, Opera 8.0+, Safari
            xmlHttp = new XMLHttpRequest();
        } 
        catch (e)
        {
            // Internet Explorer
            try
            {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e)
            {
                try
                {
                    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e)
                {
                    return false;
                }
            }
        }
        if (xmlHttp === null) {
            return false;
        } else {
            xmlHttp = null;
            browserSupportsAjaxSave = true;
            return true;    
        }
    }
