{"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","watchInputs","watchOptions","bindStatusClick","getPreselected","updateBasket","addEventListener","preventDefault","Overlay","render","sidebar","modifiers","Soho","formTemplate","undefined","dataset","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        this.watchInputs();\n        this.watchOptions();\n        this.bindStatusClick();\n\n        if (!this.el) {\n            this.updateBasket();\n            return;\n        }\n\n        this.swatches = this.getPreselected();\n\n        if (this.swatches.length) {\n            this.updateBasket();\n        }\n\n        if (this.submitButton) {\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                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                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"}