{"version":3,"sources":["fabric-overlay.js","fabric-selector.js"],"names":["_typeof","o","Symbol","iterator","constructor","prototype","_createForOfIteratorHelper","r","e","t","Array","isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","name","from","test","_classCallCheck","_defineProperties","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","i","_toPrimitive","toPrimitive","String","Number","Loop","this","object","obj","callback","keys","array","reverse","SwatchBasket","el","self","loop","basketStorage","LocalStorageManager","document","querySelector","input","querySelectorAll","status","option","option2","submitButton","selectedCount","swatches","swatchLimit","init","dataset","swatchBasketInitialised","watchInputs","watchOptions","bindStatusClick","getPreselected","updateBasket","orderSwatchesOverlay","addEventListener","preventDefault","Overlay","render","sidebar","modifiers","Soho","formTemplate","undefined","popupOpen","click","selected","swatchesSelected","get","split","map","code","getElementById","checked","getAttribute","filter","id","forEach","stopImmediatePropagation","currentTarget","closest","dispatchEvent","CustomEvent","onchange","change","bind","removeFromBasket","swatch","target","swatchExists","canAddSwatch","addSwatch","removeSwatch","resetBasket","indexOf","push","index","splice","updateSwatchCount","_this","innerHTML","concat","j","swatchDisplay","style","backgroundImage","swatchText","classList","remove","checkbox","setAttribute","add","removeAttribute","set","join","popups","popup","Popup","FabricSelector","elm","root","element","radios","readyToShip","wasPriceElement","memberWasPriceElement","getSelected","setup","setGallery","_this2","onFabricClick","radio","select","showImmediate","event","Event","_step","_iterator","err","setCta","img","setTitle","product","productName","material","colour","setPrice","price","memberPrice","isDiscounted","display","wasPrice","memberWasPrice","setDescription","description","stockitemDescription","setConfirmLink","data","textContent","v","productUrl","gallery","fetch","then","res","text","html","catch","error","console","image","imgEl","nameEl","innerText","href","_step2","_iterator2","selector","all","targets","_step3","_iterator3","parentElement","fabricOverlay","overlayElm","columnLeft","columnRight","overlayContent","footer","breakpointTablet","currentTab","onBreakpointChange","matches","lockOverlayContent","setFooter","closeRightColumn","onTabLinkClick","link","hash","setTab","replace","toggleRightColumn","open","scrollTo","openRightColumn","_step4","_iterator4","getElementsByClassName","tabName","_step5","_iterator5","tab","_step6","_iterator6","className","window","matchMedia","addListener","onSwatchClick","events","OneTrust","SohoOneTrust","swatchOrderForm","onOverlayOpen","button","load","overlayUrl"],"mappings":"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","file":"../../javascript/fabric-overlay.js","sourcesContent":["function Loop() {\n    this.object = function (obj, callback) {\n        var keys = Object.keys(obj);\n        for (var i = 0; i < keys.length; i++) {\n            (function (i) {\n                callback(keys, i);\n            })(i);\n        }\n    };\n\n    this.array = function (array, callback, reverse) {\n        if (reverse) {\n            for (var i = array.length - 1; i > -1; i--) {\n                (function (i) {\n                    callback(array, i);\n                })(i);\n            }\n        } else {\n            for (var i = 0; i < array.length; i++) {\n                (function (i) {\n                    callback(array, i);\n                })(i);\n            }\n        }\n    };\n}\n\n\n/**\n * @param {HTMLElement} el\n * @constructor\n */\nfunction SwatchBasket(el) {\n    const self = this;\n    const loop = new Loop();\n    const basketStorage = new LocalStorageManager();\n\n    this.el = el || document.querySelector('.js-swatch-basket');\n    this.input = document.querySelectorAll('.js-swatch-input');\n    this.status = document.querySelectorAll('.js-swatch-status');\n    this.option = document.querySelectorAll('.js-swatch-basket__option');\n    this.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n    this.submitButton = document.querySelector('.js-swatch-basket__submit');\n    this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n    this.swatches = [];\n    this.swatchLimit = this.option.length;\n\n    // Begin\n    this.init = function () {\n        if (!this.el) {\n            this.updateBasket();\n            return;\n        }\n\n        if (this.el.dataset.swatchBasketInitialised) {\n            return;\n        }\n\n        this.el.dataset.swatchBasketInitialised = 'true';\n\n        this.watchInputs();\n        this.watchOptions();\n        this.bindStatusClick();\n\n        this.swatches = this.getPreselected();\n\n        if (this.swatches.length) {\n            this.updateBasket();\n        }\n\n        const orderSwatchesOverlay = document.querySelector('#order-swatches');\n\n        if (this.submitButton && orderSwatchesOverlay) {\n            this.submitButton.addEventListener('click', (e) => {\n                e.preventDefault();\n\n                Overlay.render(`#order-swatches`, {\n                    sidebar: true,\n                    modifiers: ['sidebar', 'sidebar-right', 'swatch-details'],\n                    callback: () => {\n                        if (Soho.formTemplate) {\n                            Soho.formTemplate();\n                        }\n                    }\n                });\n            });\n\n            if (this.submitButton.dataset.popupOpen !== undefined) {\n                this.submitButton.click();\n            }\n        }\n    };\n\n    this.getPreselected = function () {\n        let selected = this.el.dataset.swatchesSelected ? this.el.dataset.swatchesSelected : basketStorage.get('swatch-basket-swatches', '');\n\n        if (typeof selected === 'undefined' || selected === '') {\n            return [];\n        } else {\n            selected = selected.split(',');\n        }\n\n        if (selected.length > 0) {\n            selected = selected\n                .map(function (code) {\n                    let input = document.querySelector('.js-swatch-input[value=\"' + code + '\"]');\n                    if (!input) {\n                        input = document.getElementById(code);\n                        if (!input) {\n                            return null;\n                        }\n                    }\n                    input.checked = true;\n                    return input.getAttribute('id')\n                }).filter(function (id) {\n                    return id !== null;\n                });\n        }\n\n        return selected;\n    };\n\n    // Bind status click, remove the swatch from the basket\n    this.bindStatusClick = function () {\n        this.status.forEach(status => {\n            status.addEventListener('click', e => {\n                e.preventDefault();\n                e.stopImmediatePropagation();\n                const input = e.currentTarget.closest('.swatch-group__option').querySelector('input');\n                if (input) {\n                    input.checked = false;\n                    input.dispatchEvent(new CustomEvent('change'));\n                }\n            });\n        });\n    };\n\n    // Watch all swatch inputs for changes (can be added or removed)\n    this.watchInputs = function () {\n        loop.array(this.input, function (input, i) {\n            input[i].onchange = self.change.bind(self);\n        });\n    };\n\n    // Watch all basket options for changes (can be removed)\n    this.watchOptions = function () {\n        loop.array(this.option, function (option, i) {\n            option[i].onchange = self.removeFromBasket.bind(self);\n        });\n    };\n\n    // Toggle the state of a swatch - either add it to the basket or remove it from the basket\n    this.change = function (e) {\n        const swatch = e.target.id;\n\n        if (e.target.checked && !this.swatchExists(swatch)) {\n            if (this.canAddSwatch()) {\n                this.addSwatch(swatch);\n            } else {\n                e.target.checked = false;\n            }\n        }\n\n        if (!e.target.checked && this.swatchExists(swatch)) {\n            this.removeSwatch(swatch);\n        }\n\n        this.resetBasket();\n        this.updateBasket();\n    };\n\n    // Can a swatch be added to the swatches array?\n    this.canAddSwatch = function () {\n        return this.swatches.length < this.swatchLimit;\n    };\n\n    // Does the swatch exist in the swatches array\n    this.swatchExists = function (swatch) {\n        return this.swatches.indexOf(swatch) > -1;\n    };\n\n    // Add the swatch to the swatches array\n    this.addSwatch = function (swatch) {\n        this.swatches.push(swatch);\n    };\n\n    // Remove the swatch from the swatches array\n    this.removeSwatch = function (swatch) {\n        const index = this.swatches.indexOf(swatch);\n\n        this.swatches.splice(index, 1);\n    };\n\n    // Update the swatch count\n    this.updateSwatchCount = function() {\n        this.selectedCount.forEach((el) => {\n            el.innerHTML = `(${this.swatches.length}/${this.swatchLimit})`;\n        });\n    };\n\n    // Remove a swatch from the basket\n    this.removeFromBasket = function (e) {\n        const swatch = e.target.getAttribute('data-trigger');\n\n        if (!e.target.checked && this.swatchExists(swatch)) {\n            const input = document.querySelector('#' + swatch);\n\n            input.checked = false;\n            input.dispatchEvent(new CustomEvent('change'));\n        }\n    };\n\n    // Reset all options within the basket\n    this.resetBasket = function () {\n        this.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n        this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n        loop.array(this.option, function (option, i) {\n            [option[i], self.option2[i]].forEach((el, j) => {\n                if (!el) {\n                    return;\n                }\n\n                const swatchDisplay = el.querySelector('.swatch__display');\n                if (swatchDisplay) {\n                    swatchDisplay.style.backgroundImage = 'none';\n                }\n\n                const swatchText = el.querySelector('.swatch__text');\n                if (swatchText) {\n                    swatchText.innerHTML = 'Add swatch';\n                    if (j === 1) {\n                        swatchText.classList.remove('swatch__text--visible');\n                    }\n                }\n\n                const checkbox = el.querySelector('input[type=\"checkbox\"]');\n                if (checkbox) {\n                    checkbox.value = null;\n                    checkbox.checked = false;\n                    checkbox.setAttribute('disabled', true);\n                }\n            });\n        });\n\n        if (this.submitButton) {\n            this.submitButton.setAttribute('disabled', 'disabled');\n        }\n    };\n\n    // Update the basket, adding each item from the swatches array into the basket\n    this.updateBasket = function () {\n        this.option2 = document.querySelectorAll('.js-swatch-basket__option-2');\n        this.selectedCount = document.querySelectorAll('.js-swatch-basket__selected-count');\n\n        loop.array(this.swatches, function (swatches, i) {\n            const swatch = swatches[i];\n            const input = document.querySelector('#' + swatch);\n\n            [self.option[i], self.option2[i]].forEach((el, j) => {\n                if (!el) {\n                    return;\n                }\n\n                const swatchDisplay = el.querySelector('.swatch__display');\n                if (swatchDisplay) {\n                    swatchDisplay.style.backgroundImage = 'url(' + input.getAttribute('data-colour-image') + ')';\n                }\n\n                const swatchText = el.querySelector('.swatch__text');\n                if(swatchText) {\n                    swatchText.innerHTML = input.getAttribute('data-colour-label');\n                    if (j === 1) {\n                        swatchText.classList.add('swatch__text--visible');\n                    }\n                }\n\n                const checkbox = el.querySelector('input[type=\"checkbox\"]');\n                if (checkbox) {\n                    checkbox.value = input.getAttribute('data-colour-id');\n                    checkbox.checked = true;\n                    checkbox.setAttribute('data-trigger', swatch);\n                    checkbox.removeAttribute('disabled');\n                }\n            });\n        });\n\n        if (this.swatches.length !== 0 && this.submitButton) {\n            this.submitButton.removeAttribute('disabled');\n            basketStorage.set('swatch-basket-swatches', this.swatches.join(','));\n        }\n\n        this.updateSwatchCount();\n    }\n}\n\n//=require @d3r/js-tools/legacy/loop.js\n\nSoho.popups = [];\n\nSoho.popup = function() {\n    var loop = new Loop();\n\n    loop.array(document.querySelectorAll('.js-popup:not([data-popup-initialized])'), function(array, i) {\n        var popup = new Popup(array[i]);\n        popup.init();\n\n        Soho.popups.push(popup);\n    });\n}\n\n\n/**\n * Fabric Selector\n */\nclass FabricSelector {\n\n    /**\n     * @param undefined|{HTMLElement} elm\n     */\n    constructor(elm) {\n        this.root = elm;\n\n        if (this.root) {\n            this.element = this.root.querySelector('.fabric-selector');\n            this.radios = this.element.querySelectorAll('input[type=\"radio\"]');\n            this.readyToShip = this.element.querySelector('input[name=\"ready_to_ship\"]');\n\n            this.wasPriceElement = this.root.querySelector('.js-product-detail-was-price')\n            this.memberWasPriceElement = this.root.querySelector('.js-product-detail-member-was-price')\n\n            this.bind();\n\n            const selected = this.getSelected();\n\n            this.setup(selected);\n\n            this.setGallery(selected.value);\n        }\n    }\n\n    /**\n     * Bind form events\n     */\n    bind() {\n        this.element.querySelectorAll('.js-colour-selection-option').forEach((elm) => elm.addEventListener('click', (e) => {\n            e.preventDefault();\n            this.onFabricClick(elm);\n        }));\n\n        this.radios.forEach((radio) => radio.addEventListener('change', () => this.select(this.getSelected())));\n\n        if (this.readyToShip) {\n            this.readyToShip.addEventListener('change', (e) => {\n                this.showImmediate(e.currentTarget.checked);\n            });\n        }\n    }\n\n    onFabricClick(elm) {\n        const input = elm.querySelector('input[type=\"radio\"]');\n        input.checked = !input.checked;\n        let event = new Event('change');\n        input.dispatchEvent(event);\n    }\n\n    /**\n     * Get selected radio element\n     *\n     * @returns {HTMLElement}\n     */\n    getSelected() {\n        for (const element of this.radios) {\n            if (element.checked) {\n                return element;\n            }\n        }\n    }\n\n    /**\n     * On select, update the product details\n     *\n     * @param {HTMLElement} element\n     * @returns\n     */\n    select(element) {\n        if (!element) {\n            return;\n        }\n\n        this.setup(element);\n\n        this.setGallery(element.value);\n\n        this.setCta(element.dataset.img, element.dataset.name);\n    }\n\n    /**\n     * Setup the product details\n     *\n     * @param {*} element\n     * @returns\n     */\n    setup(element) {\n        if (!element) {\n            return;\n        }\n\n        this.setTitle({\n            product: element.dataset.productName || '',\n            name: element.dataset.name || '',\n            material: element.dataset.material || '',\n            colour: element.dataset.colour || ''\n        });\n\n        this.setPrice(element.dataset.price || '', this.root.querySelector('.js-product-detail-price'));\n        this.setPrice(element.dataset.memberPrice || '', this.root.querySelector('.js-product-detail-member-price'));\n\n        if (element.dataset.isDiscounted === 'true') {\n            this.wasPriceElement.closest('.product-detail__price ').style.display = '';\n            this.memberWasPriceElement.closest('.product-detail__price ').style.display = '';\n            this.setPrice(element.dataset.wasPrice || '', this.wasPriceElement);\n            this.setPrice(element.dataset.memberWasPrice || '', this.memberWasPriceElement);\n        } else {\n            if (this.wasPriceElement) {\n                this.wasPriceElement.closest('.product-detail__price ').style.display = 'none';\n            }\n            if (this.memberWasPriceElement) {\n                this.memberWasPriceElement.closest('.product-detail__price ').style.display = 'none';\n            }\n        }\n\n        this.setDescription({\n            description: element.dataset.description || '',\n            stockitemDescription: element.dataset.stockitemDescription || '',\n        });\n\n        this.setConfirmLink(element.value);\n    }\n\n    /**\n     * Set the product title\n     *\n     * @param {Object} data\n     */\n    setTitle(data) {\n        const elm = this.root.querySelector('.js-product-detail-title');\n\n        elm.textContent = [\n            data.product,\n            [\n                data.material,\n                data.colour\n            ].filter(v => !!v).join(' ')\n        ].filter(v => !!v).join(' - ');\n    }\n\n    /**\n     * @param {String} price\n     * @param {HTMLElement} element\n     */\n    setPrice(price, element) {\n        if (price < 0) {\n            element.closest('.product-detail__prices').style.display = 'none';\n        } else {\n            element.textContent = price;\n        }\n    }\n\n    /**\n     * Set the description section\n     *\n     * @param {Object} data\n     */\n    setDescription(data) {\n        const elm = this.root.querySelector('.js-product-detail-fabric-description .richtext');\n\n        elm.innerHTML = data.description || data.stockitemDescription;\n    }\n\n    /**\n     * Fetch and render the gallery\n     *\n     * @param {String} productUrl\n     */\n    setGallery(productUrl) {\n        const gallery = this.root.querySelector('.js-fabric-gallery');\n\n        // use http fetch to get the gallery partial\n        // then insert it into the overlay\n        fetch(`${productUrl}/fabric-overlay-gallery`).then(res => res.text()).then((html) => {\n            gallery.innerHTML = html;\n        }).catch((error) => {\n            console.error('Gallery Error:', error);\n        });\n    }\n\n    /**\n     * Update the CTA\n     *\n     * @param {String} image The image URL\n     * @param {String} name The swatch name\n     */\n    setCta(image, name) {\n        const imgEl = document.querySelector('.js-swatch-img');\n        const nameEl = document.querySelector('.js-swatch-name');\n\n        if (imgEl) {\n            imgEl.style.backgroundImage = `url(${image})`;\n        }\n\n        if (nameEl) {\n            nameEl.innerText = name;\n        }\n    }\n\n    /**\n     * Set the url on the fabric confirm button\n     *\n     * @param {String} productUrl\n     */\n    setConfirmLink(productUrl) {\n        this.root.querySelectorAll('.js-fabric-select-link').forEach((elm) => {\n            elm.href = productUrl;\n        });\n    }\n\n    /**\n     * Filter the immediate (to deliver) options\n     *\n     * @param {boolean} checked\n     * @returns\n     */\n    showImmediate(checked) {\n        const immediates = this.element.querySelectorAll('input[data-immediate=\"1\"]');\n        if (!immediates.length) {\n            return;\n        }\n\n        const selectors = this.element.querySelectorAll('.colour-selection');\n\n        for (const selector of selectors) {\n            const all = selector.querySelectorAll('input[type=\"radio\"]');\n            const targets = selector.querySelectorAll('input[data-immediate=\"0\"]');\n            if (targets.length == all.length) {\n                selector.style.display = checked ? 'none' : 'inline-grid';\n            } else {\n                for (const target of targets) {\n                    target.parentElement.style.display = checked ? 'none' : 'inline-grid';\n                }\n            }\n        }\n    }\n}\n\n\nconst fabricOverlay = (function () {\n\n    let overlayElm = null;\n    let columnLeft = null;\n    let columnRight = null;\n    let overlayContent = null;\n    let footer = null;\n    let breakpointTablet = null;\n    let currentTab = 'choose-fabric';\n\n    // note this is fired onload and on overlay load\n    function init() {\n        overlayElm = document.querySelector('.overlay--takeover-fabric-overlay');\n\n        if (overlayElm) {\n            overlayContent = overlayElm.querySelector('.overlay__content');\n            columnLeft = overlayElm.querySelector('.overlay__content-column-left');\n            columnRight = overlayElm.querySelector('.overlay__content-column-right');\n            footer = overlayElm.querySelector('#choose-swatches-footer');\n\n            onOverlayOpen();\n        } else {\n            initOverlayTrigger();\n        }\n    }\n\n    function initOverlayTrigger() {\n        document.querySelectorAll('.js-fabric-overlay').forEach((elm) => elm.addEventListener('click', (e) => {\n            e.preventDefault();\n\n            const button = e.target.matches('.js-fabric-overlay') ? e.target : e.target.closest('.js-fabric-overlay');\n\n            Overlay.load(button.dataset.overlayUrl, {\n                modifiers: ['takeover', 'takeover-fabric-overlay'],\n                callback: function () {\n                    fabricOverlay.init();\n                }\n            });\n        }));\n    }\n\n    function onOverlayOpen() {\n        breakpointTablet = window.matchMedia('screen and (max-width: 62.4375em)');\n\n        Soho.popup();\n\n        events();\n\n        setTab('choose-fabric');\n        onBreakpointChange(breakpointTablet);\n        setFooter();\n\n        Soho.OneTrust = new SohoOneTrust();\n\n        if (typeof Soho.OneTrust.init === 'function') {\n            Soho.OneTrust.init();\n        }\n\n\n        if (typeof SwatchBasket === 'function') {\n            const swatchBasket = new SwatchBasket();\n            swatchBasket.init();\n        }\n\n        if (typeof Soho.swatchOrderForm === 'function') {\n            Soho.swatchOrderForm();\n        }\n\n        if (typeof FabricSelector === 'function') {\n            new FabricSelector(document.querySelector('.overlay--takeover-fabric-overlay'));\n        }\n    }\n\n    function events() {\n        overlayElm.querySelectorAll('a.js-overlay-tab').forEach((elm) => elm.addEventListener('click', onTabLinkClick));\n\n        if (overlayElm) {\n            breakpointTablet.addListener(onBreakpointChange);\n        }\n\n        overlayElm.querySelectorAll('.js-swatches-overlay').forEach((elm) => elm.addEventListener('click', (e) => {\n            e.preventDefault();\n            onSwatchClick(elm);\n        }));\n\n        if (overlayElm) {\n            overlayElm.querySelector('.js-show-right-column').addEventListener('click', toggleRightColumn);\n        }\n    }\n\n    function onSwatchClick(elm) {\n        const input = elm.querySelector('[type=\"checkbox\"]');\n        input.checked = !input.checked;\n        let event = new Event('change');\n        input.dispatchEvent(event);\n    }\n\n    function onBreakpointChange(e) {\n        lockOverlayContent();\n        setFooter();\n        if (!e.matches) {\n            closeRightColumn();\n            unlockOverlayContent();\n        }\n    }\n\n    function onTabLinkClick(e) {\n        e.preventDefault();\n\n        const link = e.target;\n\n        if (!link.hash) {\n            return;\n        }\n\n        currentTab = link.hash.replace('#', '');\n\n        setTab(currentTab);\n        setFooter();\n        closeRightColumn();\n    }\n\n    function lockHeader() {\n        if (columnLeft) {\n            columnLeft.scrollTo(0, 0);\n            columnLeft.classList.add('overlay__content-column-left--locked');\n        }\n    }\n\n    function unlockHeader() {\n        if (columnLeft) {\n            columnLeft.classList.remove('overlay__content-column-left--locked');\n        }\n    }\n\n    function toggleRightColumn() {\n        if (breakpointTablet.matches) {\n            columnRight.open = !columnRight.open;\n\n            if (columnRight.open) {\n                openRightColumn();\n            } else {\n                closeRightColumn();\n            }\n        }\n    }\n\n    function openRightColumn() {\n\n        lockHeader();\n\n        if (columnRight) {\n            columnRight.classList.add('overlay__content-column-right--sidebar-open');\n            columnRight.open = true;\n        }\n\n        if (footer) {\n            footer.classList.add('choose-swatches-footer--sidebar-open');\n        }\n\n        if (overlayContent) {\n            overlayContent.classList.add('overlay__content--locked-sidebar-open');\n        }\n    }\n\n    function closeRightColumn() {\n\n        unlockHeader();\n\n        if (columnRight) {\n            columnRight.classList.remove('overlay__content-column-right--sidebar-open');\n            columnRight.open = false;\n        }\n\n        if (footer) {\n            footer.classList.remove('choose-swatches-footer--sidebar-open');\n        }\n\n        if (overlayContent) {\n            overlayContent.classList.remove('overlay__content--locked-sidebar-open');\n        }\n    }\n\n    function setFooter() {\n        const footers = overlayElm.getElementsByClassName('overlay__content--footer');\n        for (const footer of footers) {\n            footer.style.display = 'none';\n\n            if (breakpointTablet.matches && footer.id === currentTab + '-footer') {\n                footer.style.display = 'block';\n            }\n        }\n    }\n\n    function lockOverlayContent() {\n        if (!breakpointTablet) {\n            return;\n        }\n\n        if (overlayContent) {\n            if (breakpointTablet.matches) {\n                overlayContent.classList.add('overlay__content--locked');\n            } else {\n                overlayContent.classList.remove('overlay__content--locked');\n            }\n        }\n    }\n\n    function unlockOverlayContent() {\n        if (overlayContent) {\n            overlayContent.classList.remove('overlay__content--locked');\n        }\n    }\n\n    function setTab(tabName) {\n        columnRight.style.display = tabName === 'choose-swatches' ? 'block' : 'none';\n\n        const tabcontent = overlayElm.getElementsByClassName('overlay__content-tab-content');\n        for (const tab of tabcontent) {\n            tab.classList.remove('active');\n            if (tab.id === tabName) {\n                tab.classList.add('active');\n                if (tabName === 'choose-fabric') {\n                    overlayContent.classList.add('overlay__content--bg-white');\n                } else {\n                    overlayContent.classList.remove('overlay__content--bg-white');\n                }\n            }\n        }\n\n        const tablinks = overlayElm.querySelectorAll('.overlay__content-tab-links a');\n        for (const link of tablinks) {\n            link.className = link.className.replace(' active', '');\n\n            if (link.hash === '#' + tabName) {\n                link.className += ' active';\n            }\n        }\n    }\n\n    return {\n        init\n    };\n})();\n\nfabricOverlay.init();\n","\n/**\n * Fabric Selector\n */\nclass FabricSelector {\n\n    /**\n     * @param undefined|{HTMLElement} elm\n     */\n    constructor(elm) {\n        this.root = elm;\n\n        if (this.root) {\n            this.element = this.root.querySelector('.fabric-selector');\n            this.radios = this.element.querySelectorAll('input[type=\"radio\"]');\n            this.readyToShip = this.element.querySelector('input[name=\"ready_to_ship\"]');\n\n            this.wasPriceElement = this.root.querySelector('.js-product-detail-was-price')\n            this.memberWasPriceElement = this.root.querySelector('.js-product-detail-member-was-price')\n\n            this.bind();\n\n            const selected = this.getSelected();\n\n            this.setup(selected);\n\n            this.setGallery(selected.value);\n        }\n    }\n\n    /**\n     * Bind form events\n     */\n    bind() {\n        this.element.querySelectorAll('.js-colour-selection-option').forEach((elm) => elm.addEventListener('click', (e) => {\n            e.preventDefault();\n            this.onFabricClick(elm);\n        }));\n\n        this.radios.forEach((radio) => radio.addEventListener('change', () => this.select(this.getSelected())));\n\n        if (this.readyToShip) {\n            this.readyToShip.addEventListener('change', (e) => {\n                this.showImmediate(e.currentTarget.checked);\n            });\n        }\n    }\n\n    onFabricClick(elm) {\n        const input = elm.querySelector('input[type=\"radio\"]');\n        input.checked = !input.checked;\n        let event = new Event('change');\n        input.dispatchEvent(event);\n    }\n\n    /**\n     * Get selected radio element\n     *\n     * @returns {HTMLElement}\n     */\n    getSelected() {\n        for (const element of this.radios) {\n            if (element.checked) {\n                return element;\n            }\n        }\n    }\n\n    /**\n     * On select, update the product details\n     *\n     * @param {HTMLElement} element\n     * @returns\n     */\n    select(element) {\n        if (!element) {\n            return;\n        }\n\n        this.setup(element);\n\n        this.setGallery(element.value);\n\n        this.setCta(element.dataset.img, element.dataset.name);\n    }\n\n    /**\n     * Setup the product details\n     *\n     * @param {*} element\n     * @returns\n     */\n    setup(element) {\n        if (!element) {\n            return;\n        }\n\n        this.setTitle({\n            product: element.dataset.productName || '',\n            name: element.dataset.name || '',\n            material: element.dataset.material || '',\n            colour: element.dataset.colour || ''\n        });\n\n        this.setPrice(element.dataset.price || '', this.root.querySelector('.js-product-detail-price'));\n        this.setPrice(element.dataset.memberPrice || '', this.root.querySelector('.js-product-detail-member-price'));\n\n        if (element.dataset.isDiscounted === 'true') {\n            this.wasPriceElement.closest('.product-detail__price ').style.display = '';\n            this.memberWasPriceElement.closest('.product-detail__price ').style.display = '';\n            this.setPrice(element.dataset.wasPrice || '', this.wasPriceElement);\n            this.setPrice(element.dataset.memberWasPrice || '', this.memberWasPriceElement);\n        } else {\n            if (this.wasPriceElement) {\n                this.wasPriceElement.closest('.product-detail__price ').style.display = 'none';\n            }\n            if (this.memberWasPriceElement) {\n                this.memberWasPriceElement.closest('.product-detail__price ').style.display = 'none';\n            }\n        }\n\n        this.setDescription({\n            description: element.dataset.description || '',\n            stockitemDescription: element.dataset.stockitemDescription || '',\n        });\n\n        this.setConfirmLink(element.value);\n    }\n\n    /**\n     * Set the product title\n     *\n     * @param {Object} data\n     */\n    setTitle(data) {\n        const elm = this.root.querySelector('.js-product-detail-title');\n\n        elm.textContent = [\n            data.product,\n            [\n                data.material,\n                data.colour\n            ].filter(v => !!v).join(' ')\n        ].filter(v => !!v).join(' - ');\n    }\n\n    /**\n     * @param {String} price\n     * @param {HTMLElement} element\n     */\n    setPrice(price, element) {\n        if (price < 0) {\n            element.closest('.product-detail__prices').style.display = 'none';\n        } else {\n            element.textContent = price;\n        }\n    }\n\n    /**\n     * Set the description section\n     *\n     * @param {Object} data\n     */\n    setDescription(data) {\n        const elm = this.root.querySelector('.js-product-detail-fabric-description .richtext');\n\n        elm.innerHTML = data.description || data.stockitemDescription;\n    }\n\n    /**\n     * Fetch and render the gallery\n     *\n     * @param {String} productUrl\n     */\n    setGallery(productUrl) {\n        const gallery = this.root.querySelector('.js-fabric-gallery');\n\n        // use http fetch to get the gallery partial\n        // then insert it into the overlay\n        fetch(`${productUrl}/fabric-overlay-gallery`).then(res => res.text()).then((html) => {\n            gallery.innerHTML = html;\n        }).catch((error) => {\n            console.error('Gallery Error:', error);\n        });\n    }\n\n    /**\n     * Update the CTA\n     *\n     * @param {String} image The image URL\n     * @param {String} name The swatch name\n     */\n    setCta(image, name) {\n        const imgEl = document.querySelector('.js-swatch-img');\n        const nameEl = document.querySelector('.js-swatch-name');\n\n        if (imgEl) {\n            imgEl.style.backgroundImage = `url(${image})`;\n        }\n\n        if (nameEl) {\n            nameEl.innerText = name;\n        }\n    }\n\n    /**\n     * Set the url on the fabric confirm button\n     *\n     * @param {String} productUrl\n     */\n    setConfirmLink(productUrl) {\n        this.root.querySelectorAll('.js-fabric-select-link').forEach((elm) => {\n            elm.href = productUrl;\n        });\n    }\n\n    /**\n     * Filter the immediate (to deliver) options\n     *\n     * @param {boolean} checked\n     * @returns\n     */\n    showImmediate(checked) {\n        const immediates = this.element.querySelectorAll('input[data-immediate=\"1\"]');\n        if (!immediates.length) {\n            return;\n        }\n\n        const selectors = this.element.querySelectorAll('.colour-selection');\n\n        for (const selector of selectors) {\n            const all = selector.querySelectorAll('input[type=\"radio\"]');\n            const targets = selector.querySelectorAll('input[data-immediate=\"0\"]');\n            if (targets.length == all.length) {\n                selector.style.display = checked ? 'none' : 'inline-grid';\n            } else {\n                for (const target of targets) {\n                    target.parentElement.style.display = checked ? 'none' : 'inline-grid';\n                }\n            }\n        }\n    }\n}\n"],"sourceRoot":"../../../../resources/javascript"}