{"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","submitButton","selectedCount","swatches","swatchLimit","init","watchInputs","watchOptions","bindStatusClick","getPreselected","updateBasket","selected","dataset","swatchesSelected","get","split","map","code","getElementById","checked","getAttribute","filter","id","forEach","addEventListener","preventDefault","stopImmediatePropagation","currentTarget","closest","dispatchEvent","CustomEvent","onchange","change","bind","removeFromBasket","swatch","target","swatchExists","canAddSwatch","addSwatch","removeSwatch","resetBasket","indexOf","push","index","splice","updateSwatchCount","innerHTML","concat","swatchItem","classList","add","swatchDisplay","style","backgroundImage","swatchText","checkbox","setAttribute","swatchItems","remove","removeAttribute","set","join","Soho","popups","popup","Popup","FabricSelector","elm","root","element","radios","readyToShip","wasPriceElement","memberWasPriceElement","getSelected","setup","setGallery","_this","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","adaptivePlaceholder","swatchOrderForm","onOverlayOpen","button","Overlay","load","overlayUrl","modifiers"],"mappings":"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","file":"../../javascript/fabric-overlay.js","sourcesContent":["function Loop() {\n\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.submitButton = document.querySelector('.js-swatch-basket__submit');\n    this.selectedCount = document.querySelector('.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\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        if (this.selectedCount) {\n            this.selectedCount.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        loop.array(this.option, function (option, i) {\n            var option = option[i];\n\n            const swatchItem = option.querySelector('.swatch');\n            if (swatchItem) {\n                swatchItem.classList.add('swatch--empty');\n            }\n\n            const swatchDisplay = option.querySelector('.swatch__display');\n            if (swatchDisplay) {\n                swatchDisplay.style.backgroundImage = 'none';\n            }\n\n            const swatchText = option.querySelector('.swatch__text');\n            if (swatchText) {\n                swatchText.innerHTML = 'Add swatch';\n            }\n\n            const checkbox = option.querySelector('input[type=\"checkbox\"]');\n            if (checkbox) {\n                checkbox.value = null;\n                checkbox.checked = false;\n                checkbox.setAttribute('disabled', true);\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        loop.array(this.swatches, function (swatches, i) {\n            const swatch = swatches[i];\n            const option = self.option[i];\n            const input = document.querySelector('#' + swatch);\n\n            const swatchItems = option.querySelector('.swatch');\n            if (swatchItems) {\n                swatchItems.classList.remove('swatch--empty');\n            }\n\n            const swatchDisplay = option.querySelector('.swatch__display');\n            if (swatchDisplay) {\n                swatchDisplay.style.backgroundImage = 'url(' + input.getAttribute('data-colour-image') + ')';\n            }\n\n            const swatchText = option.querySelector('.swatch__text');\n            if(swatchText) {\n                swatchText.innerHTML = input.getAttribute('data-colour-label');\n            }\n\n            const checkbox = option.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        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 js-tools/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        if (typeof Soho.adaptivePlaceholder === 'function') {\n            Soho.adaptivePlaceholder();\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"}