{"version":3,"file":"quick-search.js","sources":["../../../resources/modern-javascript/util/delegate.js","../../../resources/modern-javascript/quick-search.js"],"sourcesContent":["export const delegate = (\n    element,\n    eventType,\n    selector,\n    listener,\n    options\n) => {\n    element.addEventListener(\n        eventType,\n        /**\n         * @param {Event} event\n         */\n        function callback(event) {\n            if (event.target instanceof HTMLElement || event.target instanceof SVGElement) {\n                var closest = event.target.closest(selector);\n                if (closest) {\n                    event.closest = closest;\n                    listener(event);\n                }\n            }\n        },\n        options || null\n    );\n};\n","import { delegate } from './util/delegate';\n//=require plugins/prevent-scroll.js\n\nfunction Search() {\n    this.input = document.querySelector('.search-ayt-input');\n    this.button = document.querySelectorAll('.js-search-activate');\n    this.keyableArea = document.querySelectorAll('.search, .js-search-activate');\n    this.scrolling = false;\n    this.viewport = new Viewport(Aspinal.breakpoints);\n    this.focusIndex = -1;\n\n    this.init = () => {\n        delegate(document, 'click', '.js-search-activate', () => {\n            if (this.isActive()) {\n                this.deactivate();\n            } else {\n                this.activate();\n            }\n        });\n\n        delegate(document, 'click', 'body', (e) => {\n            if (e.target.tagName === 'BODY') {\n                this.deactivate();\n            }\n        });\n\n        delegate(document, 'click', '.search__clear', (e) => {\n            this.input.value = '';\n            this.input.focus();\n            this.input.dispatchEvent(new Event('input', { bubbles: true }));\n        });\n\n        delegate(document, 'input', '.search-ayt-input', (e) => {\n            if (e.target.value.length === 0 ) {\n                delete this.input.dataset.hasText;\n            } else {\n                this.input.dataset.hasText = true;\n            }\n        });\n\n        delegate(document, 'click', '.search-ayt-suggestion', (e) => {\n            e.preventDefault();\n            Aspinal.ga.sendAndGoto({\n                'event': 'd3rQuickSearchSuggestionClick',\n                'search_term': this.input.value,\n                'suggested_term': e.closest.querySelector('.search-ayt-suggestion__label')?.textContent,\n                'featured': e.closest.querySelector('.search-ayt-default__top') ? 'true' : 'false',\n            }, e.closest.getAttribute('href'));\n        });\n\n        delegate(document, 'click', '.search-ayt-result-item .listing__link', (e) => {\n            e.preventDefault();\n            try {\n                const data = JSON.parse(e.closest.getAttribute('data-ee'));\n                Aspinal.ga.sendAndGoto({\n                    'event': 'd3rQuickSearchProductClick',\n                    'search_term': this.input.value,\n                    'id': data.id,\n                }, e.closest.getAttribute('href'));\n            } catch (error) {\n                console.error('Failed to parse data-ee attribute:', error);\n            }\n        });\n\n        delegate(document, 'click', '.search-ayt-panel__close', () => {\n            this.input.focus();\n            this.deactivate();\n            this.input.blur();\n        });\n\n        document.addEventListener('scrollend', this.scrollEnd);\n\n        this.input.addEventListener('focus', () => {\n            this.focusIndex = 0;\n        });\n\n        this.keyableArea.forEach((el) => {\n            // Prevent key down events\n            el.addEventListener('keydown', (e) => {\n                switch (e.key) {\n                    case 'Down': // IE/Edge specific value\n                    case 'ArrowDown':\n                    case 'Up': // IE/Edge specific value\n                    case 'ArrowUp':\n                        e.preventDefault();\n                        return;\n                    case 'Tab':\n                        if (document.activeElement.closest('.search')) {\n                            e.preventDefault();\n                        }\n                        return;\n                }\n            });\n\n            // Listen to key up events\n            el.addEventListener('keyup', (e) => {\n                switch (e.key) {\n                    case 'Down': // IE/Edge specific value\n                    case 'ArrowDown':\n                        this.increaseFocusIndex();\n                        return;\n                    case 'Up': // IE/Edge specific value\n                    case 'ArrowUp':\n                        this.decreaseFocusIndex();\n                        return;\n                    case 'Tab':\n                        if (document.activeElement.closest('.search')) {\n                            this.resetFocusIndex(true);\n                        }\n                        return;\n                }\n            });\n        });\n    }\n\n    this.getHeaderTarget = () => {\n        if (this.isSearchPage()) {\n            return document.querySelector('.filterable__dimension--query');\n        } else if (this.viewport.matches('nav')) {\n            return document.querySelector('.header');\n        } else {\n            return document.querySelector('.header__bottom');\n        }\n    }\n\n    this.isActive = () => {\n        return document.body.hasAttribute('search-active');\n    }\n\n    this.scrollEnd = () => {\n        if (this.scrolling) {\n            this.activation();\n            this.scrolling = false;\n        }\n    }\n\n    this.activate = () => {\n        if (Aspinal.header) {\n            Aspinal.header.deactivate(false, () => {\n                this.activateCallback();\n            });\n            Aspinal.header.deactivateActiveItem();\n        } else {\n            this.activateCallback();\n        }\n    }\n\n    this.activation = () => {\n        document.body.setAttribute('search-active', true);\n        const header = document.querySelector('.header');\n\n        if (this.input) {\n            this.input.focus();\n        }\n\n        if (header.dataset.position === 'stuck') {\n            preventScroll.on();\n        } else {\n            const callback = (mutationList, observer) => {\n                for (const mutation of mutationList) {\n                    if (mutation.type === 'attributes') {\n                        if (header.dataset.position === 'stuck') {\n                            observer.disconnect();\n                            if (document.body.hasAttribute('search-active')) {\n                                preventScroll.on();\n                            }\n                        }\n                    }\n                }\n            };\n            const observer = new MutationObserver(callback);\n            observer.observe(header, { attributes: true, attributeFilter: ['data-position'] });\n        }\n    }\n\n    this.isSearchPage = () => {\n        return document.querySelector('.filterable__dimension--query') !== null;\n    }\n\n    this.isScrollPositionCorrect = () => {\n        if (this.isSearchPage()) {\n            const headerBottomHeight = getComputedStyle(document.querySelector(':root')).getPropertyValue('--header-bottom-height');\n\n            return this.getHeaderTarget().getBoundingClientRect().top === parseInt(headerBottomHeight);\n        } else {\n            return this.getHeaderTarget().getBoundingClientRect().top === 0;\n        }\n    }\n\n    this.activateCallback = () => {\n        if (this.isScrollPositionCorrect()) {\n            this.activation();\n        } else {\n            this.scrolling = true;\n            this.getHeaderTarget().scrollIntoView({ behavior: 'smooth' })\n        }\n        Aspinal.ga.openQuickSearch();\n    }\n\n    this.deactivate = () => {\n        if (preventScroll.active) {\n            preventScroll.off();\n        }\n        document.body.removeAttribute('search-active');\n        this.focusIndex = -1;\n        Aspinal.ga.closeQuickSearch();\n    }\n\n    this.increaseFocusIndex = () => {\n        this.focusIndex++;\n\n        if (this.focusIndex >= this.getResultCount()) {\n            this.focusIndex = this.getResultCount() - 1;\n        }\n\n        this.updateFocus();\n    }\n\n    // Decrease the focus index\n    this.decreaseFocusIndex = () => {\n        this.focusIndex--;\n\n        if (this.focusIndex < 0) {\n            this.focusIndex = 0;\n        }\n\n        this.updateFocus();\n    }\n\n    this.resetFocusIndex = (moveFocus) => {\n        this.focusIndex = -1;\n\n        if (moveFocus) {\n            const button = this.getButton();\n\n            if (button) {\n                button.focus();\n            }\n        }\n    }\n\n    this.getButton = () => {\n        let button;\n\n        this.button.forEach((el) => {\n            if (el.clientHeight > 0) {\n                button = el;\n            }\n        });\n\n        return button;\n    }\n\n    this.getSelector = () => {\n        if (document.querySelector('.search-ayt-results')?.clientHeight > 0) {\n            return document.querySelectorAll('.search-ayt-input, .search-ayt-results a');\n        } else if (document.querySelector('.search-ayt-default')?.clientHeight > 0) {\n            if (document.querySelector('.search-ayt-default__top')?.clientHeight > 0) {\n                return document.querySelectorAll('.search-ayt-input, .search-ayt-default a');\n            } else {\n                return document.querySelectorAll('.search-ayt-input, .search-ayt-default__bottom a');\n            }\n        }\n            return []; // prevent TypeError when no panel is visible\n    }\n\n    this.getResultCount = () => {\n        return this.getSelector().length;\n    }\n\n    this.updateFocus = () => {\n        const focusing = this.getSelector()[this.focusIndex];\n\n        if (focusing) {\n            focusing.focus();\n        } else {\n            this.resetFocusIndex();\n        }\n    }\n}\n\nAspinal = Aspinal || {};\nAspinal.search = new Search();\nAspinal.search.init();\n"],"names":["delegate","element","eventType","selector","listener","options","addEventListener","event","target","HTMLElement","SVGElement","closest","Search","input","document","querySelector","button","querySelectorAll","keyableArea","scrolling","viewport","Viewport","Aspinal","breakpoints","focusIndex","init","isActive","deactivate","activate","e","tagName","value","focus","dispatchEvent","Event","bubbles","length","dataset","hasText","_e$closest$querySelec","preventDefault","ga","sendAndGoto","textContent","getAttribute","data","JSON","parse","id","error","console","blur","scrollEnd","forEach","el","key","activeElement","increaseFocusIndex","decreaseFocusIndex","resetFocusIndex","getHeaderTarget","isSearchPage","matches","body","hasAttribute","activation","header","activateCallback","deactivateActiveItem","setAttribute","position","preventScroll","on","callback","mutationList","observer","mutation","type","disconnect","MutationObserver","observe","attributes","attributeFilter","isScrollPositionCorrect","headerBottomHeight","getComputedStyle","getPropertyValue","getBoundingClientRect","top","parseInt","scrollIntoView","behavior","openQuickSearch","active","off","removeAttribute","closeQuickSearch","getResultCount","updateFocus","moveFocus","getButton","clientHeight","getSelector","_document$querySelect","_document$querySelect2","_document$querySelect3","focusing","search"],"mappings":"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"}