/* Minification failed. Returning unminified contents.
(1421,36-37): run-time error JS1014: Invalid character: `
(1421,44-45): run-time error JS1193: Expected ',' or ')': {
(1421,52-53): run-time error JS1195: Expected expression: ,
(1421,69-70): run-time error JS1195: Expected expression: ,
(1421,79-80): run-time error JS1195: Expected expression: ,
(1421,88-89): run-time error JS1014: Invalid character: `
(1421,89-90): run-time error JS1195: Expected expression: )
(2111,7-15): run-time error JS1004: Expected ';': function
(2116,32-37): run-time error JS1004: Expected ';': fetch
(2127,34-42): run-time error JS1004: Expected ';': response
(2133,23-48): run-time error JS1004: Expected ';': logDynamicYieldCartUpdate
(2146,7-15): run-time error JS1004: Expected ';': function
 */
/*!
 * jQuery Migrate - v1.2.1 - 2013-05-08
 * https://github.com/jquery/jquery-migrate
 * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
 */
(function( jQuery, window, undefined ) {
// See http://bugs.jquery.com/ticket/13335
// "use strict";


var warnedAbout = {};

// List of warnings already given; public read only
jQuery.migrateWarnings = [];

// Set to true to prevent console output; migrateWarnings still maintained
// jQuery.migrateMute = false;

// Show a message on the console so devs know we're active
if ( !jQuery.migrateMute && window.console && window.console.log ) {
	window.console.log("JQMIGRATE: Logging is active");
}

// Set to false to disable traces that appear with warnings
if ( jQuery.migrateTrace === undefined ) {
	jQuery.migrateTrace = true;
}

// Forget any warnings we've already given; public
jQuery.migrateReset = function() {
	warnedAbout = {};
	jQuery.migrateWarnings.length = 0;
};

function migrateWarn( msg) {
	var console = window.console;
	if ( !warnedAbout[ msg ] ) {
		warnedAbout[ msg ] = true;
		jQuery.migrateWarnings.push( msg );
		if ( console && console.warn && !jQuery.migrateMute ) {
			console.warn( "JQMIGRATE: " + msg );
			if ( jQuery.migrateTrace && console.trace ) {
				console.trace();
			}
		}
	}
}

function migrateWarnProp( obj, prop, value, msg ) {
	if ( Object.defineProperty ) {
		// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
		// allow property to be overwritten in case some other plugin wants it
		try {
			Object.defineProperty( obj, prop, {
				configurable: true,
				enumerable: true,
				get: function() {
					migrateWarn( msg );
					return value;
				},
				set: function( newValue ) {
					migrateWarn( msg );
					value = newValue;
				}
			});
			return;
		} catch( err ) {
			// IE8 is a dope about Object.defineProperty, can't warn there
		}
	}

	// Non-ES5 (or broken) browser; just set the property
	jQuery._definePropertyBroken = true;
	obj[ prop ] = value;
}

if ( document.compatMode === "BackCompat" ) {
	// jQuery has never supported or tested Quirks Mode
	migrateWarn( "jQuery is not compatible with Quirks Mode" );
}


var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
	oldAttr = jQuery.attr,
	valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
		function() { return null; },
	valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
		function() { return undefined; },
	rnoType = /^(?:input|button)$/i,
	rnoAttrNodeType = /^[238]$/,
	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
	ruseDefault = /^(?:checked|selected)$/i;

// jQuery.attrFn
migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );

jQuery.attr = function( elem, name, value, pass ) {
	var lowerName = name.toLowerCase(),
		nType = elem && elem.nodeType;

	if ( pass ) {
		// Since pass is used internally, we only warn for new jQuery
		// versions where there isn't a pass arg in the formal params
		if ( oldAttr.length < 4 ) {
			migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
		}
		if ( elem && !rnoAttrNodeType.test( nType ) &&
			(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
			return jQuery( elem )[ name ]( value );
		}
	}

	// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
	// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
	if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
		migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
	}

	// Restore boolHook for boolean property/attribute synchronization
	if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
		jQuery.attrHooks[ lowerName ] = {
			get: function( elem, name ) {
				// Align boolean attributes with corresponding properties
				// Fall back to attribute presence where some booleans are not supported
				var attrNode,
					property = jQuery.prop( elem, name );
				return property === true || typeof property !== "boolean" &&
					( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?

					name.toLowerCase() :
					undefined;
			},
			set: function( elem, value, name ) {
				var propName;
				if ( value === false ) {
					// Remove boolean attributes when set to false
					jQuery.removeAttr( elem, name );
				} else {
					// value is true since we know at this point it's type boolean and not false
					// Set boolean attributes to the same name and set the DOM property
					propName = jQuery.propFix[ name ] || name;
					if ( propName in elem ) {
						// Only set the IDL specifically if it already exists on the element
						elem[ propName ] = true;
					}

					elem.setAttribute( name, name.toLowerCase() );
				}
				return name;
			}
		};

		// Warn only for attributes that can remain distinct from their properties post-1.9
		if ( ruseDefault.test( lowerName ) ) {
			migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
		}
	}

	return oldAttr.call( jQuery, elem, name, value );
};

// attrHooks: value
jQuery.attrHooks.value = {
	get: function( elem, name ) {
		var nodeName = ( elem.nodeName || "" ).toLowerCase();
		if ( nodeName === "button" ) {
			return valueAttrGet.apply( this, arguments );
		}
		if ( nodeName !== "input" && nodeName !== "option" ) {
			migrateWarn("jQuery.fn.attr('value') no longer gets properties");
		}
		return name in elem ?
			elem.value :
			null;
	},
	set: function( elem, value ) {
		var nodeName = ( elem.nodeName || "" ).toLowerCase();
		if ( nodeName === "button" ) {
			return valueAttrSet.apply( this, arguments );
		}
		if ( nodeName !== "input" && nodeName !== "option" ) {
			migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
		}
		// Does not return so that setAttribute is also used
		elem.value = value;
	}
};


var matched, browser,
	oldInit = jQuery.fn.init,
	oldParseJSON = jQuery.parseJSON,
	// Note: XSS check is done below after string is trimmed
	rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;

// $(html) "looks like html" rule change
jQuery.fn.init = function( selector, context, rootjQuery ) {
	var match;

	if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
			(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
		// This is an HTML string according to the "old" rules; is it still?
		if ( selector.charAt( 0 ) !== "<" ) {
			migrateWarn("$(html) HTML strings must start with '<' character");
		}
		if ( match[ 3 ] ) {
			migrateWarn("$(html) HTML text after last tag is ignored");
		}
		// Consistently reject any HTML-like string starting with a hash (#9521)
		// Note that this may break jQuery 1.6.x code that otherwise would work.
		if ( match[ 0 ].charAt( 0 ) === "#" ) {
			migrateWarn("HTML string cannot start with a '#' character");
			jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
		}
		// Now process using loose rules; let pre-1.8 play too
		if ( context && context.context ) {
			// jQuery object as context; parseHTML expects a DOM object
			context = context.context;
		}
		if ( jQuery.parseHTML ) {
			return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
					context, rootjQuery );
		}
	}
	return oldInit.apply( this, arguments );
};
jQuery.fn.init.prototype = jQuery.fn;

// Let $.parseJSON(falsy_value) return null
jQuery.parseJSON = function( json ) {
	if ( !json && json !== null ) {
		migrateWarn("jQuery.parseJSON requires a valid JSON string");
		return null;
	}
	return oldParseJSON.apply( this, arguments );
};

jQuery.uaMatch = function( ua ) {
	ua = ua.toLowerCase();

	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
		/(msie) ([\w.]+)/.exec( ua ) ||
		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
		[];

	return {
		browser: match[ 1 ] || "",
		version: match[ 2 ] || "0"
	};
};

// Don't clobber any existing jQuery.browser in case it's different
if ( !jQuery.browser ) {
	matched = jQuery.uaMatch( navigator.userAgent );
	browser = {};

	if ( matched.browser ) {
		browser[ matched.browser ] = true;
		browser.version = matched.version;
	}

	// Chrome is Webkit, but Webkit is also Safari.
	if ( browser.chrome ) {
		browser.webkit = true;
	} else if ( browser.webkit ) {
		browser.safari = true;
	}

	jQuery.browser = browser;
}

// Warn if the code tries to get jQuery.browser
migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );

jQuery.sub = function() {
	function jQuerySub( selector, context ) {
		return new jQuerySub.fn.init( selector, context );
	}
	jQuery.extend( true, jQuerySub, this );
	jQuerySub.superclass = this;
	jQuerySub.fn = jQuerySub.prototype = this();
	jQuerySub.fn.constructor = jQuerySub;
	jQuerySub.sub = this.sub;
	jQuerySub.fn.init = function init( selector, context ) {
		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
			context = jQuerySub( context );
		}

		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
	};
	jQuerySub.fn.init.prototype = jQuerySub.fn;
	var rootjQuerySub = jQuerySub(document);
	migrateWarn( "jQuery.sub() is deprecated" );
	return jQuerySub;
};


// Ensure that $.ajax gets the new parseJSON defined in core.js
jQuery.ajaxSetup({
	converters: {
		"text json": jQuery.parseJSON
	}
});


var oldFnData = jQuery.fn.data;

jQuery.fn.data = function( name ) {
	var ret, evt,
		elem = this[0];

	// Handles 1.7 which has this behavior and 1.8 which doesn't
	if ( elem && name === "events" && arguments.length === 1 ) {
		ret = jQuery.data( elem, name );
		evt = jQuery._data( elem, name );
		if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
			migrateWarn("Use of jQuery.fn.data('events') is deprecated");
			return evt;
		}
	}
	return oldFnData.apply( this, arguments );
};


var rscriptType = /\/(java|ecma)script/i,
	oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;

jQuery.fn.andSelf = function() {
	migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
	return oldSelf.apply( this, arguments );
};

// Since jQuery.clean is used internally on older versions, we only shim if it's missing
if ( !jQuery.clean ) {
	jQuery.clean = function( elems, context, fragment, scripts ) {
		// Set context per 1.8 logic
		context = context || document;
		context = !context.nodeType && context[0] || context;
		context = context.ownerDocument || context;

		migrateWarn("jQuery.clean() is deprecated");

		var i, elem, handleScript, jsTags,
			ret = [];

		jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );

		// Complex logic lifted directly from jQuery 1.8
		if ( fragment ) {
			// Special handling of each script element
			handleScript = function( elem ) {
				// Check if we consider it executable
				if ( !elem.type || rscriptType.test( elem.type ) ) {
					// Detach the script and store it in the scripts array (if provided) or the fragment
					// Return truthy to indicate that it has been handled
					return scripts ?
						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
						fragment.appendChild( elem );
				}
			};

			for ( i = 0; (elem = ret[i]) != null; i++ ) {
				// Check if we're done after handling an executable script
				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
					// Append to fragment and handle embedded scripts
					fragment.appendChild( elem );
					if ( typeof elem.getElementsByTagName !== "undefined" ) {
						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );

						// Splice the scripts into ret after their former ancestor and advance our index beyond them
						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
						i += jsTags.length;
					}
				}
			}
		}

		return ret;
	};
}

var eventAdd = jQuery.event.add,
	eventRemove = jQuery.event.remove,
	eventTrigger = jQuery.event.trigger,
	oldToggle = jQuery.fn.toggle,
	oldLive = jQuery.fn.live,
	oldDie = jQuery.fn.die,
	ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
	rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
	hoverHack = function( events ) {
		if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
			return events;
		}
		if ( rhoverHack.test( events ) ) {
			migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
		}
		return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
	};

// Event props removed in 1.9, put them back if needed; no practical way to warn them
if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
	jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
}

// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
if ( jQuery.event.dispatch ) {
	migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
}

// Support for 'hover' pseudo-event and ajax event warnings
jQuery.event.add = function( elem, types, handler, data, selector ){
	if ( elem !== document && rajaxEvent.test( types ) ) {
		migrateWarn( "AJAX events should be attached to document: " + types );
	}
	eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
};
jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
	eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
};

jQuery.fn.error = function() {
	var args = Array.prototype.slice.call( arguments, 0);
	migrateWarn("jQuery.fn.error() is deprecated");
	args.splice( 0, 0, "error" );
	if ( arguments.length ) {
		return this.bind.apply( this, args );
	}
	// error event should not bubble to window, although it does pre-1.7
	this.triggerHandler.apply( this, args );
	return this;
};

jQuery.fn.toggle = function( fn, fn2 ) {

	// Don't mess with animation or css toggles
	if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
		return oldToggle.apply( this, arguments );
	}
	migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");

	// Save reference to arguments for access in closure
	var args = arguments,
		guid = fn.guid || jQuery.guid++,
		i = 0,
		toggler = function( event ) {
			// Figure out which function to execute
			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );

			// Make sure that clicks stop
			event.preventDefault();

			// and execute the function
			return args[ lastToggle ].apply( this, arguments ) || false;
		};

	// link all the functions, so any of them can unbind this click handler
	toggler.guid = guid;
	while ( i < args.length ) {
		args[ i++ ].guid = guid;
	}

	return this.click( toggler );
};

jQuery.fn.live = function( types, data, fn ) {
	migrateWarn("jQuery.fn.live() is deprecated");
	if ( oldLive ) {
		return oldLive.apply( this, arguments );
	}
	jQuery( this.context ).on( types, this.selector, data, fn );
	return this;
};

jQuery.fn.die = function( types, fn ) {
	migrateWarn("jQuery.fn.die() is deprecated");
	if ( oldDie ) {
		return oldDie.apply( this, arguments );
	}
	jQuery( this.context ).off( types, this.selector || "**", fn );
	return this;
};

// Turn global events into document-triggered events
jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
	if ( !elem && !rajaxEvent.test( event ) ) {
		migrateWarn( "Global events are undocumented and deprecated" );
	}
	return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
};
jQuery.each( ajaxEvents.split("|"),
	function( _, name ) {
		jQuery.event.special[ name ] = {
			setup: function() {
				var elem = this;

				// The document needs no shimming; must be !== for oldIE
				if ( elem !== document ) {
					jQuery.event.add( document, name + "." + jQuery.guid, function() {
						jQuery.event.trigger( name, null, elem, true );
					});
					jQuery._data( this, name, jQuery.guid++ );
				}
				return false;
			},
			teardown: function() {
				if ( this !== document ) {
					jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
				}
				return false;
			}
		};
	}
);


})( jQuery, window );
;
//---------------------------------------------------------------------------------------
// Name        : general
// Type        : JavaScript module
// Author      : Alexandra Persille
// History	   : 7th July 2015 - Created
// Description : Encapsulates methods needed to handle of core elements (link - input ..)
//             : Uses self-executing function pattern.
// Copyright   : This is the property of Abel & Cole Limited and cannot be used, 
//               copied or modified without the express permission of the company
//               in writing. Copyright 2011 Abel & Cole Limited.
//---------------------------------------------------------------------------------------

var general = (function () {

    //settings and cached elements
    var s = {
        mqlMobile: window.matchMedia('only screen and (max-width: 480px)'),
        mql: window.matchMedia('only screen and (max-width: 640px)'),
        mqlTablet: window.matchMedia('only screen and (max-width: 768px)'),
        isMyccountPage: $('.my-account-page').length,
        body: $('.site-content'),
        basketMessageCookie: 'basket-message',
        getSearchAutoCompleteResultsUrl: '/Services/GetSearchAutoCompleteResults',
        burgerMenuIcon: 'burger-menu-icon',
        burgerMenuIconClose: 'burger-menu-icon-close',
   },

    me = {};
    me.mobile = false;
    me.smallMobile = false;
    me.vpvBasketLoggedOutPage = "/vpv/basket/logged-out";
    me.vpvBasketLoggedOutTitle = "Basket page logged out";


    // START - Used in the Menu React control
    let timer = null;

    window.addEventListener('load', function () {    
        window.BurgerMenu = document.getElementsByClassName(s.burgerMenuIcon);
        window.BurgerMenuClose = document.getElementsByClassName(s.burgerMenuIconClose);
    });

    window.addEventListener('resize', function () {

        this.clearTimeout(timer);

        timer = setTimeout(function () {
            window.BurgerMenu = document.getElementsByClassName(s.burgerMenuIcon);
            window.BurgerMenuClose = document.getElementsByClassName(s.burgerMenuIconClose);
        }, 100);

    });
    // END - Used in the Menu React control

    //-------------------------------------------------------------------------------
    // Method      : init
    // Description : initialise module
    //-------------------------------------------------------------------------------
    me.init = function (settings) {
        bindUIActions();
        handleCookieSettingsClick();
        handlemedia(s.mql);
        handlemediaTablet(s.mqlTablet);
        handlemediaMobile(s.mqlMobile);

        //me.sessionsStorageHandler();

        //detectmobileSizeTouchScreens();
        //handleOnFocusTouchScreen();

        fixGeneralBugs();
        addYoutubeTracking();

        hideTopMenuOnScroll();

        me.SetGoogleClientId();

        IsMobileView();

    }
    //-------------------------------------------------------------------------------
    // Method      : removeBasketPrompt
    // Description : remove the green added-to-basket tooltip on all page
    //-------------------------------------------------------------------------------
    me.removeBasketPrompt = function () {
        if (me.getCookie(s.basketMessageCookie) != null) {
            $('.site-content').removeClass('hasbasket').removeClass('justadded');
            me.deleteCookie(s.basketMessageCookie);
        }
    }
    //-------------------------------------------------------------------------------
    // Method      : sessionsStorageHandler
    // Description : add the green added-to-basket tooltip on all page
    //-------------------------------------------------------------------------------
    me.sessionsStorageHandler = function () {
        var basketMessage = me.getCookie(s.basketMessageCookie)
        if (basketMessage !== null) {
            $('.site-content').addClass('hasbasket');
            $('.add-prompt .text').html(unescape(basketMessage));
        }
    }
    //-------------------------------------------------------------------------------
    // Method      : whichTransitionEvent
    // Description : return which transitionend is supported by the browser
    //-------------------------------------------------------------------------------
    me.whichTransitionEventEnd = function () {
        var t,
            el = document.createElement("div");

        var animations = {
            "transition": "transitionend",
            "OTransition": "oTransitionEnd",
            "MozTransition": "transitionend",
            "WebkitTransition": "webkitTransitionEnd"
        }

        for (t in animations) {
            if (el.style[t] !== undefined) {
                return animations[t];
            }
        }
        return false;
    }

    //-------------------------------------------------------------------------------
    // Method      : bindUIActions
    // Description : Binds all ui actions
    //-------------------------------------------------------------------------------
    function bindUIActions() {
        // handle telephone number links
        $('.disableCallFromClick').find('a[href^="tel:"]').on('click', function (event) {
            event.preventDefault();
        });
        $('.no-touch').find('a[href^="tel:"]').on('click', function (event) {
            event.preventDefault();
        });


        // close green added-to-basket tooltip
        $('.close-prompt').on('click', function () {
            if ($(".recipe-box-page-container").length > 0) {
                $('.site-content').removeClass('hasbasket').removeClass('justadded');
            } else {
                me.removeBasketPrompt();
            }
        });

        $('.push-banner').on('click', function (e) {
            pushBannerClick($(this), e);
        });

        $('body').on('click', '.callout-cta', function (e) {
            var info = $(this).next('.callout-gdpr-info');
            if (info.is(':visible'))
                info.slideUp();
            else
                info.slideDown();
        });

        $('body').on('keyup', '.callout-cta', function (e) {
            if (e.which == 13) {
                $('.callout-cta').click();
                return false;
            }
        });

        $('body').on('click', '.email-contact .callout-cta-rb', function (e) {
            var info = $('#email-callout.callout-gdpr-info');

            if ($(this).hasClass('no')) {
                if (info.is(':visible'))
                    info.slideUp();
            }
            else {
                if (info.is(':hidden'))
                    info.slideDown();
            }
        });

        $(".newsletter-wrapper .email-signup").focus(function (e) {
            $('.newsletter-wrapper .callout-gdpr-info').slideDown();
        });

        $(".newsletter-wrapper .email-signup").blur(function (e) {
            $('.newsletter-wrapper .callout-gdpr-info').slideUp();
        });

        $('body').on('click', '.show-privacy-policy', function () {
            $.featherlight("/content/GDPR/privacy_policy.htm", { variant: "privacy-policy-lightbox" });
        });

        $('body').on('click', '.show-legal', function () {
            $.featherlight("/content/terms/terms.htm", { variant: "privacy-policy-lightbox" });
        });

        $('body').on('mouseenter', '#search-term', function () {
            getSearchResultsTemplate();
        });

        $('body').on('click', '#search-btn', function () {
            getSearchResultsTemplate();
        });

        $('body').on('touchstart', '#search-term', function () {
            getSearchResultsTemplate();
        });

        // matchmedia
        s.mql.addListener(handlemedia);

        s.mqlTablet.addListener(handlemediaTablet);

        s.mqlMobile.addListener(handlemediaMobile);             
    };

    //-------------------------------------------------------------------------------
    // Method      : handlemediaTablet 
    // Description : handle event on match media ( Tablet )
    //-------------------------------------------------------------------------------  
    function handlemediaTablet(mediaQuery) {
        if (s.isMyccountPage) {
            // topMenu
            if (typeof TopMenu !== 'undefined')
                TopMenu.closeMenu();
            me.mobile = mediaQuery.matches;
        }
    }

    //-------------------------------------------------------------------------------
    // Method      : getSearchResultsTemplate 
    // Description : Returns the search results template to populate the search
    //               results
    //-------------------------------------------------------------------------------  
    function getSearchResultsTemplate() {

        if ($('#search-autocomplete-control').html().length == 0) {

            $.ajax({
                url: s.getSearchAutoCompleteResultsUrl,
                type: 'POST',
                cache: false,
                dataType: "html",
                success: function (searchResults) {
                    $('#search-autocomplete-control').html(searchResults);
                }
            });

        }
    }

    //-------------------------------------------------------------------------------
    // Method      : handlemedia 
    // Description : handle event on match media ( Mobile  )
    //-------------------------------------------------------------------------------  
    function handlemedia(mediaQuery) {
        if (!s.isMyccountPage) {
            // topMenu
            if (typeof TopMenu !== 'undefined')
                TopMenu.closeMenu();
            me.mobile = mediaQuery.matches;
        }
        // category page
        if (typeof ShopList !== 'undefined')
            ShopList.filterMenuHandleSticky();
    }
    //-------------------------------------------------------------------------------
    // Method      : handlemediaMobile
    // Description : handle event on match media ( small Mobile  )
    //-------------------------------------------------------------------------------  
    function handlemediaMobile(mediaQuery) {
        me.smallMobile = mediaQuery.matches;
    }


    //-------------------------------------------------------------------------------
    // Method      : mobileSizeTouchScreen
    // Description : add a class when not mobile size and touch screen
    //------------------------------------------------------------------------------- 
    function detectmobileSizeTouchScreens() {
        if (!Modernizr.touch && TopMenu.smallMobile) {
            $('.site-content').addClass('disableCallFromClick');
        }
    }

    //-------------------------------------------------------------------------------
    // Method      : handleOnFocusTouchScreen
    // Description : add a class when an input is on focus on mobile and tablet
    //-------------------------------------------------------------------------------
    function handleOnFocusTouchScreen() {
        if (Modernizr.touch) {
            /* cache dom references */
            var $body = jQuery('body');


            /* bind events */
            $(document)
            .on('focus', 'input, textarea, select', function () {
                if($(this).attr('id') !== 'search-term')
                    $body.addClass('fixfixed');
            })
            .on('blur', 'input, textarea, select', function () {
                if ($(this).attr('id') !== 'search-term')
                    $body.removeClass('fixfixed');
            });


        }
    }
    //-------------------------------------------------------------------------------
    // Method      : fixGeneralBugs
    // Description : concerns bug that occurs on general elements
    //-------------------------------------------------------------------------------
    function fixGeneralBugs() {

        // resize iframes
        $('iframe#ifPaymentDetails').load(function () {
            $(parent.$('html,body')).animate({
                scrollTop: 0,
            }, 300);
            $(this).height($(this).contents().outerHeight() + 100);
        });

        // fix bug on dropdown for iphone/ipad
        if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
            var selects = document.querySelectorAll("select");
            for (var i = 0; i < selects.length; i++) {
                selects[i].appendChild(document.createElement("optgroup"));
            }
        }

    }

    function playYoutubeVideo(elt) {
        var videoURL = elt.prop('src');
        videoURL += "&autoplay=1";
        elt.prop('src', videoURL);
    }

    function addYoutubeTracking() {

        $('.youtube, .youtube-vid').click(function () {

            var youtube_iframe_selector = $('.videoWrapper #youtube_video');
            
            $(this).find('.overlay').fadeOut(600, function () {
                
                youtube_iframe_selector.css("z-index", "4");
                try {
                    for (var i = 0; i < window.gtmYTListeners.length; i++) {
                        if (youtube_iframe_selector.attr("src").indexOf(window.gtmYTListeners[i].B.videoData.video_id) > -1) {
                            gtmYTListeners[i].playVideo();
                            return;
                        }
                    }
                } catch (e) { }

                playYoutubeVideo(youtube_iframe_selector);
            });
        });
    }

    function hideTopMenuOnScroll() {
        var topMenuHeight = $('.top-first-layer').css('height');
        var topAutocompleteSection = $('#search_autocomplete').css('top');
        var topHere = 1;
        var parentHeight = ($('.top-first-layer').height());
        $(document).scroll(function () {
            if (window.innerWidth > 640) {
                $('.top-first-layer').removeClass('hide');
                var scrollTop = $(window).scrollTop();
                if (scrollTop > parentHeight) {
                    if (topHere == 1) {
                        $('#main-header').addClass('main-header-fixed');
                        $('#item-notification').addClass('fixed');
                        $('.top-first-layer').addClass('fixed');

                        topHere = 0;
                    }
                }
                else {
                    if (topHere == 0) {
                        $('#main-header').removeClass('main-header-fixed');
                        $('#item-notification').removeClass('fixed');
                        $('.top-first-layer').addClass('fixed');

                        topHere = 1;
                    }
                }
            }
            else {
                $('#main-header').removeClass('main-header-fixed');
                $('#item-notification').removeClass('fixed');
                $('.top-first-layer').removeClass('fixed');

                return;
            }
        });
    }

    //-------------------------------------------------------------------------------
    // Method      : updateHEaderValues
    // Description : update basket / delivery totals in the header
    //-------------------------------------------------------------------------------
    me.addBasketMessage = function (message) {
        me.createCookie(s.basketMessageCookie, message);
    }

    //-------------------------------------------------------------------------------
    // Method      : addBasketMessage
    // Description : initialise module
    //-------------------------------------------------------------------------------
    me.updateHeaderValues = function () {
        $.getJSON("/Account/GetHeaderValues", function (result) {

            var bQty = result.basketQuantity > 0 ? result.basketQuantity : '';

            $('#BasketTotal').text(result.basketPrice);
            $('#BasketCount').text(result.basketQuantity);
            $('#DeliveryCount').text(result.orderQuantity || '');
            $('.order .delivery').text(result.orderTotal);
            if ($('.basket.menu-item.icon-basket').hasClass("experiment")) {
                if (result.basketQuantity > 0 && !$('.basket.menu-item.icon-basket').hasClass("exp-active")) {
                    $('.basket.menu-item.icon-basket').addClass("exp-active");
                } else if (result.basketQuantity <= 0 && $('.basket.menu-item.icon-basket').hasClass("exp-active")) {
                    $('.basket.menu-item.icon-basket').removeClass("exp-active");
                }
            }
        });
    }

    //-------------------------------------------------------------------------------
    // Method      : init
    // Description : initialise module
    //-------------------------------------------------------------------------------
    me.createCookie = function (name, value, expires, path, domain) {
        var cookie = name + "=" + escape(value) + ";";

        if (expires) {
            // If it's a date
            if (expires instanceof Date) {
                // If it isn't a valid date
                if (isNaN(expires.getTime()))
                    expires = new Date();
            }
            else
                expires = new Date(new Date().getTime() + parseInt(expires) * 1000 * 60 * 60 * 24);

            cookie += "expires=" + expires.toGMTString() + ";";
        }
        
        cookie += "path=/;";
        if (domain)
            cookie += "domain=" + domain + ";";

        document.cookie = cookie;

    }

    //-------------------------------------------------------------------------------
    // Method      : init
    // Description : initialise module
    //-------------------------------------------------------------------------------
    me.getCookie = function (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 null;
    }

    //-------------------------------------------------------------------------------
    // Method      : init
    // Description : initialise module
    //-------------------------------------------------------------------------------
    me.deleteCookie = function (name, domain) {
        // If the cookie exists
        if (me.getCookie(name))
            me.createCookie(name, "", -1, domain);
    }

    //-------------------------------------------------------------------------------
    // Method      : pushBannerClick
    // Description : tracking every url push-banner
    //-------------------------------------------------------------------------------
    function pushBannerClick(banner, event) {

        var label = [],
            href = banner.attr('href');

        if (href != null && href != '' && href != '#' && typeof href != 'undefined') {
            event.preventDefault();
        }

        window.dataLayer = window.dataLayer || [];

        pt = me.GetPageType();
        if (pt != undefined)
            label.push(pt);
        label.push(banner.data("label"));

        images = me.getBannerImages(banner);
        image = images.length ? images.join(" | ") : undefined;

        window.dataLayer.push({
            "event": "ga_event",
            "eEcomm": "true",
            "ga_event": {
                "category": "banner click",
                "action": banner.data("action"),
                "label": label.join(" | "),
                "value": 0,
                "nonInteraction": "false"
            },
            "ecommerce": {
                "currencyCode": "GBP",
                "promoClick": {
                    "promotions": [{
                        "id": banner.data("id"),
                        "name": banner.data("action"),
                        "creative": image,
                        "position": label.join(" | "),
                    }]
                }
            },
            "eventCallback": function () {
                if (href != null && href != '' && typeof href != 'undefined') {
                    document.location = href;
                }
            }
        });

    }

    me.getBannerImages = function (banner) {
        var images = [];

        banner.find('*').addBack().each(function () {
            if ($(this).is('img'))
                images.push($(this).attr('src'))
            else {
                var image = $(this).css('background-image');
                if (image && image != "none") {
                    image = /^url\((['"]?)(.*)\1\)$/.exec(image);
                    images.push(image[2]);
                }
            }
        });
        return images;
    }

    me.LogNewsLetterSubscription = function (source) {

        var label = "from: ";
        label = label + location.pathname + location.search;

        if(source)
            label = label + " | " + source
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push({
            "event": "ga_event",
            "eEcomm": "false",
            "ga_event": {
                "category": "newsletter",
                "action": "subscribe",
                "label": label,
                "value": 0,
                "nonInteraction": "false"
            }
        });
    }

    me.GetProductLabel = function (product) {

        var label = [];

        if (product.closest('#search_autocomplete').length) {
            label.push('search autocomplete');
            label.push($('#search-term').val().toLowerCase());
            return label.join(" | ");
        }

        var pt = me.GetPageType();
        if (pt != undefined)
            label.push(pt + ' page');

        var searchString = me.GetQuerystring("term");
        if (searchString)
            label.push(searchString);


        var lt = me.GetProductListType(product);
        if (lt != undefined)
            label.push(lt);

        var breacrumbs = $('.breadcrumb:first > span');
        if (breacrumbs.length > 0) {
            breacrumbs.slice(1).each(function () {
                label.push($.trim($(this).text()));
            });
        }
        
        if (product.hasClass('personalised-recipe-box'))
            label.push('Recipe Boxes');

        return label.join(" | ");
    }

    me.GetProductListType = function (product) {
        var list = product.closest("ul");
        if (list.length > 0 && list.attr('data-list-type')) {
            return list.data('list-type');
        }
    }

    me.GetPageType = function () {
        var pt;
        $.each(window.dataLayer, function (index, value) {
            if (value.hasOwnProperty('pageType')) {
                pt = value.pageType;
                return false;
            }
        });
        return pt;
    }

    me.GetQuerystring = function (name, url) {
        if (!url) url = window.location.href;
        name = name.replace(/[\[\]]/g, "\\$&");
        var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
            results = regex.exec(url);
        if (!results) return null;
        if (!results[2]) return '';
        return decodeURIComponent(results[2].replace(/\+/g, " "));
    }

    me.SetGoogleClientId = function () {

        if (!localStorage.GoogleClientIdSet || localStorage.GoogleClientIdSet != 'true')
        {
            var clientId = GetGoogleClientId();
            if (clientId != null) {

                var data = {};
                data.googleClientId = clientId;

                $.ajax({
                    type: "POST",
                    url: "/AccountServices/SetGoogleClientId",
                    data: data,  
                    success: function (result) {
                        localStorage.GoogleClientIdSet = result;
                    }
                }); 
            }
        }
    }

    function GetGoogleClientId() {
        try {
            var ga_cookie = me.getCookie("_ga");
            if (typeof (ga_cookie) !== "undefined") {
                var components = ga_cookie.split(".");
                return components[2] + "." + components[3];
            }
        } catch (e) { }
        return undefined;
    }



    var message = {
        added: "</span> added to your basket",
        removed: "</span> removed from your basket"
    },
        delayedHide = 0,
        namePrduct = '';

    //-------------------------------------------------------------------------------
    // Method      : updateBasketSummary
    // Description : Updates the basket summary info 
    //-------------------------------------------------------------------------------
    me.updateBasketSummary = function (qty, remove, productName, displayQty, frequencyDesc, bundleWidget, bundleComplete) {
        bundleWidget = (typeof bundleWidget !== 'undefined') ? bundleWidget : false;
        bundleComplete = (typeof bundleComplete !== 'undefined') ? bundleComplete : false;

        $.getJSON("/BasketServices/UpdateMasterhead", function (result) {

            var item;
            $('#BasketCount').html(result.BasketCount);
            $('#BasketTotal').html(result.BasketTotal);
            if ($('.basket.menu-item.icon-basket').hasClass("experiment")) {
                if (result.BasketCount > 0 && !$('.basket.menu-item.icon-basket').hasClass("exp-active")) {
                    $('.basket.menu-item.icon-basket').addClass("exp-active");
                } else if (result.BasketCount <= 0 && $('.basket.menu-item.icon-basket').hasClass("exp-active")) {
                    $('.basket.menu-item.icon-basket').removeClass("exp-active");
                }
            }

            namePrduct = productName;

            if (displayQty)
                item = (qty > 1) ? qty + " items" : qty + " item";
            else
                item = productName;

            if (!remove) {
                updatePrompt(qty);
                if (bundleWidget && bundleComplete) {
                    var notificationText = '<span class="bold">Offer complete</span>';
                } else {
                    var notificationText = '<span class="bold">' + item + message.added + ((frequencyDesc != "") ? " for delivery <span class='bold'>" + frequencyDesc + '</bold>' : "");
                }
            }
            else {
                var notificationText = '<span class="bold">' + item + message.removed;
                $('#add-prompt-compt').css('opacity', '0');
            }

            if (bundleWidget == false || bundleComplete == true) {
                if (namePrduct == productName) {
                    $('.add-prompt .text').css('opacity', '0');
                    setTimeout(function () { $('.add-prompt .text').css('opacity', '0.99'); }, 100);
                }
                $('.add-prompt .text').html(notificationText);
                $('.site-content').addClass('justadded');
                general.addBasketMessage(notificationText);
            }

        });
    }

    //-------------------------------------------------------------------------------
    // Method      : function updatePrompt() {
    // Description : Updates the basket icon prompt
    //-------------------------------------------------------------------------------
    function updatePrompt(qty) {

        var prompt = $('#add-prompt-compt');

        prompt.html(qty);

        clearTimeout(delayedHide);
        prompt.css('opacity', '0.99');

        delayedHide = setTimeout(function () {
            prompt.css('opacity', '0');
        }, 3000);
    }

    //-------------------------------------------------------------------------------
    // Method      : IsMobileView
    // Description : Adds Class to body if Viewport is below 640px to be able to identify
    //               that we're in a mobile view.
    //-------------------------------------------------------------------------------
    function IsMobileView() {

        window.addEventListener('load', function () {
            checkBrowserViewport();

        });

        window.addEventListener('resize', function () {
            setTimeout(function () {
                checkBrowserViewport();
            }, 500);

        });
    }

    function checkBrowserViewport() {

        let bodyElement = document.body;
        let mobileClass = "MobileView";

        if (window.innerWidth <= 640) {
            if (bodyElement.classList !== 'undefined' && !bodyElement.classList.contains(mobileClass))
                bodyElement.classList.add(mobileClass);
        }

        else {
            if (bodyElement.classList !== 'undefined' && bodyElement.classList.contains(mobileClass))
                bodyElement.classList.remove(mobileClass);
        }
    } 

    //-------------------------------------------------------------------------------
    // Method      : AddContentSquareVirtualPageView
    // Description : Add a Virtual Page View to Content Square.
    //-------------------------------------------------------------------------------
    me.AddContentSquareVirtualPageView = function (page, title) {
        window._uxa = window._uxa || [];
        window._uxa.push(['setCustomVariable', 1, "VPV Page", page, 4]);
        window._uxa.push(['setCustomVariable', 2, "VPV Title", title, 4]);
        window._uxa.push(['trackPageview']);
    }

    me.showCustomerBlockedBanner = function(blocked) {
        if (blocked === 'True') {
            $('.site-content, .web').addClass('justadded');
            $('.wrapper1200px .checkout-prompt.icon-basket').hide();
            var closePrompt = $('.close-prompt');
            closePrompt.next('.text').text('Your account has been disabled. Please contact our customer services team so we can help you.');
            $('.top-first-layer').attr('style', 'height: 28px !important;');
            $('.add-prompt').attr('style', 'background-color:#e85d4a; color:#FFFFFF; opacity: 1;');
        }
        $('.close-prompt, .icon-cross').on('click', function () {
            $('.site-content, .web').removeClass('justadded');
        });
    }

    return me;
}());

$(document).ready(function () {
    general.init();
});

window.addEventListener('CookiebotOnAccept', function (e) {
    if (Cookiebot.consent.preferences) {
        setDynamicYieldServerCookie();
    }
    else {
        deleteDynamicYieldServerCookie();
    }
});

window.addEventListener('CookiebotOnDecline', function (e) {
    deleteDynamicYieldServerCookie();
});

//-------------------------------------------------------------------------------
// Method      : SetDynamicYieldServerCookie
// Description : Checks for the dynamic yeild cookie and creates a server side
//               cookie if necessary
//-------------------------------------------------------------------------------
function setDynamicYieldServerCookie() {

    let userActiveConsent;

    if (typeof DY !== 'undefined' && DY.userActiveConsent) {
        userActiveConsent = DY.userActiveConsent;
    }

    // Only Add DY Server Side Cookie if user has consented.
    if (userActiveConsent != null && userActiveConsent.accepted == true) {
        if (!document.cookie.includes('_dyid_server')) {
            let dyidFrontEnd;
            if (typeof DY !== 'undefined' && DY.dyid) {
                dyidFrontEnd = DY.dyid;
            }

            const payload = 'dyid=' + encodeURIComponent(dyidFrontEnd !== undefined ? dyidFrontEnd : '');

            fetch('/Services/SetDynamicYieldServerCookie', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'RequestVerificationToken': tokenHeaderValue
                },
                body: payload
            });
        }
    }  
};

//-------------------------------------------------------------------------------
// Method      : deleteDynamicYieldServerCookie
// Description : Deletes the Dynamic Yield Server Cookie when requested
//-------------------------------------------------------------------------------
function deleteDynamicYieldServerCookie() {

    // Create the fetch request with the headers
    fetch('/Services/DeleteDynamicYieldServerCookie', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'RequestVerificationToken': tokenHeaderValue
        }
    });
}

//-------------------------------------------------------------------------------
// Method      : popupWindow
// Description : Opens a new window in the center of the screen
//-------------------------------------------------------------------------------
function popupWindow(url, title, w, h) {
    let size = { w: w, h: h };
    let win = {
        w: { i: window.top.innerWidth, o: window.top.outerWidth },
        h: { i: window.top.innerHeight, o: window.top.outerHeight },
        x: window.top.screenX || window.top.screenLeft, y: window.top.screenY || window.top.screenTop
    }

    const x = win.w.o / 2 + win.x - (size.w / 2);
    const y = win.h.o / 2 + win.y - (size.h / 2);
    return window.open(url, title, `width=${size.w},height=${size.h},left=${x},top=${y}`);
}

//-------------------------------------------------------------------------------
// Method      : handleCookieSettingsClick
// Description : Opens the Cookiebot consent overlay
//-------------------------------------------------------------------------------
function handleCookieSettingsClick() {
    window.addEventListener("load", function () {
        const cookieSettingsLink = document.getElementById("cookieSettingsLink");

        cookieSettingsLink.addEventListener("click", function (event) {
            event.preventDefault();
            if (typeof Cookiebot !== 'undefined' && Cookiebot.renew) {
                Cookiebot.renew();
            }
        });
    });
};
/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */

window.matchMedia || (window.matchMedia = function() {
    "use strict";

    // For browsers that support matchMedium api such as IE 9 and webkit
    var styleMedia = (window.styleMedia || window.media);

    // For those that don't support matchMedium
    if (!styleMedia) {
        var style       = document.createElement('style'),
            script      = document.getElementsByTagName('script')[0],
            info        = null;

        style.type  = 'text/css';
        style.id    = 'matchmediajs-test';

        script.parentNode.insertBefore(style, script);

        // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
        info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;

        styleMedia = {
            matchMedium: function(media) {
                var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';

                // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
                if (style.styleSheet) {
                    style.styleSheet.cssText = text;
                } else {
                    style.textContent = text;
                }

                // Test if media query is true or false
                return info.width === '1px';
            }
        };
    }

    return function(media) {
        return {
            matches: styleMedia.matchMedium(media || 'all'),
            media: media || 'all'
        };
    };
}());
;
/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */
(function(){
    // Bail out for browsers that have addListener support
    if (window.matchMedia && window.matchMedia('all').addListener) {
        return false;
    }

    var localMatchMedia = window.matchMedia,
        hasMediaQueries = localMatchMedia('only all').matches,
        isListening     = false,
        timeoutID       = 0,    // setTimeout for debouncing 'handleChange'
        queries         = [],   // Contains each 'mql' and associated 'listeners' if 'addListener' is used
        handleChange    = function(evt) {
            // Debounce
            clearTimeout(timeoutID);

            timeoutID = setTimeout(function() {
                for (var i = 0, il = queries.length; i < il; i++) {
                    var mql         = queries[i].mql,
                        listeners   = queries[i].listeners || [],
                        matches     = localMatchMedia(mql.media).matches;

                    // Update mql.matches value and call listeners
                    // Fire listeners only if transitioning to or from matched state
                    if (matches !== mql.matches) {
                        mql.matches = matches;

                        for (var j = 0, jl = listeners.length; j < jl; j++) {
                            listeners[j].call(window, mql);
                        }
                    }
                }
            }, 30);
        };

    window.matchMedia = function(media) {
        var mql         = localMatchMedia(media),
            listeners   = [],
            index       = 0;

        mql.addListener = function(listener) {
            // Changes would not occur to css media type so return now (Affects IE <= 8)
            if (!hasMediaQueries) {
                return;
            }

            // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)
            // There should only ever be 1 resize listener running for performance
            if (!isListening) {
                isListening = true;
                window.addEventListener('resize', handleChange, true);
            }

            // Push object only if it has not been pushed already
            if (index === 0) {
                index = queries.push({
                    mql         : mql,
                    listeners   : listeners
                });
            }

            listeners.push(listener);
        };

        mql.removeListener = function(listener) {
            for (var i = 0, il = listeners.length; i < il; i++){
                if (listeners[i] === listener){
                    listeners.splice(i, 1);
                }
            }
        };

        return mql;
    };
}());
;
/*
     _ _      _       _
 ___| (_) ___| | __  (_)___
/ __| | |/ __| |/ /  | / __|
\__ \ | | (__|   < _ | \__ \
|___/_|_|\___|_|\_(_)/ |___/
                   |__/

 Version: 1.5.0
  Author: Ken Wheeler
 Website: http://kenwheeler.github.io
    Docs: http://kenwheeler.github.io/slick
    Repo: http://github.com/kenwheeler/slick
  Issues: http://github.com/kenwheeler/slick/issues

 */
/* global window, document, define, jQuery, setInterval, clearInterval */

!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,g,h,e=this;if(e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'<button type="button" data-role="none" class="slick-prev" aria-label="previous">Previous</button>',nextArrow:'<button type="button" data-role="none" class="slick-next" aria-label="next">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(a,b){return'<button type="button" data-role="none">'+(b+1)+"</button>"},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.hidden="hidden",e.paused=!1,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,f,d),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,g=e.options.responsive||null,g&&g.length>-1){e.respondTo=e.options.respondTo||"window";for(h in g)g.hasOwnProperty(h)&&(e.breakpoints.push(g[h].breakpoint),e.breakpointSettings[g[h].breakpoint]=g[h].settings);e.breakpoints.sort(function(a,b){return e.options.mobileFirst===!0?a-b:b-a})}"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.msHidden?(e.hidden="msHidden",e.visibilityChange="msvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.init(),e.checkResponsive(!0)}var b=0;return c}(),b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),d[e.animType]=e.options.vertical===!1?"translate3d("+b+"px, 0px, 0px)":"translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.asNavFor=function(b){var c=this,d=null!==c.options.asNavFor?a(c.options.asNavFor).slick("getSlick"):null;null!==d&&d.slideHandler(b,!0)},b.prototype.applyTransition=function(a){var b=this,c={};c[b.transitionType]=b.options.fade===!1?b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:"opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer),a.slideCount>a.options.slidesToShow&&a.paused!==!0&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this;a.options.infinite===!1?1===a.direction?(a.currentSlide+1===a.slideCount-1&&(a.direction=0),a.slideHandler(a.currentSlide+a.options.slidesToScroll)):(0===a.currentSlide-1&&(a.direction=1),a.slideHandler(a.currentSlide-a.options.slidesToScroll)):a.slideHandler(a.currentSlide+a.options.slidesToScroll)},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&b.slideCount>b.options.slidesToShow&&(b.$prevArrow=a(b.options.prevArrow),b.$nextArrow=a(b.options.nextArrow),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.appendTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled"))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(d='<ul class="'+b.options.dotsClass+'">',c=0;c<=b.getDotCount();c+=1)d+="<li>"+b.options.customPaging.call(this,b,c)+"</li>";d+="</ul>",b.$dots=a(d).appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),b.$slidesCache=b.$slides,b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('<div class="slick-track"/>').appendTo(b.$slider):b.$slides.wrapAll('<div class="slick-track"/>').parent(),b.$list=b.$slideTrack.wrap('<div aria-live="polite" class="slick-list"/>').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.options.accessibility===!0&&b.$list.prop("tabIndex",0),b.setSlideClasses("number"==typeof this.currentSlide?this.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;c<a.options.rows;c++){var j=document.createElement("div");for(d=0;d<a.options.slidesPerRow;d++){var k=b*h+(c*a.options.slidesPerRow+d);g.get(k)&&j.appendChild(g.get(k))}i.appendChild(j)}e.appendChild(i)}a.$slider.html(e),a.$slider.children().children().children().width(100/a.options.slidesPerRow+"%").css({display:"inline-block"})}},b.prototype.checkResponsive=function(b){var d,e,f,c=this,g=c.$slider.width(),h=window.innerWidth||a(window).width();if("window"===c.respondTo?f=h:"slider"===c.respondTo?f=g:"min"===c.respondTo&&(f=Math.min(h,g)),c.originalSettings.responsive&&c.originalSettings.responsive.length>-1&&null!==c.originalSettings.responsive){e=null;for(d in c.breakpoints)c.breakpoints.hasOwnProperty(d)&&(c.originalSettings.mobileFirst===!1?f<c.breakpoints[d]&&(e=c.breakpoints[d]):f>c.breakpoints[d]&&(e=c.breakpoints[d]));null!==e?null!==c.activeBreakpoint?e!==c.activeBreakpoint&&(c.activeBreakpoint=e,"unslick"===c.breakpointSettings[e]?c.unslick():(c.options=a.extend({},c.originalSettings,c.breakpointSettings[e]),b===!0&&(c.currentSlide=c.options.initialSlide),c.refresh())):(c.activeBreakpoint=e,"unslick"===c.breakpointSettings[e]?c.unslick():(c.options=a.extend({},c.originalSettings,c.breakpointSettings[e]),b===!0&&(c.currentSlide=c.options.initialSlide),c.refresh())):null!==c.activeBreakpoint&&(c.activeBreakpoint=null,c.options=c.originalSettings,b===!0&&(c.currentSlide=c.options.initialSlide),c.refresh())}},b.prototype.changeSlide=function(b,c){var f,g,h,d=this,e=a(b.target);switch(e.is("a")&&b.preventDefault(),h=0!==d.slideCount%d.options.slidesToScroll,f=h?0:(d.slideCount-d.currentSlide)%d.options.slidesToScroll,b.data.message){case"previous":g=0===f?d.options.slidesToScroll:d.options.slidesToShow-f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide-g,!1,c);break;case"next":g=0===f?d.options.slidesToScroll:f,d.slideCount>d.options.slidesToShow&&d.slideHandler(d.currentSlide+g,!1,c);break;case"index":var i=0===b.data.index?0:b.data.index||a(b.target).parent().index()*d.options.slidesToScroll;d.slideHandler(d.checkNavigable(i),!1,c);break;default:return}},b.prototype.checkNavigable=function(a){var c,d,b=this;if(c=b.getNavigableIndexes(),d=0,a>c[c.length-1])a=c[c.length-1];else for(var e in c){if(a<c[e]){a=d;break}d=c[e]}return a},b.prototype.cleanUpEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).off("click.slick",b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).off("mouseenter.slick",b.setPaused.bind(b,!0)).off("mouseleave.slick",b.setPaused.bind(b,!1)),b.options.arrows===!0&&b.slideCount>b.options.slidesToShow&&(b.$prevArrow&&b.$prevArrow.off("click.slick",b.changeSlide),b.$nextArrow&&b.$nextArrow.off("click.slick",b.changeSlide)),b.$list.off("touchstart.slick mousedown.slick",b.swipeHandler),b.$list.off("touchmove.slick mousemove.slick",b.swipeHandler),b.$list.off("touchend.slick mouseup.slick",b.swipeHandler),b.$list.off("touchcancel.slick mouseleave.slick",b.swipeHandler),b.$list.off("click.slick",b.clickHandler),b.options.autoplay===!0&&a(document).off(b.visibilityChange,b.visibility),b.$list.off("mouseenter.slick",b.setPaused.bind(b,!0)),b.$list.off("mouseleave.slick",b.setPaused.bind(b,!1)),b.options.accessibility===!0&&b.$list.off("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().off("click.slick",b.selectHandler),a(window).off("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange),a(window).off("resize.slick.slick-"+b.instanceUid,b.resize),a("[draggable!=true]",b.$slideTrack).off("dragstart",b.preventDefault),a(window).off("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).off("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.cleanUpRows=function(){var b,a=this;a.options.rows>1&&(b=a.$slides.children().children(),b.removeAttr("style"),a.$slider.html(b))},b.prototype.clickHandler=function(a){var b=this;b.shouldClick===!1&&(a.stopImmediatePropagation(),a.stopPropagation(),a.preventDefault())},b.prototype.destroy=function(){var b=this;b.autoPlayClear(),b.touchObject={},b.cleanUpEvents(),a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&"object"!=typeof b.options.prevArrow&&b.$prevArrow.remove(),b.$nextArrow&&"object"!=typeof b.options.nextArrow&&b.$nextArrow.remove(),b.$slides&&(b.$slides.removeClass("slick-slide slick-active slick-center slick-visible").attr("aria-hidden","true").removeAttr("data-slick-index").css({position:"",left:"",top:"",zIndex:"",opacity:"",width:""}),b.$slider.html(b.$slides)),b.cleanUpRows(),b.$slider.removeClass("slick-slider"),b.$slider.removeClass("slick-initialized")},b.prototype.disableTransition=function(a){var b=this,c={};c[b.transitionType]="",b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.fadeSlide=function(a,b){var c=this;c.cssTransitions===!1?(c.$slides.eq(a).css({zIndex:1e3}),c.$slides.eq(a).animate({opacity:1},c.options.speed,c.options.easing,b)):(c.applyTransition(a),c.$slides.eq(a).css({opacity:1,zIndex:1e3}),b&&setTimeout(function(){c.disableTransition(a),b.call()},c.options.speed))},b.prototype.filterSlides=b.prototype.slickFilter=function(a){var b=this;null!==a&&(b.unload(),b.$slideTrack.children(this.options.slide).detach(),b.$slidesCache.filter(a).appendTo(b.$slideTrack),b.reinit())},b.prototype.getCurrent=b.prototype.slickCurrentSlide=function(){var a=this;return a.currentSlide},b.prototype.getDotCount=function(){var a=this,b=0,c=0,d=0;if(a.options.infinite===!0)d=Math.ceil(a.slideCount/a.options.slidesToScroll);else if(a.options.centerMode===!0)d=a.slideCount;else for(;b<a.slideCount;)++d,b=c+a.options.slidesToShow,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d-1},b.prototype.getLeft=function(a){var c,d,f,b=this,e=0;return b.slideOffset=0,d=b.$slides.first().outerHeight(),b.options.infinite===!0?(b.slideCount>b.options.slidesToShow&&(b.slideOffset=-1*b.slideWidth*b.options.slidesToShow,e=-1*d*b.options.slidesToShow),0!==b.slideCount%b.options.slidesToScroll&&a+b.options.slidesToScroll>b.slideCount&&b.slideCount>b.options.slidesToShow&&(a>b.slideCount?(b.slideOffset=-1*(b.options.slidesToShow-(a-b.slideCount))*b.slideWidth,e=-1*(b.options.slidesToShow-(a-b.slideCount))*d):(b.slideOffset=-1*b.slideCount%b.options.slidesToScroll*b.slideWidth,e=-1*b.slideCount%b.options.slidesToScroll*d))):a+b.options.slidesToShow>b.slideCount&&(b.slideOffset=(a+b.options.slidesToShow-b.slideCount)*b.slideWidth,e=(a+b.options.slidesToShow-b.slideCount)*d),b.slideCount<=b.options.slidesToShow&&(b.slideOffset=0,e=0),b.options.centerMode===!0&&b.options.infinite===!0?b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)-b.slideWidth:b.options.centerMode===!0&&(b.slideOffset=0,b.slideOffset+=b.slideWidth*Math.floor(b.options.slidesToShow/2)),c=b.options.vertical===!1?-1*a*b.slideWidth+b.slideOffset:-1*a*d+e,b.options.variableWidth===!0&&(f=b.slideCount<=b.options.slidesToShow||b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow),c=f[0]?-1*f[0].offsetLeft:0,b.options.centerMode===!0&&(f=b.options.infinite===!1?b.$slideTrack.children(".slick-slide").eq(a):b.$slideTrack.children(".slick-slide").eq(a+b.options.slidesToShow+1),c=f[0]?-1*f[0].offsetLeft:0,c+=(b.$list.width()-f.outerWidth())/2)),c},b.prototype.getOption=b.prototype.slickGetOption=function(a){var b=this;return b.options[a]},b.prototype.getNavigableIndexes=function(){var e,a=this,b=0,c=0,d=[];for(a.options.infinite===!1?(e=a.slideCount-a.options.slidesToShow+1,a.options.centerMode===!0&&(e=a.slideCount)):(b=-1*a.options.slidesToScroll,c=-1*a.options.slidesToScroll,e=2*a.slideCount);e>b;)d.push(b),b=c+a.options.slidesToScroll,c+=a.options.slidesToScroll<=a.options.slidesToShow?a.options.slidesToScroll:a.options.slidesToShow;return d},b.prototype.getSlick=function(){return this},b.prototype.getSlideCount=function(){var c,d,e,b=this;return e=b.options.centerMode===!0?b.slideWidth*Math.floor(b.options.slidesToShow/2):0,b.options.swipeToSlide===!0?(b.$slideTrack.find(".slick-slide").each(function(c,f){return f.offsetLeft-e+a(f).outerWidth()/2>-1*b.swipeLeft?(d=f,!1):void 0}),c=Math.abs(a(d).attr("data-slick-index")-b.currentSlide)||1):b.options.slidesToScroll},b.prototype.goTo=b.prototype.slickGoTo=function(a,b){var c=this;c.changeSlide({data:{message:"index",index:parseInt(a)}},b)},b.prototype.init=function(){var b=this;a(b.$slider).hasClass("slick-initialized")||(a(b.$slider).addClass("slick-initialized"),b.buildRows(),b.buildOut(),b.setProps(),b.startLoad(),b.loadSlider(),b.initializeEvents(),b.updateArrows(),b.updateDots()),b.$slider.trigger("init",[b])},b.prototype.initArrowEvents=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.on("click.slick",{message:"previous"},a.changeSlide),a.$nextArrow.on("click.slick",{message:"next"},a.changeSlide))},b.prototype.initDotEvents=function(){var b=this;b.options.dots===!0&&b.slideCount>b.options.slidesToShow&&a("li",b.$dots).on("click.slick",{message:"index"},b.changeSlide),b.options.dots===!0&&b.options.pauseOnDotsHover===!0&&b.options.autoplay===!0&&a("li",b.$dots).on("mouseenter.slick",b.setPaused.bind(b,!0)).on("mouseleave.slick",b.setPaused.bind(b,!1))},b.prototype.initializeEvents=function(){var b=this;b.initArrowEvents(),b.initDotEvents(),b.$list.on("touchstart.slick mousedown.slick",{action:"start"},b.swipeHandler),b.$list.on("touchmove.slick mousemove.slick",{action:"move"},b.swipeHandler),b.$list.on("touchend.slick mouseup.slick",{action:"end"},b.swipeHandler),b.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},b.swipeHandler),b.$list.on("click.slick",b.clickHandler),b.options.autoplay===!0&&a(document).on(b.visibilityChange,b.visibility.bind(b)),b.$list.on("mouseenter.slick",b.setPaused.bind(b,!0)),b.$list.on("mouseleave.slick",b.setPaused.bind(b,!1)),b.options.accessibility===!0&&b.$list.on("keydown.slick",b.keyHandler),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),a(window).on("orientationchange.slick.slick-"+b.instanceUid,b.orientationChange.bind(b)),a(window).on("resize.slick.slick-"+b.instanceUid,b.resize.bind(b)),a("[draggable!=true]",b.$slideTrack).on("dragstart",b.preventDefault),a(window).on("load.slick.slick-"+b.instanceUid,b.setPosition),a(document).on("ready.slick.slick-"+b.instanceUid,b.setPosition)},b.prototype.initUI=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.show(),a.$nextArrow.show()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.show(),a.options.autoplay===!0&&a.autoPlay()},b.prototype.keyHandler=function(a){var b=this;37===a.keyCode&&b.options.accessibility===!0?b.changeSlide({data:{message:"previous"}}):39===a.keyCode&&b.options.accessibility===!0&&b.changeSlide({data:{message:"next"}})},b.prototype.lazyLoad=function(){function g(b){a("img[data-lazy]",b).each(function(){var b=a(this),c=a(this).attr("data-lazy"),d=document.createElement("img");d.onload=function(){b.animate({opacity:1},200)},d.src=c,b.css({opacity:0}).attr("src",c).removeAttr("data-lazy").removeClass("slick-loading")})}var c,d,e,f,b=this;b.options.centerMode===!0?b.options.infinite===!0?(e=b.currentSlide+(b.options.slidesToShow/2+1),f=e+b.options.slidesToShow+2):(e=Math.max(0,b.currentSlide-(b.options.slidesToShow/2+1)),f=2+(b.options.slidesToShow/2+1)+b.currentSlide):(e=b.options.infinite?b.options.slidesToShow+b.currentSlide:b.currentSlide,f=e+b.options.slidesToShow,b.options.fade===!0&&(e>0&&e--,f<=b.slideCount&&f++)),c=b.$slider.find(".slick-slide").slice(e,f),g(c),b.slideCount<=b.options.slidesToShow?(d=b.$slider.find(".slick-slide"),g(d)):b.currentSlide>=b.slideCount-b.options.slidesToShow?(d=b.$slider.find(".slick-cloned").slice(0,b.options.slidesToShow),g(d)):0===b.currentSlide&&(d=b.$slider.find(".slick-cloned").slice(-1*b.options.slidesToShow),g(d))},b.prototype.loadSlider=function(){var a=this;a.setPosition(),a.$slideTrack.css({opacity:1}),a.$slider.removeClass("slick-loading"),a.initUI(),"progressive"===a.options.lazyLoad&&a.progressiveLazyLoad()},b.prototype.next=b.prototype.slickNext=function(){var a=this;a.changeSlide({data:{message:"next"}})},b.prototype.orientationChange=function(){var a=this;a.checkResponsive(),a.setPosition()},b.prototype.pause=b.prototype.slickPause=function(){var a=this;a.autoPlayClear(),a.paused=!0},b.prototype.play=b.prototype.slickPlay=function(){var a=this;a.paused=!1,a.autoPlay()},b.prototype.postSlide=function(a){var b=this;b.$slider.trigger("afterChange",[b,a]),b.animating=!1,b.setPosition(),b.swipeLeft=null,b.options.autoplay===!0&&b.paused===!1&&b.autoPlay()},b.prototype.prev=b.prototype.slickPrev=function(){var a=this;a.changeSlide({data:{message:"previous"}})},b.prototype.preventDefault=function(a){a.preventDefault()},b.prototype.progressiveLazyLoad=function(){var c,d,b=this;c=a("img[data-lazy]",b.$slider).length,c>0&&(d=a("img[data-lazy]",b.$slider).first(),d.attr("src",d.attr("data-lazy")).removeClass("slick-loading").load(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad(),b.options.adaptiveHeight===!0&&b.setPosition()}).error(function(){d.removeAttr("data-lazy"),b.progressiveLazyLoad()}))},b.prototype.refresh=function(){var b=this,c=b.currentSlide;b.destroy(),a.extend(b,b.initials),b.init(),b.changeSlide({data:{message:"index",index:c}},!1)},b.prototype.reinit=function(){var b=this;b.$slides=b.$slideTrack.children(b.options.slide).addClass("slick-slide"),b.slideCount=b.$slides.length,b.currentSlide>=b.slideCount&&0!==b.currentSlide&&(b.currentSlide=b.currentSlide-b.options.slidesToScroll),b.slideCount<=b.options.slidesToShow&&(b.currentSlide=0),b.setProps(),b.setupInfinite(),b.buildArrows(),b.updateArrows(),b.initArrowEvents(),b.buildDots(),b.updateDots(),b.initDotEvents(),b.options.focusOnSelect===!0&&a(b.$slideTrack).children().on("click.slick",b.selectHandler),b.setSlideClasses(0),b.setPosition(),b.$slider.trigger("reInit",[b])},b.prototype.resize=function(){var b=this;a(window).width()!==b.windowWidth&&(clearTimeout(b.windowDelay),b.windowDelay=window.setTimeout(function(){b.windowWidth=a(window).width(),b.checkResponsive(),b.setPosition()},50))},b.prototype.removeSlide=b.prototype.slickRemove=function(a,b,c){var d=this;return"boolean"==typeof a?(b=a,a=b===!0?0:d.slideCount-1):a=b===!0?--a:a,d.slideCount<1||0>a||a>d.slideCount-1?!1:(d.unload(),c===!0?d.$slideTrack.children().remove():d.$slideTrack.children(this.options.slide).eq(a).remove(),d.$slides=d.$slideTrack.children(this.options.slide),d.$slideTrack.children(this.options.slide).detach(),d.$slideTrack.append(d.$slides),d.$slidesCache=d.$slides,d.reinit(),void 0)},b.prototype.setCSS=function(a){var d,e,b=this,c={};b.options.rtl===!0&&(a=-a),d="left"==b.positionProp?Math.ceil(a)+"px":"0px",e="top"==b.positionProp?Math.ceil(a)+"px":"0px",c[b.positionProp]=a,b.transformsEnabled===!1?b.$slideTrack.css(c):(c={},b.cssTransitions===!1?(c[b.animType]="translate("+d+", "+e+")",b.$slideTrack.css(c)):(c[b.animType]="translate3d("+d+", "+e+", 0px)",b.$slideTrack.css(c)))},b.prototype.setDimensions=function(){var a=this;a.options.vertical===!1?a.options.centerMode===!0&&a.$list.css({padding:"0px "+a.options.centerPadding}):(a.$list.height(a.$slides.first().outerHeight(!0)*a.options.slidesToShow),a.options.centerMode===!0&&a.$list.css({padding:a.options.centerPadding+" 0px"})),a.listWidth=a.$list.width(),a.listHeight=a.$list.height(),a.options.vertical===!1&&a.options.variableWidth===!1?(a.slideWidth=Math.ceil(a.listWidth/a.options.slidesToShow),a.$slideTrack.width(Math.ceil(a.slideWidth*a.$slideTrack.children(".slick-slide").length))):a.options.variableWidth===!0?a.$slideTrack.width(5e3*a.slideCount):(a.slideWidth=Math.ceil(a.listWidth),a.$slideTrack.height(Math.ceil(a.$slides.first().outerHeight(!0)*a.$slideTrack.children(".slick-slide").length)));var b=a.$slides.first().outerWidth(!0)-a.$slides.first().width();a.options.variableWidth===!1&&a.$slideTrack.children(".slick-slide").width(a.slideWidth-b)},b.prototype.setFade=function(){var c,b=this;b.$slides.each(function(d,e){c=-1*b.slideWidth*d,b.options.rtl===!0?a(e).css({position:"relative",right:c,top:0,zIndex:800,opacity:0}):a(e).css({position:"relative",left:c,top:0,zIndex:800,opacity:0})}),b.$slides.eq(b.currentSlide).css({zIndex:900,opacity:1})},b.prototype.setHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.css("height",b)}},b.prototype.setOption=b.prototype.slickSetOption=function(a,b,c){var d=this;d.options[a]=b,c===!0&&(d.unload(),d.reinit())},b.prototype.setPosition=function(){var a=this;a.setDimensions(),a.setHeight(),a.options.fade===!1?a.setCSS(a.getLeft(a.currentSlide)):a.setFade(),a.$slider.trigger("setPosition",[a])},b.prototype.setProps=function(){var a=this,b=document.body.style;a.positionProp=a.options.vertical===!0?"top":"left","top"===a.positionProp?a.$slider.addClass("slick-vertical"):a.$slider.removeClass("slick-vertical"),(void 0!==b.WebkitTransition||void 0!==b.MozTransition||void 0!==b.msTransition)&&a.options.useCSS===!0&&(a.cssTransitions=!0),void 0!==b.OTransform&&(a.animType="OTransform",a.transformType="-o-transform",a.transitionType="OTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.MozTransform&&(a.animType="MozTransform",a.transformType="-moz-transform",a.transitionType="MozTransition",void 0===b.perspectiveProperty&&void 0===b.MozPerspective&&(a.animType=!1)),void 0!==b.webkitTransform&&(a.animType="webkitTransform",a.transformType="-webkit-transform",a.transitionType="webkitTransition",void 0===b.perspectiveProperty&&void 0===b.webkitPerspective&&(a.animType=!1)),void 0!==b.msTransform&&(a.animType="msTransform",a.transformType="-ms-transform",a.transitionType="msTransition",void 0===b.msTransform&&(a.animType=!1)),void 0!==b.transform&&a.animType!==!1&&(a.animType="transform",a.transformType="transform",a.transitionType="transition"),a.transformsEnabled=null!==a.animType&&a.animType!==!1},b.prototype.setSlideClasses=function(a){var c,d,e,f,b=this;b.$slider.find(".slick-slide").removeClass("slick-active").attr("aria-hidden","true").removeClass("slick-center"),d=b.$slider.find(".slick-slide"),b.options.centerMode===!0?(c=Math.floor(b.options.slidesToShow/2),b.options.infinite===!0&&(a>=c&&a<=b.slideCount-1-c?b.$slides.slice(a-c,a+c+1).addClass("slick-active").attr("aria-hidden","false"):(e=b.options.slidesToShow+a,d.slice(e-c+1,e+c+2).addClass("slick-active").attr("aria-hidden","false")),0===a?d.eq(d.length-1-b.options.slidesToShow).addClass("slick-center"):a===b.slideCount-1&&d.eq(b.options.slidesToShow).addClass("slick-center")),b.$slides.eq(a).addClass("slick-center")):a>=0&&a<=b.slideCount-b.options.slidesToShow?b.$slides.slice(a,a+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):d.length<=b.options.slidesToShow?d.addClass("slick-active").attr("aria-hidden","false"):(f=b.slideCount%b.options.slidesToShow,e=b.options.infinite===!0?b.options.slidesToShow+a:a,b.options.slidesToShow==b.options.slidesToScroll&&b.slideCount-a<b.options.slidesToShow?d.slice(e-(b.options.slidesToShow-f),e+f).addClass("slick-active").attr("aria-hidden","false"):d.slice(e,e+b.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false")),"ondemand"===b.options.lazyLoad&&b.lazyLoad()},b.prototype.setupInfinite=function(){var c,d,e,b=this;if(b.options.fade===!0&&(b.options.centerMode=!1),b.options.infinite===!0&&b.options.fade===!1&&(d=null,b.slideCount>b.options.slidesToShow)){for(e=b.options.centerMode===!0?b.options.slidesToShow+1:b.options.slidesToShow,c=b.slideCount;c>b.slideCount-e;c-=1)d=c-1,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d-b.slideCount).prependTo(b.$slideTrack).addClass("slick-cloned");for(c=0;e>c;c+=1)d=c,a(b.$slides[d]).clone(!0).attr("id","").attr("data-slick-index",d+b.slideCount).appendTo(b.$slideTrack).addClass("slick-cloned");b.$slideTrack.find(".slick-cloned").find("[id]").each(function(){a(this).attr("id","")})}},b.prototype.setPaused=function(a){var b=this;b.options.autoplay===!0&&b.options.pauseOnHover===!0&&(b.paused=a,b.autoPlayClear())},b.prototype.selectHandler=function(b){var c=this,d=a(b.target).is(".slick-slide")?a(b.target):a(b.target).parents(".slick-slide"),e=parseInt(d.attr("data-slick-index"));return e||(e=0),c.slideCount<=c.options.slidesToShow?(c.$slider.find(".slick-slide").removeClass("slick-active").attr("aria-hidden","true"),c.$slides.eq(e).addClass("slick-active").attr("aria-hidden","false"),c.options.centerMode===!0&&(c.$slider.find(".slick-slide").removeClass("slick-center"),c.$slides.eq(e).addClass("slick-center")),c.asNavFor(e),void 0):(c.slideHandler(e),void 0)},b.prototype.slideHandler=function(a,b,c){var d,e,f,g,h=null,i=this;return b=b||!1,i.animating===!0&&i.options.waitForAnimate===!0||i.options.fade===!0&&i.currentSlide===a||i.slideCount<=i.options.slidesToShow?void 0:(b===!1&&i.asNavFor(a),d=a,h=i.getLeft(d),g=i.getLeft(i.currentSlide),i.currentLeft=null===i.swipeLeft?g:i.swipeLeft,i.options.infinite===!1&&i.options.centerMode===!1&&(0>a||a>i.getDotCount()*i.options.slidesToScroll)?(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d)),void 0):i.options.infinite===!1&&i.options.centerMode===!0&&(0>a||a>i.slideCount-i.options.slidesToScroll)?(i.options.fade===!1&&(d=i.currentSlide,c!==!0?i.animateSlide(g,function(){i.postSlide(d)}):i.postSlide(d)),void 0):(i.options.autoplay===!0&&clearInterval(i.autoPlayTimer),e=0>d?0!==i.slideCount%i.options.slidesToScroll?i.slideCount-i.slideCount%i.options.slidesToScroll:i.slideCount+d:d>=i.slideCount?0!==i.slideCount%i.options.slidesToScroll?0:d-i.slideCount:d,i.animating=!0,i.$slider.trigger("beforeChange",[i,i.currentSlide,e]),f=i.currentSlide,i.currentSlide=e,i.setSlideClasses(i.currentSlide),i.updateDots(),i.updateArrows(),i.options.fade===!0?(c!==!0?i.fadeSlide(e,function(){i.postSlide(e)}):i.postSlide(e),i.animateHeight(),void 0):(c!==!0?i.animateSlide(h,function(){i.postSlide(e)}):i.postSlide(e),void 0)))},b.prototype.startLoad=function(){var a=this;a.options.arrows===!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.hide(),a.$nextArrow.hide()),a.options.dots===!0&&a.slideCount>a.options.slidesToShow&&a.$dots.hide(),a.$slider.addClass("slick-loading")},b.prototype.swipeDirection=function(){var a,b,c,d,e=this;return a=e.touchObject.startX-e.touchObject.curX,b=e.touchObject.startY-e.touchObject.curY,c=Math.atan2(b,a),d=Math.round(180*c/Math.PI),0>d&&(d=360-Math.abs(d)),45>=d&&d>=0?e.options.rtl===!1?"left":"right":360>=d&&d>=315?e.options.rtl===!1?"left":"right":d>=135&&225>=d?e.options.rtl===!1?"right":"left":e.options.verticalSwiping===!0?d>=35&&135>=d?"left":"right":"vertical"},b.prototype.swipeEnd=function(){var c,b=this;if(b.dragging=!1,b.shouldClick=b.touchObject.swipeLength>10?!1:!0,void 0===b.touchObject.curX)return!1;if(b.touchObject.edgeHit===!0&&b.$slider.trigger("edge",[b,b.swipeDirection()]),b.touchObject.swipeLength>=b.touchObject.minSwipe)switch(b.swipeDirection()){case"left":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide+b.getSlideCount()):b.currentSlide+b.getSlideCount(),b.slideHandler(c),b.currentDirection=0,b.touchObject={},b.$slider.trigger("swipe",[b,"left"]);break;case"right":c=b.options.swipeToSlide?b.checkNavigable(b.currentSlide-b.getSlideCount()):b.currentSlide-b.getSlideCount(),b.slideHandler(c),b.currentDirection=1,b.touchObject={},b.$slider.trigger("swipe",[b,"right"])}else b.touchObject.startX!==b.touchObject.curX&&(b.slideHandler(b.currentSlide),b.touchObject={})},b.prototype.swipeHandler=function(a){var b=this;
if(!(b.options.swipe===!1||"ontouchend"in document&&b.options.swipe===!1||b.options.draggable===!1&&-1!==a.type.indexOf("mouse")))switch(b.touchObject.fingerCount=a.originalEvent&&void 0!==a.originalEvent.touches?a.originalEvent.touches.length:1,b.touchObject.minSwipe=b.listWidth/b.options.touchThreshold,b.options.verticalSwiping===!0&&(b.touchObject.minSwipe=b.listHeight/b.options.touchThreshold),a.data.action){case"start":b.swipeStart(a);break;case"move":b.swipeMove(a);break;case"end":b.swipeEnd(a)}},b.prototype.swipeMove=function(a){var d,e,f,g,h,b=this;return h=void 0!==a.originalEvent?a.originalEvent.touches:null,!b.dragging||h&&1!==h.length?!1:(d=b.getLeft(b.currentSlide),b.touchObject.curX=void 0!==h?h[0].pageX:a.clientX,b.touchObject.curY=void 0!==h?h[0].pageY:a.clientY,b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curX-b.touchObject.startX,2))),b.options.verticalSwiping===!0&&(b.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(b.touchObject.curY-b.touchObject.startY,2)))),e=b.swipeDirection(),"vertical"!==e?(void 0!==a.originalEvent&&b.touchObject.swipeLength>4&&a.preventDefault(),g=(b.options.rtl===!1?1:-1)*(b.touchObject.curX>b.touchObject.startX?1:-1),b.options.verticalSwiping===!0&&(g=b.touchObject.curY>b.touchObject.startY?1:-1),f=b.touchObject.swipeLength,b.touchObject.edgeHit=!1,b.options.infinite===!1&&(0===b.currentSlide&&"right"===e||b.currentSlide>=b.getDotCount()&&"left"===e)&&(f=b.touchObject.swipeLength*b.options.edgeFriction,b.touchObject.edgeHit=!0),b.swipeLeft=b.options.vertical===!1?d+f*g:d+f*(b.$list.height()/b.listWidth)*g,b.options.verticalSwiping===!0&&(b.swipeLeft=d+f*g),b.options.fade===!0||b.options.touchMove===!1?!1:b.animating===!0?(b.swipeLeft=null,!1):(b.setCSS(b.swipeLeft),void 0)):void 0)},b.prototype.swipeStart=function(a){var c,b=this;return 1!==b.touchObject.fingerCount||b.slideCount<=b.options.slidesToShow?(b.touchObject={},!1):(void 0!==a.originalEvent&&void 0!==a.originalEvent.touches&&(c=a.originalEvent.touches[0]),b.touchObject.startX=b.touchObject.curX=void 0!==c?c.pageX:a.clientX,b.touchObject.startY=b.touchObject.curY=void 0!==c?c.pageY:a.clientY,b.dragging=!0,void 0)},b.prototype.unfilterSlides=b.prototype.slickUnfilter=function(){var a=this;null!==a.$slidesCache&&(a.unload(),a.$slideTrack.children(this.options.slide).detach(),a.$slidesCache.appendTo(a.$slideTrack),a.reinit())},b.prototype.unload=function(){var b=this;a(".slick-cloned",b.$slider).remove(),b.$dots&&b.$dots.remove(),b.$prevArrow&&"object"!=typeof b.options.prevArrow&&b.$prevArrow.remove(),b.$nextArrow&&"object"!=typeof b.options.nextArrow&&b.$nextArrow.remove(),b.$slides.removeClass("slick-slide slick-active slick-visible").attr("aria-hidden","true").css("width","")},b.prototype.unslick=function(){var a=this;a.destroy()},b.prototype.updateArrows=function(){var b,a=this;b=Math.floor(a.options.slidesToShow/2),a.options.arrows===!0&&a.options.infinite!==!0&&a.slideCount>a.options.slidesToShow&&(a.$prevArrow.removeClass("slick-disabled"),a.$nextArrow.removeClass("slick-disabled"),0===a.currentSlide?(a.$prevArrow.addClass("slick-disabled"),a.$nextArrow.removeClass("slick-disabled")):a.currentSlide>=a.slideCount-a.options.slidesToShow&&a.options.centerMode===!1?(a.$nextArrow.addClass("slick-disabled"),a.$prevArrow.removeClass("slick-disabled")):a.currentSlide>=a.slideCount-1&&a.options.centerMode===!0&&(a.$nextArrow.addClass("slick-disabled"),a.$prevArrow.removeClass("slick-disabled")))},b.prototype.updateDots=function(){var a=this;null!==a.$dots&&(a.$dots.find("li").removeClass("slick-active").attr("aria-hidden","true"),a.$dots.find("li").eq(Math.floor(a.currentSlide/a.options.slidesToScroll)).addClass("slick-active").attr("aria-hidden","false"))},b.prototype.visibility=function(){var a=this;document[a.hidden]?(a.paused=!0,a.autoPlayClear()):(a.paused=!1,a.autoPlay())},a.fn.slick=function(){var g,a=this,c=arguments[0],d=Array.prototype.slice.call(arguments,1),e=a.length,f=0;for(f;e>f;f++)if("object"==typeof c||"undefined"==typeof c?a[f].slick=new b(a[f],c):g=a[f].slick[c].apply(a[f].slick,d),"undefined"!=typeof g)return g;return a}});;
$(document).ready(function () {

    $.ajaxSetup({ cache: false });
    window.delayedHide = 0;
    var numItemsAddedToBasket = 0;
    var subsRecipeBoxProductIds = null;
    let MAX_QUANTITY_IN_BASKET = 30;

    /* -- no longer initialise PRB Ids
        $.getJSON('/RecipeBoxThemesServices/GetSubsRecipeBoxProductIds', function (result) {
        subsRecipeBoxProductIds = result;
    });*/

    // Used by the "add" and "+" buttons on the shop grid and complementary products panel
    $(document).on('click', '.add-to-basket-controls .cta-button:not(.view), .add-to-basket-controls .plus:not(.disabled), .complementary-products .product-item .cta-button:not(.sold-out), .complementary-products .product-item .plus, .recipe-ingredients .add.cta-button, .recipe-ingredients .plus', function () {
        var btn = $(this);
        var data = {};
        var remove = false;
        var customerBox = null;
        btn.closest('.product-infos').removeClass('empty');

        var productItem = btn.closest('.product-item, .box-cell, .autocomplete-product');
        var basketCount = btn.parent().find('.textbox-quantity').text();
        var isComplementaryProducts = ($(productItem).data('is-complementary-products') == "True");
        let isStartMyShopPage = document.getElementById('page-start-my-shop');
        var offerId = btn.closest('.category-page.offer').data("offer-id");
        var offerCategoryId = btn.closest('.product-list.offer').data("offer-category-id");
        var originalBasketCount = null;
        var isThisWeeksBoxesPage = (btn.closest('#box-grid .customer-box').length > 0);

        data.productId = $(productItem).data('id');
        data.productName = $(productItem).data('name');
        data.quantity = 1;
        data.basketSourceType = $(productItem).data('basket-source-type');

        if ($(productItem).attr('data-delivery-date'))
            data.deliveryDate = $(productItem).data('delivery-date');

        if ($(productItem).data('offer-frequency-id') != '')
            data.frequency = $(productItem).data('offer-frequency-id')

        else if (!isComplementaryProducts && typeof ShopList != 'undefined') {
            data.filterList = JSON.stringify(ShopList.getFilters());
            data.searchText = $(productItem).data('search-term');
        }
        else {
            if ($(productItem).data('mandatory-regular-frequency') == "False" && !isStartMyShopPage)
                data.frequency = 0;
        }

        data.basketSourceEntityId = $(productItem).data('basket-source-entity-id');
        data.GA4BasketItemSource = general.GetProductLabel(productItem);

        originalBasketCount = $('#BasketCount').text();

        // update num items added when click on plus button
        var categoryId = $(this).closest('#product-list').attr('data-offer-category-id');
        //-------------------------------------------------

        $.getJSON("/BasketServices/AddItemToBasket", data, function (result) {

            if (!isThisWeeksBoxesPage) {
                btn.parent().parent().find('.textbox-quantity').text(result.Result.Quantity);
                btn.parent().parent().find('.basket-quantity').html("<a href='/basket'>" + result.Result.Quantity + " in basket</a>");
            }
            else {
                customerBox = btn.closest('#box-grid .customer-box[data-product-id=' + data.productId + '] ');
                customerBox.find('.add-to-basket-controls .textbox-quantity').text(result.Result.Quantity);
                customerBox.find('.add-to-basket-controls .basket-quantity').html("<a href='/basket'>" + result.Result.Quantity + " in basket</a>");
                customerBox.find('.product-infos').removeClass('empty');

            }

            if (subsRecipeBoxProductIds != null && subsRecipeBoxProductIds.indexOf(parseInt(data.productId)) >= 0 && result.Result.Quantity >= 1)
                btn.parent().parent().find(".add-sign.plus").addClass("disabled");

            // Update the basket totals in the masthead
            if (typeof SearchAutocomplete !== 'undefined')
                SearchAutocomplete.GetBasketItems();

            if (originalBasketCount != null &&
                originalBasketCount.length > 0 &&
                !remove) {

                if ($('.bundle-widget').length == 0 || $('.bundle-widget').css('display') == 'none') {
                    general.updateBasketSummary(data.quantity, remove, data.productName, false, "");
                } else {
                    general.updateBasketSummary(data.quantity, remove, data.productName, false, "", true);
                }

            }

            toggleInterrupterCheckoutButton();

            updateOfferControl(offerId, offerCategoryId, data.quantity, remove, data.productName);

            trackBasketClick(productItem, data.quantity, "add to basket");

            toggleIsAnonymousBrowsingRestricted(data.basketSourceType);

            updateDynamicYieldCart();

        });
    });

    // Used by "-" button on the shop grid and complementary products panel
    $(document).on('click', '.add-to-basket-controls .minus, .recipe-ingredients .product-item .minus, .complementary-products .product-item .minus', function () {
        var btn = $(this);
        var data = {};
        var remove = true;
        var productItem = btn.closest('.product-item');

        var isComplementaryProducts = (btn.closest('.complementary-product-item').length > 0);
        var productItem = ((!isComplementaryProducts) ? btn.closest('.product-item, .box-cell, .autocomplete-product') : btn.closest('.complementary-product-item'));
        var offerId = btn.closest('.category-page.offer').data("offer-id");
        var offerCategoryId = btn.closest('.product-list.offer').data("offer-category-id");
        var isThisWeeksBoxesPage = (btn.closest('#box-grid .customer-box').length > 0);
        var customerBox = null;

        data.productId = $(productItem).data('id');
        data.quantity = 1;
        data.productName = $(productItem).data('name');
        data.basketSourceType = $(productItem).data('basket-source-type');

        // update num items added when click on minus button
        var categoryId = $(this).closest('#product-list').attr('data-offer-category-id');
        //-------------------------------------------------

        $.getJSON("/BasketServices/RemoveItemFromBasket", data, function (result) {

            if (!isThisWeeksBoxesPage) {

                if (result.BasketItemRemovalResult.Quantity <= 0) {
                    btn.closest('.product-infos').addClass('empty');

                    updateDynamicYieldCart();
                }
                else {
                    btn.parent().parent().find('.basket-quantity').text(result.BasketItemRemovalResult.Quantity + " in basket");
                    btn.parent().find('.textbox-quantity').text(result.BasketItemRemovalResult.Quantity);
                }
            }
            else {

                customerBox = btn.closest('#box-grid .customer-box[data-product-id=' + data.productId + '] ');

                if (result.BasketItemRemovalResult.Quantity <= 0) {
                    customerBox.find('.product-infos').addClass('empty');

                    updateDynamicYieldCart();
                }
                else {
                    customerBox.find('.add-to-basket-controls .textbox-quantity').text(result.BasketItemRemovalResult.Quantity);
                    customerBox.find('.add-to-basket-controls .basket-quantity').text(result.BasketItemRemovalResult.Quantity + " in basket");
                }

            }

            // Update the basket totals in the masthead 


            if (typeof SearchAutocomplete !== 'undefined')
                SearchAutocomplete.GetBasketItems();

            /*if ($('.bundle-widget').css('display') == 'block' && $('.bundle-widget .title').hasClass('hide')) {
               updateBasketSummary(data.quantity, remove, data.productName, false, "", true);
            } else {*/
            if ($('.bundle-widget').length == 0 || $('.bundle-widget').css('display') == 'none') {
                general.updateBasketSummary(data.quantity, remove, data.productName, false, "");
            } else {
                general.updateBasketSummary(data.quantity, remove, data.productName, false, "", true);
            }
            //}

            toggleInterrupterCheckoutButton();

            updateOfferControl(offerId, offerCategoryId, data.quantity, remove, data.productName);

            trackBasketClick(productItem, data.quantity, "remove from basket");
        });
    });

    // Check whether an item has been added to the basket from the offer page.  If so, update the offer control if necessary
    function updateOfferControl(offerId, offerCategoryId, quantity, remove, productName) {

        if (offerId != undefined) {

            $.ajax({
                url: "/BasketServices/GetCustomerOfferStatus",
                type: 'POST',
                cache: false,
                dataType: "json",
                data: {
                    offerId: parseInt(offerId),
                    offerCategoryId: parseInt(offerCategoryId)
                },
                success: function (result) {
                    var numOffersCompleted = parseInt(result.NumOffersCompleted);
                    if (numOffersCompleted > 0) {

                        $(".bundle-widget .title").removeClass("hide").html(numOffersCompleted + " Bundle" + ((numOffersCompleted > 1) ? "s" : "") + " complete");

                        if ($('.bundle-widget').css('display') == 'block') {
                            general.updateBasketSummary(quantity, remove, productName, false, "", true, true);
                        } else {
                            general.updateBasketSummary(quantity, remove, productName, false, "");
                        }

                        $(".bundle-widget .cta-button.checkout").removeClass("visible").addClass("visible");

                        $(".bundle-widget .cta-button.checkout").attr('href', '/basket');

                    } else {
                        $(".bundle-widget .title").addClass("hide");
                        $(".bundle-widget .cta-button.checkout").removeClass("visible");
                        $(".bundle-widget .cta-button.checkout").attr('href', 'javscript: void(0)');
                        if ($('.bundle-widget').css('display') == 'block') {
                            general.updateBasketSummary(quantity, remove, productName, false, "", true);
                            if (remove == true) {
                                $('.site-content').removeClass('justadded');
                            }
                        } else {
                            general.updateBasketSummary(quantity, remove, productName, false, "");
                        }
                    }

                    var offerCategoryStatus = result.OfferCategoryStatus;

                    if (offerCategoryStatus != null) {
                        $(".bundle-widget .box[data-offer-category-id=" + offerCategoryId + "]").find('.numItemsAdded').html(offerCategoryStatus.NumSelected);

                        if (offerCategoryStatus.CategoryCompleted)
                            $(".bundle-widget .box[data-offer-category-id=" + offerCategoryId + "]").removeClass("selected").addClass("selected");
                        else
                            $(".bundle-widget .box[data-offer-category-id=" + offerCategoryId + "]").removeClass("selected");
                    }
                    else {
                        $(".bundle-widget .box[data-offer-category-id=" + offerCategoryId + "] span span").html("");
                        $(".bundle-widget .box[data-offer-category-id=" + offerCategoryId + "]").removeClass("selected");
                    }
                }
            });
        }
    }

    // Used by the "add" button on the product details page
    $('.standard-product .addtobasket .cta-button').on('click', function () {

        var btn = $(this);
        var data = {};
        var remove = false;
        var productItem = btn.closest('.addtobasket');
        var originalBasketCount = null;

        btn.parent().parent().addClass('not-empty');

        data.productId = productItem.data('id');
        data.productName = productItem.data('name');
        data.quantity = btn.parent().parent().find('.textbox-quantity').html();
        data.basketSourceType = btn.closest('.addtobasket').data('basket-source-type');
        data.frequency = parseInt($('#basket_frequency option:selected').val());

        data.GA4BasketItemSource = general.GetProductLabel(productItem);

        originalBasketCount = $('#BasketCount').text();

        $.getJSON("/BasketServices/AddItemToBasket", data, function (result) {
            btn.parent().parent().find('.textbox-quantity').text(result.Result.Quantity);
            btn.parent().find('.basket-quantity').text(result.Result.Quantity + " in basket");
            $(".pluggin-dropdown").easyDropDown('disable');

            nbBasketStyleHandler(result.Result.Quantity, $(this), false);

            // Update the basket totals in the masthead 
            //if ($('.bundle-widget').css('display') == 'block') {
            //updateBasketSummary(data.quantity, remove, data.productName, false, result.FrequencyDesc, true);
            //} else {
            if (originalBasketCount != null &&
                originalBasketCount.length > 0 &&
                !remove) {
                general.updateBasketSummary(data.quantity, remove, data.productName, false, result.FrequencyDesc);
            }
            //}

            trackBasketClick($('#product-data'), data.quantity, "add to basket");

            toggleIsAnonymousBrowsingRestricted(data.basketSourceType);

            updateDynamicYieldCart();

        });
    });

    // Used by the "+" button on the product details page
    $(document).on('click', '.standard-product .add-to-basket .plus', function () {

        var btn = $(this);
        var data = {};
        var parent = btn.parent().parent();
        var remove = false;
        var productItem = btn.closest('.addtobasket');
        var originalBasketCount = null;

        if ($(parent).hasClass('not-empty')) {

            data.productId = productItem.data('id');
            data.productName = productItem.data('name');
            data.quantity = 1;
            data.basketSourceType = productItem.data('basket-source-type');

            originalBasketCount = $('#BasketCount').text();

            $.getJSON("/BasketServices/AddItemToBasket", data, function (result) {
                btn.parent().find('.textbox-quantity').text(result.Result.Quantity);
                btn.parent().parent().find('.basket-quantity').text(result.Result.Quantity + " in basket");
                nbBasketStyleHandler(result.Result.Quantity, btn, false);

                // Update the basket totals in the masthead 
                if (originalBasketCount != null && originalBasketCount.length > 0 && !remove) {
                    general.updateBasketSummary(data.quantity, remove, data.productName, false, result.FrequencyDesc);
                }

                trackBasketClick($('#product-data'), data.quantity, "add to basket");

            });
        }
        else {
            var btn2 = btn.prev('.textbox-quantity');
            var quantity = parseInt(btn2.html()) + 1;
            if (quantity <= MAX_QUANTITY_IN_BASKET) {
                btn2.html(quantity);
                nbBasketStyleHandler(quantity, btn, false);
            }
        }
    });

    // Used by the "-" button on the product details page
    $(document).on('click', '.standard-product .add-to-basket .minus', function () {
        var btn = $(this);
        var data = {};
        var remove = true;
        var productItem = btn.closest('.addtobasket');


        var parent = btn.parent().parent();
        if ($(parent).hasClass('not-empty')) {
            data.productId = productItem.data('id');
            data.productName = productItem.data('name');
            data.quantity = 1
            data.basketSourceType = productItem.data('basket-source-type');

            $.getJSON("/BasketServices/RemoveItemFromBasket", data, function (result) {
                if (result.BasketItemRemovalResult.Quantity > 0) {
                    btn.parent().find('.textbox-quantity').text(result.BasketItemRemovalResult.Quantity);
                    btn.parent().parent().find('.basket-quantity').text(result.BasketItemRemovalResult.Quantity + " in basket");

                    nbBasketStyleHandler(result.BasketItemRemovalResult.Quantity, btn, true);

                    general.updateBasketSummary(data.quantity, remove, data.productName, false, result.FrequencyDesc);
                }
                else {
                    productItem.removeClass('not-empty');
                    btn.parent().find('.textbox-quantity').text("1");
                    $(".pluggin-dropdown").easyDropDown('enable');
                    $('.pluggin-dropdown').easyDropDown('select', parseInt(productItem.data('default-frequency')));
                    nbBasketStyleHandler(1, btn, false);

                    updateDynamicYieldCart();
                }

                // Update the basket totals in the masthead 
                trackBasketClick($('#product-data'), data.quantity, "remove from basket");
                general.updateBasketSummary(data.quantity, remove, data.productName, false, result.FrequencyDesc);

            });
        }
        else {
            var btn2 = btn.next('.textbox-quantity');
            var quantity = parseInt(btn2.html()) - 1;
            if (quantity > 0) {
                if (quantity <= MAX_QUANTITY_IN_BASKET) {
                    btn2.html(quantity);
                    nbBasketStyleHandler(quantity, btn, false);
                }
            }
        }

    });

    // Used on the recipe details page to add multiple ingredients (key, complementary and cupboard ingredients) 
    // to the shopping basket
    $('body').on('click', 'div.recipe-ingredients .cta-button.add-all', function () {
        var ingredientsToAddToBasket = $(this).closest("div.recipe-ingredients");
        var recipeIngredientsList = ingredientsToAddToBasket.find('#product-list .product-item .cta-button:not(#product-list .product-item .cta-button.hide)');

        if (recipeIngredientsList.length > 0) {
            var deferreds = addIngredientsToBasket(recipeIngredientsList);

            $.when.apply($, deferreds).then(function () {
                general.updateBasketSummary(numItemsAddedToBasket, false, "", true, "");
            });
        }
    });


    // Used on the recipe details page to add all ingredients to the basket
    $('body').on('click', '.cta-button.add-all-ingredients', function () {
        var ingredientsToAddToBasket = $('.all-recipe-ingredients').find("div.recipe-ingredients");
        var recipeIngredientsList = ingredientsToAddToBasket.find('#product-list .product-item .cta-button:not(#product-list .product-item .cta-button.hide)');

        if (recipeIngredientsList.length > 0) {
            var deferreds = addIngredientsToBasket(recipeIngredientsList);

            $.when.apply($, deferreds).then(function () {
                general.updateBasketSummary(numItemsAddedToBasket, false, "", true, "");
            });
        }
    });


    function addIngredientsToBasket(recipeIngredientsList) {
        var deferreds = [];
        var data = {};
        var pIdsAndFreqsDict = {};
        var productId = null;
        var frequency = null;
        var productItem = null;
        var basketSourceEntityId = null;
        numItemsAddedToBasket = 0;

        recipeIngredientsList.each(function () {
            var btn = $(this);

            btn.closest('.product-infos').removeClass('empty');
            productItem = btn.closest('.product-item');
            productId = $(productItem).data('id');

            if ($(productItem).data('mandatory-regular-frequency') == "False")
                frequency = 0;
            else
                frequency = 1;

            trackBasketClick(productItem, data.quantity, "add to basket");

            pIdsAndFreqsDict[productId] = frequency;
        });

        data.basketSourceType = $(productItem).data('basket-source-type');
        data.basketSourceEntityId = $(productItem).data('basket-source-entity-id');

        data.pIdsAndFreqs = JSON.stringify(pIdsAndFreqsDict);
        deferreds.push(
            $.getJSON("/BasketServices/AddItemsToBasket", data, function (result) {

                $(result).each(function () {
                    var res = $(this);
                    var prodId = res.prop("ProductId");
                    var prodItems = $('.all-recipe-ingredients li.product-item[data-id=' + prodId + ']');

                    $(prodItems).each(function () {
                        $(this).find('.textbox-quantity').text(res.prop("Result").Quantity);
                        $(this).find('.basket-quantity').text(res.prop("Result").Quantity + " in basket");
                    });

                    numItemsAddedToBasket++;
                });

                toggleIsAnonymousBrowsingRestricted(data.basketSourceType);
                updateDynamicYieldCart();
            })
        );

        return deferreds;
    }


    toggleInterrupterCheckoutButton();
});
var productName;
////---------------
//// WEBFORM pages
////---------------


function triggerUpadteMAsthead(remove) {
    general.updateBasketSummary(1, remove, productName, true, "");
}
function nbBasketStyleHandler(val, elem, notEmptyBasketExeption) {
    let MAX_QUANTITY_IN_BASKET = 30;

    if (val === 1 && !notEmptyBasketExeption) {
        elem.parent().removeClass('minus-active');
    }
    else {
        elem.parent().addClass('minus-active');
    }
    if (val === MAX_QUANTITY_IN_BASKET) {
        elem.parent().removeClass('plus-active');
    }
    else {
        elem.parent().addClass('plus-active');
    }

}

function toggleInterrupterCheckoutButton() {

    if ($('.interrupter.sli:visible').length) {
        $('#confirm-button').toggle($('.interrupter .icon-basket.basket-quantity:visible').length > 0);
    }
}

function toggleIsAnonymousBrowsingRestricted(basketSourceType) {

    let data = {};
    data.basketSourceType = basketSourceType;

    $.getJSON("/Services/IsAnonymousBrowsingRestricted", data, function (result) {

        if (result != null && result == true)
            return window.location.href = "/account/login";
    });
}

//-------------------------------------------------------------------------------
// Method      : updateDynamicYieldCart
// Description : Updates the Dynamic Yield DataLayer Cart Object
//-------------------------------------------------------------------------------
async function updateDynamicYieldCart() {
    const payload = "isAddToBasketJourney=true";
    const url = '/Services/UpdateDynamicYieldCart';

    try {
        const response = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'RequestVerificationToken': tokenHeaderValue
            },
            body: payload
        });

        if (response.ok) {

            const result = await response.json();

            if (result) {
                let dynamicYieldCart = result.Cart;

                // update DY Cart
                await logDynamicYieldCartUpdate(dynamicYieldCart);
            }
        }

    } catch (error) {
        console.error('An unexpected error occurred while trying to update the Dynamic Yield Cart. Please try again later.');
    }
}

//-------------------------------------------------------------------------------
// Method      : logDynamicYieldCartUpdate
// Description : Updates the Dynamic Yield DataLayer Cart Object
//-------------------------------------------------------------------------------
async function logDynamicYieldCartUpdate(cart) {
    window.dataLayer = window.dataLayer || [];
    window.dataLayer.push({
        'eEcomm': true,
        'event': "DynamicYieldCart",
        'DynamicYieldCart': cart
    });
};
function trackBasketClick(product, qty, category) {

    var propName = category.split(' ')[0];
    var label = general.GetProductLabel(product);

    var ec = {
        "event": "ga_event",
        "eEcomm": "true",
        "ga_event": {
            "category": category,
            "action": product.data("name"),
            "label": label,
            "value": 0,
            "nonInteraction": "false"
        },
        "ecommerce": {
            "currencyCode": "GBP",
            "impressions": ((typeof (window.px_impression_tracking) !== "undefined") && (window.px_impression_tracking["pending_impressions"]["products"].length > 0)) ? window.px_impression_tracking["pending_impressions"]["products"] : undefined,
            "promoView": {
                "promotions": ((typeof (window.px_impression_tracking) !== "undefined") && (window.px_impression_tracking["pending_impressions"]["banners"].length > 0)) ? window.px_impression_tracking["pending_impressions"]["banners"] : undefined
            }
        }
    };

    ec.ecommerce[propName] = {
        "actionField": {
            "list": label
        },
        "products": [{
            "id": product.data("id").toString(),
            "name": product.data("name"),
            "price": product.data("price").toString(),
            "brand": product.data("brand") || undefined,
            "category": product.data("category-names") || undefined,
            "variant": $("#basket_frequency option:selected").text() || undefined,
            "quantity": parseFloat(qty),
            "dimension15": product.data("icons") || undefined,
            "dimension16": product.data("availability")
        }]
    };

    window.dataLayer.push(ec);

    if ((typeof (window.px_impression_tracking) !== "undefined") && (typeof (window.px_impression_tracking["pending_impressions"]) !== "undefined")) {
        window.px_impression_tracking["pending_impressions"]["products"] = [];
        window.px_impression_tracking["pending_impressions"]["banners"] = [];
    }

    if (product.attr('data-click-url') && typeof product.attr('data-click-url') !== 'undefined')
        $.ajax({
            url: product.data('click-url'),
            dataType: 'jsonp'
        });

};
///// SETTINGS: /////

window.px_impression_tracking = {
    "delay": 2000, // Delay after user stops scrolling to send off the visible impressions
    "batch_size": 4, // Threshold over which batches of impressions will be sent (to reduce hit volumes). A value of 1 means sending as soon as they are revealed
    "accept_partially_visible": true, // Determines whether or not the entire selector must be visible or just a part of it
    "product_data": [], // Populated via code in next section
    "banner_data": [], // Populated via code in next section
    "pending_impressions": { // Used to store impressions to send until batch threshold is reached
        "banners": [], // Populated via code in next section
        "products": [] // Populated via code in next section
    },
    "sent_selectors": undefined, // Used to store sent impressions to prevent re-sending
    "timer": undefined // Used to store current timeout delay when scrolling
}

function populateAllImages() {
    // Loop through your array of all products on the given page and add in the dynamic fields & selector which relates to that product on the page:
    // Should even include details of products which are initially hidden on the page, as the visibility check will handle when to send impression data
    var array_of_products = $('li.product-item, .personalised-recipe-box').toArray();
    for (var i = 0; i < array_of_products.length; i++) {
        // Safe-degradation check in case px_impression_tracking object doesn't exist:
        if ((typeof (window.px_impression_tracking) !== "undefined") && (typeof (window.px_impression_tracking["product_data"]) !== "undefined")) {
            var product = $(array_of_products[i]);
            var list = general.GetProductLabel(product);
            window.px_impression_tracking["product_data"].push({
                "selector": $('li.product-item, .personalised-recipe-box').eq(i), // This is an example for PLPs. This may work for your implementation, but otherwise replace it with the product's selector
                "data": {
                    "id": product.data("id").toString(),
                    "name": product.data("name"),
                    "price": product.data("price").toString(),
                    "brand": product.data("brand"),
                    "category": product.data("category-names"),
                    "variant": undefined,
                    "position": i,
                    "list": list,
                    "dimension15": product.data("icons") || undefined,
                    "dimension16": product.data("availability")
                }
            });
        }
    }
}


function populateAllBanners() {
    // Loop through all of your banners on the given page and add in the dynamic fields & selector which relates to that product on the page:
    // Should even include details of banners which are initially hidden on the page, as the visibility check will handle when to send impression data
    var array_of_banners = deduplicateBanners($('.push-banner').toArray()); // If such an array exists, otherwise just push banner information in individually instead of looping:
    var pageType = general.GetPageType();
    for (var i = 0; i < array_of_banners.length; i++) {
        // Safe-degradation check in case px_impression_tracking object doesn't exist:
        if ((typeof (window.px_impression_tracking) !== "undefined") && (typeof (window.px_impression_tracking["banner_data"]) !== "undefined")) {
            var banner = $(array_of_banners[i]);
            var position = [];
            if (pageType != undefined)
                position.push(pageType);
            position.push(banner.data("label"));
            images = general.getBannerImages(banner);
            image = images.length ? images.join(" | ") : undefined;
            window.px_impression_tracking["banner_data"].push({
                "selector": $('.push-banner').eq(i),
                "data": {
                    "id": banner.data("label"),
                    "name": banner.data("action"),
                    "creative": image,
                    "position": position.join(" | ")
                }
            });
        }
    }
}

function deduplicateBanners(banners) {
    var usedObjects = {};

    for (var i = banners.length - 1; i >= 0; i--) {
        var banner = $(banners[i]);
        var tempBanner = { id: banner.data("label"), name: banner.data("action") }
        var so = JSON.stringify(tempBanner);

        if (usedObjects[so]) {
            banners.splice(i, 1);

        } else {
            usedObjects[so] = true;
        }
    }
    return banners;
}

///// VISIBILITY FUNCTION AND PLUGIN: /////

// Enhanced Ecommerce Impression Visibility Check:
// This will be called by this script whenever the user scrolls
// Pass in a parameter value of true to send the impressions off with a new hit (e.g. with scroll tracking) or false to send off with an existing hit (i.e. on page load)
// Please also call this function using checkVisibleImpressions(false) BEFORE the 'dataLoaded' event, but AFTER the product impression and promo impression arrays have been populated and AFTER any other page load dataLayer pushes (such as checkout steps)
function checkVisibleImpressions(new_hit) {
    try {
        if ((typeof (window.px_impression_tracking) !== "undefined") && ((window.px_impression_tracking["product_data"].length > 0) || (window.px_impression_tracking["banner_data"].length > 0))) {
            window.px_impression_tracking["sent_selectors"] = window.px_impression_tracking["sent_selectors"] || $();
            // Loop through product selectors to check which ones are visible and haven't already been sent as impressions:
            var px_new_product_impressions = [];
            for (var i = 0; i < window.px_impression_tracking["product_data"].length; i++) {
                var px_impression_selector = window.px_impression_tracking["product_data"][i]["selector"];
                // Feel free to replace the second clause (i.e. after &&) with your own visibility check on px_impression_selector (e.g. selector is 50% visible)
                if (window.px_impression_tracking["sent_selectors"].index(px_impression_selector) === -1
                        && ((px_impression_selector.visible(window.px_impression_tracking["accept_partially_visible"]) && !px_impression_selector.hasClass("slick-slide"))
                        || px_impression_selector.hasClass("slick-active"))) {
                    window.px_impression_tracking["sent_selectors"] = window.px_impression_tracking["sent_selectors"].add(px_impression_selector);
                    window.px_impression_tracking["pending_impressions"]["products"].push(window.px_impression_tracking["product_data"][i]["data"]);
                }
            }
            // Loop through banner selectors to check which ones are visible and haven't already been sent as impressions:
            var px_new_promo_impressions = [];
            for (var i = 0; i < window.px_impression_tracking["banner_data"].length; i++) {
                var px_impression_selector = window.px_impression_tracking["banner_data"][i]["selector"];
                // Feel free to replace the second clause (i.e. after &&) with your own visibility check on px_impression_selector (e.g. selector is 50% visible)
                if (window.px_impression_tracking["sent_selectors"].index(px_impression_selector) === -1
                        && ((px_impression_selector.visible(window.px_impression_tracking["accept_partially_visible"]) && !px_impression_selector.closest(".slick-slide").length > 0)
                        || px_impression_selector.closest(".slick-active").length > 0)) {
                    window.px_impression_tracking["sent_selectors"] = window.px_impression_tracking["sent_selectors"].add(px_impression_selector);
                    window.px_impression_tracking["pending_impressions"]["banners"].push(window.px_impression_tracking["banner_data"][i]["data"]);
                }
            }
            // Only send off the impressions if the number of new ones to send is greater than or equal to the specified batch size threshold:
            if ((window.px_impression_tracking["pending_impressions"]["banners"].length + window.px_impression_tracking["pending_impressions"]["products"].length) >= window.px_impression_tracking["batch_size"]) {
                if ((window.px_impression_tracking["pending_impressions"]["banners"].length > 0) || (window.px_impression_tracking["pending_impressions"]["products"].length > 0)) {
                    var enhanced_ecommerce_push;
                    switch (new_hit) {
                        case true:
                            // If a new hit is to be created, build everything from scratch:
                            enhanced_ecommerce_push = {
                                "event": "ga_event",
                                "eEcomm": "true",
                                "ga_event": {
                                    "category": "enhanced ecommerce",
                                    "action": "impressions",
                                    "label": location.pathname,
                                    "value": 0,
                                    "nonInteraction": "true"
                                },
                                "ecommerce": {
                                    "currencyCode": "GBP"
                                }
                            };
                            break;
                        default:
                            // Otherwise check for existing information in the dataLayer:
                            if (typeof (window.dataLayer) !== "undefined") {
                                var existing_ecommerce_object;
                                // Reverse-search dataLayer to check for an existing ecommerce object:
                                for (var i = window.dataLayer.length - 1; i >= 0; i--) {
                                    if (typeof (window.dataLayer[i]["ecommerce"]) !== "undefined") {
                                        existing_ecommerce_object = window.dataLayer[i]["ecommerce"];
                                        break;
                                    }
                                }
                                // If found, extend existing ecommerce object for the new dataLayer push:
                                if (typeof (existing_ecommerce_object) !== "undefined") {
                                    enhanced_ecommerce_push = {
                                        "eEcomm": "true",
                                        "ecommerce": JSON.parse(JSON.stringify(existing_ecommerce_object))
                                    };
                                    enhanced_ecommerce_push["ecommerce"]["currencyCode"] = "GBP";
                                } else {
                                    // Otherwise populate a new ecommerce object:
                                    enhanced_ecommerce_push = {
                                        "eEcomm": "true",
                                        "ecommerce": {
                                            "currencyCode": "GBP"
                                        }
                                    };
                                }
                            } else {
                                // If no dataLayer exists, build a new dataLayer push from scratch:
                                enhanced_ecommerce_push = {
                                    "eEcomm": "true",
                                    "ecommerce": {
                                        "currencyCode": "GBP"
                                    }
                                };
                            }
                    }
                    // If there are product impressions to send, add this array:
                    if (window.px_impression_tracking["pending_impressions"]["products"].length > 0) {
                        enhanced_ecommerce_push["ecommerce"]["impressions"] = window.px_impression_tracking["pending_impressions"]["products"];
                    }
                    // If there are banner impressions to send, add this array inside a "promoView" object:
                    if (window.px_impression_tracking["pending_impressions"]["banners"].length > 0) {
                        enhanced_ecommerce_push["ecommerce"]["promoView"] = {
                            "promotions": window.px_impression_tracking["pending_impressions"]["banners"]
                        };
                    }
                    // Safely push the new information into the dataLayer - GTM handles the rest:
                    window.dataLayer = window.dataLayer || [];
                    window.dataLayer.push(enhanced_ecommerce_push);
                }
                // All pending impressions have been sent off, so reset arrays:
                window.px_impression_tracking["pending_impressions"]["products"] = [];
                window.px_impression_tracking["pending_impressions"]["banners"] = [];
            }
        }
    } catch (e) { };
}

// jQuery Check Visibility Plugin (See https://github.com/customd/jquery-visible for non-minified version):
!function (t) { var i = t(window); t.fn.visible = function (t, e, o) { if (!(this.length < 1)) { var r = this.length > 1 ? this.eq(0) : this, n = r.get(0), f = i.width(), h = i.height(), o = o ? o : "both", l = e === !0 ? n.offsetWidth * n.offsetHeight : !0; if ("function" == typeof n.getBoundingClientRect) { var g = n.getBoundingClientRect(), u = g.top >= 0 && g.top < h, s = g.bottom > 0 && g.bottom <= h, c = g.left >= 0 && g.left < f, a = g.right > 0 && g.right <= f, v = t ? u || s : u && s, b = t ? c || a : c && a; if ("both" === o) return l && v && b; if ("vertical" === o) return l && v; if ("horizontal" === o) return l && b } else { var d = i.scrollTop(), p = d + h, w = i.scrollLeft(), m = w + f, y = r.offset(), z = y.top, B = z + r.height(), C = y.left, R = C + r.width(), j = t === !0 ? B : z, q = t === !0 ? z : B, H = t === !0 ? R : C, L = t === !0 ? C : R; if ("both" === o) return !!l && p >= q && j >= d && m >= L && H >= w; if ("vertical" === o) return !!l && p >= q && j >= d; if ("horizontal" === o) return !!l && m >= L && H >= w } } } }(jQuery);

///// SCROLL TRACKING FUNCTIONS AND PLUGIN: /////

/*!
   * @preserve
   * jquery.scrolldepth.js | v0.4.1
   * Copyright (c) 2014 Rob Flaherty (@robflaherty)
   * Licensed under the MIT and GPL licenses.
   */
; (function ($, window, document, undefined) {

    $.scrollDepth = function (options) {

        /*
           * Throttle function borrowed from:
           * Underscore.js 1.5.2
           * http://underscorejs.org
           * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
           * Underscore may be freely distributed under the MIT license.
           */
        function throttle(func, wait) {
            var context, args, result;
            var timeout = null;
            var previous = 0;
            var later = function () {
                previous = new Date;
                timeout = null;
                result = func.apply(context, args);
            };
            return function () {
                var now = new Date;
                if (!previous) previous = now;
                var remaining = wait - (now - previous);
                context = this;
                args = arguments;
                if (remaining <= 0) {
                    clearTimeout(timeout);
                    timeout = null;
                    previous = now;
                    result = func.apply(context, args);
                } else if (!timeout) {
                    timeout = setTimeout(later, remaining);
                }
                return result;
            };
        }

        // Scroll Event
        if ((typeof (window.px_impression_tracking) !== "undefined") && ((window.px_impression_tracking["product_data"].length > 0) || (window.px_impression_tracking["banner_data"].length > 0))) {
            $window = $(window);
            $window.on('scroll.scrollDepth', throttle(function () {
                // Clear any existing timeout:
                if (typeof (window.px_impression_tracking["timer"]) !== "undefined") {
                    clearTimeout(window.px_impression_tracking["timer"]);
                }
                // Set a delay to ensure that the user has stopped scrolling before checking for new impressions to fire:
                window.px_impression_tracking["timer"] = setTimeout(function () {
                    // Check visible impressions and send any new ones off with a new hit
                    checkVisibleImpressions(true);
                }, window.px_impression_tracking["delay"]);
            }, 500));
        }

    };

})(jQuery, window, document);


///// POPULATE PRODUCT AND BANNER INFORMATION: /////
$(document).ready(function () {
    populateAllImages();
    populateAllBanners();
    jQuery.scrollDepth();
    checkVisibleImpressions(true);
});
;
/**
 * Featherlight - ultra slim jQuery lightbox
 * Version 1.3.4 - http://noelboss.github.io/featherlight/
 *
 * Copyright 2015, Noël Raoul Bossart (http://www.noelboss.com)
 * MIT Licensed.
**/
!function(a){"use strict";function b(a,c){if(!(this instanceof b)){var d=new b(a,c);return d.open(),d}this.id=b.id++,this.setup(a,c),this.chainCallbacks(b._callbackChain)}if("undefined"==typeof a)return void("console"in window&&window.console.info("Too much lightness, Featherlight needs jQuery."));var c=[],d=function(b){return c=a.grep(c,function(a){return a!==b&&a.$instance.closest("body").length>0})},e=function(a,b){var c={},d=new RegExp("^"+b+"([A-Z])(.*)");for(var e in a){var f=e.match(d);if(f){var g=(f[1]+f[2].replace(/([A-Z])/g,"-$1")).toLowerCase();c[g]=a[e]}}return c},f={keyup:"onKeyUp",resize:"onResize"},g=function(c){a.each(b.opened().reverse(),function(){return c.isDefaultPrevented()||!1!==this[f[c.type]](c)?void 0:(c.preventDefault(),c.stopPropagation(),!1)})},h=function(c){if(c!==b._globalHandlerInstalled){b._globalHandlerInstalled=c;var d=a.map(f,function(a,c){return c+"."+b.prototype.namespace}).join(" ");a(window)[c?"on":"off"](d,g)}};b.prototype={constructor:b,namespace:"featherlight",targetAttr:"data-featherlight",variant:null,resetCss:!1,background:null,openTrigger:"click",closeTrigger:"click",filter:null,root:"body",openSpeed:250,closeSpeed:250,closeOnClick:"background",closeOnEsc:!0,closeIcon:"&#10005;",loading:"",persist:!1,otherClose:null,beforeOpen:a.noop,beforeContent:a.noop,beforeClose:a.noop,afterOpen:a.noop,afterContent:a.noop,afterClose:a.noop,onKeyUp:a.noop,onResize:a.noop,type:null,contentFilters:["jquery","image","html","ajax","iframe","text"],setup:function(b,c){"object"!=typeof b||b instanceof a!=!1||c||(c=b,b=void 0);var d=a.extend(this,c,{target:b}),e=d.resetCss?d.namespace+"-reset":d.namespace,f=a(d.background||['<div class="'+e+"-loading "+e+'">','<div class="'+e+'-content">','<span class="'+e+"-close-icon "+d.namespace+'-close">',d.closeIcon,"</span>",'<div class="'+d.namespace+'-inner">'+d.loading+"</div>","</div>","</div>"].join("")),g="."+d.namespace+"-close"+(d.otherClose?","+d.otherClose:"");return d.$instance=f.clone().addClass(d.variant),d.$instance.on(d.closeTrigger+"."+d.namespace,function(b){var c=a(b.target);("background"===d.closeOnClick&&c.is("."+d.namespace)||"anywhere"===d.closeOnClick||c.closest(g).length)&&(b.preventDefault(),d.close())}),this},getContent:function(){if(this.persist!==!1&&this.$content)return this.$content;var b=this,c=this.constructor.contentFilters,d=function(a){return b.$currentTarget&&b.$currentTarget.attr(a)},e=d(b.targetAttr),f=b.target||e||"",g=c[b.type];if(!g&&f in c&&(g=c[f],f=b.target&&e),f=f||d("href")||"",!g)for(var h in c)b[h]&&(g=c[h],f=b[h]);if(!g){var i=f;if(f=null,a.each(b.contentFilters,function(){return g=c[this],g.test&&(f=g.test(i)),!f&&g.regex&&i.match&&i.match(g.regex)&&(f=i),!f}),!f)return"console"in window&&window.console.error("Featherlight: no content filter found "+(i?' for "'+i+'"':" (no target specified)")),!1}return g.process.call(b,f)},setContent:function(b){var c=this;return(b.is("iframe")||a("iframe",b).length>0)&&c.$instance.addClass(c.namespace+"-iframe"),c.$instance.removeClass(c.namespace+"-loading"),c.$instance.find("."+c.namespace+"-inner").not(b).slice(1).remove().end().replaceWith(a.contains(c.$instance[0],b[0])?"":b),c.$content=b.addClass(c.namespace+"-inner"),c},open:function(b){var d=this;if(d.$instance.hide().appendTo(d.root),!(b&&b.isDefaultPrevented()||d.beforeOpen(b)===!1)){b&&b.preventDefault();var e=d.getContent();if(e)return c.push(d),h(!0),d.$instance.fadeIn(d.openSpeed),d.beforeContent(b),a.when(e).always(function(a){d.setContent(a),d.afterContent(b)}).then(d.$instance.promise()).done(function(){d.afterOpen(b)})}return d.$instance.detach(),a.Deferred().reject().promise()},close:function(b){var c=this,e=a.Deferred();return c.beforeClose(b)===!1?e.reject():(0===d(c).length&&h(!1),c.$instance.fadeOut(c.closeSpeed,function(){c.$instance.detach(),c.afterClose(b),e.resolve()})),e.promise()},chainCallbacks:function(b){for(var c in b)this[c]=a.proxy(b[c],this,a.proxy(this[c],this))}},a.extend(b,{id:0,autoBind:"[data-featherlight]",defaults:b.prototype,contentFilters:{jquery:{regex:/^[#.]\w/,test:function(b){return b instanceof a&&b},process:function(b){return this.persist!==!1?a(b):a(b).clone(!0)}},image:{regex:/\.(png|jpg|jpeg|gif|tiff|bmp|svg)(\?\S*)?$/i,process:function(b){var c=this,d=a.Deferred(),e=new Image,f=a('<img src="'+b+'" alt="" class="'+c.namespace+'-image" />');return e.onload=function(){f.naturalWidth=e.width,f.naturalHeight=e.height,d.resolve(f)},e.onerror=function(){d.reject(f)},e.src=b,d.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(b){return a(b)}},ajax:{regex:/./,process:function(b){var c=a.Deferred(),d=a("<div></div>").load(b,function(a,b){"error"!==b&&c.resolve(d.contents()),c.fail()});return c.promise()}},iframe:{process:function(b){var c=new a.Deferred,d=a("<iframe/>").hide().attr("src",b).css(e(this,"iframe")).on("load",function(){c.resolve(d.show())}).appendTo(this.$instance.find("."+this.namespace+"-content"));return c.promise()}},text:{process:function(b){return a("<div>",{text:b})}}},functionAttributes:["beforeOpen","afterOpen","beforeContent","afterContent","beforeClose","afterClose"],readElementConfig:function(b,c){var d=this,e=new RegExp("^data-"+c+"-(.*)"),f={};return b&&b.attributes&&a.each(b.attributes,function(){var b=this.name.match(e);if(b){var c=this.value,g=a.camelCase(b[1]);if(a.inArray(g,d.functionAttributes)>=0)c=new Function(c);else try{c=a.parseJSON(c)}catch(h){}f[g]=c}}),f},extend:function(b,c){var d=function(){this.constructor=b};return d.prototype=this.prototype,b.prototype=new d,b.__super__=this.prototype,a.extend(b,this,c),b.defaults=b.prototype,b},attach:function(b,c,d){var e=this;"object"!=typeof c||c instanceof a!=!1||d||(d=c,c=void 0),d=a.extend({},d);var f,g=d.namespace||e.defaults.namespace,h=a.extend({},e.defaults,e.readElementConfig(b[0],g),d);return b.on(h.openTrigger+"."+h.namespace,h.filter,function(g){var i=a.extend({$source:b,$currentTarget:a(this)},e.readElementConfig(b[0],h.namespace),e.readElementConfig(this,h.namespace),d),j=f||a(this).data("featherlight-persisted")||new e(c,i);"shared"===j.persist?f=j:j.persist!==!1&&a(this).data("featherlight-persisted",j),i.$currentTarget.blur(),j.open(g)}),b},current:function(){var a=this.opened();return a[a.length-1]||null},opened:function(){var b=this;return d(),a.grep(c,function(a){return a instanceof b})},close:function(){var a=this.current();return a?a.close():void 0},_onReady:function(){var b=this;b.autoBind&&(a(b.autoBind).each(function(){b.attach(a(this))}),a(document).on("click",b.autoBind,function(c){c.isDefaultPrevented()||(c.preventDefault(),b.attach(a(c.currentTarget)),a(c.target).click())}))},_callbackChain:{onKeyUp:function(a,b){return 27===b.keyCode?(this.closeOnEsc&&this.$instance.find("."+this.namespace+"-close:first").click(),!1):a(b)},onResize:function(a,b){if(this.$content.naturalWidth){var c=this.$content.naturalWidth,d=this.$content.naturalHeight;this.$content.css("width","").css("height","");var e=Math.max(c/parseInt(this.$content.parent().css("width"),10),d/parseInt(this.$content.parent().css("height"),10));e>1&&this.$content.css("width",""+c/e+"px").css("height",""+d/e+"px")}return a(b)},afterContent:function(a,b){var c=a(b);return this.onResize(b),c}}}),a.featherlight=b,a.fn.featherlight=function(a,c){return b.attach(this,a,c)},a(document).ready(function(){b._onReady()})}(jQuery);;
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n():"function"==typeof define&&define.amd?define(n):n()}(0,function(){"use strict";function e(e){var n=this.constructor;return this.then(function(t){return n.resolve(e()).then(function(){return t})},function(t){return n.resolve(e()).then(function(){return n.reject(t)})})}function n(e){return!(!e||"undefined"==typeof e.length)}function t(){}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],c(e,this)}function r(e,n){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,o._immediateFn(function(){var t=1===e._state?n.onFulfilled:n.onRejected;if(null!==t){var o;try{o=t(e._value)}catch(r){return void f(n.promise,r)}i(n.promise,o)}else(1===e._state?i:f)(n.promise,e._value)})):e._deferreds.push(n)}function i(e,n){try{if(n===e)throw new TypeError("A promise cannot be resolved with itself.");if(n&&("object"==typeof n||"function"==typeof n)){var t=n.then;if(n instanceof o)return e._state=3,e._value=n,void u(e);if("function"==typeof t)return void c(function(e,n){return function(){e.apply(n,arguments)}}(t,n),e)}e._state=1,e._value=n,u(e)}catch(r){f(e,r)}}function f(e,n){e._state=2,e._value=n,u(e)}function u(e){2===e._state&&0===e._deferreds.length&&o._immediateFn(function(){e._handled||o._unhandledRejectionFn(e._value)});for(var n=0,t=e._deferreds.length;t>n;n++)r(e,e._deferreds[n]);e._deferreds=null}function c(e,n){var t=!1;try{e(function(e){t||(t=!0,i(n,e))},function(e){t||(t=!0,f(n,e))})}catch(o){if(t)return;t=!0,f(n,o)}}var a=setTimeout;o.prototype["catch"]=function(e){return this.then(null,e)},o.prototype.then=function(e,n){var o=new this.constructor(t);return r(this,new function(e,n,t){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof n?n:null,this.promise=t}(e,n,o)),o},o.prototype["finally"]=e,o.all=function(e){return new o(function(t,o){function r(e,n){try{if(n&&("object"==typeof n||"function"==typeof n)){var u=n.then;if("function"==typeof u)return void u.call(n,function(n){r(e,n)},o)}i[e]=n,0==--f&&t(i)}catch(c){o(c)}}if(!n(e))return o(new TypeError("Promise.all accepts an array"));var i=Array.prototype.slice.call(e);if(0===i.length)return t([]);for(var f=i.length,u=0;i.length>u;u++)r(u,i[u])})},o.resolve=function(e){return e&&"object"==typeof e&&e.constructor===o?e:new o(function(n){n(e)})},o.reject=function(e){return new o(function(n,t){t(e)})},o.race=function(e){return new o(function(t,r){if(!n(e))return r(new TypeError("Promise.race accepts an array"));for(var i=0,f=e.length;f>i;i++)o.resolve(e[i]).then(t,r)})},o._immediateFn="function"==typeof setImmediate&&function(e){setImmediate(e)}||function(e){a(e,0)},o._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)};var l=function(){if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if("undefined"!=typeof global)return global;throw Error("unable to locate global object")}();"Promise"in l?l.Promise.prototype["finally"]||(l.Promise.prototype["finally"]=e):l.Promise=o});;
