{"webLayers":[{"_id":"67e53dff7c82c3b89392148d","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"until_visitor_interacts","uses_personalization":true,"data":"","variables_target":null,"page_vars":[]},{"_id":"68639fe7198448b6d19971f9","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":true,"data":"","variables_target":{"conditions":[{"attribute":{"id":"68639cd0ce02c697f9eb698d","type":"page_variable"},"constraint":{"operator":"is","type":"boolean","value":"true"}}]},"page_vars":[]},{"_id":"6893263a4e7db31ace75b3e6","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"hunkemoller.com/---","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":false,"data":"return (function insertBanner(data) {\ninsertBanner.inPreview = false;\ninsertBanner.sdk = window.exponea;\ninsertBanner.data = data;\ninsertBanner.html = \"\u003cdiv class=\\\"br-refund-weblayer\\\"\u003e\\n\\t\\n\\t\u003cdiv class=\\\"header-image\\\"\u003e\\n\\t\\t\u003cimg src=\\\"https://www.hunkemoller.com/on/demandware.static/-/Library-Sites-hkm-content-global/default/dwcf728530/images/HKM_Logo_Burgundy.svg\\\"\u003e\\n\\t\u003c/div\u003e\\n\\t\u003cdiv class=\\\"container\\\"\u003e\\n\\t\\t\u003cdiv class=\\\"br-form\\\"\u003e\\n\\t\\t\\t\u003cdiv class=\\\"title\\\"\u003e\\n\\t\\t\\t\u003cp\u003eSimply fill in the information below and you will receive the refund amount to your bank account within 10 working days. You will also receive a 'success' email to confirm that the information you entered is correct.\u003c/p\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\u003cform id=\\\"br-iban-check\\\"\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cdiv class=\\\"br-field-wrapper\\\"\u003e\\n\\t\\t\\t\\t\u003cinput type=\\\"text\\\" class=\\\"br-input\\\" placeholder=\\\" \\\" name=\\\"order_id\\\" required disabled\u003e\\n\\t\\t\\t\\t\u003clabel class=\\\"br-field-label\\\"\u003eOrder id \u003cspan class=\\\"br-field-required\\\"\u003e*\u003c/span\u003e\u003c/label\u003e\\n\\t\\t\\t\\t\u003cspan class='error-field order-field hidden'\u003eUnable to find your order id, please contact our customer service\u003c/span\u003e\\n\\t\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cdiv class=\\\"br-field-wrapper\\\"\u003e\\n\\t\\t\\t\\t\u003cinput type=\\\"text\\\" class=\\\"br-input\\\" placeholder=\\\" \\\" name=\\\"fname\\\" id=\\\"fname\\\" required\u003e\\n\\t\\t\\t\\t\u003clabel class=\\\"br-field-label\\\" for=\\\"fname\\\"\u003eFirst Name \u003cspan class=\\\"br-field-required\\\"\u003e*\u003c/span\u003e\u003c/label\u003e\\n\\t\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cdiv class=\\\"br-field-wrapper\\\"\u003e\\n\\t\\t\\t\\t\u003cinput type=\\\"text\\\" class=\\\"br-input\\\" placeholder=\\\" \\\" name=\\\"city\\\" id=\\\"city\\\" required\u003e\\n\\t\\t\\t\\t\u003clabel class=\\\"br-field-label required\\\" for=\\\"city\\\"\u003eCity \u003cspan class=\\\"br-field-required\\\"\u003e*\u003c/span\u003e\u003c/label\u003e\\n\\t\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cdiv class=\\\"br-field-wrapper\\\"\u003e\\n\\t\\t\\t\\t\u003cinput type=\\\"text\\\" class=\\\"br-input\\\" placeholder=\\\" \\\" name=\\\"iban\\\" id=\\\"iban\\\" pattern=\\\"^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$\\\" required\u003e\\n\\t\\t\\t\\t\u003clabel class=\\\"br-field-label\\\" for=\\\"iban\\\"\u003eIBAN Number \u003cspan class=\\\"br-field-required\\\"\u003e*\u003c/span\u003e\u003c/label\u003e\\n\\t\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cp class=\\\"sub_desc\\\"\u003e\\n\\t\\t\\t\\t\\tPlease ensure your IBAN is a continuous string of letters/numbers, no spaces or special characters.\\n\\t\\t\\t\\t\\t\u003cbr/\u003e\\n\\t\\t\\t\\t\\t\\u2705 Example of a correct IBAN: NL91ABNA0417164300\\n\\t\\t\\t\\t\u003c/p\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cp class=\\\"desc\\\"\u003e* compulsory\u003c/p\u003e\\n\\t\\t\\t\\t\\n\\t\\t\\t\\t\u003cbutton type=\\\"submit\\\" class=\\\"br-btn\\\"\u003eSUBMIT\u003c/button\u003e\\n\\t\\t\\t\u003c/form\u003e\\n\\t\\t\u003c/div\u003e\\n\\t\\t\\n\\t\\t\u003cdiv class=\\\"thank_you\\\"\u003e\\n\\t\\t\\t\u003cdiv class=\\\"title\\\"\u003e\\n\\t\\t\\t\\t\u003cp\u003eThank you\u003c/p\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\t\\t\\t\u003cdiv class=\\\"subtitle\\\"\u003e\\n\\t\\t\\t\\t\u003cp\u003eYour request for refund of order - \u003cstrong\u003e\u003cspan id=\\\"order_id\\\"\u003e\u003c/span\u003e\u003c/strong\u003e was submitted\u003c/p\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\t\\t\u003c/div\u003e\\n\\t\u003c/div\u003e\\n\\t\\n\u003c/div\u003e\";\ninsertBanner.style = \".br-refund-weblayer {\\n\\tmax-width:700px;\\n\\tdisplay:flex;\\n\\talign-items:center;\\n\\tjustify-content:center;\\n\\tflex-direction:column;\\n\\tmargin:0 auto;\\n\\tpadding: 20px 40px;\\n}\\n\\n.container {\\n\\tdisplay:flex;\\n\\tflex-direction:column;\\n}\\n\\n.br-refund-weblayer .header-image img{\\n\\twidth:100%;\\n\\theight:auto;\\n}\\n\\n.br-form form {\\n\\tdisplay:flex;\\n\\tflex-direction:column;\\n\\tgap:20px;\\n}\\n\\n.br-field-wrapper {\\n\\tposition: relative;\\n}\\n\\n.br-field-label {\\n    font-family: Nunito, sans-serif;\\n    font-weight: 400;\\n    font-size: 14px;\\n    line-height: 1;\\n    -ms-flex-align: center;\\n    align-items: center;\\n    color: #666;\\n    display: -ms-flexbox;\\n    display: flex;\\n    left: 0;\\n    position: absolute;\\n    top: 0;\\n    transition: height ease .3s, font-size ease .3s, padding-top ease .3s;\\n    \\n    font-family: Nunito, sans-serif;\\n    font-weight: 700;\\n    font-size: 10px;\\n    line-height: 1;\\n    height: 12px;\\n    padding-top: 2px;\\n    padding-left:10px;\\n    z-index: 10;\\n}\\n\\n.br-field-wrapper input:not(:focus):placeholder-shown~.br-field-label {\\n    font-family: Nunito, sans-serif;\\n    font-weight: 400;\\n    font-size: 14px;\\n    line-height: 1;\\n    -ms-flex-align: center;\\n    align-items: center;\\n    color: #666;\\n    display: -ms-flexbox;\\n    display: flex;\\n    height: 40px;\\n    left: 0;\\n    padding: 0 15px;\\n    position: absolute;\\n    top: 0;\\n}\\n\\n.br-field-required {\\n\\tcolor: #e81e75;\\n    margin: 0 2px;\\n}\\n\\n.sub_desc {\\n\\tmargin:0;\\n\\tfont-size:12px;\\n}\\n\\n.desc {\\n\\tcolor: #e81e75;\\n}\\n\\n.br-btn {\\n\\tfont-weight: 700;\\n    line-height: 13px;\\n    -webkit-appearance: none;\\n    color: #fff;\\n    display: inline-block;\\n    outline: 0;\\n    text-align: center;\\n    vertical-align: top;\\n    text-transform: uppercase;\\n    text-decoration: none;\\n    background-color: #e81e75;\\n    -moz-appearance: none;\\n    cursor: pointer;\\n    \\n    font-family: Nunito, sans-serif;\\n    font-size: 13px;\\n    border-radius: 5px;\\n    border: 1px solid #e81e75;\\n    min-width: 210px;\\n    letter-spacing: 1px;\\n    padding: 16px 10px 14px;\\n    \\n    background-color: #EC567E;\\n    border-color: #EC567E;\\n    align-self:flex-end;\\n}\\n\\n.br-input {\\n\\tfont-family: Nunito, sans-serif;\\n    font-weight: 400;\\n    font-size: 14px;\\n    line-height: 21px;\\n    -moz-appearance: none;\\n    -webkit-appearance: none;\\n    background: 0 0;\\n    border: 1px solid #e7e7e7;\\n    border-radius: 5px;\\n    box-shadow: none;\\n    color: #333;\\n    height: 45px;\\n    max-width: 100%;\\n    outline: 0;\\n    padding: 11px 15px;\\n    position: relative;\\n    width: 100%;\\n    z-index: 9;\\n    box-sizing: border-box;\\n}\\n\\n.br-input:disabled {\\n\\tbackground:#f0f0f0;\\n}\\n\\n.thank_you {\\n\\ttext-align:center;\\n\\tdisplay:none;\\n\\tflex-direction:column;\\n\\talign-items:center;\\n}\\n\\n.error-field {\\n\\tcolor: #e81e75;\\n\\tpadding: 0 15px;\\n}\\n.hidden {\\n\\tdisplay:none;\\n}\\n\\n@media only screen and (max-width:632px) {\\n\\t.br-btn {\\n\\t\\talign-self:auto;\\n\\t}\\n}\";\ninsertBanner.script = function() { /**\n * Universal parameters\n */\nvar PARAM_showAfter = parseInt(\"0\", 10);\nvar PARAM_removeAfter = parseInt(\"0\", 10);\nvar PARAM_trigger = \"On entry\";\nvar PARAM_parentElement = \"#main\";\n\n/**\n * Initialization\n */\nvar self = this;\n\nvar webLayerID = self.data.banner_id;\nvar WEB_LAYER_EVENT_STORAGE_KEY_PREFIX = \"__exponea_banner_event__\";\nvar localStorageEnabled = false;\n\nlet params = new URLSearchParams(document.location.search);\nlet order_id = params.get(\"order_id\"); //\nlet email_id = params.get(\"email_id\"); //\n\ntry {\n    if (!window.localStorage) {\n        localStorageEnabled = false;\n    } else {\n        var key = \"__\" + webLayerID + \"_storage_test__\";\n        window.localStorage.setItem(key, key);\n        window.localStorage.removeItem(key);\n        localStorageEnabled = true;\n    }\n} catch (e) {\n    localStorageEnabled = false;\n}\n\nconst setOrderId = (banner, order_id) =\u003e {\n\tif(banner){\n\t\tconst order_node = banner.querySelector('form input[name=\"order_id\"]');\n\t\tif(order_node \u0026\u0026 order_id) order_node.value = order_id;\n\t\t\n\t}\n}\n\nconst isValidIBAN = (iban, banner) =\u003e{\n\tif(!iban) { \n\t\tconsole.error('wrong iban')\n\t\treturn false \n\t};\n\t\n\tconst ibanClean = iban.replace(/\\s+/g, '').toUpperCase();\n\tconst regex = /^[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}$/;\n\tif (!regex.test(ibanClean)) return false;\n\t\n\t// Rearrange\n\tconst rearranged = ibanClean.slice(4) + ibanClean.slice(0, 4);\n\t\n\t// Convert letters to numbers (A = 10, B = 11, ..., Z = 35)\n\tconst numericIban = rearranged.replace(/[A-Z]/g, ch =\u003e ch.charCodeAt(0) - 55);\n\t\n\t// Perform MOD-97\n\tlet remainder = numericIban;\n\twhile (remainder.length \u003e 9) {\n\tconst block = remainder.slice(0, 9);\n\tremainder = (parseInt(block, 10) % 97) + remainder.slice(block.length);\n\t}\n\t\n\tconst result = parseInt(remainder, 10) % 97 === 1;\n\tif(!result){\n\t\tconst iban_node = banner.querySelector('#iban');\n    \t//iban_node.setCustomValidity(\"Please enter a valid IBAN number\");\n    \tiban_node.reportValidity()\n\t}\n\treturn result;\n}\n\n// Helper Id used to identify the banner on the website, not actual ID of the banner\nvar bannerSemiId = Math.random().toString(36).substring(5);\n\n// Used in onExit banners to mark if the banner was triggered already\nwindow['__exp_triggered-' + bannerSemiId] = false;\n\n// Resetting some of the parameters while previewing the banner in the app to easily see its appearance\nif (self.inPreview) {\n    // reset the show delay while editing the banner in editor\n    PARAM_showAfter = 0;\n\n    // always show the banner right away\n    PARAM_trigger = 'On entry';\n    order_id = '111122223334444';\n    email_id = 'ZG15dHJvLnN0YXZuaWNodWtAdm94d2lzZS5jb20';\n    PARAM_parentElement = 'body';\n}\n\n/**\n * Basic functions\n */\n\n const showThankYou = (banner, order_id) =\u003e {\n \tif(banner){\n \t\tbanner.querySelector('.br-form').style.display = 'none';\n \t\tbanner.querySelector('.thank_you').style.display = 'flex';\n \t\t\n \t\tconst order_id_num = banner.querySelector('#order_id');\n \t\tif(order_id_num){\n \t\t\torder_id_num.textContent = order_id;\n \t\t\tconsole.log('order id is show')\n \t\t}\n \t}\n }\n \n/**\n * Function used to register listener for the trigger that will display the banner\n */\nfunction registerStartTrigger() {\n    if (PARAM_trigger === 'On exit') {\n        document.body.addEventListener('mouseout', onExitMouseOutHandler);\n    } else if (PARAM_trigger === 'On scroll') {\n        window.addEventListener('scroll', scheduleShowBanner);\n    } else {\n        // If 'On entry' or anything unknown start the banner right away\n        scheduleShowBanner();\n    }\n}\n\n/**\n * This function starts the showAfter timer and then displays the banner\n */\nfunction scheduleShowBanner() {\n    window.removeEventListener('scroll', scheduleShowBanner);\n\n    setTimeout(function() {\n        // Track show event after timer expired\n        trackEvent('show', false);\n\n        // Create and display the banner\n        requestAnimationFrame(createBanner);\n\n        // If removeAfter is provided start the removal timer\n        if (PARAM_removeAfter \u003e 0) {\n            setTimeout(function() {\n                removeBanner();\n            }, PARAM_removeAfter);\n        }\n    }, PARAM_showAfter);\n}\n\n/**\n * Function used to insert the banner contents into the HTML and adding basic functionality\n */\nfunction createBanner() {\nvar placeholder = document.createElement('div');\n    placeholder.insertAdjacentHTML('afterbegin', self.html);\n\n    // get the banner reference\n    var banner = placeholder.firstElementChild;\n\n    // add close functionality to the close button\n    //banner.querySelector('.close').onclick = handleCloseButtonClick;\n\n    // insert banner CSS into the website\n    banner.insertAdjacentHTML('afterbegin', '\u003cstyle\u003e' + self.style + '\u003c/style\u003e');\n\n    // track clicking on the banner itself\n    //trackLink(banner, 'click', true);\n    \n\tsetOrderId(banner, order_id);\n    attachBannerToDom(banner);\n    \n    \n    const form = banner.querySelector('form');\n    if(form){\n    \tform.addEventListener('submit', (event) =\u003e{\n    \t\tconst iban_node = banner.querySelector('#iban');\n    \t\tiban_node.setCustomValidity(\"Please enter a valid IBAN number\");\n    \t\t\n    \t\tevent.preventDefault();\n    \t\tconsole.log('prevent default executed')\n    \t\tconst props = getEventProperties('submit', true);\n    \t\tprops.order_id = order_id;\n    \t\tprops.fname = form['fname']?.value;\n    \t\tprops.city = form['city']?.value;\n    \t\tprops.iban = form['iban']?.value;\n    \t\tprops.email = atob(decodeURIComponent(email_id));\n    \t\tconsole.log('event props - ', props)\n    \t\tif(!props.order_id){\n    \t\t\tconsole.log('order id FAIL CHECK')\n    \t\t\tbanner.querySelector('.order-field').style.display = 'block';\n    \t\t\treturn false;\n    \t\t}\n    \t\t\n    \t\t\n    \t\tif(isValidIBAN(props.iban, banner) \u0026\u0026 props.order_id){\n    \t\t\tconsole.log('order_id - ', props.order_id)\n    \t\t\tprops.iban = btoa(props.iban);\n    \t\t\tif(exponea \u0026\u0026 !exponea.isInitialized \u0026\u0026 props.email){\n    \t\t\t\tconsole.log('exponea exists, exponea is not initialized, email is valid')\n    \t\t\t\texponea.start();\n    \t\t\t\tconsole.log('starting exponea')\n    \t\t\t\texponea.identify({\n    \t\t\t\t\temail_id :  props?.email\n    \t\t\t\t})\n    \t\t\t\tconsole.log('identify #1')\n    \t\t\t}\n    \t\t\telse if(exponea \u0026\u0026 exponea.isInitialized \u0026\u0026 props.email){\n    \t\t\t\tconsole.log('exponea exists, exponea is initialized, email is valid')\n    \t\t\t\texponea.identify({\n    \t\t\t\t\temail_id :  props?.email\n    \t\t\t\t})\n    \t\t\t}\n    \t\t\tprops.email = params.get(\"email_id\");\n    \t\t\tsetTimeout(()=\u003e{\n    \t\t\t\tself.sdk.track('banner', props);\n    \t\t\t\tconsole.log('submit tracked', props)\n    \t\t\t}, 2000)\n    \t\t\tshowThankYou(banner,props.order_id)\n    \t\t}\n    \t})\n    }\n}\n\n/**\n * Function used to insert the banner HTML to the DOM\n * @param banner - html content of the banner\n */\nfunction attachBannerToDom(banner) {\n    var parentElement = document.querySelector(PARAM_parentElement);\n\n    // use shadow DOM if browser suports it\n    if (parentElement.attachShadow) {\n        createBannerInShadowDom(banner, parentElement);\n    } else {\n        parentElement.insertAdjacentElement('afterbegin', banner);\n        self.banner = banner;\n    }\n}\n\n/**\n * Creates banner in shadow dom\n * @param parentElement\n */\nfunction createBannerInShadowDom(banner, parentElement) {\n    var shadowHost = document.createElement('div');\n    shadowHost.innerHTML = getFontsImport();\n\n    var shadowRoot = shadowHost.attachShadow({ mode: 'open' });\n    shadowRoot.appendChild(banner);\n    parentElement.insertAdjacentElement('afterbegin', shadowHost);\n    self.banner = shadowHost;\n}\n\n/**\n * Function used to add fonts imports and font faces to element\n * The font import does not work inside shadow DOM, it has to be declared outside\n * @returns string - style tag with fonts import\n */\nfunction getFontsImport() {\n    var importsResult = self.style.match(/@import url\\([\"'].+?['\"]\\)/g);\n    var fontFacesResult = self.style.match(/@font-face( |\\n)*{(.|\\s)+?}/g);\n\n    var imports = importsResult \u0026\u0026 importsResult.length ? importsResult.join(';') : '';\n    var fontFaces = fontFacesResult \u0026\u0026 fontFacesResult.length ? fontFacesResult.join('') : '';\n    var fonts = (imports ? imports + ';' : '') + fontFaces;\n\n    return imports || fontFaces ? '\u003cstyle\u003e' + fonts + '\u003c/style\u003e' : '';\n}\n\n/**\n * Function used to remove the banner from the website\n */\nfunction removeBanner() {\n    if (self.banner \u0026\u0026 self.banner.parentNode) {\n        self.banner.parentNode.removeChild(self.banner);\n    }\n}\n\n/**\n * Function triggered when the closing button is clicked\n * @param event - browser click Event\n * @returns {boolean}\n */\nfunction handleCloseButtonClick(event) {\n    removeBanner();\n    trackEvent('close', true);\n\n    // Stop the click event propagation onto parent HTML elements\n    event.preventDefault();\n    if (event.stopPropagation) {\n        event.stopPropagation();\n    } else {\n        event.cancelBubble = true;\n    }\n\n    return false;\n}\n\n/**\n * Function used to track single action\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackEvent(action, interactive) {\n    if (action === 'show') {\n        trackAction('last_show');\n    }\n\n    if (interactive) {\n        trackAction('last_interaction')\n    }\n\n    self.sdk.track('banner', getEventProperties(action, interactive));\n}\n\n/**\n * Function used to add action tracking to element\n * @param link - element\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackLink(link, action, interactive) {\n    var linkClickHandler = function() {\n        if (interactive) {\n            trackAction('last_interaction');\n        }\n    }\n    link.addEventListener('click', linkClickHandler);\n\n    var eventData = getEventProperties(action, interactive);\n    eventData.link = link.href;\n    self.sdk.trackLink(link, 'banner', eventData);\n}\n\n/**\n * Default attributes tracked with every banner event\n * @param action - string\n * @param interactive - boolean\n * @returns object - object to be tracked\n */\nfunction getEventProperties(action, interactive) {\n    return {\n        action: action,\n        banner_id: self.data.banner_id,\n        banner_name: self.data.banner_name,\n        banner_type: self.data.banner_type,\n        variant_id: self.data.variant_id,\n        variant_name: self.data.variant_name,\n        variant_origin: self.data.contextual_personalization != null ? 'contextual personalisation' : 'ABtest',\n        interaction: interactive !== false,\n    };\n}\n\n/**\n * Function used to start banners with onExit trigger\n * @param event - browser mouse event\n */\nfunction onExitMouseOutHandler(event) {\n    event = event ? event : window.event;\n    var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    if (event.clientX \u003e= (vpWidth)) {\n        return;\n    }\n    if (event.clientY \u003e= 50) {\n        return;\n    }\n    var from = event.relatedTarget || event.toElement;\n\n    if (!from \u0026\u0026 !window['__exp_triggered-' + bannerSemiId]) {\n        window['__exp_triggered-' + bannerSemiId] = true;\n        scheduleShowBanner();\n    }\n}\n\n/**\n * Track an action with current time into localStorage if localStorage exists.\n * @param action - action name\n */\nfunction trackAction(action) {\n    if (!localStorageEnabled) {\n        return;\n    }\n\n    var actionKey = WEB_LAYER_EVENT_STORAGE_KEY_PREFIX + webLayerID + '_' + action;\n    window.localStorage.setItem(actionKey, new Date().valueOf().toString());\n}\n\n/**\n * Register the start trigger and return required removal function\n */\n\nregisterStartTrigger();\nreturn {\n    remove: removeBanner,\n};\n };\ninsertBanner.remove = (insertBanner.script.call(insertBanner) || {} ).remove;\ninsertBanner.contextual_personalization = {};\nreturn insertBanner;\n})({\"banner_id\": \"6893263a4e7db31ace75b3e6\", \"banner_name\": null, \"banner_type\": \"medium_rectangle\", \"banner_group\": \"\", \"variant_id\": 0, \"variant_name\": \"Variant A\"});","variables_target":null,"page_vars":[]},{"_id":"68a4738c62a4a9616a689bbd","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"?show-confirmation-wbl=true","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":false,"data":"return (function insertBanner(data) {\ninsertBanner.inPreview = false;\ninsertBanner.sdk = window.exponea;\ninsertBanner.data = data;\ninsertBanner.html = \"\u003c!-- Popup Overlay --\u003e\\n\u003cdiv id=\\\"popupOverlay\\\" class=\\\"br-popup-overlay\\\"\u003e\\n\\t\u003cdiv class=\\\"confirmation-popup-container\\\"\u003e\\n\\t\\t\u003c!-- Close button --\u003e\\n\\t\\t\u003cbutton id=\\\"closePopupBtn\\\" class=\\\"close-btn\\\" aria-label=\\\"Close popup\\\"\u003e\\n\\t\\t\\t\u003csvg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"\u003e\\n\\t\\t\\t\\t\u003cpath\\n\\t\\t\\t\\t\\td=\\\"M18 6L6 18M6 6L18 18\\\"\\n\\t\\t\\t\\t\\tstroke=\\\"currentColor\\\"\\n\\t\\t\\t\\t\\tstroke-width=\\\"2\\\"\\n\\t\\t\\t\\t\\tstroke-linecap=\\\"round\\\"\\n\\t\\t\\t\\t\\tstroke-linejoin=\\\"round\\\" /\u003e\\n\\t\\t\\t\u003c/svg\u003e\\n\\t\\t\u003c/button\u003e\\n\\n\\t\\t\u003c!-- Popup Content --\u003e\\n\\t\\t\u003cdiv class=\\\"popup-content\\\"\u003e\\n\\t\\t\\t\u003c!-- Image --\u003e\\n\\t\\t\\t\u003cdiv class=\\\"popup-image\\\"\u003e\\n\\t\\t\\t\\t\u003cimg\\n\\t\\t\\t\\t\\tsrc=\\\"https://brxcdn.com/eu2-app-storage/822c4ae8-d96c-11ef-b66c-469fe4cae743/media/original/4eabf244-7cfb-11f0-8f4b-3a0dc041ce11\\\"\\n\\t\\t\\t\\t\\talt=\\\"Hunkemoller Collection\\\"\\n\\t\\t\\t\\t\\tclass=\\\"collection-image\\\" /\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\n\\t\\t\\t\u003c!-- Header --\u003e\\n\\t\\t\\t\u003ch2 id=\\\"popupHeader\\\" class=\\\"popup-header\\\"\u003e\u003c/h2\u003e\\n\\n\\t\\t\\t\u003c!-- Body text --\u003e\\n\\t\\t\\t\u003cp id=\\\"popupBody\\\" class=\\\"popup-body\\\"\u003e\u003c/p\u003e\\n\\n\\t\\t\\t\u003c!-- CTA Button --\u003e\\n\\t\\t\\t\u003cbutton id=\\\"popupCta\\\" class=\\\"popup-cta\\\"\u003e\u003c/button\u003e\\n\\t\\t\u003c/div\u003e\\n\\t\u003c/div\u003e\\n\u003c/div\u003e\";\ninsertBanner.style = \"\\n/* Popup overlay with blur effect */\\n.br-popup-overlay {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\tbackground: rgba(0, 0, 0, 0.6);\\n\\tbackdrop-filter: blur(8px);\\n\\t-webkit-backdrop-filter: blur(8px);\\n\\tdisplay: none;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tz-index: 1000;\\n\\topacity: 0;\\n\\ttransition: opacity 0.3s ease;\\n}\\n\\n.br-popup-overlay.active {\\n\\tdisplay: flex;\\n\\topacity: 1;\\n}\\n\\n/* Popup container */\\n.confirmation-popup-container {\\n\\tbackground: white;\\n\\tborder-radius: 20px;\\n\\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\\n\\tmax-width: 450px;\\n\\twidth: 90%;\\n\\tmax-height: 90vh;\\n\\toverflow-y: auto;\\n\\tposition: relative;\\n\\ttransform: scale(0.8);\\n\\ttransition: transform 0.3s ease;\\n}\\n\\n.br-popup-overlay.active .confirmation-popup-container {\\n\\ttransform: scale(1);\\n}\\n\\n/* Close button */\\n.confirmation-popup-container .close-btn {\\n\\tall : unset;\\n\\tposition: absolute;\\n\\ttop: 5px;\\n\\tright: 10px;\\n\\tbackground: transparent;\\n\\tborder: none;\\n\\tborder-radius: 50%;\\n\\twidth: 40px;\\n\\theight: 40px;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tcursor: pointer;\\n\\ttransition: all 0.3s ease;\\n\\tz-index: 10;\\n\\tcolor: #333;\\n}\\n\\n/* Popup content */\\n.confirmation-popup-container .popup-content {\\n\\tpadding: 40px 30px 30px;\\n\\ttext-align: center;\\n}\\n\\n/* Popup image */\\n.confirmation-popup-container .popup-image {\\n\\tmargin-bottom: 25px;\\n}\\n\\n.confirmation-popup-container .collection-image {\\n\\twidth: 100%;\\n\\theight: auto;\\n\\tborder-radius: 12px;\\n\\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\\n}\\n\\n/* Popup header */\\n.confirmation-popup-container .popup-header {\\n\\tcolor: #333;\\n\\tfont-size: 24px;\\n\\tfont-weight: 700;\\n\\tmargin-bottom: 20px;\\n\\tline-height: 1.3;\\n}\\n\\n/* Popup body text */\\n.confirmation-popup-container .popup-body {\\n\\tcolor: #666;\\n\\tfont-size: 16px;\\n\\tline-height: 1.6;\\n\\tmargin-bottom: 30px;\\n\\tmax-width: 350px;\\n\\tmargin-left: auto;\\n\\tmargin-right: auto;\\n}\\n\\n/* CTA button */\\n.confirmation-popup-container .popup-cta {\\n\\tcolor: white;\\n\\tborder: none;\\n\\tpadding: 16px 32px;\\n\\tcursor: pointer;\\n\\ttext-transform: uppercase;\\n\\t\\n\\tfont-size: 13px;\\n    -webkit-appearance: none;\\n    border-radius: 5px;\\n    border: 1px solid #e81e75;\\n    min-width: 210px;\\n    letter-spacing: 1px;\\n    outline: 0;\\n    padding: 16px 15px 15px;\\n    color: #fff;\\n    background-color: #e81e75;\\n    font-family: Nunito, sans-serif;\\n    -moz-appearance: none;\\n    cursor: pointer;\\n    display: inline-block;\\n    text-align: center;\\n    vertical-align: top;\\n    text-transform: uppercase;\\n    text-decoration: none;\\n    font-weight: 700;\\n    line-height: 13px;\\n}\\n\\n.confirmation-popup-container .popup-cta:hover {\\n\\tbackground-color: #ed4b91;\\n    border-color: #ed4b91;\\n}\\n\\n.confirmation-popup-container .popup-cta:active {\\n\\ttransform: translateY(0);\\n}\\n\\n/* Responsive design */\\n@media (max-width: 768px) {\\n\\t.confirmation-popup-container .confirmation-popup-container {\\n\\t\\twidth: 95%;\\n\\t\\tmargin: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 30px 20px 25px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 14px;\\n\\t}\\n\\n\\t.confirmation-popup-container .close-btn {\\n\\t\\ttop: 5px;\\n\\t\\tright: 5px;\\n\\t\\twidth: 35px;\\n\\t\\theight: 35px;\\n\\t}\\n}\\n\\n@media (max-width: 480px) {\\n\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 25px 15px 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 18px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 13px;\\n\\t}\\n}\\n\";\ninsertBanner.script = function() { /**\n * Universal parameters\n */\nvar PARAM_showAfter = parseInt(\"0\", 10);\nvar PARAM_removeAfter = parseInt(\"0\", 10);\nvar PARAM_trigger = \"On entry\";\nvar PARAM_parentElement = \"body\";\n\n/**\n * Initialization\n */\nvar self = this;\n\nvar webLayerID = self.data.banner_id;\nvar WEB_LAYER_EVENT_STORAGE_KEY_PREFIX = \"__exponea_banner_event__\";\nvar localStorageEnabled = false;\ntry {\n    if (!window.localStorage) {\n        localStorageEnabled = false;\n    } else {\n        var key = \"__\" + webLayerID + \"_storage_test__\";\n        window.localStorage.setItem(key, key);\n        window.localStorage.removeItem(key);\n        localStorageEnabled = true;\n    }\n} catch (e) {\n    localStorageEnabled = false;\n}\n\n// Helper Id used to identify the banner on the website, not actual ID of the banner\nvar bannerSemiId = Math.random().toString(36).substring(5);\n\n// Used in onExit banners to mark if the banner was triggered already\nwindow['__exp_triggered-' + bannerSemiId] = false;\n\n// Resetting some of the parameters while previewing the banner in the app to easily see its appearance\nif (self.inPreview) {\n    // reset the show delay while editing the banner in editor\n    PARAM_showAfter = 0;\n\n    // always show the banner right away\n    PARAM_trigger = 'On entry';\n}\n\n/**\n * Basic functions\n */\n\n\n/**\n * Function used to register listener for the trigger that will display the banner\n */\nfunction registerStartTrigger() {\n    if (PARAM_trigger === 'On exit') {\n        document.body.addEventListener('mouseout', onExitMouseOutHandler);\n    } else if (PARAM_trigger === 'On scroll') {\n        window.addEventListener('scroll', scheduleShowBanner);\n    } else {\n        // If 'On entry' or anything unknown start the banner right away\n        scheduleShowBanner();\n    }\n}\n\n/**\n * This function starts the showAfter timer and then displays the banner\n */\nfunction scheduleShowBanner() {\n    window.removeEventListener('scroll', scheduleShowBanner);\n\n    setTimeout(function() {\n        // Track show event after timer expired\n        trackEvent('show', false);\n\n        // Create and display the banner\n        requestAnimationFrame(createBanner);\n\n        // If removeAfter is provided start the removal timer\n        if (PARAM_removeAfter \u003e 0) {\n            setTimeout(function() {\n                removeBanner();\n            }, PARAM_removeAfter);\n        }\n    }, PARAM_showAfter);\n}\n\n/**\n * Function used to insert the banner contents into the HTML and adding basic functionality\n */\nfunction createBanner() {\n    var placeholder = document.createElement('div');\n    placeholder.insertAdjacentHTML('afterbegin', self.html);\n\n    // get the banner reference\n    var banner = placeholder.firstElementChild;\n\n    // add close functionality to the close button\n    //banner.querySelector('.close').onclick = handleCloseButtonClick;\n\n    // insert banner CSS into the website\n    banner.insertAdjacentHTML('afterbegin', '\u003cstyle\u003e' + self.style + '\u003c/style\u003e');\n\n    attachBannerToDom(banner);\n    const PopupManager = (() =\u003e {\n\t// Translations object with all supported languages\n\tconst translations = {\n\t\tEN: {\n\t\t\theader: \"Thank you for signing up [NAME]\",\n\t\t\tbody: \"Now, You're all set to receive our exclusive offers, invites to events, inspiration and more!\",\n\t\t\tcta: \"DISCOVER THE COLLECTION\",\n\t\t},\n\t\tUK: {\n\t\t\theader: \"Thank you for signing up [NAME]\",\n\t\t\tbody: \"Thank you for signing up [NAME]. Now, You're all set to receive our exclusive offers, invites to events, inspiration and more!\",\n\t\t\tcta: \"DISCOVER THE COLLECTION\",\n\t\t},\n\t\tNL: {\n\t\t\theader: \"Bedankt voor je aanmelding [NAME]\",\n\t\t\tbody: \"Bedankt voor je aanmelding, [NAAM]. Vanaf nu ontvang je onze exclusieve aanbiedingen, uitnodigingen voor evenementen, inspiratie en nog veel meer!\",\n\t\t\tcta: \"ONTDEK DE COLLECTIE\",\n\t\t},\n\t\tBENL: {\n\t\t\theader: \"Bedankt voor je aanmelding [NAME]\",\n\t\t\tbody: \"Bedankt voor je aanmelding, [NAAM]. Vanaf nu ontvang je onze exclusieve aanbiedingen, uitnodigingen voor evenementen, inspiratie en nog veel meer!\",\n\t\t\tcta: \"ONTDEK DE COLLECTIE\",\n\t\t},\n\t\tBEFR: {\n\t\t\theader: \"Bienvenue parmi nous, [NAME]!\",\n\t\t\tbody: \"À partir de maintenant, tu recevras nos offres exclusives, nos invitations et encore plus d'inspiration.\",\n\t\t\tcta: \"DÉCOUVRE LA COLLECTION\",\n\t\t},\n\t\tFR: {\n\t\t\theader: \"Bienvenue parmi nous, [NAME]!\",\n\t\t\tbody: \"À partir de maintenant, tu recevras nos offres exclusives, nos invitations et encore plus d'inspiration.\",\n\t\t\tcta: \"DÉCOUVRE LA COLLECTION\",\n\t\t},\n\t\tLU: {\n\t\t\theader: \"Bienvenue parmi nous, [NAME]!\",\n\t\t\tbody: \"À partir de maintenant, tu recevras nos offres exclusives, nos invitations et encore plus d'inspiration.\",\n\t\t\tcta: \"DÉCOUVRE LA COLLECTION\",\n\t\t},\n\t\tCHFR: {\n\t\t\theader: \"Bienvenue parmi nous, [NAME]!\",\n\t\t\tbody: \"À partir de maintenant, tu recevras nos offres exclusives, nos invitations et encore plus d'inspiration.\",\n\t\t\tcta: \"DÉCOUVRE LA COLLECTION\",\n\t\t},\n\t\tCHDE: {\n\t\t\theader: \"Danke für deine Anmeldung, [NAME]\",\n\t\t\tbody: \"Du bist jetzt bereit, unsere exklusiven Angebote, Event-Einladungen, Inspiration und vieles mehr zu erhalten!\",\n\t\t\tcta: \"ENTDECKE DIE KOLLECTION\",\n\t\t},\n\t\tDE: {\n\t\t\theader: \"Danke für deine Anmeldung, [NAME]\",\n\t\t\tbody: \"Du bist jetzt bereit, unsere exklusiven Angebote, Event-Einladungen, Inspiration und vieles mehr zu erhalten!\",\n\t\t\tcta: \"ENTDECKE DIE KOLLECTION\",\n\t\t},\n\t\tAT: {\n\t\t\theader: \"Danke für deine Anmeldung, [NAME]\",\n\t\t\tbody: \"Du bist jetzt bereit, unsere exklusiven Angebote, Event-Einladungen, Inspiration und vieles mehr zu erhalten!\",\n\t\t\tcta: \"ENTDECKE DIE KOLLECTION\",\n\t\t},\n\t\tDK: {\n\t\t\theader: \"Tak fordi du tilmeldte dig, [NAME]\",\n\t\t\tbody: \"Du er nu klar til at modtage vores eksklusive tilbud, invitationer til events, inspiration og meget mere!\",\n\t\t\tcta: \"SE VORES KOLLEKTION\",\n\t\t},\n\t\tES: {\n\t\t\theader: \"Gracias por suscribirte, [NAME]\",\n\t\t\tbody: \"¡Ya estás listo para recibir nuestras ofertas exclusivas, invitaciones a eventos, inspiración y mucho más!\",\n\t\t\tcta: \"DESCUBRE LA COLECCIÓN\",\n\t\t},\n\t\tSE: {\n\t\t\theader: \"Tack för att du anmälde dig, [NAME]\",\n\t\t\tbody: \"Nu är du redo att få våra exklusiva erbjudanden, inbjudningar till evenemang, inspiration och mycket mer!\",\n\t\t\tcta: \"SE VÅRT SORTIMENT\",\n\t\t},\n\t\tNO: {\n\t\t\theader: \"Takk for at du meldte deg på, [NAME]\",\n\t\t\tbody: \"Du er nå helt klar for å motta våre eksklusive tilbud, invitasjoner til arrangementer, inspirasjon og mye mer!\",\n\t\t\tcta: \"OPPDAG KOLLEKSJONEN\",\n\t\t},\n\t};\n\n\t// Translation utility functions\n\tconst getUrlParameter = (name) =\u003e {\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(name);\n\t};\n\t\n\tconst getFirstName = () =\u003e {\n\t\treturn getUrlParameter(\"fname\") || \"\";\n\t};\n\n\tconst getCurrentLanguage = () =\u003e {\n\t\tconst langParam = getUrlParameter(\"lang\");\n\t\tconst supportedLanguages = Object.keys(translations);\n\n\t\t// If no language parameter or unsupported language, default to EN\n\t\tif (!langParam || !supportedLanguages.includes(langParam.toUpperCase())) {\n\t\t\treturn \"EN\";\n\t\t}\n\n\t\treturn langParam.toUpperCase();\n\t};\n\n\tconst getTranslation = (language = null) =\u003e {\n\t\tconst lang = language || getCurrentLanguage();\n\t\treturn translations[lang] || translations[\"EN\"];\n\t};\n\n\tconst replaceNamePlaceholder = (text, name) =\u003e {\n\t\treturn text.replace(/\\[NAME\\]/g, name || \"there\");\n\t};\n\n\t// DOM elements\n\tconst elements = {\n\t\toverlay: null,\n\t\tcontainer: null,\n\t\theader: null,\n\t\tbody: null,\n\t\tcta: null,\n\t\tcloseBtn: null,\n\t\tshowBtn: null,\n\t};\n\n\t// Initialize DOM elements\n\tconst initializeElements = () =\u003e {\n\t\telements.overlay = document.getElementById(\"popupOverlay\");\n\t\telements.container = document.querySelector(\".popup-container\");\n\t\telements.header = document.getElementById(\"popupHeader\");\n\t\telements.body = document.getElementById(\"popupBody\");\n\t\telements.cta = document.getElementById(\"popupCta\");\n\t\telements.closeBtn = document.getElementById(\"closePopupBtn\");\n\t\telements.showBtn = document.getElementById(\"showPopupBtn\");\n\t};\n\n\t// Update popup content based on current language\n\tconst updatePopupContent = () =\u003e {\n\t\tconst translation = getTranslation();\n\t\tconst currentLang = getCurrentLanguage();\n\n\t\t// Update header with name placeholder replacement\n\t\telements.header.textContent = replaceNamePlaceholder(translation.header, getFirstName());\n\n\t\t// Update body text\n\t\telements.body.textContent = replaceNamePlaceholder(translation.body, getFirstName());\n\n\t\t// Update CTA button text\n\t\telements.cta.textContent = translation.cta;\n\n\t\t// Log current language for debugging\n\t\tconsole.log(`Popup displayed in: ${currentLang}`);\n\t};\n\n\t// Show popup with smooth animation\n\tconst showPopup = () =\u003e {\n\t\tif (!elements.overlay) return;\n\n\t\t// Update content before showing\n\t\tupdatePopupContent();\n\n\t\t// Show overlay\n\t\telements.overlay.style.display = \"flex\";\n\n\t\t// Trigger animation after a small delay\n\t\tsetTimeout(() =\u003e {\n\t\t\telements.overlay.classList.add(\"active\");\n\t\t}, 10);\n\n\t\t// Prevent body scroll\n\t\tdocument.body.style.overflow = \"hidden\";\n\t};\n\n\t// Hide popup with smooth animation\n\tconst hidePopup = () =\u003e {\n\t\tif (!elements.overlay) return;\n\n\t\t// Remove active class to trigger animation\n\t\telements.overlay.classList.remove(\"active\");\n\n\t\t// Hide overlay after animation completes\n\t\tsetTimeout(() =\u003e {\n\t\t\telements.overlay.style.display = \"none\";\n\t\t\t// Restore body scroll\n\t\t\tdocument.body.style.overflow = \"\";\n\t\t\ttrackEvent('show', false);\n\t\t}, 300);\n\t};\n\n\t// Handle click outside popup to close\n\tconst handleOverlayClick = (event) =\u003e {\n\t\tif (event.target === elements.overlay) {\n\t\t\thidePopup();\n\t\t}\n\t};\n\n\t// Handle escape key to close popup\n\tconst handleEscapeKey = (event) =\u003e {\n\t\tif (event.key === \"Escape\" \u0026\u0026 elements.overlay.classList.contains(\"active\")) {\n\t\t\thidePopup();\n\t\t}\n\t};\n\n\t// Initialize event listeners\n\tconst initializeEventListeners = () =\u003e {\n\t\t// Show popup button\n\t\tif (elements.showBtn) {\n\t\t\telements.showBtn.addEventListener(\"click\", showPopup);\n\t\t}\n\n\t\t// Close button\n\t\tif (elements.closeBtn) {\n\t\t\telements.closeBtn.addEventListener(\"click\", hidePopup);\n\t\t}\n\n\t\t// Click outside popup\n\t\tif (elements.overlay) {\n\t\t\telements.overlay.addEventListener(\"click\", handleOverlayClick);\n\t\t}\n\n\t\t// Escape key\n\t\tdocument.addEventListener(\"keydown\", handleEscapeKey);\n\n\t\t// CTA button click\n\t\tif (elements.cta) {\n\t\t\telements.cta.addEventListener(\"click\", () =\u003e {\n\t\t\t\tconsole.log(\"CTA button clicked!\");\n\t\t\t\ttrackEvent('continue', true)\n\t\t\t\t// Here you can add navigation logic or other actions\n\t\t\t\thidePopup();\n\t\t\t});\n\t\t}\n\t};\n\n\t// Public API\n\tconst popupAPI = {\n\t\tshow: showPopup,\n\t\thide: hidePopup,\n\t\tupdateContent: updatePopupContent,\n\t\tgetCurrentLanguage: getCurrentLanguage,\n\t\tgetTranslation: getTranslation,\n\t\tgetFirstName: getFirstName,\n\t\treplaceNamePlaceholder: replaceNamePlaceholder,\n\t\ttranslations: translations,\n\t};\n\n\t// Initialize when DOM is ready\n\tconst init = () =\u003e {\n\t\tif (document.readyState === \"loading\") {\n\t\t\tdocument.addEventListener(\"DOMContentLoaded\", () =\u003e {\n\t\t\t\tinitializeElements();\n\t\t\t\tinitializeEventListeners();\n\t\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t\t});\n\t\t} else {\n\t\t\tinitializeElements();\n\t\t\tinitializeEventListeners();\n\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t}\n\t};\n\n\t// Auto-initialize\n\tinit();\n\tpopupAPI.show()\n\n\treturn popupAPI;\n})();\n}\n\n/**\n * Function used to insert the banner HTML to the DOM\n * @param banner - html content of the banner\n */\nfunction attachBannerToDom(banner) {\n    var parentElement = document.querySelector(PARAM_parentElement);\n        parentElement.insertAdjacentElement('afterbegin', banner);\n        self.banner = banner;\n}\n\n/**\n * Creates banner in shadow dom\n * @param parentElement\n */\nfunction createBannerInShadowDom(banner, parentElement) {\n    var shadowHost = document.createElement('div');\n    shadowHost.innerHTML = getFontsImport();\n\n    var shadowRoot = shadowHost.attachShadow({ mode: 'open' });\n    shadowRoot.appendChild(banner);\n    parentElement.insertAdjacentElement('afterbegin', shadowHost);\n    self.banner = shadowHost;\n}\n\n/**\n * Function used to add fonts imports and font faces to element\n * The font import does not work inside shadow DOM, it has to be declared outside\n * @returns string - style tag with fonts import\n */\nfunction getFontsImport() {\n    var importsResult = self.style.match(/@import url\\([\"'].+?['\"]\\)/g);\n    var fontFacesResult = self.style.match(/@font-face( |\\n)*{(.|\\s)+?}/g);\n\n    var imports = importsResult \u0026\u0026 importsResult.length ? importsResult.join(';') : '';\n    var fontFaces = fontFacesResult \u0026\u0026 fontFacesResult.length ? fontFacesResult.join('') : '';\n    var fonts = (imports ? imports + ';' : '') + fontFaces;\n\n    return imports || fontFaces ? '\u003cstyle\u003e' + fonts + '\u003c/style\u003e' : '';\n}\n\n/**\n * Function used to remove the banner from the website\n */\nfunction removeBanner() {\n    if (self.banner \u0026\u0026 self.banner.parentNode) {\n        self.banner.parentNode.removeChild(self.banner);\n    }\n}\n\n/**\n * Function triggered when the closing button is clicked\n * @param event - browser click Event\n * @returns {boolean}\n */\nfunction handleCloseButtonClick(event) {\n    removeBanner();\n    trackEvent('close', true);\n\n    // Stop the click event propagation onto parent HTML elements\n    event.preventDefault();\n    if (event.stopPropagation) {\n        event.stopPropagation();\n    } else {\n        event.cancelBubble = true;\n    }\n\n    return false;\n}\n\n/**\n * Function used to track single action\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackEvent(action, interactive) {\n    if (action === 'show') {\n        trackAction('last_show');\n    }\n\n    if (interactive) {\n        trackAction('last_interaction')\n    }\n\n    self.sdk.track('banner', getEventProperties(action, interactive));\n}\n\n/**\n * Function used to add action tracking to element\n * @param link - element\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackLink(link, action, interactive) {\n    var linkClickHandler = function() {\n        if (interactive) {\n            trackAction('last_interaction');\n        }\n    }\n    link.addEventListener('click', linkClickHandler);\n\n    var eventData = getEventProperties(action, interactive);\n    eventData.link = link.href;\n    self.sdk.trackLink(link, 'banner', eventData);\n}\n\n/**\n * Default attributes tracked with every banner event\n * @param action - string\n * @param interactive - boolean\n * @returns object - object to be tracked\n */\nfunction getEventProperties(action, interactive) {\n    return {\n        action: action,\n        banner_id: self.data.banner_id,\n        banner_name: self.data.banner_name,\n        banner_type: self.data.banner_type,\n        variant_id: self.data.variant_id,\n        variant_name: self.data.variant_name,\n        variant_origin: self.data.contextual_personalization != null ? 'contextual personalisation' : 'ABtest',\n        interaction: interactive !== false,\n    };\n}\n\n/**\n * Function used to start banners with onExit trigger\n * @param event - browser mouse event\n */\nfunction onExitMouseOutHandler(event) {\n    event = event ? event : window.event;\n    var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    if (event.clientX \u003e= (vpWidth)) {\n        return;\n    }\n    if (event.clientY \u003e= 50) {\n        return;\n    }\n    var from = event.relatedTarget || event.toElement;\n\n    if (!from \u0026\u0026 !window['__exp_triggered-' + bannerSemiId]) {\n        window['__exp_triggered-' + bannerSemiId] = true;\n        scheduleShowBanner();\n    }\n}\n\n/**\n * Track an action with current time into localStorage if localStorage exists.\n * @param action - action name\n */\nfunction trackAction(action) {\n    if (!localStorageEnabled) {\n        return;\n    }\n\n    var actionKey = WEB_LAYER_EVENT_STORAGE_KEY_PREFIX + webLayerID + '_' + action;\n    window.localStorage.setItem(actionKey, new Date().valueOf().toString());\n}\n\n/**\n * Register the start trigger and return required removal function\n */\n\nregisterStartTrigger();\nreturn {\n    remove: removeBanner,\n};\n };\ninsertBanner.remove = (insertBanner.script.call(insertBanner) || {} ).remove;\ninsertBanner.contextual_personalization = {};\nreturn insertBanner;\n})({\"banner_id\": \"68a4738c62a4a9616a689bbd\", \"banner_name\": null, \"banner_type\": \"medium_rectangle\", \"banner_group\": \"\", \"variant_id\": 0, \"variant_name\": \"Variant A\"});","variables_target":null,"page_vars":[]},{"_id":"691c838a8b001899ca477f9d","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"?snooze-bf=true","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":false,"data":"return (function insertBanner(data) {\ninsertBanner.inPreview = false;\ninsertBanner.sdk = window.exponea;\ninsertBanner.data = data;\ninsertBanner.html = \"\u003c!-- Popup Overlay --\u003e\\n\u003cdiv id=\\\"popupOverlay\\\" class=\\\"br-popup-overlay\\\"\u003e\\n\\t\u003cdiv class=\\\"confirmation-popup-container\\\"\u003e\\n\\t\\t\u003c!-- Close button --\u003e\\n\\t\\t\u003cbutton id=\\\"closePopupBtn\\\" class=\\\"close-btn\\\" aria-label=\\\"Close popup\\\"\u003e\\n\\t\\t\\t\u003csvg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"\u003e\\n\\t\\t\\t\\t\u003cpath\\n\\t\\t\\t\\t\\td=\\\"M18 6L6 18M6 6L18 18\\\"\\n\\t\\t\\t\\t\\tstroke=\\\"currentColor\\\"\\n\\t\\t\\t\\t\\tstroke-width=\\\"2\\\"\\n\\t\\t\\t\\t\\tstroke-linecap=\\\"round\\\"\\n\\t\\t\\t\\t\\tstroke-linejoin=\\\"round\\\" /\u003e\\n\\t\\t\\t\u003c/svg\u003e\\n\\t\\t\u003c/button\u003e\\n\\n\\t\\t\u003c!-- Popup Content --\u003e\\n\\t\\t\u003cdiv class=\\\"popup-content\\\"\u003e\\n\\t\\t\\t\u003c!-- Image --\u003e\\n\\t\\t\\t\u003cdiv class=\\\"popup-image\\\"\u003e\\n\\t\\t\\t\\t\u003cimg\\n\\t\\t\\t\\t\\tsrc=\\\"https://brxcdn.com/eu2-app-storage/822c4ae8-d96c-11ef-b66c-469fe4cae743/media/original/4eabf244-7cfb-11f0-8f4b-3a0dc041ce11\\\"\\n\\t\\t\\t\\t\\talt=\\\"Hunkemoller Collection\\\"\\n\\t\\t\\t\\t\\tclass=\\\"collection-image\\\" /\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\n\\t\\t\\t\u003c!-- Header --\u003e\\n\\t\\t\\t\u003ch2 id=\\\"popupHeader\\\" class=\\\"popup-header\\\"\u003e\u003c/h2\u003e\\n\\n\\t\\t\\t\u003c!-- Body text --\u003e\\n\\t\\t\\t\u003cp id=\\\"popupBody\\\" class=\\\"popup-body\\\"\u003e\u003c/p\u003e\\n\\n\\t\\t\\t\u003c!-- CTA Button --\u003e\\n\\t\\t\\t\u003cbutton id=\\\"popupCta\\\" class=\\\"popup-cta\\\"\u003e\u003c/button\u003e\\n\\t\\t\u003c/div\u003e\\n\\t\u003c/div\u003e\\n\u003c/div\u003e\";\ninsertBanner.style = \"\\n/* Popup overlay with blur effect */\\n.br-popup-overlay {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\tbackground: rgba(0, 0, 0, 0.6);\\n\\tbackdrop-filter: blur(8px);\\n\\t-webkit-backdrop-filter: blur(8px);\\n\\tdisplay: none;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tz-index: 1000;\\n\\topacity: 0;\\n\\ttransition: opacity 0.3s ease;\\n}\\n\\n.br-popup-overlay.active {\\n\\tdisplay: flex;\\n\\topacity: 1;\\n}\\n\\n/* Popup container */\\n.confirmation-popup-container {\\n\\tbackground: white;\\n\\tborder-radius: 20px;\\n\\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\\n\\tmax-width: 450px;\\n\\twidth: 90%;\\n\\tmax-height: 90vh;\\n\\toverflow-y: auto;\\n\\tposition: relative;\\n\\ttransform: scale(0.8);\\n\\ttransition: transform 0.3s ease;\\n}\\n\\n.br-popup-overlay.active .confirmation-popup-container {\\n\\ttransform: scale(1);\\n}\\n\\n/* Close button */\\n.confirmation-popup-container .close-btn {\\n\\tall : unset;\\n\\tposition: absolute;\\n\\ttop: 5px;\\n\\tright: 10px;\\n\\tbackground: transparent;\\n\\tborder: none;\\n\\tborder-radius: 50%;\\n\\twidth: 40px;\\n\\theight: 40px;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tcursor: pointer;\\n\\ttransition: all 0.3s ease;\\n\\tz-index: 10;\\n\\tcolor: #333;\\n}\\n\\n/* Popup content */\\n.confirmation-popup-container .popup-content {\\n\\tpadding: 40px 30px 30px;\\n\\ttext-align: center;\\n}\\n\\n/* Popup image */\\n.confirmation-popup-container .popup-image {\\n\\tmargin-bottom: 25px;\\n}\\n\\n.confirmation-popup-container .collection-image {\\n\\twidth: 100%;\\n\\theight: auto;\\n\\tborder-radius: 12px;\\n\\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\\n}\\n\\n/* Popup header */\\n.confirmation-popup-container .popup-header {\\n\\tcolor: #333;\\n\\tfont-size: 24px;\\n\\tfont-weight: 700;\\n\\tmargin-bottom: 20px;\\n\\tline-height: 1.3;\\n}\\n\\n/* Popup body text */\\n.confirmation-popup-container .popup-body {\\n\\tcolor: #666;\\n\\tfont-size: 16px;\\n\\tline-height: 1.6;\\n\\tmargin-bottom: 30px;\\n\\tmax-width: 350px;\\n\\tmargin-left: auto;\\n\\tmargin-right: auto;\\n}\\n\\n/* CTA button */\\n.confirmation-popup-container .popup-cta {\\n\\tcolor: white;\\n\\tborder: none;\\n\\tpadding: 16px 32px;\\n\\tcursor: pointer;\\n\\ttext-transform: uppercase;\\n\\t\\n\\tfont-size: 13px;\\n    -webkit-appearance: none;\\n    border-radius: 5px;\\n    border: 1px solid #e81e75;\\n    min-width: 210px;\\n    letter-spacing: 1px;\\n    outline: 0;\\n    padding: 16px 15px 15px;\\n    color: #fff;\\n    background-color: #e81e75;\\n    font-family: Nunito, sans-serif;\\n    -moz-appearance: none;\\n    cursor: pointer;\\n    display: inline-block;\\n    text-align: center;\\n    vertical-align: top;\\n    text-transform: uppercase;\\n    text-decoration: none;\\n    font-weight: 700;\\n    line-height: 13px;\\n}\\n\\n.confirmation-popup-container .popup-cta:hover {\\n\\tbackground-color: #ed4b91;\\n    border-color: #ed4b91;\\n}\\n\\n.confirmation-popup-container .popup-cta:active {\\n\\ttransform: translateY(0);\\n}\\n\\n/* Responsive design */\\n@media (max-width: 768px) {\\n\\t.confirmation-popup-container .confirmation-popup-container {\\n\\t\\twidth: 95%;\\n\\t\\tmargin: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 30px 20px 25px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 14px;\\n\\t}\\n\\n\\t.confirmation-popup-container .close-btn {\\n\\t\\ttop: 5px;\\n\\t\\tright: 5px;\\n\\t\\twidth: 35px;\\n\\t\\theight: 35px;\\n\\t}\\n}\\n\\n@media (max-width: 480px) {\\n\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 25px 15px 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 18px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 13px;\\n\\t}\\n}\\n\";\ninsertBanner.script = function() { /**\n * Universal parameters\n */\nvar PARAM_showAfter = parseInt(\"0\", 10);\nvar PARAM_removeAfter = parseInt(\"0\", 10);\nvar PARAM_trigger = \"On entry\";\nvar PARAM_parentElement = \"body\";\n\n/**\n * Initialization\n */\nvar self = this;\n\nvar webLayerID = self.data.banner_id;\nvar WEB_LAYER_EVENT_STORAGE_KEY_PREFIX = \"__exponea_banner_event__\";\nvar localStorageEnabled = false;\ntry {\n    if (!window.localStorage) {\n        localStorageEnabled = false;\n    } else {\n        var key = \"__\" + webLayerID + \"_storage_test__\";\n        window.localStorage.setItem(key, key);\n        window.localStorage.removeItem(key);\n        localStorageEnabled = true;\n    }\n} catch (e) {\n    localStorageEnabled = false;\n}\n\n// Helper Id used to identify the banner on the website, not actual ID of the banner\nvar bannerSemiId = Math.random().toString(36).substring(5);\n\n// Used in onExit banners to mark if the banner was triggered already\nwindow['__exp_triggered-' + bannerSemiId] = false;\n\n// Resetting some of the parameters while previewing the banner in the app to easily see its appearance\nif (self.inPreview) {\n    // reset the show delay while editing the banner in editor\n    PARAM_showAfter = 0;\n\n    // always show the banner right away\n    PARAM_trigger = 'On entry';\n}\n\n/**\n * Basic functions\n */\n\n\n/**\n * Function used to register listener for the trigger that will display the banner\n */\nfunction registerStartTrigger() {\n    if (PARAM_trigger === 'On exit') {\n        document.body.addEventListener('mouseout', onExitMouseOutHandler);\n    } else if (PARAM_trigger === 'On scroll') {\n        window.addEventListener('scroll', scheduleShowBanner);\n    } else {\n        // If 'On entry' or anything unknown start the banner right away\n        scheduleShowBanner();\n    }\n}\n\n/**\n * This function starts the showAfter timer and then displays the banner\n */\nfunction scheduleShowBanner() {\n    window.removeEventListener('scroll', scheduleShowBanner);\n\n    setTimeout(function() {\n        // Track show event after timer expired\n        trackEvent('show', false);\n\n        // Create and display the banner\n        requestAnimationFrame(createBanner);\n\n        // If removeAfter is provided start the removal timer\n        if (PARAM_removeAfter \u003e 0) {\n            setTimeout(function() {\n                removeBanner();\n            }, PARAM_removeAfter);\n        }\n    }, PARAM_showAfter);\n}\n\n/**\n * Function used to insert the banner contents into the HTML and adding basic functionality\n */\nfunction createBanner() {\n    var placeholder = document.createElement('div');\n    placeholder.insertAdjacentHTML('afterbegin', self.html);\n\n    // get the banner reference\n    var banner = placeholder.firstElementChild;\n\n    // add close functionality to the close button\n    //banner.querySelector('.close').onclick = handleCloseButtonClick;\n\n    // insert banner CSS into the website\n    banner.insertAdjacentHTML('afterbegin', '\u003cstyle\u003e' + self.style + '\u003c/style\u003e');\n\n    attachBannerToDom(banner);\n    const PopupManager = (() =\u003e {\n\t// Translations object with all supported languages\n\tconst translations = {\n\t\tEN: {\n\t\t\theader: \"You’re snoozed until December 1st\",\n\t\t\tbody: \"We’re pausing your newsletters for now, but you can still shop all your favourites anytime.\",\n\t\t\tcta: \"Continue shopping\",\n\t\t},\n\t\tUK: {\n\t\t\theader: \"You’re snoozed until December 1st\",\n\t\t\tbody: \"We’re pausing your newsletters for now, but you can still shop all your favourites anytime.\",\n\t\t\tcta: \"Continue shopping\",\n\t\t},\n\t\tNL: {\n\t\t\theader: \"Je staat op snooze tot 1 december\",\n\t\t\tbody: \"We pauzeren je nieuwsbrieven voor nu, maar je kunt altijd blijven shoppen voor al je favorieten.\",\n\t\t\tcta: \"Verder shoppen\",\n\t\t},\n\t\tBENL: {\n\t\t\theader: \"Je staat op snooze tot 1 december\",\n\t\t\tbody: \"We pauzeren je nieuwsbrieven voor nu, maar je kunt altijd blijven shoppen voor al je favorieten.\",\n\t\t\tcta: \"Verder shoppen\",\n\t\t},\n\t\tBEFR: {\n\t\t\theader: \"Vous êtes en mode pause jusqu’au 1er décembre\",\n\t\t\tbody: \"Nous mettons vos newsletters en pause pour le moment, mais vous pouvez continuer à shopper vos favoris quand vous le souhaitez.\",\n\t\t\tcta: \"Continuer vos achats\",\n\t\t},\n\t\tFR: {\n\t\t\theader: \"Vous êtes en mode pause jusqu’au 1er décembre\",\n\t\t\tbody: \"Nous mettons vos newsletters en pause pour le moment, mais vous pouvez continuer à shopper vos favoris quand vous le souhaitez.\",\n\t\t\tcta: \"Continuer vos achats\",\n\t\t},\n\t\tLU: {\n\t\t\theader: \"Vous êtes en mode pause jusqu’au 1er décembre\",\n\t\t\tbody: \"Nous mettons vos newsletters en pause pour le moment, mais vous pouvez continuer à shopper vos favoris quand vous le souhaitez.\",\n\t\t\tcta: \"Continuer vos achats\",\n\t\t},\n\t\tCHFR: {\n\t\t\theader: \"Vous êtes en mode pause jusqu’au 1er décembre\",\n\t\t\tbody: \"Nous mettons vos newsletters en pause pour le moment, mais vous pouvez continuer à shopper vos favoris quand vous le souhaitez.\",\n\t\t\tcta: \"Continuer vos achats\",\n\t\t},\n\t\tCHDE: {\n\t\t\theader: \"Du bist bis zum 1. Dezember im Snooze-Modus\",\n\t\t\tbody: \"Wir pausieren deine Newsletter vorerst für dich – aber du kannst natürlich weiterhin deine Favoriten shoppen.\",\n\t\t\tcta: \"Weiter shoppen\",\n\t\t},\n\t\tDE: {\n\t\t\theader: \"Du bist bis zum 1. Dezember im Snooze-Modus\",\n\t\t\tbody: \"Wir pausieren deine Newsletter vorerst für dich – aber du kannst natürlich weiterhin deine Favoriten shoppen.\",\n\t\t\tcta: \"Weiter shoppen\",\n\t\t},\n\t\tAT: {\n\t\t\theader: \"Du bist bis zum 1. Dezember im Snooze-Modus\",\n\t\t\tbody: \"Wir pausieren deine Newsletter vorerst für dich – aber du kannst natürlich weiterhin deine Favoriten shoppen.\",\n\t\t\tcta: \"Weiter shoppen\",\n\t\t},\n\t\tDK: {\n\t\t\theader: \"Du er på snooze til 1. december\",\n\t\t\tbody: \"Vi sætter dine nyhedsbreve på pause for nu, men du kan stadig shoppe dine favoritter, når du har lyst.\",\n\t\t\tcta: \"Fortsæt med at shoppe\",\n\t\t},\n\t\tES: {\n\t\t\theader: \"Has activado la pausa hasta el 1 de diciembre\",\n\t\t\tbody: \"Pausamos tus newsletters por ahora, pero puedes seguir comprando tus favoritos cuando quieras.\",\n\t\t\tcta: \"Seguir comprando\",\n\t\t},\n\t\tSE: {\n\t\t\theader: \"Du är pausad till den 1 december\",\n\t\t\tbody: \"Vi pausar dina nyhetsbrev för tillfället,  men du kan fortfarande shoppa alla dina favoriter när du vill.\",\n\t\t\tcta: \"Fortsätt shoppa\",\n\t\t},\n\t\tNO: {\n\t\t\theader: \"Du er satt på pause til 1. desember\",\n\t\t\tbody: \"Vi pauser dine nyhetsbrev for nå, men du kan fortsatt handle favorittene dine når som helst.\",\n\t\t\tcta: \"Fortsett å handle\",\n\t\t},\n\t};\n\n\t// Translation utility functions\n\tconst getUrlParameter = (name) =\u003e {\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(name);\n\t};\n\t\n\tconst getFirstName = () =\u003e {\n\t\treturn getUrlParameter(\"fname\") || \"\";\n\t};\n\n\tconst getCurrentLanguage = () =\u003e {\n\t\tconst langParam = getUrlParameter(\"lang\");\n\t\tconst supportedLanguages = Object.keys(translations);\n\n\t\t// If no language parameter or unsupported language, default to EN\n\t\tif (!langParam || !supportedLanguages.includes(langParam.toUpperCase())) {\n\t\t\treturn \"EN\";\n\t\t}\n\n\t\treturn langParam.toUpperCase();\n\t};\n\n\tconst getTranslation = (language = null) =\u003e {\n\t\tconst lang = language || getCurrentLanguage();\n\t\treturn translations[lang] || translations[\"EN\"];\n\t};\n\n\tconst replaceNamePlaceholder = (text, name) =\u003e {\n\t\treturn text.replace(/\\[NAME\\]/g, name || \"there\");\n\t};\n\n\t// DOM elements\n\tconst elements = {\n\t\toverlay: null,\n\t\tcontainer: null,\n\t\theader: null,\n\t\tbody: null,\n\t\tcta: null,\n\t\tcloseBtn: null,\n\t\tshowBtn: null,\n\t};\n\n\t// Initialize DOM elements\n\tconst initializeElements = () =\u003e {\n\t\telements.overlay = document.getElementById(\"popupOverlay\");\n\t\telements.container = document.querySelector(\".popup-container\");\n\t\telements.header = document.getElementById(\"popupHeader\");\n\t\telements.body = document.getElementById(\"popupBody\");\n\t\telements.cta = document.getElementById(\"popupCta\");\n\t\telements.closeBtn = document.getElementById(\"closePopupBtn\");\n\t\telements.showBtn = document.getElementById(\"showPopupBtn\");\n\t};\n\n\t// Update popup content based on current language\n\tconst updatePopupContent = () =\u003e {\n\t\tconst translation = getTranslation();\n\t\tconst currentLang = getCurrentLanguage();\n\n\t\t// Update header with name placeholder replacement\n\t\telements.header.textContent = replaceNamePlaceholder(translation.header, getFirstName());\n\n\t\t// Update body text\n\t\telements.body.textContent = replaceNamePlaceholder(translation.body, getFirstName());\n\n\t\t// Update CTA button text\n\t\telements.cta.textContent = translation.cta;\n\n\t\t// Log current language for debugging\n\t\tconsole.log(`Popup displayed in: ${currentLang}`);\n\t};\n\n\t// Show popup with smooth animation\n\tconst showPopup = () =\u003e {\n\t\tif (!elements.overlay) return;\n\n\t\t// Update content before showing\n\t\tupdatePopupContent();\n\n\t\t// Show overlay\n\t\telements.overlay.style.display = \"flex\";\n\n\t\t// Trigger animation after a small delay\n\t\tsetTimeout(() =\u003e {\n\t\t\telements.overlay.classList.add(\"active\");\n\t\t}, 10);\n\n\t\t// Prevent body scroll\n\t\tdocument.body.style.overflow = \"hidden\";\n\t};\n\n\t// Hide popup with smooth animation\n\tconst hidePopup = () =\u003e {\n\t\tif (!elements.overlay) return;\n\n\t\t// Remove active class to trigger animation\n\t\telements.overlay.classList.remove(\"active\");\n\n\t\t// Hide overlay after animation completes\n\t\tsetTimeout(() =\u003e {\n\t\t\telements.overlay.style.display = \"none\";\n\t\t\t// Restore body scroll\n\t\t\tdocument.body.style.overflow = \"\";\n\t\t\ttrackEvent('show', false);\n\t\t}, 300);\n\t};\n\n\t// Handle click outside popup to close\n\tconst handleOverlayClick = (event) =\u003e {\n\t\tif (event.target === elements.overlay) {\n\t\t\thidePopup();\n\t\t}\n\t};\n\n\t// Handle escape key to close popup\n\tconst handleEscapeKey = (event) =\u003e {\n\t\tif (event.key === \"Escape\" \u0026\u0026 elements.overlay.classList.contains(\"active\")) {\n\t\t\thidePopup();\n\t\t}\n\t};\n\n\t// Initialize event listeners\n\tconst initializeEventListeners = () =\u003e {\n\t\t// Show popup button\n\t\tif (elements.showBtn) {\n\t\t\telements.showBtn.addEventListener(\"click\", showPopup);\n\t\t}\n\n\t\t// Close button\n\t\tif (elements.closeBtn) {\n\t\t\telements.closeBtn.addEventListener(\"click\", hidePopup);\n\t\t}\n\n\t\t// Click outside popup\n\t\tif (elements.overlay) {\n\t\t\telements.overlay.addEventListener(\"click\", handleOverlayClick);\n\t\t}\n\n\t\t// Escape key\n\t\tdocument.addEventListener(\"keydown\", handleEscapeKey);\n\n\t\t// CTA button click\n\t\tif (elements.cta) {\n\t\t\telements.cta.addEventListener(\"click\", () =\u003e {\n\t\t\t\tconsole.log(\"CTA button clicked!\");\n\t\t\t\ttrackEvent('continue', true)\n\t\t\t\t// Here you can add navigation logic or other actions\n\t\t\t\thidePopup();\n\t\t\t});\n\t\t}\n\t};\n\n\t// Public API\n\tconst popupAPI = {\n\t\tshow: showPopup,\n\t\thide: hidePopup,\n\t\tupdateContent: updatePopupContent,\n\t\tgetCurrentLanguage: getCurrentLanguage,\n\t\tgetTranslation: getTranslation,\n\t\tgetFirstName: getFirstName,\n\t\treplaceNamePlaceholder: replaceNamePlaceholder,\n\t\ttranslations: translations,\n\t};\n\n\t// Initialize when DOM is ready\n\tconst init = () =\u003e {\n\t\tif (document.readyState === \"loading\") {\n\t\t\tdocument.addEventListener(\"DOMContentLoaded\", () =\u003e {\n\t\t\t\tinitializeElements();\n\t\t\t\tinitializeEventListeners();\n\t\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t\t});\n\t\t} else {\n\t\t\tinitializeElements();\n\t\t\tinitializeEventListeners();\n\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t}\n\t};\n\n\t// Auto-initialize\n\tinit();\n\tpopupAPI.show()\n\n\treturn popupAPI;\n})();\n}\n\n/**\n * Function used to insert the banner HTML to the DOM\n * @param banner - html content of the banner\n */\nfunction attachBannerToDom(banner) {\n    var parentElement = document.querySelector(PARAM_parentElement);\n        parentElement.insertAdjacentElement('afterbegin', banner);\n        self.banner = banner;\n}\n\n/**\n * Creates banner in shadow dom\n * @param parentElement\n */\nfunction createBannerInShadowDom(banner, parentElement) {\n    var shadowHost = document.createElement('div');\n    shadowHost.innerHTML = getFontsImport();\n\n    var shadowRoot = shadowHost.attachShadow({ mode: 'open' });\n    shadowRoot.appendChild(banner);\n    parentElement.insertAdjacentElement('afterbegin', shadowHost);\n    self.banner = shadowHost;\n}\n\n/**\n * Function used to add fonts imports and font faces to element\n * The font import does not work inside shadow DOM, it has to be declared outside\n * @returns string - style tag with fonts import\n */\nfunction getFontsImport() {\n    var importsResult = self.style.match(/@import url\\([\"'].+?['\"]\\)/g);\n    var fontFacesResult = self.style.match(/@font-face( |\\n)*{(.|\\s)+?}/g);\n\n    var imports = importsResult \u0026\u0026 importsResult.length ? importsResult.join(';') : '';\n    var fontFaces = fontFacesResult \u0026\u0026 fontFacesResult.length ? fontFacesResult.join('') : '';\n    var fonts = (imports ? imports + ';' : '') + fontFaces;\n\n    return imports || fontFaces ? '\u003cstyle\u003e' + fonts + '\u003c/style\u003e' : '';\n}\n\n/**\n * Function used to remove the banner from the website\n */\nfunction removeBanner() {\n    if (self.banner \u0026\u0026 self.banner.parentNode) {\n        self.banner.parentNode.removeChild(self.banner);\n    }\n}\n\n/**\n * Function triggered when the closing button is clicked\n * @param event - browser click Event\n * @returns {boolean}\n */\nfunction handleCloseButtonClick(event) {\n    removeBanner();\n    trackEvent('close', true);\n\n    // Stop the click event propagation onto parent HTML elements\n    event.preventDefault();\n    if (event.stopPropagation) {\n        event.stopPropagation();\n    } else {\n        event.cancelBubble = true;\n    }\n\n    return false;\n}\n\n/**\n * Function used to track single action\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackEvent(action, interactive) {\n    if (action === 'show') {\n        trackAction('last_show');\n    }\n\n    if (interactive) {\n        trackAction('last_interaction')\n    }\n\n    self.sdk.track('banner', getEventProperties(action, interactive));\n}\n\n/**\n * Function used to add action tracking to element\n * @param link - element\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackLink(link, action, interactive) {\n    var linkClickHandler = function() {\n        if (interactive) {\n            trackAction('last_interaction');\n        }\n    }\n    link.addEventListener('click', linkClickHandler);\n\n    var eventData = getEventProperties(action, interactive);\n    eventData.link = link.href;\n    self.sdk.trackLink(link, 'banner', eventData);\n}\n\n/**\n * Default attributes tracked with every banner event\n * @param action - string\n * @param interactive - boolean\n * @returns object - object to be tracked\n */\nfunction getEventProperties(action, interactive) {\n    return {\n        action: action,\n        banner_id: self.data.banner_id,\n        banner_name: self.data.banner_name,\n        banner_type: self.data.banner_type,\n        variant_id: self.data.variant_id,\n        variant_name: self.data.variant_name,\n        variant_origin: self.data.contextual_personalization != null ? 'contextual personalisation' : 'ABtest',\n        interaction: interactive !== false,\n    };\n}\n\n/**\n * Function used to start banners with onExit trigger\n * @param event - browser mouse event\n */\nfunction onExitMouseOutHandler(event) {\n    event = event ? event : window.event;\n    var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n    if (event.clientX \u003e= (vpWidth)) {\n        return;\n    }\n    if (event.clientY \u003e= 50) {\n        return;\n    }\n    var from = event.relatedTarget || event.toElement;\n\n    if (!from \u0026\u0026 !window['__exp_triggered-' + bannerSemiId]) {\n        window['__exp_triggered-' + bannerSemiId] = true;\n        scheduleShowBanner();\n    }\n}\n\n/**\n * Track an action with current time into localStorage if localStorage exists.\n * @param action - action name\n */\nfunction trackAction(action) {\n    if (!localStorageEnabled) {\n        return;\n    }\n\n    var actionKey = WEB_LAYER_EVENT_STORAGE_KEY_PREFIX + webLayerID + '_' + action;\n    window.localStorage.setItem(actionKey, new Date().valueOf().toString());\n}\n\n/**\n * Register the start trigger and return required removal function\n */\n\nregisterStartTrigger();\nreturn {\n    remove: removeBanner,\n};\n };\ninsertBanner.remove = (insertBanner.script.call(insertBanner) || {} ).remove;\ninsertBanner.contextual_personalization = {};\nreturn insertBanner;\n})({\"banner_id\": \"691c838a8b001899ca477f9d\", \"banner_name\": null, \"banner_type\": \"medium_rectangle\", \"banner_group\": \"\", \"variant_id\": 0, \"variant_name\": \"Variant A\"});","variables_target":null,"page_vars":[]},{"_id":"69bbceb14af908070b27e126","date_filter":{"enabled":false,"from_date":null,"to_date":null},"trigger":{"include_pages":[{"url":"show-mothers-day-confirmation=true\u0026consent_page_link=","type":"contains"}],"exclude_pages":null},"device_target":{"type":"any"},"frequency":"always","uses_personalization":false,"data":"return (function insertBanner(data) {\ninsertBanner.inPreview = false;\ninsertBanner.sdk = window.exponea;\ninsertBanner.data = data;\ninsertBanner.html = \"\u003c!-- Popup Overlay --\u003e\\n\u003cdiv id=\\\"popupOverlay\\\" class=\\\"br-popup-overlay\\\"\u003e\\n\\t\u003cdiv class=\\\"confirmation-popup-container\\\"\u003e\\n\\t\\t\u003c!-- Close button --\u003e\\n\\t\\t\u003cbutton id=\\\"closePopupBtn\\\" class=\\\"close-btn\\\" aria-label=\\\"Close popup\\\"\u003e\\n\\t\\t\\t\u003csvg width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"\u003e\\n\\t\\t\\t\\t\u003cpath\\n\\t\\t\\t\\t\\td=\\\"M18 6L6 18M6 6L18 18\\\"\\n\\t\\t\\t\\t\\tstroke=\\\"currentColor\\\"\\n\\t\\t\\t\\t\\tstroke-width=\\\"2\\\"\\n\\t\\t\\t\\t\\tstroke-linecap=\\\"round\\\"\\n\\t\\t\\t\\t\\tstroke-linejoin=\\\"round\\\" /\u003e\\n\\t\\t\\t\u003c/svg\u003e\\n\\t\\t\u003c/button\u003e\\n\\n\\t\\t\u003c!-- Popup Content --\u003e\\n\\t\\t\u003cdiv class=\\\"popup-content\\\"\u003e\\n\\t\\t\\t\u003c!-- Image --\u003e\\n\\t\\t\\t\u003cdiv class=\\\"popup-image\\\"\u003e\\n\\t\\t\\t\\t\u003cimg\\n\\t\\t\\t\\t\\tsrc=\\\"https://brxcdn.com/eu2-app-storage/822c4ae8-d96c-11ef-b66c-469fe4cae743/media/original/4eabf244-7cfb-11f0-8f4b-3a0dc041ce11\\\"\\n\\t\\t\\t\\t\\talt=\\\"Hunkemoller Collection\\\"\\n\\t\\t\\t\\t\\tclass=\\\"collection-image\\\" /\u003e\\n\\t\\t\\t\u003c/div\u003e\\n\\n\\t\\t\\t\u003c!-- Header --\u003e\\n\\t\\t\\t\u003ch2 id=\\\"popupHeader\\\" class=\\\"popup-header\\\"\u003e\u003c/h2\u003e\\n\\n\\t\\t\\t\u003c!-- Body text --\u003e\\n\\t\\t\\t\u003cp id=\\\"popupBody\\\" class=\\\"popup-body\\\"\u003e\u003c/p\u003e\\n\\n\\t\\t\\t\u003c!-- CTA Button --\u003e\\n\\t\\t\\t\u003cbutton id=\\\"popupCta\\\" class=\\\"popup-cta\\\"\u003e\u003c/button\u003e\\n\\t\\t\u003c/div\u003e\\n\\t\u003c/div\u003e\\n\u003c/div\u003e\\n\";\ninsertBanner.style = \"/* Popup overlay with blur effect */\\n.br-popup-overlay {\\n\\tposition: fixed;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\twidth: 100%;\\n\\theight: 100%;\\n\\tbackground: rgba(0, 0, 0, 0.6);\\n\\tbackdrop-filter: blur(8px);\\n\\t-webkit-backdrop-filter: blur(8px);\\n\\tdisplay: none;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tz-index: 100000;\\n\\topacity: 0;\\n\\ttransition: opacity 0.3s ease;\\n}\\n\\n.br-popup-overlay.active {\\n\\tdisplay: flex;\\n\\topacity: 1;\\n}\\n\\n/* Popup container */\\n.confirmation-popup-container {\\n\\tbackground: white;\\n\\tborder-radius: 20px;\\n\\tbox-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\\n\\tmax-width: 450px;\\n\\twidth: 90%;\\n\\tmax-height: 90vh;\\n\\toverflow-y: auto;\\n\\tposition: relative;\\n\\ttransform: scale(0.8);\\n\\ttransition: transform 0.3s ease;\\n}\\n\\n.br-popup-overlay.active .confirmation-popup-container {\\n\\ttransform: scale(1);\\n}\\n\\n/* Close button */\\n.confirmation-popup-container .close-btn {\\n\\tall: unset;\\n\\tposition: absolute;\\n\\ttop: 5px;\\n\\tright: 10px;\\n\\tbackground: transparent;\\n\\tborder: none;\\n\\tborder-radius: 50%;\\n\\twidth: 40px;\\n\\theight: 40px;\\n\\tdisplay: flex;\\n\\talign-items: center;\\n\\tjustify-content: center;\\n\\tcursor: pointer;\\n\\ttransition: all 0.3s ease;\\n\\tz-index: 10;\\n\\tcolor: #333;\\n}\\n\\n/* Popup content */\\n.confirmation-popup-container .popup-content {\\n\\tpadding: 40px 30px 30px;\\n\\ttext-align: center;\\n}\\n\\n/* Popup image */\\n.confirmation-popup-container .popup-image {\\n\\tmargin-bottom: 25px;\\n}\\n\\n.confirmation-popup-container .collection-image {\\n\\twidth: 100%;\\n\\theight: auto;\\n\\tborder-radius: 12px;\\n\\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);\\n}\\n\\n/* Popup header */\\n.confirmation-popup-container .popup-header {\\n\\tcolor: #333;\\n\\tfont-size: 24px;\\n\\tfont-weight: 700;\\n\\tmargin-bottom: 20px;\\n\\tline-height: 1.3;\\n}\\n\\n/* Popup body text */\\n.confirmation-popup-container .popup-body {\\n\\tcolor: #666;\\n\\tfont-size: 16px;\\n\\tline-height: 1.6;\\n\\tmargin-bottom: 30px;\\n\\tmax-width: 350px;\\n\\tmargin-left: auto;\\n\\tmargin-right: auto;\\n}\\n\\n/* Resubscribe link */\\n.confirmation-popup-container .resubscribe-link {\\n\\tcolor: #e81e75;\\n\\ttext-decoration: underline;\\n}\\n\\n/* CTA button */\\n.confirmation-popup-container .popup-cta {\\n\\tcolor: white;\\n\\tborder: none;\\n\\tpadding: 16px 32px;\\n\\tcursor: pointer;\\n\\ttext-transform: uppercase;\\n\\n\\tfont-size: 13px;\\n\\t-webkit-appearance: none;\\n\\tborder-radius: 5px;\\n\\tborder: 1px solid #e81e75;\\n\\tmin-width: 210px;\\n\\tletter-spacing: 1px;\\n\\toutline: 0;\\n\\tpadding: 16px 15px 15px;\\n\\tcolor: #fff;\\n\\tbackground-color: #e81e75;\\n\\tfont-family: Nunito, sans-serif;\\n\\t-moz-appearance: none;\\n\\tcursor: pointer;\\n\\tdisplay: inline-block;\\n\\ttext-align: center;\\n\\tvertical-align: top;\\n\\ttext-transform: uppercase;\\n\\ttext-decoration: none;\\n\\tfont-weight: 700;\\n\\tline-height: 13px;\\n}\\n\\n.confirmation-popup-container .popup-cta:hover {\\n\\tbackground-color: #ed4b91;\\n\\tborder-color: #ed4b91;\\n}\\n\\n.confirmation-popup-container .popup-cta:active {\\n\\ttransform: translateY(0);\\n}\\n\\n/* Responsive design */\\n@media (max-width: 768px) {\\n\\t.confirmation-popup-container .confirmation-popup-container {\\n\\t\\twidth: 95%;\\n\\t\\tmargin: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 30px 20px 25px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 14px;\\n\\t}\\n\\n\\t.confirmation-popup-container .close-btn {\\n\\t\\ttop: 5px;\\n\\t\\tright: 5px;\\n\\t\\twidth: 35px;\\n\\t\\theight: 35px;\\n\\t}\\n}\\n\\n@media (max-width: 480px) {\\n\\t.confirmation-popup-container .popup-content {\\n\\t\\tpadding: 25px 15px 20px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-header {\\n\\t\\tfont-size: 18px;\\n\\t}\\n\\n\\t.confirmation-popup-container .popup-body {\\n\\t\\tfont-size: 13px;\\n\\t}\\n}\\n\";\ninsertBanner.script = function() { /**\n * Universal parameters\n */\nvar PARAM_showAfter = parseInt(\n\t\"0\",\n\t10,\n);\nvar PARAM_removeAfter = parseInt(\n\t\"0\",\n\t10,\n);\nvar PARAM_trigger =\n\t\"On entry\";\nvar PARAM_parentElement =\n\t\"body\";\n\n/**\n * Initialization\n */\nvar self = this;\n\nvar webLayerID = self.data.banner_id;\nvar WEB_LAYER_EVENT_STORAGE_KEY_PREFIX = \"__exponea_banner_event__\";\nvar localStorageEnabled = false;\ntry {\n\tif (!window.localStorage) {\n\t\tlocalStorageEnabled = false;\n\t} else {\n\t\tvar key = \"__\" + webLayerID + \"_storage_test__\";\n\t\twindow.localStorage.setItem(key, key);\n\t\twindow.localStorage.removeItem(key);\n\t\tlocalStorageEnabled = true;\n\t}\n} catch (e) {\n\tlocalStorageEnabled = false;\n}\n\n// Helper Id used to identify the banner on the website, not actual ID of the banner\nvar bannerSemiId = Math.random().toString(36).substring(5);\n\n// Used in onExit banners to mark if the banner was triggered already\nwindow[\"__exp_triggered-\" + bannerSemiId] = false;\n\n// Resetting some of the parameters while previewing the banner in the app to easily see its appearance\nif (self.inPreview) {\n\t// reset the show delay while editing the banner in editor\n\tPARAM_showAfter = 0;\n\n\t// always show the banner right away\n\tPARAM_trigger = \"On entry\";\n}\n\n/**\n * Basic functions\n */\n\n/**\n * Function used to register listener for the trigger that will display the banner\n */\nfunction registerStartTrigger() {\n\tif (PARAM_trigger === \"On exit\") {\n\t\tdocument.body.addEventListener(\"mouseout\", onExitMouseOutHandler);\n\t} else if (PARAM_trigger === \"On scroll\") {\n\t\twindow.addEventListener(\"scroll\", scheduleShowBanner);\n\t} else {\n\t\t// If 'On entry' or anything unknown start the banner right away\n\t\tscheduleShowBanner();\n\t}\n}\n\n/**\n * This function starts the showAfter timer and then displays the banner\n */\nfunction scheduleShowBanner() {\n\twindow.removeEventListener(\"scroll\", scheduleShowBanner);\n\n\tsetTimeout(function () {\n\t\t// Track show event after timer expired\n\t\ttrackEvent(\"show\", false);\n\n\t\t// Create and display the banner\n\t\trequestAnimationFrame(createBanner);\n\n\t\t// If removeAfter is provided start the removal timer\n\t\tif (PARAM_removeAfter \u003e 0) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tremoveBanner();\n\t\t\t}, PARAM_removeAfter);\n\t\t}\n\t}, PARAM_showAfter);\n}\n\n/**\n * Function used to insert the banner contents into the HTML and adding basic functionality\n */\nfunction createBanner() {\n\tvar placeholder = document.createElement(\"div\");\n\tplaceholder.insertAdjacentHTML(\"afterbegin\", self.html);\n\n\t// get the banner reference\n\tvar banner = placeholder.firstElementChild;\n\n\t// add close functionality to the close button\n\tbanner.querySelector(\"#closePopupBtn\").onclick = handleCloseButtonClick;\n\n\t// insert banner CSS into the website\n\tbanner.insertAdjacentHTML(\"afterbegin\", \"\u003cstyle\u003e\" + self.style + \"\u003c/style\u003e\");\n\n\tattachBannerToDom(banner);\n\tconst PopupManager = (() =\u003e {\n\t\t// Translations object with all supported languages\n\t\tconst translations = {\n\t\t\tEN: {\n\t\t\t\theader: \"You've been unsubscribed from our Mother's Day emails.\",\n\t\t\t\tbody: \"But don't worry - we'll still keep you updated on the latest news, new arrivals, and exclusive offers. You just won't receive emails about Mother's Day anymore. Did you unsubscribe by accident and still want to receive Mother's Day emails from us? You can subscribe again [LINK].\",\n\t\t\t\tlinkText: \"here\",\n\t\t\t\tcta: \"Continue shopping\",\n\t\t\t},\n\t\t\tUK: {\n\t\t\t\theader: \"You've been unsubscribed from our Mother's Day emails.\",\n\t\t\t\tbody: \"But don't worry - we'll still keep you updated on the latest news, new arrivals, and exclusive offers. You just won't receive emails about Mother's Day anymore. Did you unsubscribe by accident and still want to receive Mother's Day emails from us? You can subscribe again [LINK].\",\n\t\t\t\tlinkText: \"here\",\n\t\t\t\tcta: \"Continue shopping\",\n\t\t\t},\n\t\t\tNL: {\n\t\t\t\theader: \"Je bent uitgeschreven voor onze Moederdag e-mails.\",\n\t\t\t\tbody: \"Maar geen zorgen – we houden je nog steeds op de hoogte van het laatste nieuws, nieuwe collecties en exclusieve aanbiedingen. Je ontvangt alleen geen e-mails meer over Moederdag. Heb je je per ongeluk uitgeschreven en wil je toch weer Moederdag e-mails van ons ontvangen? Dan kun je je [LINK] opnieuw inschrijven.\",\n\t\t\t\tlinkText: \"hier\",\n\t\t\t\tcta: \"Verder shoppen\",\n\t\t\t},\n\t\t\tBENL: {\n\t\t\t\theader: \"Je bent uitgeschreven voor onze Moederdag e-mails.\",\n\t\t\t\tbody: \"Maar geen zorgen – we houden je nog steeds op de hoogte van het laatste nieuws, nieuwe collecties en exclusieve aanbiedingen. Je ontvangt alleen geen e-mails meer over Moederdag. Heb je je per ongeluk uitgeschreven en wil je toch weer Moederdag e-mails van ons ontvangen? Dan kun je je [LINK] opnieuw inschrijven.\",\n\t\t\t\tlinkText: \"hier\",\n\t\t\t\tcta: \"Verder shoppen\",\n\t\t\t},\n\t\t\tBEFR: {\n\t\t\t\theader: \"Vous avez été désinscrit(e) de nos e\\u2011mails pour la Fête des Mères.\",\n\t\t\t\tbody: \"Mais pas d'inquiétude, vous continuerez à recevoir nos dernières actualités, nouveautés et offres exclusives. Vous ne recevrez simplement plus d'e\\u2011mails concernant la Fête des Mères. Vous vous êtes désinscrit(e) par erreur et souhaitez toujours recevoir nos e\\u2011mails pour la Fête des Mères ? Vous pouvez vous réabonner [LINK].\",\n\t\t\t\tlinkText: \"ici\",\n\t\t\t\tcta: \"Continuer vos achats\",\n\t\t\t},\n\t\t\tFR: {\n\t\t\t\theader: \"Vous avez été désinscrit(e) de nos e\\u2011mails pour la Fête des Mères.\",\n\t\t\t\tbody: \"Mais pas d'inquiétude, vous continuerez à recevoir nos dernières actualités, nouveautés et offres exclusives. Vous ne recevrez simplement plus d'e\\u2011mails concernant la Fête des Mères. Vous vous êtes désinscrit(e) par erreur et souhaitez toujours recevoir nos e\\u2011mails pour la Fête des Mères ? Vous pouvez vous réabonner [LINK].\",\n\t\t\t\tlinkText: \"ici\",\n\t\t\t\tcta: \"Continuer vos achats\",\n\t\t\t},\n\t\t\tLU: {\n\t\t\t\theader: \"Vous avez été désinscrit(e) de nos e\\u2011mails pour la Fête des Mères.\",\n\t\t\t\tbody: \"Mais pas d'inquiétude, vous continuerez à recevoir nos dernières actualités, nouveautés et offres exclusives. Vous ne recevrez simplement plus d'e\\u2011mails concernant la Fête des Mères. Vous vous êtes désinscrit(e) par erreur et souhaitez toujours recevoir nos e\\u2011mails pour la Fête des Mères ? Vous pouvez vous réabonner [LINK].\",\n\t\t\t\tlinkText: \"ici\",\n\t\t\t\tcta: \"Continuer vos achats\",\n\t\t\t},\n\t\t\tCHFR: {\n\t\t\t\theader: \"Vous avez été désinscrit(e) de nos e\\u2011mails pour la Fête des Mères.\",\n\t\t\t\tbody: \"Mais pas d'inquiétude, vous continuerez à recevoir nos dernières actualités, nouveautés et offres exclusives. Vous ne recevrez simplement plus d'e\\u2011mails concernant la Fête des Mères. Vous vous êtes désinscrit(e) par erreur et souhaitez toujours recevoir nos e\\u2011mails pour la Fête des Mères ? Vous pouvez vous réabonner [LINK].\",\n\t\t\t\tlinkText: \"ici\",\n\t\t\t\tcta: \"Continuer vos achats\",\n\t\t\t},\n\t\t\tCHDE: {\n\t\t\t\theader: \"Du wurdest erfolgreich von unseren Muttertags-E-Mails abgemeldet.\",\n\t\t\t\tbody: \"Keine Sorge – wir halten dich natürlich weiterhin über die neuesten Trends, Neuheiten und exklusiven Angebote auf dem Laufenden. Du erhältst lediglich keine E-Mails mehr zum Thema Muttertag. War das ein Versehen und du möchtest doch E-Mails zum Muttertag erhalten? [LINK] kannst du dich wieder anmelden.\",\n\t\t\t\tlinkText: \"Hier\",\n\t\t\t\tcta: \"Weiter shoppen\",\n\t\t\t},\n\t\t\tDE: {\n\t\t\t\theader: \"Du wurdest erfolgreich von unseren Muttertags-E-Mails abgemeldet.\",\n\t\t\t\tbody: \"Keine Sorge – wir halten dich natürlich weiterhin über die neuesten Trends, Neuheiten und exklusiven Angebote auf dem Laufenden. Du erhältst lediglich keine E-Mails mehr zum Thema Muttertag. War das ein Versehen und du möchtest doch E-Mails zum Muttertag erhalten? [LINK] kannst du dich wieder anmelden.\",\n\t\t\t\tlinkText: \"Hier\",\n\t\t\t\tcta: \"Weiter shoppen\",\n\t\t\t},\n\t\t\tAT: {\n\t\t\t\theader: \"Du wurdest erfolgreich von unseren Muttertags-E-Mails abgemeldet.\",\n\t\t\t\tbody: \"Keine Sorge – wir halten dich natürlich weiterhin über die neuesten Trends, Neuheiten und exklusiven Angebote auf dem Laufenden. Du erhältst lediglich keine E-Mails mehr zum Thema Muttertag. War das ein Versehen und du möchtest doch E-Mails zum Muttertag erhalten? [LINK] kannst du dich wieder anmelden.\",\n\t\t\t\tlinkText: \"Hier\",\n\t\t\t\tcta: \"Weiter shoppen\",\n\t\t\t},\n\t\t\tDK: {\n\t\t\t\theader: \"Du er blevet afmeldt vores Mors Dag-mails.\",\n\t\t\t\tbody: \"Men bare rolig – vi holder dig stadig opdateret med de seneste nyheder, nye kollektioner og eksklusive tilbud. Du vil bare ikke længere modtage e-mails om Mors Dag. Har du afmeldt dig ved en fejl og vil stadig gerne modtage Mors Dag-mails fra oss? Du kan tilmelde dig igen [LINK].\",\n\t\t\t\tlinkText: \"her\",\n\t\t\t\tcta: \"Fortsæt med at shoppe\",\n\t\t\t},\n\t\t\tES: {\n\t\t\t\theader: \"Te has dado de baja de nuestros correos del Día de la Madre.\",\n\t\t\t\tbody: \"Pero no te preocupes, te mantendremos al día con las últimas noticias, novedades y ofertas exclusivas. Simplemente dejarás de recibir correos específicos sobre el Día de la Madre. ¿Te has dado de baja por error y todavía quieres recibir nuestros emails del Día de la Madre? Puedes volver a suscribirte [LINK].\",\n\t\t\t\tlinkText: \"aquí\",\n\t\t\t\tcta: \"Seguir comprando\",\n\t\t\t},\n\t\t\tSE: {\n\t\t\t\theader: \"Du har avregistrerat dig från våra mors dag-mejl.\",\n\t\t\t\tbody: \"Men bara rolig – vi kommer fortfarande att hålla dig uppdaterad om de senaste nyheterna, nya kollektioner och exklusiva erbjudanden. Du kommer bara inte längre att få mejl om mors dag. Avregistrerade du dig av misstag och vill fortfarande få mors dag-mejl från oss? Du kan registrera dig igen [LINK].\",\n\t\t\t\tlinkText: \"här\",\n\t\t\t\tcta: \"Fortsätt shoppa\",\n\t\t\t},\n\t\t\tNO: {\n\t\t\t\theader: \"Du har nå avsluttet abonnementet på morsdags-e-postene våre.\",\n\t\t\t\tbody: \"Men ikke bekymre deg – vi holder deg fortsatt oppdatert på de siste nyhetene, nye varer og eksklusive tilbud. Du vil bare ikke lenger motta e-poster om morsdagen. Har du avsluttet abonnementet ved et uhell og ønsker fortsatt å motta morsdags-e-poster fra oss? Du kan abonnere igjen [LINK].\",\n\t\t\t\tlinkText: \"her\",\n\t\t\t\tcta: \"Fortsett å handle\",\n\t\t\t},\n\t\t};\n\n\t\t// Translation utility functions\n\t\tconst getUrlParameter = (name) =\u003e {\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\treturn urlParams.get(name);\n\t\t};\n\n\t\tconst getConsentPageLink = () =\u003e {\n\t\t\tconst encoded = getUrlParameter(\"consent_page_link\");\n\t\t\tif (!encoded) return null;\n\t\t\ttry {\n\t\t\t\treturn atob(encoded);\n\t\t\t} catch (e) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\tconst getCurrentLanguage = () =\u003e {\n\t\t\tconst langParam = getUrlParameter(\"lang\");\n\t\t\tconst supportedLanguages = Object.keys(translations);\n\n\t\t\t// If no language parameter or unsupported language, default to EN\n\t\t\tif (!langParam || !supportedLanguages.includes(langParam.toUpperCase())) {\n\t\t\t\treturn \"EN\";\n\t\t\t}\n\n\t\t\treturn langParam.toUpperCase();\n\t\t};\n\n\t\tconst getTranslation = (language = null) =\u003e {\n\t\t\tconst lang = language || getCurrentLanguage();\n\t\t\treturn translations[lang] || translations[\"EN\"];\n\t\t};\n\n\t\t// DOM elements\n\t\tconst elements = {\n\t\t\toverlay: null,\n\t\t\tcontainer: null,\n\t\t\theader: null,\n\t\t\tbody: null,\n\t\t\tcta: null,\n\t\t\tcloseBtn: null,\n\t\t\tshowBtn: null,\n\t\t};\n\n\t\t// Initialize DOM elements\n\t\tconst initializeElements = () =\u003e {\n\t\t\telements.overlay = document.getElementById(\"popupOverlay\");\n\t\t\telements.container = document.querySelector(\".popup-container\");\n\t\t\telements.header = document.getElementById(\"popupHeader\");\n\t\t\telements.body = document.getElementById(\"popupBody\");\n\t\t\telements.cta = document.getElementById(\"popupCta\");\n\t\t\telements.closeBtn = document.getElementById(\"closePopupBtn\");\n\t\t\telements.showBtn = document.getElementById(\"showPopupBtn\");\n\t\t};\n\n\t\t// Update popup content based on current language\n\t\tconst updatePopupContent = () =\u003e {\n\t\t\tconst translation = getTranslation();\n\t\t\tconst currentLang = getCurrentLanguage();\n\t\t\tconst consentLink = getConsentPageLink();\n\n\t\t\t// Update header\n\t\t\telements.header.textContent = translation.header;\n\n\t\t\t// Build body HTML with resubscribe link\n\t\t\tconst linkHref = consentLink || \"#\";\n\t\t\tconst linkHtml = `\u003ca id=\"resubscribeLink\" href=\"${linkHref}\" class=\"resubscribe-link\"\u003e${translation.linkText}\u003c/a\u003e`;\n\t\t\tconst bodyWithBreak = translation.body.replace(\"? \", \"?\u003cbr\u003e\");\n\t\t\telements.body.innerHTML = bodyWithBreak.replace(\"[LINK]\", linkHtml);\n\n\t\t\t// Update CTA button text\n\t\t\telements.cta.textContent = translation.cta;\n\n\t\t\t// Log current language for debugging\n\t\t\tconsole.log(`Popup displayed in: ${currentLang}`);\n\t\t};\n\n\t\t// Show popup with smooth animation\n\t\tconst showPopup = () =\u003e {\n\t\t\tif (!elements.overlay) return;\n\n\t\t\t// Update content before showing\n\t\t\tupdatePopupContent();\n\n\t\t\t// Show overlay\n\t\t\telements.overlay.style.display = \"flex\";\n\n\t\t\t// Trigger animation after a small delay\n\t\t\tsetTimeout(() =\u003e {\n\t\t\t\telements.overlay.classList.add(\"active\");\n\t\t\t}, 10);\n\n\t\t\t// Prevent body scroll\n\t\t\tdocument.body.style.overflow = \"hidden\";\n\t\t};\n\n\t\t// Hide popup with smooth animation\n\t\tconst hidePopup = () =\u003e {\n\t\t\tif (!elements.overlay) return;\n\n\t\t\t// Remove active class to trigger animation\n\t\t\telements.overlay.classList.remove(\"active\");\n\n\t\t\t// Hide overlay after animation completes\n\t\t\tsetTimeout(() =\u003e {\n\t\t\t\telements.overlay.style.display = \"none\";\n\t\t\t\t// Restore body scroll\n\t\t\t\tdocument.body.style.overflow = \"\";\n\t\t\t\t//trackEvent(\"show\", false);\n\t\t\t}, 300);\n\t\t};\n\n\t\t// Handle click outside popup to close\n\t\tconst handleOverlayClick = (event) =\u003e {\n\t\t\tif (event.target === elements.overlay) {\n\t\t\t\thidePopup();\n\t\t\t}\n\t\t};\n\n\t\t// Handle escape key to close popup\n\t\tconst handleEscapeKey = (event) =\u003e {\n\t\t\tif (event.key === \"Escape\" \u0026\u0026 elements.overlay.classList.contains(\"active\")) {\n\t\t\t\thidePopup();\n\t\t\t}\n\t\t};\n\n\t\t// Initialize event listeners\n\t\tconst initializeEventListeners = () =\u003e {\n\t\t\t// Show popup button\n\t\t\tif (elements.showBtn) {\n\t\t\t\telements.showBtn.addEventListener(\"click\", showPopup);\n\t\t\t}\n\n\t\t\t// Close button\n\t\t\tif (elements.closeBtn) {\n\t\t\t\telements.closeBtn.addEventListener(\"click\", hidePopup);\n\t\t\t}\n\n\t\t\t// Click outside popup\n\t\t\tif (elements.overlay) {\n\t\t\t\telements.overlay.addEventListener(\"click\", handleOverlayClick);\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tdocument.addEventListener(\"keydown\", handleEscapeKey);\n\n\t\t\t// CTA button click\n\t\t\tif (elements.cta) {\n\t\t\t\telements.cta.addEventListener(\"click\", () =\u003e {\n\t\t\t\t\ttrackEvent(\"continue\", true);\n\t\t\t\t\thidePopup();\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Public API\n\t\tconst popupAPI = {\n\t\t\tshow: showPopup,\n\t\t\thide: hidePopup,\n\t\t\tupdateContent: updatePopupContent,\n\t\t\tgetCurrentLanguage: getCurrentLanguage,\n\t\t\tgetTranslation: getTranslation,\n\t\t\ttranslations: translations,\n\t\t};\n\n\t\t// Initialize when DOM is ready\n\t\tconst init = () =\u003e {\n\t\t\tif (document.readyState === \"loading\") {\n\t\t\t\tdocument.addEventListener(\"DOMContentLoaded\", () =\u003e {\n\t\t\t\t\tinitializeElements();\n\t\t\t\t\tinitializeEventListeners();\n\t\t\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tinitializeElements();\n\t\t\t\tinitializeEventListeners();\n\t\t\t\t//console.log(\"Popup Manager initialized\");\n\t\t\t}\n\t\t};\n\n\t\t// Auto-initialize\n\t\tinit();\n\t\tpopupAPI.show();\n\n\t\treturn popupAPI;\n\t})();\n}\n\n/**\n * Function used to insert the banner HTML to the DOM\n * @param banner - html content of the banner\n */\nfunction attachBannerToDom(banner) {\n\tvar parentElement = document.querySelector(PARAM_parentElement);\n\tparentElement.insertAdjacentElement(\"afterbegin\", banner);\n\tself.banner = banner;\n}\n\n/**\n * Creates banner in shadow dom\n * @param parentElement\n */\nfunction createBannerInShadowDom(banner, parentElement) {\n\tvar shadowHost = document.createElement(\"div\");\n\tshadowHost.innerHTML = getFontsImport();\n\n\tvar shadowRoot = shadowHost.attachShadow({ mode: \"open\" });\n\tshadowRoot.appendChild(banner);\n\tparentElement.insertAdjacentElement(\"afterbegin\", shadowHost);\n\tself.banner = shadowHost;\n}\n\n/**\n * Function used to add fonts imports and font faces to element\n * The font import does not work inside shadow DOM, it has to be declared outside\n * @returns string - style tag with fonts import\n */\nfunction getFontsImport() {\n\tvar importsResult = self.style.match(/@import url\\([\"'].+?['\"]\\)/g);\n\tvar fontFacesResult = self.style.match(/@font-face( |\\n)*{(.|\\s)+?}/g);\n\n\tvar imports = importsResult \u0026\u0026 importsResult.length ? importsResult.join(\";\") : \"\";\n\tvar fontFaces = fontFacesResult \u0026\u0026 fontFacesResult.length ? fontFacesResult.join(\"\") : \"\";\n\tvar fonts = (imports ? imports + \";\" : \"\") + fontFaces;\n\n\treturn imports || fontFaces ? \"\u003cstyle\u003e\" + fonts + \"\u003c/style\u003e\" : \"\";\n}\n\n/**\n * Function used to remove the banner from the website\n */\nfunction removeBanner() {\n\tif (self.banner \u0026\u0026 self.banner.parentNode) {\n\t\tself.banner.parentNode.removeChild(self.banner);\n\t}\n}\n\n/**\n * Function triggered when the closing button is clicked\n * @param event - browser click Event\n * @returns {boolean}\n */\nfunction handleCloseButtonClick(event) {\n\tremoveBanner();\n\ttrackEvent(\"close\", true);\n\n\t// Stop the click event propagation onto parent HTML elements\n\tevent.preventDefault();\n\tif (event.stopPropagation) {\n\t\tevent.stopPropagation();\n\t} else {\n\t\tevent.cancelBubble = true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Function used to track single action\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackEvent(action, interactive) {\n\tif (action === \"show\") {\n\t\ttrackAction(\"last_show\");\n\t}\n\n\tif (interactive) {\n\t\ttrackAction(\"last_interaction\");\n\t}\n\n\tself.sdk.track(\"banner\", getEventProperties(action, interactive));\n}\n\n/**\n * Function used to add action tracking to element\n * @param link - element\n * @param action - string\n * @param interactive - boolean\n */\nfunction trackLink(link, action, interactive) {\n\tvar linkClickHandler = function () {\n\t\tif (interactive) {\n\t\t\ttrackAction(\"last_interaction\");\n\t\t}\n\t};\n\tlink.addEventListener(\"click\", linkClickHandler);\n\n\tvar eventData = getEventProperties(action, interactive);\n\teventData.link = link.href;\n\tself.sdk.trackLink(link, \"banner\", eventData);\n}\n\n/**\n * Default attributes tracked with every banner event\n * @param action - string\n * @param interactive - boolean\n * @returns object - object to be tracked\n */\nfunction getEventProperties(action, interactive) {\n\treturn {\n\t\taction: action,\n\t\tbanner_id: self.data.banner_id,\n\t\tbanner_name: self.data.banner_name,\n\t\tbanner_type: self.data.banner_type,\n\t\tvariant_id: self.data.variant_id,\n\t\tvariant_name: self.data.variant_name,\n\t\tvariant_origin: self.data.contextual_personalization != null ? \"contextual personalisation\" : \"ABtest\",\n\t\tinteraction: interactive !== false,\n\t};\n}\n\n/**\n * Function used to start banners with onExit trigger\n * @param event - browser mouse event\n */\nfunction onExitMouseOutHandler(event) {\n\tevent = event ? event : window.event;\n\tvar vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\tif (event.clientX \u003e= vpWidth) {\n\t\treturn;\n\t}\n\tif (event.clientY \u003e= 50) {\n\t\treturn;\n\t}\n\tvar from = event.relatedTarget || event.toElement;\n\n\tif (!from \u0026\u0026 !window[\"__exp_triggered-\" + bannerSemiId]) {\n\t\twindow[\"__exp_triggered-\" + bannerSemiId] = true;\n\t\tscheduleShowBanner();\n\t}\n}\n\n/**\n * Track an action with current time into localStorage if localStorage exists.\n * @param action - action name\n */\nfunction trackAction(action) {\n\tif (!localStorageEnabled) {\n\t\treturn;\n\t}\n\n\tvar actionKey = WEB_LAYER_EVENT_STORAGE_KEY_PREFIX + webLayerID + \"_\" + action;\n\twindow.localStorage.setItem(actionKey, new Date().valueOf().toString());\n}\n\n/**\n * Register the start trigger and return required removal function\n */\n\nregisterStartTrigger();\nreturn {\n\tremove: removeBanner,\n};\n };\ninsertBanner.remove = (insertBanner.script.call(insertBanner) || {} ).remove;\ninsertBanner.contextual_personalization = {};\nreturn insertBanner;\n})({\"banner_id\": \"69bbceb14af908070b27e126\", \"banner_name\": null, \"banner_type\": \"medium_rectangle\", \"banner_group\": \"\", \"variant_id\": 0, \"variant_name\": \"Variant A\"});","variables_target":null,"page_vars":[]}],"experiments":[],"constantManagedTags":[{"uses_overlay":false,"type":"js","parametrized_definition":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\n\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\n//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (event_name) =\u003e {\n    if(dataLayer \u0026\u0026 event_name){\n        try{\n            return dataLayer.findLast(({event}) =\u003e event === event_name);\n        } catch {\n            return undefined;\n        }\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\nconst getMetaProperty = (property) =\u003e {\n\treturn document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') ? document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') : ''\n}\n\nconst getCategoryPath = (category_array) =\u003e {\n\treturn category_array.filter(item =\u003e item)?.join(\" \u003e \");\n}\n\nconst getStockInfo = (string) =\u003e {\n\tif (string){\n\t\treturn string === 'InStock' ? true : false;\n\t} else {\n\t\treturn undefined\n\t}\n}\n\nconst trackViewItem = (data) =\u003e {\n\tconst category_array = [data?.ph1, data?.ph2, data?.ph3, data?.ph4]\n\texponea.track('view_item', {\n\t\tdomain : window.location.hostname,\n\t\tproduct_id : String(data?.id) ?? '',\n\t\tvariant_id: String(data?.variantID) ?? '',\n\t\ttitle : data?.name ?? '',\n\t\ttitle_en : data?.item_name ?? '',\n\t\tcolor : data?.color ?? '',\n\t\tsize : data?.selectedSize ?? '',\n\t\tbrand : data?.brand ?? '',\n\t\tcategory_path: getCategoryPath(category_array),\n\t\tcategory_path_en: getCategoryPath(category_array),\n\t\turl : data?.url ?? '',\n\t\timage : data?.image ?? '',\n\t\tcategory_level_1: data?.ph1 ?? '',\n\t\tcategory_level_2: data?.ph2 ?? '',\n\t\tcategory_level_3: data?.ph3 ?? '',\n\t\tcategory_level_4: data?.ph4 ?? '',\n\t\tcategory_level_1_en: '',\n\t\tcategory_level_2_en: '',\n\t\tcategory_level_3_en: '',\n\t\tcategory_level_4_en: '',\n\t\tcategory_level_1_id : data?.productAttribute1 ?? '',\n\t\tcategory_level_2_id : data?.productAttribute2 ?? '',\n\t\tcategory_level_3_id : data?.productAttribute3 ?? '', //always blank\n\t\tcategory_level_4_id : data?.productAttribute4 ?? '', //always blank\n\t\tcurrency : getMetaProperty('og:product:price:currency'),\n\t\tin_stock : getStockInfo(data?.availability) ?? undefined,\n\t\toriginal_price : parseFloat(data?.originalPrice) ?? 0,\n\t\tsale_price : parseFloat(data?.price) ?? 0,\n\t\ttotal_price : parseFloat(data?.price) ?? 0,\n\t\tlanguage : getLanguage() ?? '',\n\t\tcountry : getCountry() ?? '',\n\t})\n}\n\n\n//IT SEEMS THAT THE PAGE IS A SPA. I ADDED MUTATION OBSERVER TO CHECK WHEN CHANGES TO THE FORM ARE MADE (CHOOSING DIFFERENT SIZE/ COLOR).\n//SHOULD BE TESTED ONCE THE SNIPPET IS IMPLEMENTED\nconst config = { childList: true, subtree: true };\n\nconst size_observer = new MutationObserver((mutations) =\u003e {\n  mutations.forEach((mutation) =\u003e {\n    mutation.addedNodes.forEach((node) =\u003e {\n      if (node.nodeType === 1 \u0026\u0026 node.matches(\"form[data-product-details]\")) {\n\t\tconst obs_data = JSON.parse(document.querySelector(\".b-pdp-content form\")?.getAttribute('data-product-details'));\n\t\tif (obs_data){\n\t\t\ttrackViewItem(obs_data)\n\t\t}\n      }\n    });\n  });\n});\n\nlet page_pathname = window.location.pathname;\n\nconst color_observer = new MutationObserver((mutations) =\u003e {\n  if (page_pathname !== window.location.pathname \u0026\u0026 getDatalayerValue('view_item')){\n  \tpage_pathname = window.location.pathname\n  \tconst obs_data = JSON.parse(document.querySelector(\".b-pdp-content form\")?.getAttribute('data-product-details'));\n\tif (obs_data){\n\t\ttrackViewItem(obs_data)\n\t\t\n\t\t//ADD OBSERVER TO THE SIZE\n\t\tif (!document.querySelector('.b-pdp-content')?.getAttribute('br-pdp-size-observer') \u0026\u0026 document.querySelector(\".b-pdp-content form\")){\n\t\t\tdocument.querySelector('.b-pdp-content')?.setAttribute('br-pdp-size-observer', true)\n\t\t\tsize_observer.observe(document.querySelector(\".b-pdp-content\"), config);\n\t\t}\n\t}\n  }\n});\n\nif (!document.querySelector('.b-pdp-content')?.getAttribute('br-pdp-size-observer') \u0026\u0026 document.querySelector(\".b-pdp-content form\")){\n\tdocument.querySelector('.b-pdp-content')?.setAttribute('br-pdp-size-observer', true)\n\tsize_observer.observe(document.querySelector(\".b-pdp-content\"), config);\n}\n\nif (!document.querySelector('#pdpMain')?.getAttribute('br-pdp-color-observer') \u0026\u0026 document.querySelector(\".b-pdp-content form\")){\n\tdocument.querySelector('#pdpMain')?.setAttribute('br-pdp-color-observer', true)\n\tcolor_observer.observe(document.querySelector('#pdpMain'), config);\n}\n\nconst product_page = getDatalayerValue('view_item');\nconst data = JSON.parse(document.querySelector(\".b-pdp-content form\")?.getAttribute('data-product-details'));\nconst site_type = detectSite();\n\nif (product_page \u0026\u0026 data \u0026\u0026 site_type === 'old'){\n\ttrackViewItem(data)\n}","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"67ceae665ac86df31c8954a1"},{"uses_overlay":false,"type":"js","parametrized_definition":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\n\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\n//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (event_name) =\u003e {\n    if(dataLayer \u0026\u0026 event_name){\n        try{\n            return dataLayer.findLast(({event}) =\u003e event === event_name);\n        } catch {\n            return undefined;\n        }\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\nconst getMetaProperty = (property) =\u003e {\n\treturn document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') ? document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') : ''\n}\n\nconst getCategoryPath = (category_array) =\u003e {\n\treturn category_array.filter(item =\u003e item)?.join(\" \u003e \");\n}\n\nconst getItemIds = (data) =\u003e {\n\tif (data \u0026\u0026 data.length \u003e 0){\n\t\treturn data.map(item =\u003e item.id)\n\t} else {\n\t\treturn []\n\t}\n}\n\nconst trackViewCategory = (data, category_data) =\u003e {\n\tconst category_array = [category_data?.structuredData?.breadcrumb?.[1]?.name, category_data?.structuredData?.breadcrumb?.[2]?.name, category_data?.structuredData?.breadcrumb?.[3]?.name, category_data?.structuredData?.breadcrumb?.[4]?.name]\n\texponea.track('view_category', {\n\t\tpath : window.location.pathname,\n\t\tlanguage : getLanguage() ?? '',\n\t\tdomain : window.location.hostname, \n\t\tcategory_title : category_data?.structuredData?.name ?? '',\n\t\tcategory_title_en : category_data?.structuredData?.name ?? '',\n\t\tcategory_path : getCategoryPath(category_array),\n\t\tcategory_path_en : getCategoryPath(category_array),\n\t\tcategory_level_1 : category_data?.structuredData?.breadcrumb?.[1]?.name ?? '',\n\t\tcategory_level_2 : category_data?.structuredData?.breadcrumb?.[2]?.name ?? '',\n\t\tcategory_level_3 : category_data?.structuredData?.breadcrumb?.[3]?.name ?? '',\n\t\tcategory_level_4 : category_data?.structuredData?.breadcrumb?.[4]?.name ?? '',\n\t\tcategory_level_1_en : '',\n\t\tcategory_level_2_en : '',\n\t\tcategory_level_3_en : '',\n\t\tcategory_level_4_en : '',\n\t\tproduct_ids : getItemIds(data),\n\t\tcountry : getCountry(),\n\t})\n}\n\n\n//DATA IS ALSO AVAILABLE IN THE DATALAYER. I CONNECTED IT TO EACH ITEM IF WE WANTED TO ADD FUNCTIONS TO MAKE IT RESPONSIVE TO THE CATEGORY CHANGES. \nconst category_data = getDatalayerValue(\"structuredDataList\")\nconst data = []\nconst site_type = detectSite()\n\ndocument.querySelectorAll('div[data-product-details]').forEach(item =\u003e {\n\tdata.push(JSON.parse(item.getAttribute('data-product-details')))\n})\n\nif (category_data \u0026\u0026 data \u0026\u0026 site_type === 'old'){\n\ttrackViewCategory(data, category_data)\n}","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"67ceae665ac86df31c8954a6"},{"uses_overlay":false,"type":"js","parametrized_definition":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\n\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\n//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (event_name) =\u003e {\n    if(dataLayer \u0026\u0026 event_name){\n        try{\n            return dataLayer.findLast(({event}) =\u003e event === event_name);\n        } catch {\n            return undefined;\n        }\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\nconst getStockInfo = (string) =\u003e {\n\tif (string){\n\t\treturn string === 'InStock' ? true : false;\n\t} else {\n\t\treturn undefined\n\t}\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\nconst getMetaProperty = (property) =\u003e {\n\treturn document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') ? document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') : ''\n}\n\nconst getCategoryPath = (category_array) =\u003e {\n\treturn category_array.filter(item =\u003e item)?.join(\" \u003e \");\n}\n\n//DATALAYER VIEW ITEM EVENT\nconst trackViewItem = (data) =\u003e {\n\tconst item = data?.items?.[0]\n\tconst category_array = [item?.item_category, item?.item_category2, item?.item_category3, item?.item_category4]\n\texponea.track('view_item', {\n\t\tdomain : window.location.hostname,\n\t\tproduct_id : String(item?.item_id) ?? '',\n\t\tvariant_id: item?.item_variant ? String(item?.item_variant) : '', \n\t\ttitle : item?.item_name ?? '',\n\t\ttitle_en : item?.item_name ?? '',\n\t\tcolor : item?.color ?? '', \n\t\tsize : item?.size ?? '', \n\t\tbrand : item?.item_brand ?? '',\n\t\tcategory_path: getCategoryPath(category_array),\n\t\tcategory_path_en: getCategoryPath(category_array),\n\t\turl : item?.product_url ?? '',\n\t\timage : item?.image_url ?? '',\n\t\tcategory_level_1: item?.item_category ?? '',\n\t\tcategory_level_2: item?.item_category2 ?? '',\n\t\tcategory_level_3: item?.item_category3 ?? '',\n\t\tcategory_level_4: item?.item_category4 ?? '',\n\t\tcategory_level_1_en: item?.item_category ?? '',\n\t\tcategory_level_2_en: item?.item_category2 ?? '',\n\t\tcategory_level_3_en: item?.item_category3 ?? '',\n\t\tcategory_level_4_en: item?.item_category4 ?? '',\n\t\tcategory_level_1_id : '', //always blank\n\t\tcategory_level_2_id : '', //always blank\n\t\tcategory_level_3_id : '', //always blank\n\t\tcategory_level_4_id : '', //always blank\n\t\tcurrency : data?.currency ?? '',\n\t\tin_stock : getStockInfo(data?.availability) ?? undefined,\n\t\toriginal_price : parseFloat(item?.original_price) ?? 0,\n\t\tsale_price : parseFloat(item?.price) ?? 0,\n\t\ttotal_price : parseFloat(item?.price) ?? 0,\n\t\tlanguage : getLanguage(),\n\t\tcountry : getCountry(),\n\t})\n}\n\nsetTimeout(()=\u003e{\n\tlet size = document.querySelector('div[data-testid=\"product-details-page\"] button[data-testid=\"size-select-button\"]')?.innerText ?? '';\n\tconst config = { childList: true, subtree: true };\n\t\n\tconst observer = new MutationObserver(() =\u003e {\n\t\tif (size !== document.querySelector('div[data-testid=\"product-details-page\"] button[data-testid=\"size-select-button\"]')?.innerText){\n\t\t\tsize = document.querySelector('div[data-testid=\"product-details-page\"] button[data-testid=\"size-select-button\"]')?.innerText;\n\t\t\tsetTimeout(()=\u003e{\n\t\t\t\tconst obs_data = getDatalayerValue('view_item');\n\t\t\t\tif (obs_data?.ecommerce){\n\t\t\t\t\ttrackViewItem(obs_data?.ecommerce)\n\t\t\t\t}\n\t\t\t}, 1000)\n\t\t}\n\t});\n\t\n\tif (!document.querySelector('body')?.getAttribute('br-pdp-observer') \u0026\u0026 document.querySelector('button[data-testid=\"size-select-button\"] span')){\n\t\tdocument.querySelector('body')?.setAttribute('br-pdp-observer', true)\n\t\tobserver.observe(document.querySelector('button[data-testid=\"size-select-button\"] span'), config);\n\t}\n\n\t//DATALAYER VIEW ITEM\n\tconst data = getDatalayerValue('view_item');\n\tconst site_type = detectSite();\n\n\tif (getMetaProperty('og:type') === \"product\" \u0026\u0026 data \u0026\u0026 document.querySelector('body').getAttribute('data-react-helmet')){\n\t\ttrackViewItem(data?.ecommerce)\n\t}\n}, 2000)\n\n","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"67ceae665ac86df31c8954b0"},{"uses_overlay":false,"type":"js","parametrized_definition":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\n\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\n//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (event_name) =\u003e {\n    if(dataLayer \u0026\u0026 event_name){\n        try{\n            return dataLayer.findLast(({event}) =\u003e event === event_name);\n        } catch {\n            return undefined;\n        }\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\nconst getMetaProperty = (property) =\u003e {\n\treturn document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') ? document.querySelector(`meta[property=\"${property}\"]`)?.getAttribute('content') : ''\n}\n\nconst getCategoryPath = (category_array) =\u003e {\n\treturn category_array.filter(item =\u003e item)?.join(\" \u003e \");\n}\n\nconst getItemIds = (data) =\u003e {\n\tif (data \u0026\u0026 data.length \u003e 0){\n\t\treturn data.map(item =\u003e item.item_id)\n\t} else {\n\t\treturn []\n\t}\n}\n\nconst trackViewCategory = (data, category_data) =\u003e {\n\tconst breadcrumbs = category_data?.mainEntityOfPage?.breadcrumb?.itemListElement\n\tconst category_array = [breadcrumbs?.[1]?.item?.name, breadcrumbs?.[2]?.item?.name, breadcrumbs?.[3]?.item?.name, breadcrumbs?.[4]?.item?.name]\n\texponea.track('view_category', {\n\t\tpath : window.location.pathname,\n\t\tlanguage : getLanguage() ?? '',\n\t\tdomain : window.location.hostname, \n\t\tcategory_title : category_array?.reverse()?.find(item =\u003e item) ?? '',\n\t\tcategory_title_en : category_array?.reverse()?.find(item =\u003e item) ?? '',\n\t\tcategory_path : getCategoryPath(category_array),\n\t\tcategory_path_en : getCategoryPath(category_array),\n\t\tcategory_level_1 : breadcrumbs?.[1]?.item?.name ?? '',\n\t\tcategory_level_2 : breadcrumbs?.[2]?.item?.name ?? '',\n\t\tcategory_level_3 : breadcrumbs?.[3]?.item?.name ?? '',\n\t\tcategory_level_4 : breadcrumbs?.[4]?.item?.name ?? '',\n\t\tcategory_level_1_en : '',\n\t\tcategory_level_2_en : '',\n\t\tcategory_level_3_en : '',\n\t\tcategory_level_4_en : '',\n\t\tproduct_ids : getItemIds(data?.items),\n\t\tcountry : getCountry(),\n\t})\n}\nsetTimeout(()=\u003e{\n\tconst data = getDatalayerValue(\"view_item_list\")\n\tconst category_data = document.querySelector('div[data-testid=\"product-list-page\"] script') ? JSON.parse(document.querySelector('div[data-testid=\"product-list-page\"] script')?.textContent) : undefined;\n\tconst site_type = detectSite();\n\n\tif (document.querySelector('div[data-testid=\"product-list-page\"]') \u0026\u0026 category_data \u0026\u0026 data \u0026\u0026 document.querySelector('body').getAttribute('data-react-helmet')){\n\t\ttrackViewCategory(data?.ecommerce, category_data)\n\t}\n}, 4000)\n","trigger":{"include_pages":[{"type":"any"}],"exclude_pages":null},"_id":"67ceae665ac86df31c8954b5"},{"uses_overlay":false,"type":"js","parametrized_definition":"//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (event_name) =\u003e {\n    if(dataLayer \u0026\u0026 event_name){\n        const event = dataLayer.findLast(({event}) =\u003e event === event_name);\n        return event;\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\nconst getMetaProperty = (type) =\u003e {\n\tif (type) return document.querySelector(`meta[property='${type}']`)?.getAttribute('content')\n}\n\nconst getTotalQuantity = (data) =\u003e {\n\tif(data) return data?.map(item =\u003e +item.quantity)?.reduce((a, b) =\u003e a + b, 0) ?? 0;\n\treturn 0;\n}\n\nconst getTotalAmount = (data, variable) =\u003e {\n\tif(data \u0026\u0026 variable) return data?.map(item =\u003e +item[variable] * item.quantity)?.reduce((a, b) =\u003e a + b, 0) ?? 0;\n\treturn 0;\n}\n\nconst getItemsIds = (data) =\u003e {\n\tif(data) return data?.map(item =\u003e String(item.item_id))\n\treturn[]\n}\n\nconst getVariantIds = (data) =\u003e {\n\tif(data) return data?.map(item =\u003e String(item.item_variant_id))\n\treturn[]\n}\n\nconst getItemsDetails = (data) =\u003e {\n\tif(data) return data?.map(item =\u003e ({\n\t\tvariant_brand : item.item_brand ?? '',\n\t\tproduct_id : String(item.item_id) ?? '',\n\t\tvariant_id : String(item.item_variant_id) ?? '',\n\t\tvariant_category : item.item_category ?? '',\n\t\tvariant_color: item.color ?? '',\n\t\tvariant_title : item.item_name ?? '',\n\t\tvariant_image : item.image_url ?? '',\n\t\tvariant_original_price : +item.original_price ?? 0,\n\t\tvariant_price : +item.price ?? 0, \n\t\tvariant_sale_price : +item.price ?? 0, \n\t\tvariant_size : item.size ?? '',\n\t\tvariant_in_stock: item.in_stock ?? undefined ,\n\t\tvariant_discount : +item.original_price \u003e +item.price ? parseFloat((+item.original_price - +item.price).toFixed(2)) : 0, \n\t\tvariant_url : item.product_url ?? '',\n\t\ttotal_price: +item.price \u0026\u0026 +item.quantity ? parseFloat((+item.price * +item.quantity).toFixed(2)) : 0,\n\t\tdiscount_value: (+item.original_price \u003e +item.price) \u0026\u0026 +item.quantity ? parseFloat(((+item.original_price - +item.price)*+item.quantity).toFixed(2)) : 0, \n\t\tquantity : +item.quantity ?? 0,\n\t}))\n\t\n\treturn []\n}\n\n\nconst trackCartUpdate = (data, items, action) =\u003e {\n \t exponea.track(\"cart_update\", {\n \t    path: window.location.pathname ?? \"\",\n \t    country : getCountry(),\n \t    language: getLanguage() ?? \"\",\n \t    domain: window.location.hostname ?? \"\",\n \t    action: action ?? \"\",\n \t    total_quantity: getTotalQuantity(items) ?? 0,\n \t    total_price: getTotalAmount(items, 'price') ? parseFloat(getTotalAmount(items, 'price').toFixed(2)) : 0,\n \t    total_discount_value: getTotalAmount(items, 'price') \u003c getTotalAmount(items, 'original_price') ? parseFloat((getTotalAmount(items, 'original_price') - getTotalAmount(items, 'price')).toFixed(2)) : 0,\n \t    currency: data?.currency ?? \"\",\n \t    product_ids: getItemsIds(items) ?? [],\n \t    variant_ids: getVariantIds(items) ?? [],\n \t    variant_details: getItemsDetails(items) ?? [],\n \t  });\n};\n\n//Mutation config\nconst config = { childList: true, subtree: true };\n\nconst addListener = (selector, html_event, event, action) =\u003e {\n\tdocument.querySelectorAll(selector).forEach(button =\u003e {\n\t\tif (!button.getAttribute('br-cart-update')){\n\t\t\tbutton.setAttribute('br-cart-update', true)\n\t\t\tbutton.addEventListener(html_event, () =\u003e {\n\t\t\t\tsetTimeout(()=\u003e{\n\t\t\t\t\tconst data = getDatalayerValue(event)\n\t\t\t\t\tif (data \u0026\u0026 data.ecommerce){\n\t\t\t\t\t\ttrackCartUpdate(data?.ecommerce, data?.ecommerce?.basket, action)\n\t\t\t\t\t}\n\t\t\t\t}, 2500)\n\t\t\t})\n\t\t}\n\t})\n}\n\nconst addStorageListener = (selector, listener, action) =\u003e {\n\tdocument.querySelectorAll(selector).forEach(button =\u003e {\n\t\tif (!button.getAttribute('br-cart-update')){\n\t\t\tbutton.setAttribute('br-cart-update', true)\n\t\t\tbutton.addEventListener(listener, () =\u003e {\n\t\t\t\tsessionStorage.setItem('br-cart-update', action)\n\t\t\t})\n\t\t}\n\t})\n}\n\nconst observer = new MutationObserver((mutations) =\u003e {\n  mutations.forEach((mutation) =\u003e {\n\tif (mutation.target.classList.contains('b-pdp-content')){\n\t\taddListener('button#add-to-cart', 'click', 'cart_update', 'add')\n\t\taddListener('button#add-all-to-cart', 'click', 'cart_update', 'add')\n\t}\n\n\tif (mutation.target.classList.contains('b-minicart_popup')){\n\t\taddListener('.b-minicart_product-remove[role=\"button\"]', 'click', 'cart_update', 'remove')\n\t}\n  });\n  \n  //AT PAGE\n\taddListener('button[data-tracking=\"add-to-cart\"]', 'click', 'cart_update', 'add')\n\t\n\t//RECO AT THE BOTTOM OF THE PAGE\n\taddListener('.ins-recommender-body .ins-new-custom-button', 'click', 'cart_update', 'add')\n\taddListener('div[data-testid=\"product-line-tile\"] button[aria-label=\"Delete\"]', 'click', 'cart_update', 'remove')\n\t\n\t//AT CART PAGE\n\taddListener('div[data-testid=\"product-line-tile\"] button', 'click', 'cart_update', 'remove')\n\taddListener('div[data-testid=\"product-line-tile\"] select', 'change', 'cart_update', 'update')\n\t// addListener('div[data-testid=\"product-line-tile\"] button[role=\"menuitem\"]', 'click', 'cart_update', 'update')\n});\n\n// HANDLE PAGE BUTTONS\naddListener('button#add-to-cart', 'click', 'cart_update',  'add')\naddListener('button#add-all-to-cart', 'click', 'cart_update', 'add')\n\t\naddListener('.b-minicart_product-remove[role=\"button\"]', 'click', 'cart_update',  'remove')\n\n//AT PAGE\naddListener('button[data-tracking=\"add-to-cart\"]', 'click', 'cart_update','add')\n\t\n//RECO AT THE BOTTOM OF THE PAGE\naddListener('.ins-recommender-body .ins-new-custom-button', 'click', 'cart_update', 'add')\naddListener('.b-minicart_product-remove[role=\"button\"]', 'click', 'cart_update', 'remove')\n\n//AT CART PAGE\naddListener('div[data-testid=\"product-line-tile\"] button', 'click', 'cart_update',  'remove')\naddListener('div[data-testid=\"product-line-tile\"] select', 'change', 'cart_update', 'update')\n// addListener('div[data-testid=\"product-line-tile\"] button[role=\"menuitem\"]', 'click', 'cart_update', 'update')\n\n//ADD OBSERVER - SOMETIMES THE PAGE CONTENT IS CHAGNED WITHOUT PAGE REFRESH\nif (!document.querySelector('body').getAttribute('br-cart-update-obs')){\n\tdocument.querySelector('body').setAttribute('br-cart-update-obs', true)\n\tobserver.observe(document, config)\n}\n\n//HANDLE CART PAGE\nif (window.location.pathname.includes('/cart')){\n\taddStorageListener('.js-cart-size-select', 'change', 'update')\n\taddStorageListener('.js-cart-quantity-select', 'change', 'update')\n\taddStorageListener('button.js-remove-from-cart', 'click', 'remove')\n\t\n\tconst action = sessionStorage.getItem('br-cart-update')\n\tconst data = getDatalayerValue('view_cart')\n\tif (action \u0026\u0026 data){\n\t\ttrackCartUpdate(data.ecommerce, data.ecommerce?.items, action)\n\t}\n\t\n\tsessionStorage.removeItem('br-cart-update')\n}\n\nsessionStorage.removeItem('br-cart-update')\n\n","trigger":{"include_pages":[{"url":"hunkemoller","type":"contains"}],"exclude_pages":null},"_id":"67d930c98a878998fa77dff4"},{"uses_overlay":false,"type":"js","parametrized_definition":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\n\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\n//get dataLayer value, the item is always last in the dataLayer array\nconst getDatalayerValue = (array) =\u003e {\n    if(dataLayer){\n        try{\n            return dataLayer.findLast(({event}) =\u003e array.includes(event));\n        } catch {\n            return undefined;\n        }\n    }\n    else {\n        console.error('Error :', 'Datalayer with name '+ ' ' + event_name + ' '+'is not existing')\n        return undefined;\n    }\n}\n\nconst getAction = (string) =\u003e {\n\tif (string){\n\t\tif (string === \"update_wishlist\"){\n\t\t\treturn 'update'\n\t\t} else if (string === 'remove_from_wishlist'){\n\t\t\treturn 'remove'\n\t\t} else if (string === 'add_to_wishlist'){\n\t\t\treturn 'add'\n\t\t}\n\t\treturn ''\n\t} \n\treturn ''\n}\n\nconst getLanguage = () =\u003e {\n\tlet lang = document.documentElement.lang;\n\tif(lang){\n\t\tlang = lang.replaceAll('-', '_');\n\t\tif(window.location.pathname.includes('/global')) return 'en_GB';\n\t\treturn lang;\n\t}\n}\n\nconst getCountry = () =\u003e {\n\tlet language = document.documentElement.lang;\n\tif(window.location.pathname.includes('/global')) language = 'en-GB';\n\tconst array = language?.split('-')\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\treturn array[array.length - 1]\n\t} else {\n\t\treturn ''\n\t}\n}\n\n//it's possibel to have duplicate items in the wishlist. I added checks to avoid the duplicates. \n//dataLayer doesn't contain product_id if variant_id is available, therefore I create the product_id from the variant_id and store it\n//each item should be represented always by a product_id, variant_id is tracked only if it's available\nconst getIds = (array) =\u003e {\n\tconst ids = {\n\t\tproduct_ids : [],\n\t\tvariant_ids : []\n\t}\n\t\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\tarray.forEach(item =\u003e {\n\t\t\tif (item \u0026\u0026 String(item).length \u003e 6){\n\t\t\t\tif (!ids.variant_ids.includes(String(item))){\n\t\t\t\t\tids.variant_ids.push(String(item))\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//create product_id from variant_id\n\t\t\t\tconst sliced_variant_id = String(item).slice(0,6)\n\t\t\t\tif (sliced_variant_id \u0026\u0026 !ids.product_ids.includes(sliced_variant_id)){\n\t\t\t\t\tids.product_ids.push(sliced_variant_id)\n\t\t\t\t}\n\t\t\t} else if (item){\n\t\t\t\tif (!ids.product_ids.includes(String(item))){\n\t\t\t\t\tids.product_ids.push(String(item))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\t\n\treturn ids;\n}\n\nconst addListener = (array, action) =\u003e {\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\tarray.forEach(item =\u003e {\n\t\t\tif (!item.getAttribute('br-wishlist')){\n\t\t\t\titem.setAttribute('br-wishlist', true)\n\t\t\t\titem.addEventListener(action , ()=\u003e{\n\t\t\t\t\tsetTimeout(()=\u003e{\n\t\t\t\t\t\t\ttrackEvent()\t\n\t\t\t\t\t}, 300)\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nconst addSelectListener = (array, action) =\u003e {\n\tif (array \u0026\u0026 array.length \u003e 0){\n\t\tarray.forEach(item =\u003e {\n\t\t\tif (!item.getAttribute('br-wishlist')){\n\t\t\t\titem.setAttribute('br-wishlist', true)\n\t\t\t\titem.addEventListener(action , ()=\u003e{\n\t\t\t\t\tif (action === 'change'){\n\t\t\t\t\t\tconst selectedOption = item?.options[item?.selectedIndex]; \n\t\t\t\t\t\tconst out_of_stock = selectedOption?.getAttribute(\"data-is-notify-me\");\n\t\t\t\t\t\tif (out_of_stock === 'false'){\n\t\t\t\t\t\t\tsetTimeout(()=\u003e{\n\t\t\t\t\t\t\t\ttrackEvent()\t\n\t\t\t\t\t\t\t}, 500)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\n// Helper function to check for wishlist buttons in added nodes\nconst checkForWishlistButtons = (node) =\u003e {\nif (!node || !node.nodeType) return;\n\n// Check if the node itself is a wishlist button\nif (node.nodeType === 1 \u0026\u0026 node.matches \u0026\u0026 node.matches('button[data-testid=\"wishlist-button\"]')) {\n  addListener([node], 'click');\n  return;\n}\n\n// Check if the node contains wishlist buttons (for container nodes)\nif (node.nodeType === 1 \u0026\u0026 node.querySelectorAll) {\n  const wishlistButtons = node.querySelectorAll('button[data-testid=\"wishlist-button\"]');\n  if (wishlistButtons.length \u003e 0) {\n    addListener(Array.from(wishlistButtons), 'click');\n  }\n}\n};\n\nconst trackEvent = () =\u003e {\n\tconst actions = ['remove_from_wishlist', 'add_to_wishlist', 'update_wishlist']\n\tconst datalayer_event = getDatalayerValue(actions)\n\tconst data = datalayer_event?.ecommerce\n\tconst ids = getIds(data?.productIDs)\n\tif (data){\n\t\texponea.track('wishlist_update', {\n\t\t\tpath : window.location.pathname, \n\t\t\tdomain : window.location.hostname,\n\t\t\taction : getAction(datalayer_event?.event),\n\t\t\ttotal_quantity: data?.productIDs?.length ?? 0,\n\t\t\tcurrency : data?.currency ?? '',\n\t\t\tlast_updated_item_id : data?.items?.[0]?.item_id ? String(data?.items?.[0]?.item_id) : '',\n\t\t\tlast_update_variant_id : data?.items?.[0]?.item_variant_id ? String(data?.items?.[0]?.item_variant_id) : '',\n\t\t\tlast_updated_item_title : data?.items?.[0]?.item_name ?? '',\n\t\t\tlast_updated_item_brand : data?.items?.[0]?.item_brand ?? '',\n\t\t\tlast_updated_item_category : data?.items?.[0]?.item_category ?? '',\n\t\t\tproduct_ids : ids?.product_ids ?? [],\n\t\t\tvariant_ids : ids?.variant_ids ?? [],\n\t\t\tvariant_details: [],\n\t \t    country : getCountry(),\n\t \t    language: getLanguage() ?? \"\",\n\t\t})\n\t}\n}\n\n//Mutation config\nconst config = { childList: true, subtree: true };\n\nconst observer = new MutationObserver((mutations) =\u003e {\n  mutations.forEach((mutation) =\u003e {\n    \n    // Check all added nodes for wishlist buttons\n    if (mutation.addedNodes \u0026\u0026 mutation.addedNodes.length \u003e 0) {\n        mutation.addedNodes.forEach((node) =\u003e {\n          checkForWishlistButtons(node);\n        });\n    }\n    \n\tif (mutation.target.classList.contains('b-pdp-content')){\n\t\taddListener(document.querySelectorAll('.b-wishlist_btn'), 'click')\n\t}\n\t\n\tif (mutation.target.classList.contains('b-my_wishlist-wrap')){\n\t\taddSelectListener(document.querySelectorAll('.js-wishlist-size-select'), 'change')\n\t\taddListener(document.querySelectorAll('.js-wishlist-item .b-product_tile-delete'), 'click')\n\t}\n\t\n\tif (mutation.target.id === 'dialog-container'){\n\t\taddListener(document.querySelectorAll('.js-wishlist-add-guest'), 'click')\n\t}\n  });\n});\n\nconst site_type = detectSite();\n\nif (site_type === 'old'){\n\t//General buttons\n\taddListener(document.querySelectorAll('.b-wishlist_btn'), 'click')\n\t\n\t//Wishlist page buttons\n\taddListener(document.querySelectorAll('.js-wishlist-item .b-product_tile-delete'), 'click')\n\t\n\taddSelectListener(document.querySelectorAll('.js-wishlist-size-select'), 'change')\n\t\n\taddListener(document.querySelectorAll('button[data-testid=\"wishlist-button\"]'), 'click')\n\t\n\t//On PDP if the different size is selected, the new listener to the wishlist button needs to be added\n\t//On wishlist page if the different size is selected, the new listener to the wishlist button needs to be added\n\tobserver.observe(document, config)\n}\n\n","trigger":{"include_pages":[{"url":"hunkemoller","type":"contains"}],"exclude_pages":null},"_id":"682344bb0f1b369349ea47b7"}],"vars":{"data":[{"id":"68639cd0ce02c697f9eb698d","name":"hm_only_old_pdp","variable":{"type":"custom_function","custom_function":{"body":"return document.querySelector('#pdpMain') ? true : false;"}}},{"id":"6863a1ee949342e1f559d9eb","name":"hm_only_new_pdp","variable":{"type":"custom_function","custom_function":{"body":"return document.querySelector('div[data-testid=\"product-details-page\"]') ? true : false;"}}},{"id":"687a2658d03706e15863dd9f","name":"hm_only_new_homepage","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\nconst site_type = detectSite();\nif(window.location.pathname === '/' \u0026\u0026 site_type == 'new'){\n\treturn true;\n}"}}},{"id":"687a2a59e4d7e89bbe666443","name":"hm_only_old_homepage","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\n\nconst site_type = detectSite();\nif(window.location.pathname === '/' \u0026\u0026 site_type == 'old'){\n\treturn true\n}"}}},{"id":"687a35ad6cc8c42fc738aff9","name":"hm_only_old_plp","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite();\n\nif(site_type === 'old' \u0026\u0026 !!document.querySelector('#plp-header')) {\n\treturn true\n}"}}},{"id":"687a3615370fdb4134b5b3a7","name":"hm_only_new_plp","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite();\nif(site_type === 'new' \u0026\u0026 !!document.querySelector('body[data-noibu-id=\"plp_template\"]')) {\n\treturn true\n}"}}},{"id":"687a396f882de1af59373373","name":"hm_only_old_cart","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite()\n\nif(site_type === 'old' \u0026\u0026 window.location.pathname === '/cart' \u0026\u0026 !!document.querySelector('#wrapper.pt_cart')){\n\treturn true\n\t\n}"}}},{"id":"687a3c0c110aee920cbd34c4","name":"hm_only_new_cart","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite()\n\nif(site_type === 'new' \u0026\u0026 window.location.pathname === '/cart' \u0026\u0026 !!document.querySelector('div[data-testid=\"cart-page\"]')){\n\treturn true\n}"}}},{"id":"687f8334b7a828911cef5202","name":"hm_only_new_checkout","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite()\n\nif(site_type === 'new' \u0026\u0026 ['/checkout-start', '/checkout'].includes(window.location.pathname)){\n\treturn true\n}"}}},{"id":"687f834bb7a828911cef520a","name":"hm_only_old_checkout","variable":{"type":"custom_function","custom_function":{"body":"function getCookie(cname) {\n  let name = cname + \"=\";\n  let decodedCookie = decodeURIComponent(document.cookie);\n  let ca = decodedCookie.split(';');\n  for(let i = 0; i \u003cca.length; i++) {\n    let c = ca[i];\n    while (c.charAt(0) == ' ') {\n      c = c.substring(1);\n    }\n    if (c.indexOf(name) == 0) {\n      return c.substring(name.length, c.length);\n    }\n  }\n  return \"\";\n}\nconst detectSite = () =\u003e{\n\tconst site_type = getCookie('cc_experience')\n\treturn site_type === 'new' ? 'new' : 'old'\n}\nconst site_type = detectSite()\n\nif(site_type === 'old' \u0026\u0026 ['/checkout-start', '/checkout'].includes(window.location.pathname)){\n\treturn true\n}"}}}]}}