{"version":3,"file":"cross-sell.js","sources":["../../../resources/javascript/features/pdp/cross-sell/index.js","../../../resources/javascript/entrypoint/cross-sell.js"],"sourcesContent":["import { getContentBlockListName } from '../../content-block';\nimport { getProductElementData, trackProductElementClick, trackProductListImpressions, updateTrackingFor } from '../../tracking/list';\nimport { getCurrency, formatPrice as _formatPrice } from '../../../util/currency';\nimport { getLocale } from '../../../util/locale';\nimport '../../../mv2020/plugins/check-replace';\n\nconst formatPrice = (opts) => _formatPrice(Object.assign({ locale: getLocale(), currency: getCurrency() }, opts));\n\n/**\n * Initialise cross sell carousel\n *\n * This function must be called on pages that include cross sell\n* carousels, but no more than once per page load.\n */\nexport const initCrossSell = () => {\n  initCarousel();\n  initRollout();\n\n  const observer = new IntersectionObserver((entries) => {\n    for (const entry of entries) {\n      if (!entry.isIntersecting) {\n        continue;\n      }\n\n      // Unobserve, so we only record impressions once\n      observer.unobserve(entry.target);\n\n      initImpressionTracking(entry.target);\n    }\n  });\n\n  document.querySelectorAll('.product-details__crosssell')\n    .forEach(crossSellCarousel => observer.observe(crossSellCarousel));\n};\n\nconst initImpressionTracking = (crosssell) => {\n  const carousel = crosssell.querySelector('.product-details__crosssell-options');\n\n  const list = getContentBlockListName(crosssell);\n\n  const options = [...carousel.querySelectorAll('.product-details__crosssell-option:not(.product-details__crosssell-option__no-selection)')];\n\n  let countTracked = 0;\n  let items = [];\n\n  const trackImpressions = () => {\n    if (items.length > 0) {\n      trackProductListImpressions({ list, items });\n      items = [];\n    }\n  }\n\n  carousel.addEventListener('scrollend', trackImpressions);\n\n  let firstObservation = true;\n  const observer = new IntersectionObserver((entries) => {\n    for (const entry of entries) {\n      if (!entry.isIntersecting) {\n        continue;\n      }\n\n      observer.unobserve(entry.target);\n\n      if (countTracked++ === options.length) {\n        carousel.removeEventListener('scrollend', trackImpressions);\n      }\n\n      const option = entry.target.querySelector('.js-cross-sell');\n\n      items.push(getProductElementData(option));\n\n      entry.target.addEventListener('click', (e) => {\n        trackProductElementClick(e, list, { element: option });\n      });\n    }\n\n    if (firstObservation) {\n      firstObservation = false;\n      trackImpressions();\n    }\n  }, { root: this });\n\n  options.forEach(option => observer.observe(option));\n}\n\nconst initCarousel = () => {\n    const crosssell = $('.product-details__crosssell-options');\n    if (!crosssell.length) {\n        return;\n    }\n\n    const selection = $('.product-details__crosssell-selection')\n    const price = $('.product-details__crosssell-price');\n    const noSelectionRadioInput = crosssell.find('.product-details__crosssell-option__no-selection input[type=\"radio\"]');\n\n    crosssell.find('img').attr('draggable', 'false');\n\n    function scrollToSelection (crosssellOption) {\n        if ($(crosssellOption).prev().length) {\n            $(crosssellOption).prev().get(0).scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n        }\n        crosssell.css('overflow-x', '');\n    }\n\n    function updateSelection (e) {\n        if ($(this).length === 0) {\n            return;\n        }\n\n        scrollToSelection(this);\n\n        const radioInput = $(this).find('input[type=\"radio\"]');\n        if (radioInput.is(':checked')) {\n            radioInput.prop('checked', false);\n            noSelectionRadioInput.prop('checked', true);\n            selection.text(noSelectionRadioInput.data('name'));\n            price.text('');\n        } else {\n            radioInput.prop('checked', true);\n            selection.text(radioInput.data('name'));\n            if (radioInput.data('display-sale-price')) {\n                price.addClass('product-details__crosssell-price--sale');\n                price.html('<p class=\"product-details__crosssell-price--was\">' + radioInput.data('display-price') + '</p><p class=\"product-details__crosssell-price--now\">+' + radioInput.data('display-sale-price') + '</p>');\n            } else {\n                price.text('+' + radioInput.data('display-price'));\n            }\n        }\n\n    }\n\n    if ($('.js-cross-sell:not(.product-details__crosssell-option__no-selection):checked').length) {\n        const selected = $('.js-cross-sell:checked');\n        scrollToSelection(selected.closest('.product-details__crosssell-option'));\n        selection.text(selected.data('name'));\n        price.text('+' + selected.data('display-price'));\n    } else {\n        noSelectionRadioInput.prop('checked', true);\n    }\n\n    let lastX = null;\n    let moveAnimationFrame = null;\n    let moved = false;\n    let mouseButtonPressed = false;\n    const movehandler = function (e) {\n        const deltaX = lastX - e.clientX;\n\n        if (!moved && Math.abs(deltaX) > 3) {\n            moved = true;\n            crosssell.css('overflow-x', '');\n            $('body').addClass('product-details__crosssell-grabbing');\n        }\n\n        cancelAnimationFrame(moveAnimationFrame);\n        moveAnimationFrame = requestAnimationFrame(function () {\n            const newScrollLeft = crosssell.scrollLeft() + deltaX;\n            crosssell.scrollLeft(newScrollLeft);\n            lastX = e.clientX;\n        });\n    };\n\n    // disable click events so they don't interfere with the drag handling\n    crosssell.find('.product-details__crosssell-option').on('click', function (e) {\n        if (moved) {\n            e.preventDefault();\n            e.stopPropagation();\n            e.stopImmediatePropagation();\n            return false;\n        }\n    });\n\n    crosssell.on('mousedown', function (e) {\n        moved = false;\n        mouseButtonPressed = true;\n        lastX = e.clientX;\n        crosssell.css('overflow-x', 'hidden');\n        crosssell.css('scroll-snap-type', 'none');\n\n        $(window).on('mousemove', movehandler);\n        $(window).one('mouseup', (e) => {\n            mouseButtonPressed = false;\n            $(window).off('mousemove', movehandler);\n            cancelAnimationFrame(moveAnimationFrame);\n            lastX = null;\n            // treat as a click event instead\n            if (!moved) {\n                crosssell.css('scroll-snap-type', '');\n                updateSelection.call($(e.target).closest('.product-details__crosssell-option'));\n            } else {\n                crosssell.one('scroll', () => {\n                    if (!mouseButtonPressed) {\n                        crosssell.css('scroll-snap-type', '');\n                    }\n                });\n            }\n            $('body').removeClass('product-details__crosssell-grabbing');\n            crosssell.css('overflow-x', '');\n        });\n        $('body').one('mouseleave', () => {\n            mouseButtonPressed = false;\n            $(window).off('mousemove', movehandler);\n        });\n    });\n\n    if (Math.ceil(crosssell.width()) < crosssell.get(0).scrollWidth) {\n        const lastOption = $('.product-details__crosssell-option:last-child');\n        const scrollLeftMax = crosssell.get(0).scrollWidth - crosssell.get(0).clientWidth;\n        const maxScroll = scrollLeftMax - lastOption.width();\n        let scrollAnimationFrame = null;\n\n        crosssell.on('scroll', function (e) {\n            if (crosssell.scrollLeft() >= maxScroll - 1) {\n                const maskDistance = lastOption.width() - (crosssell.scrollLeft() - maxScroll);\n                const alpha = 1 - Math.max(Math.min(Math.round((maskDistance / lastOption.width()) * 100) / 100, 1), 0);\n                const easedAlpha = alpha ** 5;\n                cancelAnimationFrame(scrollAnimationFrame);\n                scrollAnimationFrame = requestAnimationFrame(function () {\n                    crosssell.css('mask-image', `linear-gradient(to right, black calc(100% - ${lastOption.width()}px), rgba(0,0,0,${easedAlpha}) 98%)`);\n                })\n            }\n        });\n    } else {\n        crosssell.css('mask-image', 'none');\n    }\n}\n\nconst initRollout = () => {\n    const crossSellRolloutBlocks = document.querySelectorAll('.product-details__crosssell-rollout-block');\n\n    for (const crossSellRolloutBlock of crossSellRolloutBlocks) {\n        const item = crossSellRolloutBlock.querySelector('.js-cross-sell-item');\n        const itemTitle = item.querySelector('.product-details__crosssell-item__title');\n        const itemPrice = item.querySelector('.product-details__crosssell-item__price--now');\n        const itemPriceWas = item.querySelector('.product-details__crosssell-item__price--was');\n        const itemImage = item.querySelector('.product-details__crosssell-item__image img');\n\n        const list = getContentBlockListName(crossSellRolloutBlock);\n\n        crossSellRolloutBlock.querySelector('.js-cross-sell-default').addEventListener('click', function () {\n            window.header.setWidgetDepth();\n\n            const url = new URL(crossSellRolloutBlock.dataset.crossSellUrl, window.location.origin);\n            url.searchParams.set(...window.cacheString.split('='));\n\n            const flipflopParams = MV.getFlipFlopUrlParams();\n            Object.entries(flipflopParams).forEach(([key, value]) => {\n                url.searchParams.set(key, value);\n            });\n\n            const options = {\n                type: 'ajax',\n                items: { src: url },\n                mainClass: 'mfp-fade',\n                fixedContentPos: true,\n                callbacks: {\n                    ajaxContentAdded: function() {\n                        const rollout = $(this.content).get(0);\n\n                        const options = [...rollout.querySelectorAll('.crosssell-rollout__option:not(.crosssell-rollout__option-no-selection)')];\n                        const items = [];\n                        options.forEach(option => items.push(getProductElementData(option.querySelector('.js-cross-sell'))));\n                        trackProductListImpressions({ list, items });\n\n                        $(rollout).filter('.popup').addClass('popup--open');\n                        $(rollout).find('input[type=checkbox]').checkReplace();\n                        $(rollout).find('select').selectreplace({\n                            wrapper     : 'div',\n                            wrapperClass: 'select-replace',\n                            value       : 'p',\n                            valueClass  : 'select-replace__value',\n                            svgIcon     : 'dropdown-black'\n                        });\n\n                        const rolloutContent = rollout.querySelector('.rollout-content');\n                        const addBtn = rollout.querySelector('#js-crosssell-rollout__add-item');\n\n                        const noSelectionInput = rolloutContent.querySelector('.crosssell-rollout__option-no-selection');\n                        for (const option of options) {\n                            const input = option.querySelector('.js-cross-sell');\n                            option.addEventListener('click', (e) => {\n                                if (!e.target.matches('input')) {\n                                    e.preventDefault()\n                                    e.stopPropagation();\n                                    if (!input.checked) {\n                                        input.checked = true;\n                                        noSelectionInput.checked = false;\n                                    } else {\n                                        input.checked = false;\n                                        noSelectionInput.checked = true;\n                                    }\n                                }\n                                addBtn.disabled = noSelectionInput.checked;\n                            });\n                        }\n\n                        const initProductDetails = (content) => {\n                            content.querySelector('.size-selector--disabled')?.classList.remove('size-selector--disabled');\n\n                            const productDetails = content.querySelector('.product-details');\n\n                            let price = parseFloat(productDetails.dataset.salePrice ?? productDetails.dataset.price) * item.dataset.qty;\n                            let priceWas = parseFloat(productDetails.dataset.price) * item.dataset.qty;\n\n                            const confirmPrice = content.querySelector('#js-crosssell-rollout__price');\n                            const chainExtenderUpsellAdd = content.querySelector('.product-details__chain-extender-upsell-details--add');\n                            const chainExtenderUpsellRemove = content.querySelector('.product-details__chain-extender-upsell-details--remove');\n\n                            const addChainExtender = () => {\n                                chainExtenderUpsellAdd.style.display = 'none';\n                                chainExtenderUpsellRemove.style.display = 'flex';\n                                item.dataset.chainExtenderKey = chainExtenderUpsellAdd.dataset.key;\n\n                                price += parseFloat(chainExtenderUpsellAdd.dataset.salePrice ?? chainExtenderUpsellAdd.dataset.price);\n                                priceWas += parseFloat(chainExtenderUpsellAdd.dataset.price);\n\n                                confirmPrice.innerText = formatPrice({ price });\n                            };\n\n                            if (item.dataset.chainExtenderKey) {\n                                addChainExtender();\n                            }\n\n                            chainExtenderUpsellAdd?.querySelector('.product-details__chain-extender-upsell-cta').addEventListener('click', (e) => {\n                                e.preventDefault();\n                                e.stopPropagation();\n                                addChainExtender();\n                            });\n\n                            chainExtenderUpsellRemove?.querySelector('.product-details__chain-extender-upsell-cta').addEventListener('click', (e) => {\n                                e.preventDefault();\n                                e.stopPropagation();\n                                chainExtenderUpsellAdd.style.display = 'flex';\n                                chainExtenderUpsellRemove.style.display = 'none';\n                                delete item.dataset.key;\n                                delete item.dataset.code;\n                                delete item.dataset.chainExtenderKey;\n\n                                price -= parseFloat(chainExtenderUpsellAdd.dataset.salePrice ?? chainExtenderUpsellAdd.dataset.price);\n                                priceWas -= parseFloat(chainExtenderUpsellAdd.dataset.price);\n\n                                confirmPrice.innerText = formatPrice({ price });\n                            });\n\n                            const confirmBtn = content.querySelector('#js-crosssell-rollout__confirm-item');\n                            confirmBtn.disabled = !content.querySelector('.size-selector__item--selected');\n                            confirmBtn.addEventListener('click', () => {\n                                itemTitle.innerText = productDetails.querySelector('.product-details__title').innerText;\n                                itemPrice.innerText = formatPrice({ price });\n                                itemPriceWas.innerText = price !== priceWas ? formatPrice({ price: priceWas }) : '';\n                                itemImage.src = productDetails.querySelector('.product-details__image img').src;\n                                item.dataset.key = productDetails.querySelector('.product-details__add-to-basket').dataset.key;\n                                item.dataset.code = productDetails.querySelector('.product-details__add-to-basket').dataset.code;\n                                window.MV.modal.close({ clearStack: true });\n                            });\n\n                            const backBtn = content.querySelector('.crosssell-rollout__back-btn');\n                            backBtn?.addEventListener('click', () => {\n                                window.MV.modal.close();\n                                delete item.dataset.chainExtenderKey;\n                            });\n\n                            for (const link of content.querySelectorAll('a:not(.modal):not(.js-add-to-wishlist):not(.js-size-selector-rollout):not(.product-details__chain-extender-upsell-cta)')) {\n                                link.addEventListener('click', (e) => {\n                                    e.preventDefault();\n                                    e.stopPropagation();\n                                    e.stopImmediatePropagation();\n\n                                    const url = new URL(link.pathname + '/cross-sell-item' + link.search, window.location.origin);\n                                    url.searchParams.set('show-chain-upsell', true);\n                                    url.searchParams.set(...window.cacheString.split('='));\n\n                                    Object.entries(flipflopParams).forEach(([key, value]) => {\n                                        url.searchParams.set(key, value);\n                                    });\n\n                                    $.ajax({ url }).done((response) => {\n                                        const options = {\n                                            items: { src: response },\n                                            type: 'inline',\n                                            callbacks: {\n                                                open: function () {\n                                                    $(this.content).filter('.popup').addClass('popup--open');\n                                                    initProductDetails(this.content.get(0));\n                                                }\n                                            }\n                                        }\n\n                                        window.MV.modal.replace({ options, overwritePrev: true });\n                                    });\n                                });\n                            }\n                        };\n\n                        addBtn?.addEventListener('click', (e) => {\n                            e.preventDefault();\n\n                            const selectedItem = rollout.querySelector('.js-cross-sell:checked');\n                            if (!selectedItem) {\n                                return;\n                            }\n\n                            const position = parseInt(selectedItem.dataset.position);\n                            updateTrackingFor(selectedItem.dataset.gaid, list, position, window.location.pathname);\n                            trackProductElementClick(e, list, { element: selectedItem });\n\n                            const option = selectedItem.closest('.crosssell-rollout__option');\n\n                            if (option.classList.contains('crosssell-rollout__option--multiple')) {\n                                const url = new URL(option.querySelector('a').href, window.location.origin);\n                                url.pathname += '/cross-sell-item';\n                                url.searchParams.set('show-chain-upsell', true);\n                                url.searchParams.set(...window.cacheString.split('='));\n\n                                Object.entries(flipflopParams).forEach(([key, value]) => {\n                                    url.searchParams.set(key, value);\n                                });\n\n                                const options = {\n                                    items: { src: url },\n                                    type: 'ajax',\n                                    callbacks: {\n                                        ajaxContentAdded: function () {\n                                            $(this.content).filter('.popup').addClass('popup--open');\n                                            initProductDetails(this.content.get(0));\n                                        },\n                                    },\n                                };\n\n                                window.MV.modal.open({ options });\n                            } else {\n                                const crossSellItem = option.querySelector('.js-cross-sell');\n                                itemTitle.innerText = option.querySelector('.crosssell-rollout__option-title').innerText;\n\n                                const price = parseFloat(crossSellItem.dataset.salePrice ?? crossSellItem.dataset.price) * item.dataset.qty;\n                                const priceWas = parseFloat(crossSellItem.dataset.price) * item.dataset.qty;\n                                itemPrice.innerText = formatPrice({ price });\n                                itemPriceWas.innerText = price !== priceWas ? formatPrice({ price: priceWas }) : '';\n\n                                itemImage.src = option.querySelector('img').src;\n                                item.dataset.key = selectedItem.dataset.key;\n                                item.dataset.code = selectedItem.dataset.gaid;\n                                window.MV.modal.close({ clearStack: true });\n                                delete item.dataset.chainExtenderKey;\n                            }\n                        });\n                    },\n                    close: function() {\n                        window.dataLayer.push({\n                            'event': 'CrossSellRolloutClose',\n                        });\n                    }\n                }\n            };\n\n            window.MV.modal.open({ options });\n            window.dataLayer.push({ 'event': 'CrossSellRolloutOpen' });\n        });\n\n        crossSellRolloutBlock.querySelector('.product-details__crosssell-item__remove-cta').addEventListener('click', function () {\n            itemTitle.innerText = '';\n            itemPrice.innerText = '';\n            itemPriceWas.innerText = '';\n            delete item.dataset.key;\n            delete item.dataset.code;\n            delete item.dataset.chainExtenderKey;\n        });\n    }\n};\n","import { initCrossSell } from '../features/pdp/cross-sell';\nimport { onDOMContentLoaded } from '../util/loaded';\n\nonDOMContentLoaded(initCrossSell);\n\n"],"names":["formatPrice","opts","_formatPrice","Object","assign","locale","getLocale","currency","getCurrency","initImpressionTracking","crosssell","carousel","querySelector","list","getContentBlockListName","options","querySelectorAll","countTracked","items","trackImpressions","length","trackProductListImpressions","addEventListener","firstObservation","observer","IntersectionObserver","entries","entry","isIntersecting","unobserve","target","removeEventListener","option","push","getProductElementData","e","trackProductElementClick","element","root","this","forEach","observe","initCarousel","$","selection","price","noSelectionRadioInput","find","scrollToSelection","crosssellOption","prev","get","scrollIntoView","behavior","block","inline","css","updateSelection","radioInput","is","prop","text","data","addClass","html","attr","selected","closest","lastX","moveAnimationFrame","moved","mouseButtonPressed","movehandler","deltaX","clientX","Math","abs","cancelAnimationFrame","requestAnimationFrame","newScrollLeft","scrollLeft","on","preventDefault","stopPropagation","stopImmediatePropagation","window","one","off","call","removeClass","ceil","width","scrollWidth","lastOption","maxScroll","clientWidth","scrollAnimationFrame","maskDistance","easedAlpha","max","min","round","initRollout","crossSellRolloutBlocks","document","crossSellRolloutBlock","item","itemTitle","itemPrice","itemPriceWas","itemImage","header","setWidgetDepth","url","URL","dataset","crossSellUrl","location","origin","searchParams","set","cacheString","split","flipflopParams","MV","getFlipFlopUrlParams","key","value","type","src","mainClass","fixedContentPos","callbacks","ajaxContentAdded","rollout","content","filter","checkReplace","selectreplace","wrapper","wrapperClass","valueClass","svgIcon","rolloutContent","addBtn","noSelectionInput","input","matches","checked","disabled","initProductDetails","_content$querySelecto","_productDetails$datas","classList","remove","productDetails","parseFloat","salePrice","qty","priceWas","confirmPrice","chainExtenderUpsellAdd","chainExtenderUpsellRemove","addChainExtender","_chainExtenderUpsellA","style","display","chainExtenderKey","innerText","_chainExtenderUpsellA2","code","confirmBtn","modal","close","clearStack","backBtn","link","pathname","search","ajax","done","response","open","replace","overwritePrev","selectedItem","position","parseInt","updateTrackingFor","gaid","contains","href","_crossSellItem$datase","crossSellItem","dataLayer","event","onDOMContentLoaded","initCrossSell","crossSellCarousel"],"mappings":"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"}