{"version":3,"sources":["src/js/search/loop54-search-ui.js","src/js/search/loop54-templates.js","src/js/util/fractions-helper.js","src/js/product/product-size-sorter.js","src/js/search/loop54-filters-handler.js","src/js/search/loop54-search.js"],"names":["waitForFinalEvent","callback","ms","uniqueId","global","_searchWaitTimers","clearTimeout","setTimeout","_searchThrottleWaitTimers","Loop54SearchUi","_classCallCheck","_createClass","key","value","state","settings","loop54Search","page","window","addEventListener","event","persisted","_i","_arr","_state$views","views","_state$views$products","products","_state$views$products2","elems","results","_state$views2","_state$views2$product","_state$views2$product2","relatedResults","length","resultsArea","_step","productItems","querySelectorAll","_iterator","_createForOfIteratorHelper","s","n","done","productItem","classList","add","remove","err","e","f","productImpressions","impressionsTimeout","handleLazyLoad","productListItem","target","closest","dataLayerData","getProductDataLayerData","push","_window$GoogleTagMana","GoogleTagManager","isEnabled","isCategory","articles","saveSearchState","passive","shops","handleSuggestedQueries","preventDefault","dataset","suggestion","searchBoxes","_step2","_iterator2","handleSearch","clear","clearScope","keepFilters","newSearch","showSuggestionsAfter","relatedQueries","spellingSuggestions","handleProductClick","skipAction","newTab","openingToNewTab","stopPropagation","productLink","navigateLink","href","navigateToUrl","location","identifier","type","category","_window$GoogleTagMana2","entity","id","eventCategory","dataLayer","eventAction","eventLabel","scrollY","client","loopEvent","click","createEvent","clickProduct","button","Object","keys","_step3","_iterator3","_loop","view","elem","activeView","showMoreResults","showMoreButton","querySelector","ignoreKeys","newSearchAnalyticsEvent","searchBoxDesktop","String","trim","redirectToSearch","scroll","suggestions","_step4","_iterator4","_loop2","suggestionBox","handleKeyNavigation","mode","arguments","undefined","active","document","activeElement","items","Array","from","filter","item","getComputedStyle","display","currentIndex","some","index","nextIndex","focus","wrapper","searchBox","handleEsc","contains","_step5","_iterator5","scopedSuggestion","scope","suggestedScope","_step6","_iterator6","concat","params","scopedTerm","handleArrowDown","container","searchBoxMobile","handleSuggestions","includes","clearSuggestions","_step7","_iterator7","_step8","_iterator8","_step9","_iterator9","_loop3","_step10","_iterator10","clearSearchButton","parentNode","_step11","_iterator11","searchButtons","_step12","_iterator12","initialised","restoreState","getParams","URLSearchParams","search","parseInt","get","pageParam","this","addPageListeners","stateRestored","searchParamValue","searchQueryParam","scopeTermParamValue","scopedQueryParam","scopeParamValue","scopeParam","searchTerm","sessionStorage","getItem","searchParamKey","searchTermValue","searchScopeTerm","searchScopeTermKey","searchScope","searchScopeKey","query","has","_step13","_iterator13","_loop4","_Object$keys","_i2","orderBy","orderParam","optionValue","attributeName","order","_settings$views$view","sortOptions","loop54FiltersHandler","updateRobotsMetaTag","updateFiltersAfter","searchFacets","selectedFacets","MutationObserver","mutationsList","_step14","_iterator14","mutation","oldValue","getAttribute","skipFacetUpdate","observe","attributes","childList","subtree","attributeOldValue","fixDropdownPosition","el","func","limit","lastRan","apply","Date","now","last","throttle","dropdown","rect","getBoundingClientRect","left","right","innerWidth","documentElement","clientWidth","content","clickTarget","clickedButton","clearFacets","actionObject","action","clearAll","facet","checked","updateFacets","facetOptionsClick","facetOption","closeFilterDropdowns","facetsBar","scrollTo","offsetLeft","behavior","$","trigger","body","filterDropdownListener","_step15","_iterator15","openDropdown","Loop54Search","pageContainers","loop54Mode","getElements","endpoint","tabs","addSearchBoxListeners","initPage","FractionsTools","fractionsLookup","separator","sup","sub","frac","x","tolerance","h1","h2","k1","k2","b","a","Math","floor","aux","abs","fraction","test","values","split","sum","fractionPart","firstPart","Number","isNaN","reduce","text","returnDecimalnumber","tempText","replace","RegExp","i","fracEntity","_tempText$trim$split$","c","_tempText$trim$split$2","_slicedToArray","parseFloat","number","lookup","map","num","join","allowNamedEntities","tempNumber","base","rat","float2rat","getFraction","_value","unfraction","escapeFractionsString","toFractions","entityMap","'","ProductSizeSorter","data","isArray","numericSizes","letterSizes","mixedSizes","sizeTable","itemData","sizeSort","size","toUpperCase","dashless","isNumeric","hasLetter","match","hasNumbers","numericSize","sort","asize","indexOf","bsize","Templates","checkboxBarFilter","productTemplate","resultItemTemplate","checkboxTemplate","noProducts","noSearchResults","template","categoryTemplate","textContent","searchTemplate","searchPage","Settings","State","Loop54FiltersProxy","Loop54FiltersHandler","set","possibleFacets","possibleFacet","selectedFacetsBar","innerHTML","userFacets","facetObject","selected","facetsToUrlParams","_State","_State$views$this$vie","_State$views$this$vie2","_State$views$this$vie3","firstLoad","urlParams","lookups","facets","idFacets","idParams","targetGroups","Set","mainColour","brand","urlFacets","_Object$entries","entries","_Object$entries$_i","mappedFacet","_toConsumableArray","facetsParamNameSeparator","facetsParamValueSeparator","idParamsString","flatMap","idParam","Boolean","delete","rawOrderBy","sortOrder","facetsParam","JSON","stringify","fromEntries","urlParamsString","toString","history","replaceState","pathname","noIndex","parsedFacets","parse","error","filterBlurListener","removeEventListener","noIndexState","metaTag","newMetaTag","createElement","name","head","appendChild","_State$views$this$vie4","_State$views$this$vie5","remoteFacets","remoteFacetValues","selectedFacetValue","shopFilter","shopAvailability","sizesFilter","sizes","writeFacets","getCurrentFacets","_State2","_State2$views$this$vi","_State2$views$this$vi2","_State2$views$this$vi3","_rawOrderBy$split","_rawOrderBy$split2","reset","facetsLookup","checkboxBarFilterTemplate","Mustache","filterTemplate","defaultFilters","filterbarFacets","render","disabled","facetLookup","acc","facetName","selectedFacetsTemplate","visibleFacets","renderedFacets","_data$results","facetNameMapping","_facet$facetName$spli","_facet$facetName$spli2","additionalFieldName","count","selectedCount","toLowerCase","fractionToDecimal","filterName","convertToHtmlFractions","_String$split","_String$split2","hex","colorMark","colorWithBorder","facetId","checkboxName","labelTitle","label","dataAttributes","SizeSorter","sortProductSizes","targetGroupsOrder","_a","_b","aIsNumber","bIsNumber","localeCompare","sensitivity","onlyOptions","dropdownButton","buttonContentOnly","_i3","_Object$keys2","openFacetOption","minSuggestionLetters","searchMakesNoSenseText","stateStoreKey","titleSuffix","currentCategory","contentId","itemsPerPage","maxItems","singularLabel","pluralLabel","scopedTerms","productAdditons","subcategory","sports","productType","sustainability","technologies","showMaxSuggestions","showMaxScopedSuggestions","loop54Options","resultsOptions","skip","take","relatedResultsOptions","spellingSuggestionsOptions","relatedQueriesOptions","customData","pageResultsOptions","shopResultsOptions","__productListingSettings","addViewSettings","searchContainer","noSearchText","searchText","searchTextScoped","makesSense","hasMoreResults","relatedSearchResultsContainer","currentItemsCount","allItemsCount","fetchedFacets","Loop54Connector","searchController","suggestionsController","hasSuggestionListener","suggestionsQuery","hadPageParam","cache","Loop54SearchProxy","containerOnly","searchParam","noQuery","getElementById","_Object$keys3","clearRelatedQueries","clearSpellingSuggestion","scoped","_objectSpread","infoText","_State$views$view$ele","tagName","removeAttribute","currentPageIndex","prevPageIndex","prevLink","nextLink","relUrl","currentUrl","origin","prevUrl","prevLinkParams","nextUrl","setAttribute","urlActiveParams","urlActiveParamsString","elemTotalCount","viewData","pageResults","shopResults","restoredState","getViewResultsObj","min","updateCounts","updatePaginationLinks","resultItems","removed","itemsJson","resItem","renderDataObject","find","attribute","console","log","baseUrl","url","URL","searchParams","_this","searchProducts","parseResultItems","relatedProducts","_ref","_ref$addProductType","addProductType","_ref$addTargetGroup","addTargetGroup","_ref$customProductTyp","customProductType","renderProduct","product","mainElement","appendSearchWordUrlParam","productElement","firstChild","noIndexMetadata","metaRobots","productNameAdditions","productTypeText","titleCategory","productname","resultItem","resultElement","resultItemData","fullLinkParent","sideCol","image","sideCentered","mobileFullWidth","contentType","heading","title","link","createResultItem","mapUrl","shop","shopAddress","address","postNumber","city","shopOpeningHours","shopOpenStatus","shopOpens","shopCloses","cta","ctaLink","ctaLabel","updateProducts","updateArticles","updateShops","renderRealtedQueries","parentElement","removeChild","viewsWithResults","_i4","_Object$keys4","handleFacets","viewHasResults","updateViewState","updateResults","children","style","optsObj","_Settings$views$view","_Settings$views$view$","_Settings$views$view2","_Settings$views$view3","getUrlFacets","_ref2","_ref3","updateOrderBy","sortBy","searchOptions","updateViewSearchOpts","storageType","localStorage","men","women","navigation","_this2","_clear$clearScope$kee","abort","resetStoredState","hasPageParam","previousPage","_i5","_Object$keys5","resetFacets","setItem","removeItem","hadScope","_i6","_Object$keys6","_i7","_Object$keys7","getViewSearchOpts","max","_ref4","_searchOptions$result","_searchOptions","_searchOptions$result2","_searchOptions2","_searchOptions2$custo","_searchOptions2$custo2","ceil","_ref5","_ref5$attribute","_ref5$customData","resultsAnalytics","handleSearchResults","scrollPosition","y","responseData","_responseData$customD","_responseData$customD2","side","ab","suggestionBoxListeners","suggestionsObject","queries","scopedQuery","scopes","slice","scopeAttributeName","suggestedCategory","isScoped","elements","suggestionsTemplate","removeSuggestionsCount","renderData","element","maxHeight","top","autoComplete","processSuggestions","scrollX","_i8","_Object$keys8","states","stateObject"],"mappings":"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","file":"hashed/1.8f4923fc.chunk.js","sourcesContent":["'use strict';\n\n/* global dataLayer */\n\nimport tabs from '../ui/tabs';\nimport Loop54Search from './loop54-search';\nimport { openingToNewTab } from '../util/helpers';\nimport { getProductDataLayerData } from '../product/product-card';\nimport $ from 'jquery';\n\nglobal._searchWaitTimers = global._searchWaitTimers || {};\nglobal._searchThrottleWaitTimers = global._searchThrottleWaitTimers || {};\n\nfunction waitForFinalEvent(callback, ms, uniqueId) {\n\tif (global._searchWaitTimers[uniqueId]) {\n\t\tclearTimeout(global._searchWaitTimers[uniqueId]);\n\t}\n\tglobal._searchWaitTimers[uniqueId] = setTimeout(callback, ms);\n}\n\nfunction throttle(func, limit, uniqueId) {\n\n\tif (typeof global._searchThrottleWaitTimers[uniqueId] === 'undefined') {\n\t\tglobal._searchThrottleWaitTimers[uniqueId] = {};\n\t}\n\n\tif (!global._searchThrottleWaitTimers[uniqueId].lastRan) {\n\t\tfunc.apply();\n\t\tglobal._searchThrottleWaitTimers[uniqueId].lastRan = Date.now();\n\t\treturn func;\n\t} else {\n\t\tclearTimeout(global._searchThrottleWaitTimers[uniqueId].last);\n\t\tglobal._searchThrottleWaitTimers[uniqueId].last = setTimeout(function () {\n\t\t\tif (global._searchThrottleWaitTimers[uniqueId] && (Date.now() - global._searchThrottleWaitTimers[uniqueId].lastRan) >= limit) {\n\t\t\t\tfunc.apply();\n\t\t\t\tglobal._searchThrottleWaitTimers[uniqueId].lastRan = Date.now();\n\t\t\t}\n\t\t}, limit - (Date.now() - global._searchThrottleWaitTimers[uniqueId].lastRan));\n\t}\n}\n\nclass Loop54SearchUi {\n\n\taddPageListeners(state, settings, loop54Search) {\n\n\t\tif (state.page) {\n\n\t\t\twindow.addEventListener('pageshow', (event) => {\n\t\t\t\tif (event.persisted) {\n\t\t\t\t\tfor (const resultsArea of [state?.views?.products?.elems?.results, state?.views?.products?.elems?.relatedResults]) {\n\t\t\t\t\t\tif (!resultsArea) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst productItems = resultsArea.querySelectorAll('.product-list-item.clicked-search-item');\n\t\t\t\t\t\tfor (const productItem of productItems) {\n\t\t\t\t\t\t\tproductItem.classList.add('item-revealed');\n\t\t\t\t\t\t\tproductItem.classList.remove('clicked-search-item');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet productImpressions = [];\n\t\t\tlet impressionsTimeout = null;\n\n\t\t\tconst handleLazyLoad = (e) => {\n\n\t\t\t\tconst productListItem = e.target.closest('.product-list-item');\n\n\t\t\t\tif (productListItem) {\n\n\t\t\t\t\tproductListItem.classList.add('item-revealed');\n\n\t\t\t\t\tconst dataLayerData = getProductDataLayerData(productListItem);\n\n\t\t\t\t\tproductImpressions.push(dataLayerData);\n\n\t\t\t\t\tif (impressionsTimeout) {\n\t\t\t\t\t\tclearTimeout(impressionsTimeout);\n\t\t\t\t\t}\n\n\t\t\t\t\timpressionsTimeout = setTimeout(() => {\n\n\t\t\t\t\t\tif (window.GoogleTagManager?.isEnabled && window.GoogleTagManager.isEnabled()) {\n\n\t\t\t\t\t\t\twindow.GoogleTagManager.productImpressions(productImpressions);\n\t\t\t\t\t\t\tproductImpressions = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 2000);\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tif (!settings.isCategory) {\n\t\t\t\tif (state.views.articles.elems.results) {\n\t\t\t\t\tstate.views.articles.elems.results.addEventListener('click', function () {\n\t\t\t\t\t\tloop54Search.saveSearchState();\n\t\t\t\t\t}, { passive: true });\n\t\t\t\t}\n\n\t\t\t\tif (state.views.shops.elems.results) {\n\t\t\t\t\tstate.views.shops.elems.results.addEventListener('click', function () {\n\t\t\t\t\t\tloop54Search.saveSearchState();\n\t\t\t\t\t}, { passive: true });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (state.views.products.elems.results) {\n\t\t\t\tstate.views.products.elems.results.addEventListener('lazyloaded', handleLazyLoad, { passive: true });\n\t\t\t}\n\n\t\t\tif (!settings.isCategory) {\n\t\t\t\tif (state.views.products.elems.relatedResults) {\n\t\t\t\t\tstate.views.products.elems.relatedResults.addEventListener('lazyloaded', handleLazyLoad, { passive: true });\n\t\t\t\t}\n\n\t\t\t\tconst handleSuggestedQueries = (e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst target = e.target;\n\t\t\t\t\tif (target.dataset.suggestion && state.searchBoxes.length > 0) {\n\t\t\t\t\t\tfor (const searchBoxes of state.searchBoxes) {\n\t\t\t\t\t\t\tsearchBoxes.value = target.dataset.suggestion;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\tloop54Search.handleSearch({ clear: true, clearScope: true, keepFilters: false, newSearch: true });\n\t\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (state.relatedQueries) {\n\t\t\t\t\tstate.relatedQueries.addEventListener('click', handleSuggestedQueries);\n\t\t\t\t}\n\n\t\t\t\tif (state.spellingSuggestions) {\n\t\t\t\t\tstate.spellingSuggestions.addEventListener('click', handleSuggestedQueries);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst handleProductClick = (e, skipAction) => {\n\n\t\t\t\tconst newTab = openingToNewTab(e);\n\t\t\t\tif (!newTab) {\n\t\t\t\t\t// Prevent actual click event if not opening to new tab (so that datalayer has the time to receive the event)\n\t\t\t\t\t// Opening to new tab is allowed, because tag manager event will not be interrubted\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else {\n\t\t\t\t\tskipAction = true;\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\n\t\t\t\tif (!skipAction) {\n\t\t\t\t\tloop54Search.saveSearchState();\n\t\t\t\t}\n\n\t\t\t\tconst productItem = e.target.closest('.product-list-item');\n\t\t\t\tconst productLink = e.target.closest('a.product-link');\n\t\t\t\tconst navigateLink = productLink ? productLink.href : false;\n\n\t\t\t\tconst navigateToUrl = () => {\n\t\t\t\t\tif (!skipAction) {\n\t\t\t\t\t\twindow.location.href = navigateLink;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (productItem && navigateLink) {\n\n\t\t\t\t\tif (!skipAction) {\n\t\t\t\t\t\tproductItem.classList.remove('item-revealed');\n\t\t\t\t\t}\n\n\t\t\t\t\tproductItem.classList.add('clicked-search-item');\n\t\t\t\t\tconst identifier = productItem.dataset.identifier;\n\t\t\t\t\tconst type = productItem.dataset.type;\n\t\t\t\t\tconst category = productItem.dataset.category;\n\t\t\t\t\tif (identifier && type) {\n\n\t\t\t\t\t\tconst entity = { type: type, id: identifier };\n\n\t\t\t\t\t\tconst eventCategory = settings.isCategory ? 'Loop54Category' : 'Loop54Search';\n\n\t\t\t\t\t\tif (dataLayer) {\n\t\t\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\t\t\t\teventCategory: eventCategory,\n\t\t\t\t\t\t\t\teventAction: 'Result page click',\n\t\t\t\t\t\t\t\teventLabel: category ? category + ':' + identifier : identifier\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\t\t\t\teventCategory: eventCategory,\n\t\t\t\t\t\t\t\teventAction: 'Scroll depth',\n\t\t\t\t\t\t\t\teventLabel: window.scrollY\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.client) {\n\n\t\t\t\t\t\t\tif (window.GoogleTagManager?.isEnabled && window.GoogleTagManager.isEnabled()) {\n\n\t\t\t\t\t\t\t\tconst loopEvent = {\n\t\t\t\t\t\t\t\t\tclick: () => {\n\t\t\t\t\t\t\t\t\t\tstate.client.createEvent('click', entity, () => {\n\t\t\t\t\t\t\t\t\t\t\tnavigateToUrl();\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tconst dataLayerData = getProductDataLayerData(productItem);\n\t\t\t\t\t\t\t\twindow.GoogleTagManager.clickProduct(dataLayerData, newTab, () => {\n\t\t\t\t\t\t\t\t\t// Ensures that click event happens only once even if there are multiple GTM containers.\n\t\t\t\t\t\t\t\t\tif (typeof loopEvent.click === 'function') {\n\t\t\t\t\t\t\t\t\t\tloopEvent.click();\n\t\t\t\t\t\t\t\t\t\tloopEvent.click = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstate.client.createEvent('click', entity, () => {\n\t\t\t\t\t\t\t\t\tnavigateToUrl();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// This should never happen.\n\t\t\t\t\t\t\tnavigateToUrl();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnavigateToUrl();\n\t\t\t\t\t}\n\t\t\t\t} else if (navigateLink) {\n\t\t\t\t\tnavigateToUrl();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (state.views.products.elems.results) {\n\t\t\t\tstate.views.products.elems.results.addEventListener('click', handleProductClick);\n\t\t\t\tstate.views.products.elems.results.addEventListener('auxclick', (e) => {\n\t\t\t\t\tif (e.button && e.button === 1) {\n\t\t\t\t\t\thandleProductClick(e, true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst views = settings.isCategory ? ['products'] : Object.keys(state.views);\n\n\t\t\tif (!settings.isCategory && state.views.products.elems.relatedResults) {\n\t\t\t\tstate.views.products.elems.relatedResults.addEventListener('click', handleProductClick);\n\t\t\t}\n\n\t\t\tfor (let view of views) {\n\n\t\t\t\t// Add event listeners for tab changes\n\t\t\t\tif (!settings.isCategory) {\n\t\t\t\t\tstate.views[view].elems.elem.addEventListener('tab.open', (e) => {\n\t\t\t\t\t\tstate.activeView = view;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (state.views[view].elems.showMoreResults) {\n\t\t\t\t\tconst showMoreButton = state.views[view].elems.showMoreResults.querySelector('.js-load-more-results');\n\t\t\t\t\tif (showMoreButton) {\n\n\t\t\t\t\t\tshowMoreButton.addEventListener('click', (e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\t\tloop54Search.handleSearch({ activeView: view, clear: false, clearScope: false, keepFilters: true, newSearch: false });\n\t\t\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\taddSearchBoxListeners(state, settings, loop54Search) {\n\n\t\tconst ignoreKeys = ['PageUp', 'PageDown', 'Home', 'End', 'Left', 'Right', 'ArrowLeft', 'ArrowRight', 'Up', 'ArrowUp', 'Dead'];\n\n\t\tconst newSearchAnalyticsEvent = () => {\n\t\t\tif (state.searchBoxDesktop && dataLayer) {\n\t\t\t\tdataLayer.push({\n\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\teventCategory: 'Loop54Search',\n\t\t\t\t\teventAction: 'New search',\n\t\t\t\t\teventLabel: String(state.searchBoxDesktop.value).trim()\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tconst handleSearch = (clear, clearScope) => {\n\t\t\tloop54Search.handleSearch({ clear: clear, clearScope: clearScope, keepFilters: false, newSearch: true, redirectToSearch: settings.isCategory });\n\t\t\twindow.scroll(0, 0);\n\t\t};\n\n\t\tif (state.suggestions && state.searchBoxes.length > 0) {\n\n\t\t\tfor (const suggestionBox of state.suggestions) {\n\n\t\t\t\tsuggestionBox.addEventListener('keydown', (e) => {\n\t\t\t\t\tconst handleKeyNavigation = (mode = 'down') => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tconst active = document.activeElement;\n\n\t\t\t\t\t\tconst items = Array.from(suggestionBox.querySelectorAll('.suggested-item, .suggested-search')).filter(item => {\n\t\t\t\t\t\t\tif (getComputedStyle(item).display === 'none') {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (items.length === 0) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet currentIndex = 0;\n\t\t\t\t\t\titems.some((item, index) => {\n\t\t\t\t\t\t\tif (item === active) {\n\t\t\t\t\t\t\t\tcurrentIndex = index;\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (mode === 'down') {\n\t\t\t\t\t\t\tconst nextIndex = currentIndex + 1;\n\t\t\t\t\t\t\tif (nextIndex > items.length - 1) {\n\t\t\t\t\t\t\t\tif (items[0]) {\n\t\t\t\t\t\t\t\t\titems[0].focus();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\titems[nextIndex].focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst nextIndex = currentIndex - 1;\n\t\t\t\t\t\t\tif (nextIndex < 0) {\n\t\t\t\t\t\t\t\tconst wrapper = suggestionBox.closest('.search-box-wrapper');\n\t\t\t\t\t\t\t\tif (wrapper) {\n\t\t\t\t\t\t\t\t\tconst searchBox = wrapper.querySelector('.search-box');\n\t\t\t\t\t\t\t\t\tif (searchBox) {\n\t\t\t\t\t\t\t\t\t\tsearchBox.focus();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\titems[nextIndex].focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t};\n\n\t\t\t\t\tconst handleEsc = () => {\n\t\t\t\t\t\tconst wrapper = suggestionBox.closest('.search-box-wrapper');\n\t\t\t\t\t\tif (wrapper) {\n\t\t\t\t\t\t\tconst searchBox = wrapper.querySelector('.search-box');\n\t\t\t\t\t\t\tif (searchBox) {\n\t\t\t\t\t\t\t\tsearchBox.focus();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/*\n\t\t\t\t\t\tloop54Search.clearSuggestions();\n\t\t\t\t\t\tfor (const searchBox of workset.searchBoxes) {\n\t\t\t\t\t\t\tsearchBox.value = '';\n\t\t\t\t\t\t} */\n\t\t\t\t\t};\n\n\t\t\t\t\tswitch (e.key) {\n\t\t\t\t\tcase 'Up':\n\t\t\t\t\tcase 'ArrowUp':\n\t\t\t\t\t\thandleKeyNavigation('up');\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'Down':\n\t\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\t\thandleKeyNavigation('down');\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'Esc':\n\t\t\t\t\tcase 'Escape':\n\t\t\t\t\t\thandleEsc();\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\n\t\t\t\tsuggestionBox.addEventListener('click', (e) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tlet target = e.target;\n\n\t\t\t\t\tif (!target.classList.contains('suggested-item') || !target.classList.contains('suggested-search')) {\n\t\t\t\t\t\ttarget = target.closest('.suggested-item, .suggested-search');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target && target.dataset.suggestion) {\n\t\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\t\tsearchBox.value = target.dataset.suggestion;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataLayer) {\n\t\t\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\t\t\t\teventCategory: 'Loop54Search',\n\t\t\t\t\t\t\t\teventAction: 'Quick search click',\n\t\t\t\t\t\t\t\teventLabel: 'Search suggestion: ' + target.dataset.suggestion\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\thandleSearch(true, true);\n\t\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\t} else if (target && target.dataset.scopedSuggestion && target.dataset.scope && target.dataset.suggestedScope) {\n\t\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\t\tsearchBox.value = target.dataset.scopedSuggestion;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataLayer) {\n\t\t\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\t\t\t\teventCategory: 'Loop54Search',\n\t\t\t\t\t\t\t\teventAction: 'Quick search click',\n\t\t\t\t\t\t\t\teventLabel: `Search suggestion (category: ${target.dataset.suggestedScope}): ${target.dataset.scopedSuggestion}`\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.params.scopedTerm = target.dataset.suggestedScope;\n\t\t\t\t\t\tstate.params.scope = target.dataset.scope;\n\n\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\thandleSearch(true, false);\n\t\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t}\n\n\t\tconst handleArrowDown = (elem) => {\n\t\t\tif (!elem) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst container = elem.closest('.search-box-wrapper');\n\n\t\t\tif (container) {\n\t\t\t\tconst suggestion = container.querySelector('.search-suggestions.has-results.visible .suggested-item');\n\t\t\t\tif (suggestion) {\n\t\t\t\t\tsuggestion.focus();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tif (state.searchBoxDesktop && state.searchBoxMobile) {\n\n\n\t\t\tstate.searchBoxDesktop.addEventListener('input', (e) => {\n\t\t\t\tif (state.searchBoxMobile && state.searchBoxMobile.value) {\n\t\t\t\t\tstate.searchBoxMobile.value = e.target.value;\n\t\t\t\t}\n\n\t\t\t\twaitForFinalEvent(loop54Search.handleSuggestions, settings.showSuggestionsAfter, 'quickSearchSuggestions');\n\t\t\t});\n\n\t\t\tstate.searchBoxDesktop.addEventListener('keyup', (e) => {\n\n\t\t\t\tif (ignoreKeys.includes(e.key)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (state.searchBoxMobile && state.searchBoxMobile.value) {\n\t\t\t\t\tstate.searchBoxMobile.value = e.target.value;\n\t\t\t\t}\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\tcase 'Enter':\n\t\t\t\t\tnewSearchAnalyticsEvent();\n\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\thandleSearch(true, true);\n\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'Esc':\n\t\t\t\tcase 'Escape':\n\t\t\t\t\tloop54Search.clearSuggestions();\n\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\tsearchBox.value = '';\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twaitForFinalEvent(loop54Search.handleSuggestions, settings.showSuggestionsAfter, 'quickSearchSuggestions');\n\n\t\t\t});\n\n\n\t\t\tstate.searchBoxDesktop.addEventListener('keydown', (e) => {\n\t\t\t\tswitch (e.key) {\n\t\t\t\tcase 'Down':\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleArrowDown(state.searchBoxDesktop);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t\tif (state.searchBoxMobile && state.searchBoxDesktop) {\n\t\t\t// Mobile search box acts as salve for desktop search box.\n\t\t\tstate.searchBoxMobile.addEventListener('input', (e) => {\n\t\t\t\tstate.searchBoxDesktop.value = e.target.value;\n\t\t\t\twaitForFinalEvent(loop54Search.handleSuggestions, settings.showSuggestionsAfter, 'quickSearchSuggestions');\n\t\t\t});\n\t\t\tstate.searchBoxMobile.addEventListener('keyup', (e) => {\n\n\t\t\t\tif (ignoreKeys.includes(e.key)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstate.searchBoxDesktop.value = e.target.value;\n\n\t\t\t\tswitch (e.key) {\n\t\t\t\tcase 'Enter':\n\t\t\t\t\tnewSearchAnalyticsEvent();\n\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\thandleSearch(true);\n\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t\treturn;\n\t\t\t\tcase 'Esc':\n\t\t\t\tcase 'Escape':\n\t\t\t\t\tloop54Search.clearSuggestions();\n\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\tsearchBox.value = '';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\twaitForFinalEvent(loop54Search.handleSuggestions, settings.showSuggestionsAfter, 'quickSearchSuggestions');\n\n\t\t\t});\n\n\t\t\tstate.searchBoxMobile.addEventListener('keydown', (e) => {\n\t\t\t\tswitch (e.key) {\n\t\t\t\tcase 'Down':\n\t\t\t\tcase 'ArrowDown':\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleArrowDown(state.searchBoxMobile);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t\tif (state.searchBoxes) {\n\n\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\tsearchBox.addEventListener('focus', (e) => {\n\n\t\t\t\t\tif (dataLayer) {\n\t\t\t\t\t\tdataLayer.push({\n\t\t\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\t\t\teventCategory: 'Loop54Search',\n\t\t\t\t\t\t\teventAction: 'Focus in search field',\n\t\t\t\t\t\t\teventLabel: '-'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const suggestionBox of state.suggestions) {\n\t\t\t\t\t\tif (suggestionBox.classList.contains('has-results')) {\n\t\t\t\t\t\t\tsuggestionBox.classList.add('visible');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twaitForFinalEvent(loop54Search.handleSuggestions, settings.showSuggestionsAfter, 'quickSearchSuggestions');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t});\n\n\t\t\t\tconst clearSearchButton = searchBox.parentNode.querySelector('.clear-search');\n\n\t\t\t\tif (clearSearchButton) {\n\n\t\t\t\t\tclearSearchButton.addEventListener('click', (e) => {\n\n\t\t\t\t\t\tif (searchBox) {\n\t\t\t\t\t\t\tsearchBox.focus();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\t\tsearchBox.value = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tloop54Search.handleSuggestions();\n\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (state.searchButtons) {\n\t\t\tfor (const searchButton of state.searchButtons) {\n\t\t\t\tsearchButton.addEventListener('click', () => {\n\t\t\t\t\tnewSearchAnalyticsEvent();\n\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\thandleSearch(true, true);\n\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t});\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tinitPage(state, settings, loop54Search) {\n\n\t\tif (state.page && state.page.dataset.initialised === 'false') {\n\t\t\tstate.page.dataset.initialised = 'true';\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (state.page) {\n\n\t\t\tif (settings.isCategory) {\n\t\t\t\tloop54Search.restoreState();\n\t\t\t\tconst getParams = new URLSearchParams(window.location.search);\n\t\t\t\tstate.params.page = parseInt(getParams.get(settings.pageParam)) || false;\n\n\t\t\t\tthis.addPageListeners(state, settings, loop54Search);\n\n\n\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\tloop54Search.handleSearch({ clear: true, clearScope: true, keepFilters: false, newSearch: true });\n\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t} else {\n\t\t\t\tconst stateRestored = loop54Search.restoreState();\n\t\t\t\tconst getParams = new URLSearchParams(window.location.search);\n\t\t\t\tstate.params.page = parseInt(getParams.get(settings.pageParam)) || false;\n\n\t\t\t\tif (state.restoreState && state.restoreState.activeView && state.activeView !== state.restoreState.activeView) {\n\t\t\t\t\t// Restore active view\n\t\t\t\t\tif (state.views[state.restoreState.activeView].elems.elem) {\n\t\t\t\t\t\tstate.views[state.restoreState.activeView].elems.elem.click();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.addPageListeners(state, settings, loop54Search);\n\n\t\t\t\tconst searchParamValue = String(getParams.get(settings.searchQueryParam)).trim();\n\t\t\t\tconst scopeTermParamValue = String(getParams.get(settings.scopedQueryParam));\n\t\t\t\tconst scopeParamValue = String(getParams.get(settings.scopeParam));\n\n\t\t\t\tconst searchTerm = sessionStorage.getItem(settings.searchParamKey);\n\t\t\t\tconst searchTermValue = String(searchTerm).trim();\n\n\t\t\t\tconst searchScopeTerm = sessionStorage.getItem(settings.searchScopeTermKey);\n\t\t\t\tconst searchScope = sessionStorage.getItem(settings.searchScopeKey);\n\n\t\t\t\tlet query = '';\n\t\t\t\tlet clearScope = true;\n\t\t\t\tif (getParams.has(settings.searchQueryParam) && searchParamValue.length > 0 && state.searchBoxes.length > 0) {\n\t\t\t\t\tquery = searchParamValue;\n\t\t\t\t\tif (getParams.has(settings.scopedQueryParam) && scopeTermParamValue && getParams.has(settings.scopeParam) && scopeParamValue) {\n\t\t\t\t\t\tstate.params.scopedTerm = scopeTermParamValue;\n\t\t\t\t\t\tstate.params.scope = scopeParamValue;\n\t\t\t\t\t\tclearScope = false;\n\t\t\t\t\t}\n\t\t\t\t} else if (searchTerm && searchTermValue) {\n\t\t\t\t\tquery = searchTermValue;\n\t\t\t\t\tif (searchScopeTerm && searchScope) {\n\t\t\t\t\t\tstate.params.scopedTerm = searchScopeTerm;\n\t\t\t\t\t\tstate.params.scope = searchScope;\n\t\t\t\t\t\tclearScope = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (query) {\n\t\t\t\t\tfor (const searchBox of state.searchBoxes) {\n\t\t\t\t\t\tsearchBox.value = query;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (query || stateRestored) {\n\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\tloop54Search.handleSearch({ clear: true, clearScope: clearScope, keepFilters: false, newSearch: true });\n\t\t\t\t\t}, settings.showSuggestionsAfter, 'search');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (let view of Object.keys(state.views)) {\n\t\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\t\tconst orderBy = urlParams.get(settings.orderParam);\n\t\t\t\tif (state.views[view].elems.orderBy) {\n\t\t\t\t\tif (state.restoreState && state.restoreState.views[view] && state.restoreState.views[view].orderBy && state.restoreState.views[view].orderBy.length) {\n\t\t\t\t\t\tconst optionValue = state.restoreState.views[view].orderBy[0].attributeName + '-' + state.restoreState.views[view].orderBy[0].order;\n\t\t\t\t\t\tstate.views[view].elems.orderBy.value = optionValue;\n\t\t\t\t\t} else if (settings.isCategory) {\n\t\t\t\t\t\tif (orderBy && ((settings.views[view]?.sortOptions || []).includes(orderBy) || (orderBy === 'default'))) {\n\t\t\t\t\t\t\tif (orderBy === 'default') {\n\t\t\t\t\t\t\t\tstate.views[view].elems.orderBy.value = '';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tstate.views[view].elems.orderBy.value = orderBy;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (orderBy && settings.isCategory) {\n\t\t\t\t\t\tstate.views[view].loop54FiltersHandler.updateRobotsMetaTag(true);\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.views[view].elems.orderBy.addEventListener('change', (e) => {\n\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\tloop54Search.handleSearch({ activeView: view, clear: true, clearScope: false, keepFilters: true, newSearch: false });\n\t\t\t\t\t\t}, settings.updateFiltersAfter, 'searchFiltersSelected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (state.views[view].elems.searchFacets) {\n\n\t\t\t\t\tif (!state.views[view].elems.searchFacets.dataset.selectedFacets) {\n\t\t\t\t\t\tstate.views[view].elems.searchFacets.dataset.selectedFacets = '{}';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst observer = new MutationObserver((mutationsList) => {\n\t\t\t\t\t\tfor (const mutation of mutationsList) {\n\n\t\t\t\t\t\t\t// If nothing changed, do nothing.\n\t\t\t\t\t\t\tif (mutation.oldValue === mutation.target.getAttribute(mutation.attributeName)) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\tswitch (mutation.attributeName) {\n\t\t\t\t\t\t\tcase 'data-selected-facets':\n\t\t\t\t\t\t\t\tif (state.views[view].elems.searchFacets) {\n\t\t\t\t\t\t\t\t\tif (state.views[view].elems.searchFacets.dataset.skipFacetUpdate !== 'true') {\n\t\t\t\t\t\t\t\t\t\twaitForFinalEvent(() => {\n\t\t\t\t\t\t\t\t\t\t\tloop54Search.handleSearch({ activeView: view, clear: true, clearScope: true, keepFilters: true, newSearch: false });\n\t\t\t\t\t\t\t\t\t\t}, settings.updateFiltersAfter, 'facetSearch');\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tstate.views[view].elems.searchFacets.dataset.skipFacetUpdate = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Start observing the target node for configured mutations\n\t\t\t\t\tobserver.observe(state.views[view].elems.searchFacets, { attributes: true, childList: false, subtree: false, attributeOldValue: true });\n\n\t\t\t\t\tconst fixDropdownPosition = (el) => {\n\t\t\t\t\t\tthrottle(() => {\n\t\t\t\t\t\t\tconst dropdown = el.querySelector('.facet-options');\n\t\t\t\t\t\t\tif (dropdown) {\n\t\t\t\t\t\t\t\tconst rect = dropdown.getBoundingClientRect();\n\t\t\t\t\t\t\t\tif (rect.left < 0) {\n\t\t\t\t\t\t\t\t\tel.classList.remove('revert');\n\t\t\t\t\t\t\t\t} else if ((rect.right + 20) > (window.innerWidth || document.documentElement.clientWidth)) {\n\t\t\t\t\t\t\t\t\tel.classList.add('revert');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, 100, 'fixDropdown');\n\t\t\t\t\t};\n\n\t\t\t\t\twindow.addEventListener('resize', (e) => {\n\t\t\t\t\t\tconst dropdown = state.views[view].elems.content.querySelector('.facet-option.open');\n\t\t\t\t\t\tif (dropdown) {\n\t\t\t\t\t\t\tfixDropdownPosition(dropdown);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, { passive: true });\n\n\t\t\t\t\tstate.views[view].elems.searchFacets.addEventListener('click', (e) => {\n\t\t\t\t\t\tconst clickTarget = e.target;\n\t\t\t\t\t\tconst clickedButton = clickTarget.closest('button[data-selected-facet], button[data-clear-facets]');\n\t\t\t\t\t\tif (clickedButton) {\n\n\t\t\t\t\t\t\tconst clearFacets = clickedButton.dataset.clearFacets === 'true' ? true : false;\n\n\t\t\t\t\t\t\tconst actionObject = {\n\t\t\t\t\t\t\t\taction: 'removeFacet',\n\t\t\t\t\t\t\t\tclearAll: clearFacets,\n\t\t\t\t\t\t\t\tfacet: clickedButton.dataset.facet,\n\t\t\t\t\t\t\t\tvalue: clickedButton.dataset.value,\n\t\t\t\t\t\t\t\tchecked: false\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tconst selectedFacets = state.views[view].elems.searchFacets.querySelector('.js-selected-facets-bar');\n\t\t\t\t\t\t\tif (clearFacets) {\n\t\t\t\t\t\t\t\tif (selectedFacets) {\n\t\t\t\t\t\t\t\t\tselectedFacets.classList.remove('has-facets');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tclickedButton.remove();\n\t\t\t\t\t\t\t\tif (state.views[view].elems.searchFacets.querySelectorAll('button[data-selected-facet]').length === 0) {\n\t\t\t\t\t\t\t\t\tif (selectedFacets) {\n\t\t\t\t\t\t\t\t\t\tselectedFacets.classList.remove('has-facets');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t//waitForFinalEvent(() => {\n\t\t\t\t\t\t\tstate.views[view].loop54FiltersHandler.updateFacets(actionObject);\n\t\t\t\t\t\t\t//}, settings.updateFiltersAfter, \"searchFiltersSelected\");\n\n\n\t\t\t\t\t\t} else if (clickTarget.closest('input[data-is-facet]')) {\n\t\t\t\t\t\t\tconst actionObject = {\n\t\t\t\t\t\t\t\taction: 'facet',\n\t\t\t\t\t\t\t\tfacet: clickTarget.dataset.facet,\n\t\t\t\t\t\t\t\tvalue: clickTarget.dataset.value,\n\t\t\t\t\t\t\t\tchecked: clickTarget.checked\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t//waitForFinalEvent(() => {\n\n\t\t\t\t\t\t\tstate.views[view].loop54FiltersHandler.updateFacets(actionObject);\n\t\t\t\t\t\t\t//}, settings.updateFiltersAfter, \"searchFiltersSelected\");\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst facetOptionsClick = clickTarget.closest('.open-facet-options');\n\n\t\t\t\t\t\t\tif (facetOptionsClick) {\n\t\t\t\t\t\t\t\tconst facetOption = clickTarget.closest('.facet-option');\n\n\t\t\t\t\t\t\t\tif (facetOption) {\n\t\t\t\t\t\t\t\t\tfacetOption.classList.remove('revert');\n\t\t\t\t\t\t\t\t\tif (facetOption.classList.contains('open')) {\n\t\t\t\t\t\t\t\t\t\tstate.views[view].loop54FiltersHandler.closeFilterDropdowns();\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconst facetsBar = facetOptionsClick.closest('.js-facets-bar');\n\t\t\t\t\t\t\t\t\t\tif (facetsBar) {\n\t\t\t\t\t\t\t\t\t\t\tfacetsBar.scrollTo({ left: facetOption.offsetLeft - 20, behavior: 'smooth' });\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t$('.top-ad-bar.full').trigger('close-full-ad-bar');\n\t\t\t\t\t\t\t\t\t\tfacetOption.classList.add('open');\n\t\t\t\t\t\t\t\t\t\tdocument.body.classList.add('prevent-scroll-mobile');\n\t\t\t\t\t\t\t\t\t\tfixDropdownPosition(facetOption);\n\t\t\t\t\t\t\t\t\t\tstate.views[view].loop54FiltersHandler.filterDropdownListener();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor (const openDropdown of state.views[view].elems.searchFacets.querySelectorAll('.facet-option.open')) {\n\t\t\t\t\t\t\t\t\tif (openDropdown !== facetOption) {\n\t\t\t\t\t\t\t\t\t\topenDropdown.classList.remove('open');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinit() {\n\t\tconst loop54Search = new Loop54Search();\n\n\t\tconst state = loop54Search.state;\n\t\tconst settings = loop54Search.settings;\n\n\t\tconst categoryPage = document.querySelector(settings.pageContainers.category);\n\n\t\tif (categoryPage) {\n\t\t\tsettings.isCategory = true;\n\t\t\tsettings.loop54Mode = 'category';\n\t\t\tstate.views = { products: state.views.products };\n\t\t}\n\n\t\tloop54Search.getElements();\n\n\t\tif (!settings.endpoint) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (settings.loop54Mode !== 'category') {\n\t\t\ttabs('.m-tabs');\n\t\t}\n\n\n\t\tthis.addSearchBoxListeners(state, settings, loop54Search);\n\n\t\tthis.initPage(state, settings, loop54Search);\n\n\t\treturn true;\n\n\t}\n}\n\nexport default Loop54SearchUi;\n","'use strict';\n\n/* global __quickSearchTemplates, __searchPageTemplates, __pageTemplates */\n\nconst Templates = {\n\tpage: '',\n\trelatedQueries: '',\n\tsuggestions: '',\n\tselectedFacets: '',\n\tcheckboxBarFilter: '',\n\tfilter: '',\n\tproductTemplate: '',\n\tresultItemTemplate: '',\n\tcheckboxTemplate: '',\n\tnoProducts: '
Ei tuotteita.
',\n\tnoSearchResults: 'Ei hakutuloksia.
'\n};\n\n/*\nif (typeof __quickSearchTemplates === 'object') {\n\tfor (const key of Object.keys(__quickSearchTemplates)) {\n\t\tTemplates[key] = __quickSearchTemplates[key];\n\t}\n}\n\nif (typeof __searchPageTemplates === 'object') {\n\tfor (const key of Object.keys(__searchPageTemplates)) {\n\t\tTemplates[key] = __searchPageTemplates[key];\n\t}\n}\n\nif (typeof __pageTemplates === 'object') {\n\tfor (const key of Object.keys(__pageTemplates)) {\n\t\tTemplates[key] = __pageTemplates[key];\n\t}\n} */\n\nfor (const template of document.querySelectorAll('.category-template[data-category-template]')) {\n\tif (template.dataset.categoryTemplate) {\n\t\tTemplates[template.dataset.categoryTemplate] = template.textContent;\n\t}\n}\n\nfor (const template of document.querySelectorAll('.search-template[data-search-template]')) {\n\tif (template.dataset.searchTemplate) {\n\t\tTemplates[template.dataset.searchTemplate] = template.textContent;\n\t}\n}\n\n\nif (Templates.searchPage && !Templates.page) {\n\tTemplates.page = Templates.searchPage;\n}\n\n/*\nTemplates.suggestions = Templates.suggestions.replaceAll('', ` `); */\n\nexport default Templates;\n","'use strict';\n\n/**\n * Tools for handling html fractions etc.\n */\nclass FractionsTools {\n\n\tconstructor() {\n\t\tthis.fractionsLookup = {\n\t\t\tseparator: '⁄', // /\n\t\t\tsup: [\n\t\t\t\t'⁰', // 0\n\t\t\t\t'¹', // 1\n\t\t\t\t'²', // 2\n\t\t\t\t'³', // 3\n\t\t\t\t'⁴', // 4\n\t\t\t\t'⁵', // 5\n\t\t\t\t'⁶', // 6\n\t\t\t\t'⁷', // 7\n\t\t\t\t'⁸', // 8\n\t\t\t\t'⁹' // 9\n\t\t\t],\n\t\t\tsub: [\n\t\t\t\t'₀', // 0\n\t\t\t\t'₁', // 1\n\t\t\t\t'₂', // 2\n\t\t\t\t'₃', // 3\n\t\t\t\t'₄', // 4\n\t\t\t\t'₅', // 5\n\t\t\t\t'₆', // 6\n\t\t\t\t'₇', // 7\n\t\t\t\t'₈', // 8\n\t\t\t\t'₉' // 9\n\t\t\t],\n\t\t\tfrac: {\n\t\t\t\t'1/2': '½',\n\t\t\t\t'1/3': '⅓',\n\t\t\t\t'1/4': '¼',\n\t\t\t\t'1/5': '⅕',\n\t\t\t\t'1/6': '⅙',\n\t\t\t\t'1/8': '⅛',\n\t\t\t\t'2/3': '⅔',\n\t\t\t\t'2/5': '⅖',\n\t\t\t\t'3/4': '¾',\n\t\t\t\t'3/5': '⅗',\n\t\t\t\t'3/8': '⅜',\n\t\t\t\t'4/5': '⅘',\n\t\t\t\t'5/6': '⅚',\n\t\t\t\t'5/8': '⅝',\n\t\t\t\t'7/8': '⅞'\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Convert float to a rational number.\n\t * (http://jonisalonen.com/2012/converting-decimal-numbers-to-ratios/)\n\t *\n\t * @param {number} x - Number.\n\t * @param {number} tolerance - Tolerance.\n\t *\n\t * @returns {number[]} Numerator and denominator ([ numerator, dominator ]).\n\t */\n\tfloat2rat(x, tolerance) {\n\t\tlet h1 = 1;\n\t\tlet h2 = 0;\n\t\tlet k1 = 0;\n\t\tlet k2 = 1;\n\t\tlet b = x;\n\n\t\tdo {\n\t\t\tlet a = Math.floor(b);\n\t\t\tlet aux = h1;\n\t\t\th1 = a * h1 + h2;\n\t\t\th2 = aux;\n\t\t\taux = k1;\n\t\t\tk1 = a * k1 + k2;\n\t\t\tk2 = aux;\n\t\t\tb = 1 / (b - a);\n\t\t} while (Math.abs(x - h1 / k1) > x * tolerance);\n\n\t\treturn [h1, k1];\n\t}\n\n\t/**\n\t* Convert fraction to decimal\n\t* Separates fractions from the whole numbers and sums values together\n\t*\n\t* @param {string} fraction - Fraction.\n\t* @returns {(number|string)} Returns original string or number if conversion isn't possible.\n\t*/\n\tfractionToDecimal(fraction) {\n\t\tif (typeof fraction !== 'string' || !/\\d\\/\\d/.test(fraction)) {\n\t\t\treturn fraction;\n\t\t}\n\n\t\tconst values = fraction.split(' ');\n\t\tconst sum = [];\n\n\t\tfor (const value of values) {\n\n\t\t\tif (value.includes('/')) {\n\t\t\t\tconst fractionPart = value.split('/');\n\n\t\t\t\tconst firstPart = String(fractionPart[0]);\n\n\t\t\t\tfractionPart[0] = Number(fractionPart[0]);\n\t\t\t\tfractionPart[1] = Number(fractionPart[1]);\n\n\t\t\t\tif (firstPart.length === 1 && fractionPart[0] &&!Number.isNaN(fractionPart[0]) && !Number.isNaN(fractionPart[0])) {\n\t\t\t\t\tsum.push(fractionPart[0] / fractionPart[1]);\n\t\t\t\t} else {\n\t\t\t\t\treturn fraction;\n\t\t\t\t}\n\t\t\t} else if (!Number.isNaN(Number(value))) {\n\t\t\t\tsum.push(Number(value));\n\t\t\t}\n\t\t}\n\n\t\treturn values.length === sum.length ?\n\t\t\tsum.reduce((a, b) => {\n\t\t\t\treturn a + b;\n\t\t\t}, 0) :\n\t\t\tfraction;\n\t}\n\n\t/**\n\t * Converts hex encoded fractions to normal characters.\n\t * Example: 1 ¹⁄₄ -> 1 1/4\n\t * \n\t * @param {string} text - String to unfraction.\n\t * @param {boolean} [returnDecimalnumber=false] - Return decimal number instead, assuming that the input is in \"1 1/4\" format.\n\t * @returns {(string|number)} Converted value.\n\t */\n\tunfraction(text, returnDecimalnumber) {\n\n\t\tif (typeof text !== 'string') {\n\t\t\treturn text;\n\t\t}\n\n\t\t// Replace fraction dash\n\t\tlet tempText = String(text).replace(new RegExp(this.fractionsLookup.separator, 'g'), '/');\n\t\ttempText = tempText.replace(new RegExp(' ', 'g'), ' ');\n\n\t\tfor (let i = 0; i < this.fractionsLookup.sup.length; i++) {\n\t\t\ttempText = tempText.replace(new RegExp(this.fractionsLookup.sup[i], 'g'), String(i));\n\t\t\ttempText = tempText.replace(new RegExp(this.fractionsLookup.sub[i], 'g'), String(i));\n\t\t}\n\n\t\tfor (const key of Object.keys(this.fractionsLookup.frac)) {\n\t\t\tconst fracEntity = this.fractionsLookup.frac[key];\n\t\t\ttempText = tempText.replace(new RegExp(fracEntity, 'g'), key);\n\t\t}\n\n\t\tif (returnDecimalnumber === true) {\n\t\t\tlet [sup, sub] = tempText.trim().split(' ').filter(c => c !== '');\n\t\t\tsup = String(sup).trim();\n\t\t\tsub = String(sub).trim().split('/');\n\t\t\tif (sub.length === 2) {\n\t\t\t\tsub = sub.reduce((value, frac, i) => {\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\treturn Number(frac);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn value / Number(frac);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t} else {\n\t\t\t\tsub = false;\n\t\t\t}\n\n\t\t\tif (!Number.isNaN(parseFloat(sup)) && !Number.isNaN(parseFloat(sub))) {\n\t\t\t\treturn Number(sup) + Number(sub);\n\t\t\t}\n\n\t\t}\n\n\t\treturn tempText;\n\t}\n\n\t/**\n\t * Get unicode hex encoded sup/sub numbers.\n\t * \n\t * @param {string} [mode=\"sup\"] - Sup or sub fractions.\n\t * @param {(string|number)} number - Integer number.\n\t * @returns {string} Encoded sup/sub numbers;\n\t */\n\tgetFraction(mode, number) {\n\n\t\tlet lookup = this.fractionsLookup.sup;\n\t\tif (mode === 'sub') {\n\t\t\tlookup = this.fractionsLookup.sub;\n\t\t}\n\n\t\treturn Array.from(String(parseInt(number))).map(num => lookup[parseInt(num)]).join('');\n\n\t}\n\n\t/**\n\t * Returns base number and fractions (unicode hex or named entity):\n\t * 0.125 (1/8) -> 0 ¹⁄₈ or 0 ⅛\n\t * \n\t * If you want to convert 25 1/8 to 25 ⅛, do it like this:\n\t * FractionsTools.toFractions(FractionsTools.unfraction(\"25 1/8\", true));\n\t *\n\t * @param {(string|number)} number - Float to convert.\n\t * @param {boolean} [allowNamedEntities=false] - Get named entity i.e. ¼ if exists.\n\t * @returns {string} Returns base and fractions (if possible) or original value.\n\t */\n\ttoFractions(number, allowNamedEntities) {\n\n\t\tconst tempNumber = parseFloat(String(number).replace(',', '.'));\n\t\tif (!Number.isNaN(tempNumber) && tempNumber % 1 !== 0) {\n\t\t\tconst fraction = tempNumber % 1;\n\t\t\tconst base = tempNumber - fraction;\n\t\t\tconst rat = this.float2rat(fraction, 1.0e-2);\n\t\t\tif (allowNamedEntities === true) {\n\t\t\t\tconst frac = this.fractionsLookup.frac[`${rat[0]}/${rat[1]}`];\n\t\t\t\tif (frac !== undefined) {\n\t\t\t\t\treturn `${base} ${frac}`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn `${base} ${this.getFraction('sup', rat[0])}${this.fractionsLookup.separator}${this.getFraction('sub', rat[1])}`;\n\t\t}\n\t\treturn number;\n\t}\n\n\t/**\n\t * Convert to HTML fractions.\n\t * \n\t * Example:\n\t * Input: 25 1/8 or 25.125\n\t * Output: 25 ⅛\n\t * \n\t * @param {(string|number)} value - Value to convert.\n\t * @returns {string} - Input converted to fractions.\n\t */\n\tconvertToHtmlFractions(value) {\n\t\tlet _value = '';\n\t\tif (typeof value === 'string') {\n\t\t\t_value = this.unfraction(String(value), true);\n\t\t} else if (typeof value === 'number') {\n\t\t\t_value = value;\n\t\t} else {\n\t\t\t_value = String(value);\n\t\t}\n\t\treturn this.escapeFractionsString(this.toFractions(_value, true) + '');\n\t}\n\n\t/**\n\t * Escapes string that contains html escaped entities.\n\t * \n\t * @param {string} text - String to process.\n\t * @returns {string} Escaped and trimmed value.\n\t */\n\tescapeFractionsString(text) {\n\n\t\tconst entityMap = {\n\t\t\t'<': '<',\n\t\t\t'>': '>',\n\t\t\t'\"': '"',\n\t\t\t'\\'': ''',\n\t\t\t'/': '/',\n\t\t\t'`': '`',\n\t\t\t'=': '=',\n\t\t\t' & ': ' & '\n\t\t};\n\n\t\treturn String(text).replace(/[<>\"'`=/]/g, (s) => {\n\t\t\treturn entityMap[s];\n\t\t});\n\n\t\t//if (_text.includes(\"&frac\") || _text.includes(\"⁄\")) {\n\t\t//\treturn escapeChars(_text);\n\t\t//} else {\n\t\t//return _text;\n\t\t//}\n\t}\n}\n\nexport default new FractionsTools();","'use strict';\n\nclass ProductSizeSorter {\n\n\t/**\n\t * Product size and balance data object.\n\t * \n\t * @typedef {object} ProductData\n\t * @property {string} size - Product size.\n\t */\n\n\t/**\n\t * Sort by size (smaller first).\n\t * \n\t * @param {ProductData[]} data - Product data.\n\t * @returns {ProductData[]} Sorted product data.\n\t */\n\tsortProductSizes(data) {\n\n\t\tif (!Array.isArray(data)) {\n\t\t\treturn data;\n\t\t}\n\n\t\tconst numericSizes = [];\n\t\tconst letterSizes = [];\n\t\tconst mixedSizes = [];\n\n\t\t//Correct order of these sizes. Not alphabetical.\n\t\tconst sizeTable = ['XXS', 'XS', 'S', 'SM', 'S/M', 'M', 'M/L', 'L', 'L/XL', 'XL', 'XL/XXL', 'XXL', '2XL', 'XXXL', '3XL', 'XXXXL', '4XL', '5XL'];\n\n\t\t//Normalize sizes\n\t\tfor (let itemData of data) {\n\n\t\t\tif (itemData.sizeSort === undefined) {\n\t\t\t\titemData.sizeSort = itemData.size;\n\t\t\t}\n\n\t\t\titemData.sizeSort = String(itemData.sizeSort).replace(/\\([^)]*\\)/g, '').replace(/\\+/g, '').trim().toUpperCase().split(',')[0];\n\n\t\t\tconst dashless = itemData.sizeSort.split('-');\n\n\t\t\tif (dashless.length > 1 && dashless[0] !== '') {\n\t\t\t\titemData.sizeSort = String(dashless[0]).trim();\n\t\t\t}\n\n\t\t\tif (itemData.sizeSort !== '' && itemData.sizeSort !== null && itemData.sizeSort !== undefined) {\n\n\n\t\t\t\t//Check for numeric size (this matches 1, 1,11)\n\t\t\t\tlet isNumeric = String(parseFloat(itemData.sizeSort)) === itemData.sizeSort; //itemData.sizeSort.match(/^\\d+(,\\d+)?$/g) || itemData.sizeSort.match(/^\\d+(\\.\\d+)?$/g);\n\n\t\t\t\tconst letters = /[a-zA-ZöäåÖÄÅ]/;\n\t\t\t\tconst numbers = /\\d/;\n\t\t\t\tconst hasLetter = itemData.sizeSort.match(letters);\n\t\t\t\tconst hasNumbers = itemData.sizeSort.match(numbers);\n\n\t\t\t\tif (hasLetter && hasNumbers && !sizeTable.includes(itemData.sizeSort)) {\n\t\t\t\t\titemData.sizeSort = itemData.sizeSort.replace(/[^\\d.-]/g, '');\n\t\t\t\t\tisNumeric = true;\n\t\t\t\t} else if (!hasLetter && !hasNumbers) {\n\t\t\t\t\tisNumeric = false;\n\t\t\t\t}\n\n\t\t\t\t//Handle sizes with numbers only (e.g. 38, 40, 42)\n\t\t\t\tif (isNumeric) {\n\n\t\t\t\t\tconst numericSize = Number(itemData.sizeSort);\n\n\t\t\t\t\t//Add only unique sizes to list\n\t\t\t\t\tif (!numericSizes.includes(numericSize)) {\n\t\t\t\t\t\tnumericSizes.push(itemData);\n\t\t\t\t\t}\n\n\t\t\t\t\t//Handle letter sizes (e.g. S, M, L)\n\t\t\t\t} else if (sizeTable.includes(itemData.sizeSort)) {\n\t\t\t\t\tif (!letterSizes.includes(itemData.sizeSort)) {\n\t\t\t\t\t\tletterSizes.push(itemData);\n\t\t\t\t\t}\n\n\t\t\t\t\t//Mixed crap (e.g. 90D XLS XLL)\n\t\t\t\t} else {\n\n\t\t\t\t\tmixedSizes.push(itemData);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t//Something very weird crap (like missing size)\n\t\t\t\tmixedSizes.push(itemData);\n\t\t\t}\n\n\t\t}\n\n\t\t//Sort sizes\n\t\tletterSizes.sort((a, b) => {\n\t\t\tconst asize = sizeTable.indexOf(a.sizeSort);\n\t\t\tconst bsize = sizeTable.indexOf(b.sizeSort);\n\n\t\t\tif (asize === bsize) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn (asize > bsize) ? 1 : -1;\n\t\t});\n\n\t\tnumericSizes.sort((a, b) => {\n\t\t\treturn Number(String(a.sizeSort).replace(',', '.')) - Number(String(b.sizeSort).replace(',', '.'));\n\t\t});\n\n\t\tmixedSizes.sort((a, b) => {\n\t\t\treturn a.sizeSort - b.sizeSort;\n\t\t});\n\n\t\t// Merge all three arrays\n\t\t// 1. numeric, 2. letter, 3. mixed\n\t\treturn [...numericSizes, ...letterSizes, ...mixedSizes];\n\t}\n}\n\nexport default new ProductSizeSorter();","'use strict';\n\n/* global dataLayer */\n\nimport Mustache from 'mustache';\nimport FractionsTools from '../util/fractions-helper';\nimport SizeSorter from '../product/product-size-sorter';\nimport Templates from './loop54-templates';\nimport $ from 'jquery';\n\nlet Settings = {};\nlet State = {};\n\nlet Loop54FiltersProxy = {};\n\nclass Loop54FiltersHandler {\n\n\tconstructor(view, settings, state) {\n\t\tthis.view = view;\n\n\t\tif (settings) {\n\t\t\tthis.settings = settings;\n\t\t}\n\n\t\tif (state) {\n\t\t\tthis.state = state;\n\t\t}\n\n\t\tLoop54FiltersProxy = this;\n\t}\n\n\tset settings(settings) {\n\t\tSettings = settings;\n\t}\n\n\tget settings() {\n\t\treturn Settings;\n\t}\n\n\tset state(state) {\n\t\tState = state;\n\t}\n\n\tget state() {\n\t\treturn State;\n\t}\n\n\tgetCurrentFacets(clearFacets) {\n\n\t\tconst possibleFacets = {};\n\n\t\tfor (const possibleFacet of (Settings.views[this.view].possibleFacets || [])) {\n\t\t\tpossibleFacets[possibleFacet] = [];\n\t\t}\n\n\t\tif (State.views[this.view].params.selectedFacets && !clearFacets) {\n\t\t\tfor (const facet of Object.keys(State.views[this.view].params.selectedFacets)) {\n\t\t\t\tif (possibleFacets[facet]) {\n\t\t\t\t\tpossibleFacets[facet] = State.views[this.view].params.selectedFacets[facet];\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tState.views[this.view].params.selectedFacets = {};\n\t\t\tif (State.views[this.view].elems.searchFacets) {\n\t\t\t\tconst selectedFacetsBar = State.views[this.view].elems.searchFacets.querySelector('.js-selected-facets-bar');\n\t\t\t\tif (selectedFacetsBar) {\n\t\t\t\t\tselectedFacetsBar.classList.remove('has-facets');\n\t\t\t\t\tselectedFacetsBar.innerHTML = '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst userFacets = Object.keys(possibleFacets).map(facet => {\n\t\t\tconst facetObject = {\n\t\t\t\tattributeName: facet\n\t\t\t};\n\n\t\t\tif (possibleFacets[facet].length > 0) {\n\t\t\t\tfacetObject.selected = possibleFacets[facet];\n\t\t\t}\n\n\t\t\treturn facetObject;\n\t\t});\n\n\t\tState.views[this.view].params.userFacets = userFacets;\n\n\t\treturn State.views[this.view].params.userFacets;\n\n\t}\n\n\tresetFacets() {\n\t\tif (State.views[this.view].elems.searchFacets) {\n\n\t\t\tfor (const option of State.views[this.view].elems.searchFacets.querySelectorAll('.js-selected-facets-bar .facet-option.open')) {\n\t\t\t\toption.classList.remove('.open');\n\t\t\t}\n\n\t\t\tif (State.views[this.view].elems.searchFacets.dataset.selectedFacets !== '{}') {\n\t\t\t\tState.views[this.view].elems.searchFacets.dataset.skipFacetUpdate = true;\n\t\t\t\tState.views[this.view].params.selectedFacets = {};\n\t\t\t\tState.views[this.view].elems.searchFacets.dataset.selectedFacets = '{}';\n\t\t\t}\n\n\t\t}\n\n\t\tthis.facetsToUrlParams();\n\t\tthis.updateRobotsMetaTag();\n\t}\n\n\t/**\n\t * Convert facets to url params. We try to sort the facets and values so that urls would always be the same\n\t * regardless of in what order user selected facets.\n\t */\n\tfacetsToUrlParams() {\n\n\t\tif (State.firstLoad || !Settings.isCategory) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst selectedFacets = State.views[this.view].params.selectedFacets;\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tconst lookups = Settings.views[this.view].lookups || {};\n\t\tconst facets = [];\n\n\t\tconst idFacets = ['targetGroups', 'mainColour', 'brand'];\n\t\tconst idParams = {\n\t\t\ttargetGroups: new Set(),\n\t\t\tmainColour: new Set(),\n\t\t\tbrand: new Set()\n\t\t};\n\n\t\tconst urlFacets = {};\n\n\t\tfor (const [facet, values] of Object.entries(selectedFacets)) {\n\t\t\tconst mappedFacet = lookups[facet];\n\n\t\t\tif (idFacets.includes(facet) && (mappedFacet !== undefined)) {\n\n\t\t\t\tfor (const value of values) {\n\t\t\t\t\tlet mappedValue = mappedFacet[value];\n\n\t\t\t\t\tif (mappedValue) {\n\t\t\t\t\t\tidParams[facet].add(mappedFacet[value]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\turlFacets[facet] = [...values].sort();\n\t\t\t\tfacets.push(`${facet}${Settings.facetsParamNameSeparator}${values.join(Settings.facetsParamValueSeparator)}`);\n\t\t\t}\n\t\t}\n\n\t\tconst idParamsString = idFacets.flatMap(idParam => Array.from(idParams[idParam]).sort()).filter(Boolean).join('-');\n\n\t\tif (idParamsString) {\n\t\t\turlParams.set(Settings.idParam, idParamsString);\n\t\t} else {\n\t\t\turlParams.delete(Settings.idParam);\n\t\t}\n\n\t\tlet rawOrderBy = String(State?.views[this.view]?.elems?.orderBy?.value);\n\n\t\tif (Settings.views.products.sortOrder) {\n\t\t\tif (rawOrderBy !== Settings.views.products.sortOrder) {\n\t\t\t\turlParams.set(Settings.orderParam, rawOrderBy || 'default');\n\t\t\t} else {\n\t\t\t\turlParams.delete(Settings.orderParam);\n\t\t\t}\n\t\t} else {\n\t\t\tif (rawOrderBy) {\n\t\t\t\turlParams.set(Settings.orderParam, rawOrderBy);\n\t\t\t} else {\n\t\t\t\turlParams.delete(Settings.orderParam);\n\t\t\t}\n\t\t}\n\n\n\t\tif (Object.keys(urlFacets).length > 0) {\n\t\t\turlParams.set(Settings.facetsParam, JSON.stringify(Object.fromEntries(Object.entries(urlFacets).sort())));\n\t\t} else {\n\t\t\turlParams.delete(Settings.facetsParam);\n\t\t}\n\n\t\turlParams.sort();\n\t\tconst urlParamsString = urlParams.toString();\n\n\t\thistory.replaceState(null, '', urlParamsString ? '?' + urlParamsString : window.location.pathname);\n\n\t}\n\n\t/**\n\t * Convert url params to facets.\n\t *\n\t * @returns {Object} Facets.\n\t */\n\tgetUrlFacets() {\n\n\t\tif (State.firstLoad && Settings.isCategory) {\n\t\t\tthis.updateRobotsMetaTag(Settings.views[this.view].noIndex);\n\t\t}\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tconst facets = urlParams.get(Settings.facetsParam);\n\n\t\tlet parsedFacets = {};\n\n\t\tif (facets) {\n\t\t\ttry {\n\t\t\t\tparsedFacets = JSON.parse(facets);\n\t\t\t} catch (error) {\n\t\t\t\turlParams.delete(Settings.facetsParam);\n\t\t\t\tconst urlParamsString = urlParams.toString();\n\t\t\t\thistory.replaceState(null, '', urlParamsString ? '?' + urlParamsString : window.location.pathname);\n\t\t\t\treturn {};\n\t\t\t}\n\t\t}\n\n\t\tif (!((typeof parsedFacets === 'object') && parsedFacets)) {\n\t\t\treturn {};\n\t\t}\n\n\t\treturn parsedFacets;\n\n\t}\n\n\twriteFacets(facets, skipFacetUpdate) {\n\t\tif (State.views[this.view].elems.searchFacets) {\n\t\t\tif (skipFacetUpdate) {\n\t\t\t\tState.views[this.view].elems.searchFacets.dataset.skipFacetUpdate = true;\n\t\t\t\tState.views[this.view].params.selectedFacets = facets;\n\t\t\t}\n\n\t\t\tState.views[this.view].elems.searchFacets.dataset.selectedFacets = JSON.stringify(State.views[this.view].params.selectedFacets);\n\t\t}\n\t}\n\n\tcloseFilterDropdowns() {\n\t\tfor (const openDropdown of document.querySelectorAll('.facet-option.open')) {\n\t\t\topenDropdown.classList.remove('open');\n\t\t}\n\t\tdocument.body.classList.remove('prevent-scroll-mobile');\n\t\tif (State.views[this.view].filterBlurListener) {\n\t\t\tdocument.body.removeEventListener('click', State.views[this.view].filterBlurListener);\n\t\t\tState.views[this.view].filterBlurListener = false;\n\t\t}\n\t\t//State.openFilter = false;\n\t}\n\n\tfilterDropdownListener(remove) {\n\t\tif (remove) {\n\t\t\tif (State.views[this.view].filterBlurListener) {\n\t\t\t\tdocument.body.removeEventListener('click', State.views[this.view].filterBlurListener);\n\t\t\t\tState.views[this.view].filterBlurListener = false;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!State.views[this.view].filterBlurListener) {\n\t\t\t\tState.views[this.view].filterBlurListener = (e) => {\n\t\t\t\t\tif (!e.target.closest('.facet-option.open, .facet-container') && !e.target.classList.contains('open-facet-options') || e.target.classList.contains('close-facet-options')) {\n\t\t\t\t\t\tLoop54FiltersProxy.closeFilterDropdowns();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdocument.body.addEventListener('click', State.views[this.view].filterBlurListener);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Update meta tag for robots if facets are applied.\n\t *\n\t * @param {boolean} [noIndexState] - Whether to set the meta tag to noindex or remove it. If not given, the meta tag will be set to noindex if facets are applied, and removed if not.\n\t */\n\tupdateRobotsMetaTag(noIndexState) {\n\n\t\tif (!Settings.isCategory) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet metaTag = document.querySelector('meta[name=\"robots\"]');\n\t\t//let noIndex = Object.keys(State.views[this.view].params.selectedFacets).length > 0;\n\t\tlet noIndex = false;\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\tif (urlParams.get(Settings.orderParam) || urlParams.get(Settings.idParam) || urlParams.get(Settings.facetsParam)) {\n\t\t\tnoIndex = true;\n\t\t}\n\n\t\tif (typeof noIndexState === 'boolean') {\n\t\t\tnoIndex = noIndexState;\n\t\t}\n\n\t\tif (metaTag) {\n\t\t\tif (noIndex) {\n\t\t\t\tmetaTag.content = 'noindex';\n\t\t\t} else {\n\t\t\t\tmetaTag.remove();\n\t\t\t}\n\t\t} else {\n\t\t\tif (noIndex) {\n\t\t\t\tconst newMetaTag = document.createElement('meta');\n\t\t\t\tnewMetaTag.name = 'robots';\n\t\t\t\tnewMetaTag.content = 'noindex';\n\t\t\t\tdocument.head.appendChild(newMetaTag);\n\t\t\t}\n\t\t}\n\t}\n\n\n\tupdateFacets(actionObject, skipFacetUpdate) {\n\n\t\tif ((actionObject.action === 'removeFacet') && actionObject.clearAll) {\n\n\t\t\tState.views[this.view].params.selectedFacets = {};\n\n\t\t} else if ((actionObject.action === 'facet') || (actionObject.action === 'removeFacet' && !actionObject.clearAll)) {\n\t\t\tif (!State.views[this.view].params.selectedFacets[actionObject.facet]) {\n\t\t\t\tState.views[this.view].params.selectedFacets[actionObject.facet] = [];\n\t\t\t}\n\n\t\t\tif (actionObject.checked) {\n\t\t\t\tState.views[this.view].params.selectedFacets[actionObject.facet].push(actionObject.value);\n\t\t\t} else {\n\t\t\t\tState.views[this.view].params.selectedFacets[actionObject.facet] = State.views[this.view].params.selectedFacets[actionObject.facet].filter(value => !(value === actionObject.value));\n\t\t\t}\n\n\t\t\t// This will filter out results that do not apply.\n\t\t\t// For example it [\"Miehet\", \"Naiset\"] were preloaded facets, but the\n\t\t\t// results would only contain \"Miehet\", this will then remove \"Naiset\".\n\t\t\tif (Settings.isCategory && State.views[this.view].remoteFacets) {\n\t\t\t\tconst remoteFacetValues = State.views[this.view].remoteFacets[actionObject.facet]\n\n\t\t\t\tState.views[this.view].params.selectedFacets[actionObject.facet] = State.views[this.view].params.selectedFacets[actionObject.facet].filter(selectedFacetValue => remoteFacetValues.includes(selectedFacetValue));\n\t\t\t}\n\n\t\t\tif (State.views[this.view].params.selectedFacets[actionObject.facet].length === 0) {\n\t\t\t\tdelete State.views[this.view].params.selectedFacets[actionObject.facet];\n\t\t\t}\n\n\t\t}\n\n\t\t// Hack for disabling shop availability filter when sizes are selected and vice versa.\n\t\t// Filter work as colour level but these are ean level filters and we can't mix them.\n\t\tif (State.views[this.view]?.elems?.searchFacets) {\n\t\t\tconst shopFilter = State.views[this.view].elems.searchFacets.querySelector('.facets-bar .facet-option[data-facet=\"sizes\"]');\n\t\t\tif (shopFilter) {\n\t\t\t\tif (State.views[this.view].params.selectedFacets.shopAvailability) {\n\t\t\t\t\tshopFilter.classList.add('hidden');\n\t\t\t\t} else {\n\t\t\t\t\tshopFilter.classList.remove('hidden');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sizesFilter = State.views[this.view].elems.searchFacets.querySelector('.facets-bar .facet-option[data-facet=\"shopAvailability\"]');\n\t\t\tif (sizesFilter) {\n\t\t\t\tif (State.views[this.view].params.selectedFacets.sizes) {\n\t\t\t\t\tsizesFilter.classList.add('hidden');\n\t\t\t\t} else {\n\t\t\t\t\tsizesFilter.classList.remove('hidden');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.writeFacets(State.views[this.view].params.selectedFacets, skipFacetUpdate);\n\t\tthis.updateRobotsMetaTag();\n\t\tthis.facetsToUrlParams();\n\n\t\treturn this.getCurrentFacets();\n\n\t}\n\n\tupdateOrderBy() {\n\t\tlet rawOrderBy = String(State?.views[this.view]?.elems?.orderBy?.value);\n\t\tconst [orderBy, order] = rawOrderBy.split('-');\n\t\tif (orderBy) {\n\t\t\tState.views[this.view].params.orderBy = [{ type: 'attribute', attributeName: orderBy, order: order || 'asc' }];\n\t\t} else {\n\t\t\tState.views[this.view].params.orderBy = false;\n\t\t}\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tif (!State.firstLoad && Settings.isCategory) {\n\n\t\t\tif (Settings.views.products.sortOrder) {\n\t\t\t\tif (rawOrderBy !== Settings.views.products.sortOrder) {\n\t\t\t\t\turlParams.set(Settings.orderParam, rawOrderBy || 'default');\n\t\t\t\t} else {\n\t\t\t\t\turlParams.delete(Settings.orderParam);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (orderBy && order) {\n\t\t\t\t\turlParams.set(Settings.orderParam, rawOrderBy);\n\t\t\t\t} else {\n\t\t\t\t\turlParams.delete(Settings.orderParam);\n\t\t\t\t}\n\t\t\t}\n\n\n\n\t\t\turlParams.sort();\n\t\t\tconst urlParamsString = urlParams.toString();\n\n\t\t\thistory.replaceState(null, '', urlParamsString ? '?' + urlParamsString : window.location.pathname);\n\t\t\tthis.updateRobotsMetaTag();\n\t\t}\n\n\t\treturn State.views[this.view].params.orderBy;\n\t}\n\n\thandleFacets(data, reset) {\n\t\t// Currently only products, handle different views if neccessary\n\t\tif (!['products', 'category'].includes(this.view)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!(data.results && data.results.facets)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst facets = data.results.facets;\n\n\t\tState.views[this.view].remoteFacets = (facets || []).reduce((facetsLookup, facet) => {\n\n\t\t\tfacetsLookup[facet.name] = facet.items.map(item => item.item);\n\n\t\t\treturn facetsLookup;\n\t\t}, {});\n\n\t\tif (State.views[this.view].elems.searchFacets) {\n\n\t\t\tconst facetsBar = State.views[this.view].elems.searchFacets.querySelector('.js-facets-bar');\n\n\t\t\tconst checkboxBarFilterTemplate = Templates.checkboxBarFilter;\n\t\t\tMustache.parse(checkboxBarFilterTemplate);\n\n\t\t\tconst filterTemplate = Templates.filter;\n\t\t\tconst checkboxTemplate = Templates.checkboxTemplate;\n\t\t\tMustache.parse(filterTemplate);\n\t\t\tMustache.parse(checkboxTemplate);\n\n\t\t\tconst possibleFacets = Settings.views[this.view].possibleFacets || [];\n\n\t\t\tif (!State.views[this.view].elems.searchFacets.querySelector('.facet-option') || reset) {\n\t\t\t\tlet defaultFilters = '';\n\n\t\t\t\tfor (const facet of possibleFacets) {\n\t\t\t\t\tif (Settings.views[this.view].filterbarFacets.includes(facet)) {\n\t\t\t\t\t\tdefaultFilters += Mustache.render(filterTemplate, { name: facet, disabled: true }, { checkboxTemplate });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (facetsBar) {\n\t\t\t\t\tfacetsBar.innerHTML = defaultFilters;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet facetLookup = {};\n\t\t\tif (facetsBar) {\n\t\t\t\tfacetLookup = Array.from(facetsBar.querySelectorAll('.facet-option')).reduce((acc, facet) => {\n\t\t\t\t\tconst facetName = facet.dataset.facet;\n\t\t\t\t\tif (facetName) {\n\t\t\t\t\t\tif (acc[facetName] === undefined) {\n\t\t\t\t\t\t\tacc[facetName] = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tacc[facetName] = facet;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {});\n\t\t\t}\n\n\t\t\tlet selectedFacets = [];\n\n\t\t\tconst selectedFacetsTemplate = Templates.selectedFacets;\n\t\t\tMustache.parse(selectedFacetsTemplate);\n\n\t\t\tlet visibleFacets = false;\n\t\t\t// let checkboxBarHtml = '';\n\n\t\t\tconst renderedFacets = [];\n\n\t\t\tfor (const facet of facets) {\n\n\t\t\t\tfacet.facetName = String(Settings.facetNameMapping[facet.name] || facet.name);\n\t\t\t\tif (facet.facetName.includes('|')) {\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\tconst [additionalFieldType, additionalFieldName] = facet.facetName.split('|');\n\t\t\t\t\tif (additionalFieldName) {\n\t\t\t\t\t\tfacet.facetName = additionalFieldName;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\tif (facet.items.length === 1) {\n\t\t\t\t\tif ((facet.items[0].count >= data?.results?.count)) {\n\t\t\t\t\t\t// Don't show facets that apply to every product unless it is selected.\n\t\t\t\t\t\tif (!facet.items[0].selected) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfacet.selectedCount = 0;\n\t\t\t\tfacet.items = facet.items.map(item => {\n\t\t\t\t\titem.sort = String(item.item).toLowerCase().trim().replace(/\\W/g, '') || '';\n\t\t\t\t\titem.id = String(String(facet.name).trim() + '-' + String(item.item).trim().replace(/\\W/g, '-'));\n\t\t\t\t\tif (facet.name === 'sizes') {\n\t\t\t\t\t\titem.sizeSort = FractionsTools.fractionToDecimal(String(item.item).toLowerCase().trim());\n\t\t\t\t\t\titem.filterName = FractionsTools.convertToHtmlFractions(item.item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (facet.name === 'mainColour') {\n\t\t\t\t\t\tconst [name, hex] = String(item.item).split('|:|');\n\t\t\t\t\t\titem.filterName = name;\n\t\t\t\t\t\titem.colorMark = hex;\n\n\t\t\t\t\t\t// Add border for white (Valkoinen) and colorless (Väritön)\n\t\t\t\t\t\tif (hex === '#ffffff') {\n\t\t\t\t\t\t\titem.colorWithBorder = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (item.selected) {\n\t\t\t\t\t\tfacet.selectedCount++;\n\t\t\t\t\t\titem.facetId = facet.name;\n\t\t\t\t\t\titem.facetName = facet.facetName;\n\t\t\t\t\t\titem.checked = true;\n\t\t\t\t\t\tselectedFacets.push(item);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For checkbox template\n\t\t\t\t\tlet checkboxName = String(item.filterName || item.item);\n\t\t\t\t\titem.labelTitle = checkboxName;\n\t\t\t\t\titem.label = checkboxName;\n\t\t\t\t\titem.value = item.item;\n\t\t\t\t\titem.dataAttributes = [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'is-facet',\n\t\t\t\t\t\t\tvalue: 'true'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'value',\n\t\t\t\t\t\t\tvalue: item.item\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'facet',\n\t\t\t\t\t\t\tvalue: facet.name\n\t\t\t\t\t\t}\n\t\t\t\t\t];\n\n\t\t\t\t\treturn item;\n\t\t\t\t});\n\n\t\t\t\tif (facet.selectedCount === 0) {\n\t\t\t\t\tfacet.selectedCount = false;\n\t\t\t\t}\n\n\t\t\t\tif (facet.name === 'sizes') {\n\t\t\t\t\tfacet.items = SizeSorter.sortProductSizes(facet.items);\n\t\t\t\t} else if (facet.name === 'targetGroups') {\n\n\t\t\t\t\tconst targetGroupsOrder = Settings.targetGroupsOrder;\n\n\t\t\t\t\tfacet.items = facet.items.sort((a, b) => targetGroupsOrder[a.item || 99] - targetGroupsOrder[b.item || 99]);\n\t\t\t\t} else {\n\t\t\t\t\tfacet.items = facet.items.sort((a, b) => {\n\t\t\t\t\t\tlet _a = +a.sort;\n\t\t\t\t\t\tlet _b = +b.sort;\n\t\t\t\t\t\tconst aIsNumber = !Number.isNaN(_a);\n\t\t\t\t\t\tconst bIsNumber = !Number.isNaN(_b);\n\t\t\t\t\t\tif (aIsNumber && bIsNumber) {\n\t\t\t\t\t\t\treturn _a - _b;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn a.sort.localeCompare(b.sort, 'fi', { sensitivity: 'base' });\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (facet.items.length > 0) {\n\t\t\t\t\tfacet.onlyOptions = true;\n\t\t\t\t\tif (facetLookup[facet.name]) {\n\t\t\t\t\t\trenderedFacets.push(facet.name);\n\t\t\t\t\t\tif (facetLookup[facet.name] && facetLookup[facet.name].classList.contains('open')) {\n\t\t\t\t\t\t\t// Prevent re-rendering open dropdown.\n\t\t\t\t\t\t\tconst dropdownButton = facetLookup[facet.name].querySelector('.open-facet-options');\n\t\t\t\t\t\t\tif (dropdownButton) {\n\t\t\t\t\t\t\t\tfacet.buttonContentOnly = true;\n\t\t\t\t\t\t\t\tdropdownButton.innerHTML = String(Mustache.render(filterTemplate, facet, { checkboxTemplate })).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfacetLookup[facet.name].innerHTML = Mustache.render(filterTemplate, facet, { checkboxTemplate });\n\t\t\t\t\t\t\tfacetLookup[facet.name].classList.remove('disabled');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvisibleFacets = true;\n\t\t\t\t\t}\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Disable filters that didn't apply.\n\t\t\tfor (const facet of Object.keys(facetLookup)) {\n\t\t\t\tif (!renderedFacets.includes(facet) && facetLookup[facet]) {\n\t\t\t\t\tfacetLookup[facet].classList.add('disabled');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// State.params.allFacets = JSON.parse(JSON.stringify(facets)); // Not sure we use this anywhere?\n\n\t\t\tif (State.views[this.view].elems.searchFacets) {\n\t\t\t\t/*\n\t\t\t\tconst checkboxBar = State.views[this.view].elems.searchFacets.querySelector('.js-checkbox-bar');\n\t\t\t\tif (checkboxBar) {\n\t\t\t\t\tcheckboxBar.innerHTML = checkboxBarHtml;\n\t\t\t\t\tif (!checkboxBarHtml) {\n\t\t\t\t\t\tcheckboxBar.classList.add('no-facets');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcheckboxBar.classList.remove('no-facets');\n\t\t\t\t\t}\n\t\t\t\t} */\n\n\t\t\t\tif (facetsBar) {\n\t\t\t\t\tif (visibleFacets) {\n\t\t\t\t\t\tfacetsBar.classList.remove('no-facets');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfacetsBar.classList.add('no-facets');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst selectedFacetsBar = State.views[this.view].elems.searchFacets.querySelector('.js-selected-facets-bar');\n\n\t\t\t\tif (selectedFacetsBar) {\n\t\t\t\t\tif (selectedFacets.length > 0) {\n\t\t\t\t\t\tselectedFacetsBar.classList.add('has-facets');\n\t\t\t\t\t\tselectedFacetsBar.innerHTML = Mustache.render(selectedFacetsTemplate, selectedFacets);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectedFacetsBar.classList.remove('has-facets');\n\t\t\t\t\t\tselectedFacetsBar.innerHTML = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (facetsBar) {\n\t\t\t\tconst openFacetOption = facetsBar.querySelector('.facet-option.open');\n\t\t\t\tif (openFacetOption) {\n\t\t\t\t\tfacetsBar.scrollTo(openFacetOption.offsetLeft - 20, 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (State.views[this.view].elems.content.querySelector('.facet-option.open')) {\n\t\t\t\t$('.top-ad-bar.full').trigger('close-full-ad-bar');\n\t\t\t\tdocument.body.classList.add('prevent-scroll-mobile');\n\t\t\t} else {\n\t\t\t\tdocument.body.classList.remove('prevent-scroll-mobile');\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport default Loop54FiltersHandler;\n","'use strict';\n\n/* global dataLayer, __productListingSettings */\n\nimport Mustache from 'mustache';\nimport Loop54Connector from './loop54-connector';\nimport Loop54FiltersHandler from './loop54-filters-handler'; // Currently only works with products\nimport Templates from './loop54-templates';\n\nlet Settings = {\n\tshowSuggestionsAfter: 150,\n\tupdateFiltersAfter: 500,\n\tminSuggestionLetters: 2,\n\tendpoint: false, // relative url\n\tsearchMakesNoSenseText: 'Valitettavasti emme ymmärtäneet hakuasi',\n\tstateStoreKey: 'ListingStatesStore',\n\tsearchParamKey: 'searchParam',\n\tsearchScopeTermKey: 'searchScopeTerm',\n\tsearchScopeKey: 'searchScope',\n\tpageParam: 'sivu',\n\tidParam: 'id',\n\tfacetsParam: 'userFacets',\n\torderParam: 'orderBy',\n\tsearchQueryParam: 'q',\n\tscopedQueryParam: 'scoped',\n\tscopeParam: 'scope',\n\ttitleSuffix: '| Intersport',\n\tloop54Mode: 'search', // or 'category'\n\tisCategory: false,\n\tcurrentCategory: false,\n\tpageContainers: {\n\t\tsearch: '#search-page',\n\t\tcategory: '#o-product-listing'\n\t},\n\tviews: {\n\t\tproducts: {\n\t\t\tid: 'products-tab',\n\t\t\tcontentId: 'products-tab-content',\n\t\t\titemsPerPage: 30,\n\t\t\tmaxItems: false,\n\t\t\tsingularLabel: 'tuote',\n\t\t\tpluralLabel: 'tuotetta',\n\t\t\tsortOrder: '',\n\t\t\t// Note: Settings can override this. Also \"default\" sort option will always mean Loop54 sorting.\n\t\t\tsortOptions: [\n\t\t\t\t'popularity-desc',\n\t\t\t\t'newUntil-desc',\n\t\t\t\t'brand-asc',\n\t\t\t\t'brand-desc',\n\t\t\t\t'currentPrice-asc',\n\t\t\t\t'currentPrice-desc',\n\t\t\t\t'ovhComparisonPercent-desc'\n\t\t\t],\n\t\t\t// This is also facet order.\n\t\t\tpossibleFacets: [\n\t\t\t\t'targetGroups',\n\t\t\t\t'sizes',\n\t\t\t\t'brand',\n\t\t\t\t'mainColour',\n\t\t\t\t'sustainability',\n\t\t\t\t'productType',\n\t\t\t\t'category',\n\t\t\t\t'subcategory',\n\t\t\t\t'sports',\n\t\t\t\t// 'technologies',\n\t\t\t\t'shopAvailability'\n\t\t\t],\n\t\t\tfilterbarFacets: [\n\t\t\t\t'targetGroups',\n\t\t\t\t'sizes',\n\t\t\t\t'brand',\n\t\t\t\t'mainColour',\n\t\t\t\t'sustainability',\n\t\t\t\t'productType',\n\t\t\t\t'category',\n\t\t\t\t'subcategory',\n\t\t\t\t'sports',\n\t\t\t\t// 'technologies',\n\t\t\t\t'shopAvailability'\n\t\t\t],\n\t\t\tscopedTerms: true,\n\t\t\t// Append product name\n\t\t\tproductAdditons: {},\n\t\t\tlookups: {}\n\t\t},\n\t\tarticles: {\n\t\t\tid: 'articles-tab',\n\t\t\tcontentId: 'articles-tab-content',\n\t\t\titemsPerPage: 18,\n\t\t\tsingularLabel: 'artikkeli',\n\t\t\tpluralLabel: 'artikkelia',\n\t\t\tpossibleFacets: [],\n\t\t\tfilterbarFacets: [],\n\t\t\tscopedTerms: false\n\t\t},\n\t\tshops: {\n\t\t\tid: 'shops-tab',\n\t\t\tcontentId: 'shops-tab-content',\n\t\t\titemsPerPage: 18,\n\t\t\tsingularLabel: 'kauppa',\n\t\t\tpluralLabel: 'kauppaa',\n\t\t\tpossibleFacets: [],\n\t\t\tfilterbarFacets: [],\n\t\t\tscopedTerms: false\n\t\t}\n\t},\n\tfacetNameMapping: {\n\t\ttargetGroups: 'Kohderyhmä',\n\t\tcategory: 'Kategoria',\n\t\tsubcategory: 'Alakategoria',\n\t\tbrand: 'Brändi',\n\t\tsports: 'Laji',\n\t\tproductType: 'Tuotetyyppi',\n\t\tmainColour: 'Väri',\n\t\tsizes: 'Koko',\n\t\tsustainability: 'Vastuullisuus',\n\t\tshopAvailability: 'Kauppasaatavuus',\n\t\ttechnologies: 'Teknologiat',\n\t},\n\ttargetGroupsOrder: {\n\t\t'Aikuiset': 0,\n\t\t'Naiset': 1,\n\t\t'Miehet': 2,\n\t\t'Nuoret': 3,\n\t\t'Tytöt': 4,\n\t\t'Pojat': 5,\n\t\t'Lapset': 6\n\t},\n\tshowMaxSuggestions: 9, // suggestions and scoped suggestions combined.\n\tshowMaxScopedSuggestions: 3, // Max scoped suggestions\n\tloop54Options: {\n\t\tsearch: {\n\t\t\tresultsOptions: {\n\t\t\t\tskip: 0,\n\t\t\t\ttake: 30\n\t\t\t},\n\t\t\trelatedResultsOptions: {\n\t\t\t\tskip: 0,\n\t\t\t\ttake: 10\n\t\t\t},\n\t\t\tspellingSuggestionsOptions: {\n\t\t\t\tskip: 0,\n\t\t\t\ttake: 6\n\t\t\t},\n\t\t\trelatedQueriesOptions: {\n\t\t\t\tskip: 0,\n\t\t\t\ttake: 6\n\t\t\t},\n\t\t\tcustomData: {\n\t\t\t\tpageResultsOptions: {\n\t\t\t\t\tskip: 0,\n\t\t\t\t\ttake: 18\n\t\t\t\t},\n\t\t\t\tshopResultsOptions: {\n\t\t\t\t\tskip: 0,\n\t\t\t\t\ttake: 18\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tcategory: {\n\t\t\tresultsOptions: {\n\t\t\t\tskip: 0,\n\t\t\t\ttake: 30\n\t\t\t},\n\t\t\t/*\tfilter: {\n\t\t\t\t\tand: [\n\t\t\t\t\t\t{ attributeName: 'category' },\n\t\t\t\t\t\t{ type: 'attribute', attributeName: 'targetGroups', value: 'Miehet' }\n\t\t\t\t\t]\n\t\t\t\t} */\n\t\t},\n\t\t//suggestions: { skip: 0, take: 10, customData: { directSearch: true } }\n\t\tsuggestions: { skip: 0, take: 9 }\n\t}\n};\n\n\nif (typeof __productListingSettings === 'object') {\n\n\tconst addViewSettings = (view) => {\n\t\tfor (const key of Object.keys(__productListingSettings[view])) {\n\t\t\tSettings.views[view][key] = __productListingSettings[view][key];\n\t\t}\n\t\tdelete __productListingSettings[view];\n\t}\n\n\tif (__productListingSettings.products) {\n\t\taddViewSettings('products');\n\t}\n\n\tif (__productListingSettings.articles) {\n\t\taddViewSettings('articles');\n\t}\n\n\tif (__productListingSettings.shops) {\n\t\taddViewSettings('shops');\n\t}\n\n\tfor (const key of Object.keys(__productListingSettings)) {\n\t\tSettings[key] = __productListingSettings[key];\n\t}\n}\n\n\n\nlet State = {\n\t// General elements\n\tsearchBoxes: false,\n\tsearchButtons: false,\n\tpage: false,\n\tsearchContainer: false,\n\tnoSearchText: false,\n\n\tsearchBoxDesktop: false,\n\tsearchBoxMobile: false,\n\trelatedQueries: false,\n\tspellingSuggestions: false,\n\tsearchText: false,\n\tsearchTextScoped: false,\n\tmakesSense: false,\n\tsuggestions: false,\n\n\t// View specific stuff.\n\tviews: {\n\t\tproducts: {\n\t\t\ttype: 'product',\n\t\t\ttemplate: '',\n\t\t\tfilterBlurListener: false,\n\t\t\tloop54FiltersHandler: false,\n\t\t\thasMoreResults: false,\n\t\t\telems: {\n\t\t\t\telem: false,\n\t\t\t\tcontent: false,\n\t\t\t\tsearchFacets: false,\n\t\t\t\tresults: false,\n\t\t\t\trelatedSearchResultsContainer: false,\n\t\t\t\trelatedResults: false,\n\t\t\t\tshowMoreResults: false,\n\t\t\t\torderBy: false,\n\t\t\t},\n\t\t\tparams: {\n\t\t\t\tcurrentIndex: 0,\n\t\t\t\tcurrentItemsCount: 0,\n\t\t\t\tallItemsCount: 0,\n\t\t\t\torderBy: false,\n\t\t\t\tuserFacets: [],\n\t\t\t\tselectedFacets: {}\n\t\t\t},\n\t\t\tfetchedFacets: false\n\t\t},\n\t\tarticles: {\n\t\t\ttype: 'article',\n\t\t\ttemplate: '',\n\t\t\tfilterBlurListener: false,\n\t\t\tloop54FiltersHandler: false,\n\t\t\thasMoreResults: false,\n\t\t\telems: {\n\t\t\t\telem: false,\n\t\t\t\tcontent: false,\n\t\t\t\tsearchFacets: false,\n\t\t\t\tresults: false,\n\t\t\t\trelatedSearchResultsContainer: false,\n\t\t\t\trelatedResults: false,\n\t\t\t\tshowMoreResults: false,\n\t\t\t\torderBy: false,\n\t\t\t},\n\t\t\tparams: {\n\t\t\t\tcurrentIndex: 0,\n\t\t\t\tcurrentItemsCount: 0,\n\t\t\t\tallItemsCount: 0,\n\t\t\t\torderBy: false,\n\t\t\t\tuserFacets: [],\n\t\t\t\tselectedFacets: {}\n\t\t\t}\n\t\t},\n\t\tshops: {\n\t\t\ttype: 'shop',\n\t\t\ttemplate: '',\n\t\t\tfilterBlurListener: false,\n\t\t\tloop54FiltersHandler: false,\n\t\t\thasMoreResults: false,\n\t\t\telems: {\n\t\t\t\telem: false,\n\t\t\t\tcontent: false,\n\t\t\t\tsearchFacets: false,\n\t\t\t\tresults: false,\n\t\t\t\trelatedSearchResultsContainer: false,\n\t\t\t\trelatedResults: false,\n\t\t\t\tshowMoreResults: false,\n\t\t\t\torderBy: false,\n\t\t\t},\n\t\t\tparams: {\n\t\t\t\tcurrentIndex: 0,\n\t\t\t\tcurrentItemsCount: 0,\n\t\t\t\tallItemsCount: 0,\n\t\t\t\torderBy: false,\n\t\t\t\tuserFacets: [],\n\t\t\t\tselectedFacets: {}\n\t\t\t}\n\t\t}\n\t},\n\tactiveView: 'products', // Initial view\n\tclient: new Loop54Connector(),\n\tsearchController: false,\n\tsuggestionsController: false,\n\thasSuggestionListener: false,\n\tparams: {\n\t\t// allFacets: [],\n\t\tsuggestionsQuery: '',\n\t\tsearchTerm: '',\n\t\tscopedTerm: false,\n\t\tscope: false,\n\t\tpage: false\n\t},\n\trestoreState: false,\n\thadPageParam: false,\n\tfirstLoad: true,\n\tcache: {}\n};\n\nlet Loop54SearchProxy = {};\n\nclass Loop54Search {\n\n\tconstructor(settings, state) {\n\n\t\tif (settings) {\n\t\t\tthis.settings = settings;\n\t\t}\n\n\t\tif (state) {\n\t\t\tthis.state = state;\n\t\t}\n\n\t\tLoop54SearchProxy = this;\n\n\t}\n\n\tset settings(settings) {\n\t\tSettings = settings;\n\t}\n\n\t/*get loop54FiltersHandler() {\n\t\treturn loop54FiltersHandler;\n\t}*/\n\n\tget settings() {\n\t\treturn Settings;\n\t}\n\n\tset state(state) {\n\t\tState = state;\n\t}\n\n\tget state() {\n\t\treturn State;\n\t}\n\n\tgetElements(containerOnly) {\n\n\t\tif (containerOnly) {\n\t\t\treturn document.querySelector(Settings.pageContainers[Settings.loop54Mode]);\n\t\t} else {\n\n\n\t\t\tState.page = document.querySelector(Settings.pageContainers[Settings.loop54Mode]);\n\n\t\t\tif (State.page && !State.page.querySelector('.search-container')) {\n\t\t\t\tif (Templates.page) {\n\t\t\t\t\tconst searchParam = new URLSearchParams(window.location.search);\n\t\t\t\t\tif (searchParam.has(Settings.searchQueryParam) && searchParam.get(Settings.searchQueryParam).trim()) {\n\t\t\t\t\t\tState.page.innerHTML = Mustache.render(Templates.page, { searchTerm: searchParam.get(Settings.searchQueryParam).trim() });\n\t\t\t\t\t} else if (sessionStorage.getItem(Settings.searchParamKey)) {\n\t\t\t\t\t\tState.page.innerHTML = Mustache.render(Templates.page, { searchTerm: sessionStorage.getItem(Settings.searchParamKey) });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tState.page.innerHTML = Mustache.render(Templates.page, { noQuery: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tState.searchContainer = document.querySelector('.search-container');\n\t\t\tState.searchBoxes = document.querySelectorAll('.search-box');\n\t\t\tState.searchBoxDesktop = document.querySelector('.search-box.desktop');\n\n\t\t\tif (State.searchBoxDesktop && State.searchBoxDesktop.dataset.endpoint) {\n\t\t\t\tSettings.endpoint = State.searchBoxDesktop.dataset.endpoint;\n\t\t\t}\n\n\t\t\tState.searchBoxMobile = document.querySelector('.search-box.mobile');\n\t\t\tState.searchButtons = document.querySelectorAll('.search-button');\n\t\t\tState.noSearchText = document.querySelector('#no-search-text');\n\t\t\tState.searchTextScoped = document.querySelectorAll('.search-term-scoped');\n\t\t\tState.relatedQueries = document.getElementById('related-queries');\n\t\t\tState.spellingSuggestions = document.getElementById('spelling-suggestions');\n\t\t\tState.searchText = document.querySelectorAll('.search-term');\n\t\t\tState.makesSense = document.querySelector('.makes-sense');\n\t\t\tState.suggestions = document.querySelectorAll('.search-suggestions');\n\t\t\tState.productTemplate = Templates.productTemplate;\n\t\t\tState.resultItemTemplate = Templates.resultItemTemplate;\n\n\t\t\t// Loop through views to set view specific elements\n\t\t\tfor (let view of Object.keys(State.views)) {\n\n\t\t\t\tif (Settings.isCategory) {\n\t\t\t\t\tState.views[view].elems.content = document.querySelector(Settings.pageContainers.category);\n\t\t\t\t} else {\n\t\t\t\t\tState.views[view].elems.elem = document.getElementById(Settings.views[view].id);\n\t\t\t\t\tState.views[view].elems.content = document.getElementById(Settings.views[view].contentId);\n\t\t\t\t}\n\n\t\t\t\tif ((State.views[view].elems.elem || Settings.isCategory) && State.views[view].elems.content) {\n\t\t\t\t\tState.views[view].elems.searchFacets = State.views[view].elems.content.querySelector('.search-facets');\n\t\t\t\t\tState.views[view].elems.results = State.views[view].elems.content.querySelector('.js-search-results');\n\t\t\t\t\tState.views[view].elems.relatedSearchResultsContainer = State.views[view].elems.content.querySelector('.related-search-results-container');\n\t\t\t\t\tState.views[view].elems.relatedResults = State.views[view].elems.content.querySelector('.js-related-search-results');\n\t\t\t\t\tState.views[view].elems.showMoreResults = State.views[view].elems.content.querySelector('.load-more-results');\n\t\t\t\t\tState.views[view].elems.orderBy = State.views[view].elems.content.querySelector('.facet-order-by');\n\n\t\t\t\t\tif (Settings.views[view].possibleFacets && Settings.views[view].possibleFacets.length) {\n\t\t\t\t\t\tState.views[view].loop54FiltersHandler = new Loop54FiltersHandler(view, Settings, State);\n\t\t\t\t\t\tState.views[view].params.userFacets = State.views[view].loop54FiltersHandler.getCurrentFacets();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (State.productTemplate) {\n\t\t\t\tMustache.parse(State.productTemplate);\n\t\t\t}\n\t\t\tif (State.resultItemTemplate) {\n\t\t\t\tMustache.parse(State.resultItemTemplate);\n\t\t\t}\n\t\t}\n\n\t}\n\n\trenderRealtedQueries(data) {\n\n\t\tif (!data) {\n\t\t\treturn false;\n\t\t}\n\t\tconst relatedQueries = data.relatedQueries;\n\t\tconst spellingSuggestions = data.spellingSuggestions;\n\t\tif (!relatedQueries || (Array.isArray(relatedQueries.items) && relatedQueries.items.length === 0)) {\n\t\t\tthis.clearRelatedQueries();\n\t\t}\n\n\t\tif (!spellingSuggestions || (Array.isArray(spellingSuggestions.items) && spellingSuggestions.items.length === 0)) {\n\t\t\tthis.clearSpellingSuggestion();\n\t\t}\n\n\t\tif (relatedQueries && relatedQueries.items && relatedQueries.items.length > 0 || relatedQueries && relatedQueries.scoped && relatedQueries.scoped.length > 0) {\n\t\t\tif (State.relatedQueries) {\n\t\t\t\tconst lastItem = relatedQueries.items[relatedQueries.items.length - 1];\n\t\t\t\tlastItem.last = true;\n\t\t\t\tState.relatedQueries.innerHTML = Mustache.render(Templates.relatedQueries, { ...relatedQueries, infoText: 'Muut hakivat' });\n\t\t\t\tState.relatedQueries.classList.add('visible');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.clearRelatedQueries();\n\t\t}\n\n\t\tif (spellingSuggestions && spellingSuggestions.items && spellingSuggestions.items.length > 0 || spellingSuggestions && spellingSuggestions.scoped && spellingSuggestions.scoped.length > 0) {\n\t\t\tif (State.spellingSuggestions) {\n\t\t\t\tconst lastItem = spellingSuggestions.items[spellingSuggestions.items.length - 1];\n\t\t\t\tlastItem.last = true;\n\t\t\t\tState.spellingSuggestions.innerHTML = Mustache.render(Templates.relatedQueries, { ...spellingSuggestions, infoText: 'Tarkoititko' });\n\t\t\t\tState.spellingSuggestions.classList.add('visible');\n\t\t\t}\n\t\t} else {\n\t\t\tthis.clearSpellingSuggestion();\n\t\t}\n\t}\n\n\t/**\n\t * Update pagination links in head (for search engines): rel=\"prev\" and rel=\"next\" and load more button.\n\t *\n\t * @param {*} view - State view object.\n\t * @returns {void} Returns void if not category.\n\t */\n\tupdatePaginationLinks(view = State.activeView) {\n\n\t\tif (!Settings.isCategory) {\n\t\t\treturn;\n\t\t}\n\n\t\t// updatePaginationLinks will update the next page link if it exists.\n\t\tconst showMoreButton = State.views[view].elems.showMoreResults?.querySelector('.js-load-more-results');\n\t\t// This will dynamically add href if load more button is a link.\n\t\tif (showMoreButton && (showMoreButton.tagName === 'A')) {\n\t\t\tif (!State.views[view].hasMoreResults) {\n\t\t\t\tshowMoreButton.removeAttribute('href');\n\t\t\t}\n\t\t}\n\n\t\tconst currentPageIndex = State.views[view].params.currentIndex / Settings.views[view].itemsPerPage;\n\t\tconst prevPageIndex = currentPageIndex - 1;\n\t\tconst prevLink = document.querySelector('link[rel=\"prev\"]');\n\t\tconst nextLink = document.querySelector('link[rel=\"next\"]');\n\n\t\tconst relUrl = new URLSearchParams();\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tif (urlParams.has(Settings.idParam)) {\n\t\t\trelUrl.set(Settings.idParam, urlParams.get(Settings.idParam));\n\t\t}\n\n\t\tif (urlParams.has(Settings.orderParam)) {\n\t\t\trelUrl.set(Settings.orderParam, urlParams.get(Settings.orderParam));\n\t\t}\n\n\t\tif (urlParams.has(Settings.facetsParam)) {\n\t\t\trelUrl.set(Settings.facetsParam, urlParams.get(Settings.facetsParam));\n\t\t}\n\n\t\tlet params = relUrl.toString();\n\t\tlet currentUrl = `${window.location.origin}${window.location.pathname}${params ? `?${params}` : ''}`;\n\n\t\tlet prevUrl = currentUrl;\n\n\t\t// Don't add page param if previous would be 1, just use the root url (i.e. default above).\n\t\tif (currentPageIndex > 2) {\n\t\t\trelUrl.set(Settings.pageParam, currentPageIndex - 1);\n\t\t\tconst prevLinkParams = relUrl.toString();\n\t\t\tprevUrl = `${window.location.origin}${window.location.pathname}${prevLinkParams ? `?${prevLinkParams}` : ''}`;\n\t\t}\n\n\t\trelUrl.set(Settings.pageParam, currentPageIndex + 1);\n\t\tparams = relUrl.toString();\n\t\tcurrentUrl = `${window.location.origin}${window.location.pathname}${params ? `?${params}` : ''}`;\n\t\tconst nextUrl = currentUrl;\n\n\t\tconst hasMoreResults = State.views[view].hasMoreResults;\n\n\t\tif (prevLink) {\n\t\t\tif (prevPageIndex >= 1) {\n\t\t\t\tprevLink.setAttribute('rel', 'prev');\n\t\t\t\tprevLink.setAttribute('href', prevUrl);\n\t\t\t} else {\n\t\t\t\tprevLink.remove();\n\t\t\t}\n\n\t\t} else if (currentPageIndex > 1) {\n\t\t\tconst prevLink = document.createElement('link');\n\t\t\tprevLink.setAttribute('rel', 'prev');\n\t\t\tprevLink.setAttribute('href', prevUrl);\n\t\t\tdocument.head.appendChild(prevLink);\n\t\t}\n\n\t\tif (hasMoreResults) {\n\t\t\tif (nextLink) {\n\t\t\t\tnextLink.setAttribute('rel', 'next');\n\t\t\t\tnextLink.setAttribute('href', nextUrl);\n\t\t\t} else {\n\t\t\t\tconst nextLink = document.createElement('link');\n\t\t\t\tnextLink.setAttribute('rel', 'next');\n\t\t\t\tnextLink.setAttribute('href', nextUrl);\n\t\t\t\tdocument.head.appendChild(nextLink);\n\t\t\t}\n\n\t\t\t// This will dynamically add href if load more button is a link.\n\t\t\tif (showMoreButton && (showMoreButton.tagName === 'A')) {\n\t\t\t\tconst urlActiveParams = new URLSearchParams(window.location.search);\n\n\t\t\t\tif (urlActiveParams.has(Settings.pageParam)) {\n\t\t\t\t\turlActiveParams.set(Settings.pageParam, currentPageIndex);\n\t\t\t\t\tif (currentPageIndex === 1) {\n\t\t\t\t\t\turlActiveParams.delete(Settings.pageParam);\n\t\t\t\t\t}\n\t\t\t\t\tconst urlActiveParamsString = urlActiveParams.toString();\n\t\t\t\t\thistory.replaceState(null, '', urlActiveParamsString ? '?' + urlActiveParamsString : window.location.pathname);\n\t\t\t\t}\n\n\t\t\t\tif (!State.views[view].hasMoreResults) {\n\t\t\t\t\tshowMoreButton.removeAttribute('href');\n\t\t\t\t} else {\n\n\t\t\t\t\tif (nextUrl) {\n\t\t\t\t\t\tshowMoreButton.setAttribute('href', nextUrl);\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (nextLink) {\n\t\t\t\tnextLink.remove();\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\taddPageParam(view = State.activeView) {\n\t\tconst currentPageIndex = State.views[view].params.currentIndex / Settings.views[view].itemsPerPage;\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tif (!urlParams.has(Settings.pageParam) && currentPageIndex > 1) {\n\t\t\turlParams.set(Settings.pageParam, currentPageIndex);\n\t\t\thistory.replaceState({}, '', '?' + encodeURI(urlParams.toString()));\n\t\t}\n\t} */\n\n\n\n\tupdateCounts(view) {\n\n\t\tif (State.views[view].elems.content) {\n\t\t\tfor (const elem of State.views[view].elems.content.querySelectorAll('.current-search-items-count')) {\n\t\t\t\telem.textContent = State.views[view].params.currentItemsCount;\n\t\t\t}\n\n\t\t\tfor (const elem of State.views[view].elems.content.querySelectorAll('.all-search-item-count')) {\n\t\t\t\telem.textContent = State.views[view].params.allItemsCount;\n\t\t\t}\n\n\t\t\tif (!Settings.isCategory) {\n\t\t\t\tconst elemTotalCount = State.views[view].elems.elem.querySelector('.js-total-count');\n\t\t\t\tif (elemTotalCount) {\n\t\t\t\t\telemTotalCount.textContent = State.views[view].params.allItemsCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (State.views[view].params.allItemsCount === 0) {\n\t\t\t\tif (!Settings.isCategory) {\n\t\t\t\t\tState.views[view].elems.elem.disabled = true;\n\t\t\t\t}\n\t\t\t\tState.views[view].elems.content.classList.add('no-results');\n\t\t\t} else {\n\t\t\t\tif (!Settings.isCategory) {\n\t\t\t\t\tState.views[view].elems.elem.disabled = false;\n\t\t\t\t}\n\t\t\t\tState.views[view].elems.content.classList.remove('no-results');\n\t\t\t}\n\n\t\t\tfor (const elem of State.views[view].elems.content.querySelectorAll('.search-item-count-text')) {\n\t\t\t\tif (State.views[view].params.allItemsCount === 1) {\n\t\t\t\t\telem.textContent = ` ${Settings.views[view].singularLabel}`;\n\t\t\t\t} else {\n\t\t\t\t\telem.textContent = ` ${Settings.views[view].pluralLabel}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetViewResultsObj(view, data) {\n\t\tlet viewData = null;\n\n\t\tif (view === 'products' && data.results) {\n\t\t\tviewData = {\n\t\t\t\tresults: data.results,\n\t\t\t\trelatedResults: data.relatedResults\n\t\t\t};\n\t\t} else if (view === 'articles' && data.customData && data.customData.pageResults) {\n\t\t\tviewData = {\n\t\t\t\tresults: data.customData.pageResults.results,\n\t\t\t\trelatedResults: null\n\t\t\t};\n\t\t} else if (view === 'shops' && data.customData && data.customData.shopResults) {\n\t\t\tviewData = {\n\t\t\t\tresults: data.customData.shopResults.results,\n\t\t\t\trelatedResults: null\n\t\t\t};\n\t\t}\n\n\t\treturn viewData;\n\t}\n\n\tupdateViewState(view, data, newSearch, restoredState) {\n\t\tlet viewData = this.getViewResultsObj(view, data);\n\t\tif (!viewData) {\n\t\t\tviewData = {\n\t\t\t\tresults: {\n\t\t\t\t\tcount: 0,\n\t\t\t\t\titems: []\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (restoredState) {\n\t\t\tState.views[view].params.currentItemsCount = viewData.results.items.length;\n\t\t} else {\n\t\t\tState.views[view].params.currentItemsCount = Math.min(State.views[view].params.currentIndex + viewData.results.items.length, viewData.results.count);\n\t\t\tState.views[view].params.currentIndex += Settings.views[view].itemsPerPage;\n\t\t}\n\n\t\tconst maxItems = Settings.isCategory ? (Settings.views[view].maxItems || false) : false;\n\n\t\tState.views[view].params.allItemsCount = maxItems ? Math.min(viewData.results.count, maxItems) : viewData.results.count;\n\n\n\t\tthis.updateCounts(view);\n\n\t\tif (State.views[view].elems.showMoreResults) {\n\t\t\tif (State.views[view].params.currentIndex >= State.views[view].params.allItemsCount || viewData.results.items.length === 0 || Settings.views[view].itemsPerPage > viewData.results.items.length) {\n\t\t\t\tState.views[view].hasMoreResults = false;\n\t\t\t\tState.views[view].elems.showMoreResults.classList.remove('has-more-results');\n\t\t\t} else {\n\t\t\t\tState.views[view].hasMoreResults = true;\n\t\t\t\tState.views[view].elems.showMoreResults.classList.add('has-more-results');\n\t\t\t}\n\t\t}\n\n\t\tthis.updatePaginationLinks(view);\n\t\t// adding page param to url is currently disabled beacause of bad user experience when refreshing page: only that pages's results are shown.\n\t\t// this can be enabled if we create the \"Load more results on scroll\" feature.\n\t\t// this.addPageParam(view);\n\n\t\tif (newSearch) {\n\t\t\tif (viewData.relatedResults && State.views[view].elems.relatedSearchResultsContainer) {\n\t\t\t\tif (viewData.relatedResults.count > 0) {\n\t\t\t\t\tState.views[view].elems.relatedSearchResultsContainer.classList.add('has-results');\n\t\t\t\t} else {\n\t\t\t\t\tState.views[view].elems.relatedSearchResultsContainer.classList.remove('has-results');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn State.views[view].params.allItemsCount > 0 ? true : false;\n\t}\n\n\tparseResultItems(items, type) {\n\t\tlet resultItems = [];\n\t\tlet removed = false;\n\t\ttry {\n\t\t\tconst getItemJson = (itemsJson, item) => {\n\t\t\t\tlet resItem = '';\n\n\t\t\t\tconst renderDataObject = item.attributes.find(attribute => attribute.name === 'renderDataObject');\n\t\t\t\tif (renderDataObject && renderDataObject.values) {\n\t\t\t\t\tresItem = renderDataObject.values[0] || '';\n\t\t\t\t}\n\n\t\t\t\tif (resItem && item.type === type) {\n\t\t\t\t\titemsJson.push(resItem);\n\t\t\t\t}\n\n\t\t\t\tif (item.type !== type) {\n\t\t\t\t\tremoved = true;\n\t\t\t\t}\n\n\t\t\t\treturn itemsJson;\n\t\t\t};\n\n\t\t\tresultItems = JSON.parse('[' + items.reduce(getItemJson, []).join(',') + ']');\n\t\t} catch (e) {\n\t\t\t// whoops\n\t\t}\n\n\t\tif (removed) {\n\t\t\tconsole.log('|||||| ______ ^^^^^^^ ********* Unexpected result types ********* ^^^^^^^ ______ ||||||');\n\t\t}\n\n\t\treturn resultItems;\n\t}\n\n\tappendSearchWordUrlParam(baseUrl) {\n\n\t\tconst url = new URL(baseUrl, window.location.origin);\n\t\turl.searchParams.set('searchWords', State.params.searchTerm);\n\n\t\treturn url.pathname + url.search;\n\t}\n\n\tupdateProducts(data) {\n\t\tconst searchProducts = this.parseResultItems(data.results.items, 'Product');\n\n\t\tconst relatedProducts = Settings.isCategory ? [] : this.parseResultItems(data.relatedResults.items, 'Product');\n\n\t\tconst {\n\t\t\taddProductType = false,\n\t\t\taddTargetGroup = false,\n\t\t\tcustomProductType = '',\n\t\t} = (Settings.isCategory ? Settings.views.products : {});\n\n\t\tconst renderProduct = (product, mainElement) => {\n\t\t\tif (mainElement) {\n\t\t\t\tif (!Settings.isCategory) {\n\t\t\t\t\tproduct.url = this.appendSearchWordUrlParam(product.url);\n\t\t\t\t}\n\n\t\t\t\tconst productItem = document.createElement('div');\n\t\t\t\tproductItem.innerHTML = Mustache.render(State.productTemplate, product);\n\t\t\t\tconst productElement = productItem.firstChild;\n\t\t\t\tproductElement.dataset.type = 'Product';\n\t\t\t\tmainElement.appendChild(productElement);\n\t\t\t}\n\t\t};\n\n\t\tif (Settings.isCategory) {\n\t\t\tconst noIndexMetadata = document.head.querySelector('meta[data-no-products=true]');\n\t\t\tif (noIndexMetadata) {\n\t\t\t\tnoIndexMetadata.remove();\n\t\t\t}\n\t\t}\n\n\t\tif (searchProducts.length === 0 && State.views.products.elems.results) {\n\t\t\tif (Settings.isCategory) {\n\t\t\t\tState.views.products.elems.results.innerHTML = Templates.noProducts;\n\t\t\t} else {\n\t\t\t\tState.views.products.elems.results.innerHTML = Templates.noSearchResults;\n\t\t\t}\n\n\t\t\tif (Settings.isCategory && State.hadPageParam) {\n\t\t\t\t// https://developers.google.com/search/docs/advanced/javascript/javascript-seo-basics#avoid-soft-404s\n\t\t\t\t// Another alternative would be to do a 404 redirect.\n\t\t\t\tconst metaRobots = document.createElement('meta');\n\t\t\t\tmetaRobots.name = 'robots';\n\t\t\t\tmetaRobots.content = 'noindex';\n\t\t\t\tmetaRobots.dataset.noProducts = true;\n\t\t\t\tdocument.head.appendChild(metaRobots);\n\t\t\t\tState.hadPageParam = false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const product of searchProducts) {\n\n\t\t\tlet productNameAdditions = [];\n\t\t\tif (addTargetGroup) {\n\t\t\t\tproductNameAdditions.push(addTargetGroup);\n\t\t\t}\n\n\t\t\tif (addProductType) {\n\t\t\t\tconst productTypeText = customProductType ? customProductType : product.titleCategory;\n\t\t\t\tif (!String(product.productname).toLowerCase().includes(String(productTypeText).toLowerCase())) {\n\t\t\t\t\tproductNameAdditions.push(customProductType ? customProductType : product.titleCategory);\n\t\t\t\t} else {\n\t\t\t\t\tproductNameAdditions = [];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (productNameAdditions.length > 0) {\n\t\t\t\tproduct.productname = product.productname + ' - ' + productNameAdditions.join(' ');\n\t\t\t}\n\n\t\t\trenderProduct(product, State.views.products.elems.results);\n\t\t}\n\n\n\t\tif (!Settings.isCategory) {\n\t\t\tfor (const product of relatedProducts) {\n\t\t\t\trenderProduct(product, State.views.products.elems.relatedResults);\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateResultItem(data, mainElement) {\n\t\tconst resultItem = document.createElement('div');\n\t\tresultItem.innerHTML = Mustache.render(State.resultItemTemplate, data);\n\t\tconst resultElement = resultItem.firstChild;\n\t\tresultElement.dataset.type = 'Article';\n\t\tmainElement.appendChild(resultElement);\n\t}\n\n\tupdateArticles(data) {\n\t\tif (State.views.articles.elems.results && data.customData && data.customData.pageResults && data.customData.pageResults.results && data.customData.pageResults.results.items.length) {\n\t\t\tconst items = this.parseResultItems(data.customData.pageResults.results.items, 'pageEntity');\n\n\t\t\tfor (const item of items) {\n\t\t\t\tconst resultItemData = {\n\t\t\t\t\tfullLinkParent: true,\n\t\t\t\t\tsideCol: !!item.image,\n\t\t\t\t\tsideCentered: false,\n\t\t\t\t\tmobileFullWidth: false,\n\t\t\t\t\tcategory: item.contentType,\n\t\t\t\t\theading: item.title,\n\t\t\t\t\tlink: item.link,\n\t\t\t\t\ttype: item.type,\n\t\t\t\t\timage: item.image ? item.image.href : null\n\t\t\t\t};\n\n\t\t\t\tthis.createResultItem(resultItemData, State.views.articles.elems.results);\n\t\t\t}\n\n\t\t\tif (items.length === 0 && State.views.products.elems.results) {\n\t\t\t\tState.views.articles.elems.results.innerHTML = Templates.noSearchResults;\n\t\t\t}\n\t\t}\n\n\t}\n\n\tupdateShops(data) {\n\t\tif (State.views.shops.elems.results && data.customData && data.customData.shopResults && data.customData.shopResults.results && data.customData.shopResults.results.items.length) {\n\t\t\tconst items = this.parseResultItems(data.customData.shopResults.results.items, 'shopEntity');\n\n\t\t\tfor (const item of items) {\n\t\t\t\tconst resultItemData = {\n\t\t\t\t\tsideCol: !!item.mapUrl,\n\t\t\t\t\tsideCentered: true,\n\t\t\t\t\tmobileFullWidth: true,\n\t\t\t\t\tfullLinkParent: !item.mapUrl,\n\t\t\t\t\tcategory: 'Intersport',\n\t\t\t\t\theading: item.name,\n\t\t\t\t\tlink: item.link,\n\t\t\t\t\ttype: null,\n\t\t\t\t\timage: null,\n\t\t\t\t\tshop: {\n\t\t\t\t\t\tshopAddress: item.address ? `${item.address}, ${item.postNumber} ${item.city}` : null,\n\t\t\t\t\t\tshopOpeningHours: item.shopOpenStatus ? `${item.shopOpenStatus}${item.shopOpens ? ' ' + item.shopOpens : ''}${item.shopCloses ? '–' + item.shopCloses : ''}` : null\n\t\t\t\t\t},\n\t\t\t\t\tcta: item.mapUrl ? {\n\t\t\t\t\t\tctaLink: item.mapUrl,\n\t\t\t\t\t\tctaLabel: 'Ajo-ohjeet'\n\t\t\t\t\t} : null\n\t\t\t\t};\n\n\t\t\t\tthis.createResultItem(resultItemData, State.views.shops.elems.results);\n\t\t\t}\n\n\t\t\tif (items.length === 0 && State.views.products.elems.results) {\n\t\t\t\tState.views.articles.elems.shopResults.innerHTML = Templates.noSearchResults;\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateResults(view, data) {\n\t\tif (view === 'products') {\n\t\t\tthis.updateProducts(data);\n\t\t} else if (view === 'articles') {\n\t\t\tthis.updateArticles(data);\n\t\t} else if (view === 'shops') {\n\t\t\tthis.updateShops(data);\n\t\t}\n\t}\n\n\thandleSearchResults(params = {}) {\n\n\t\tconst { data, newSearch, restoredState, clear } = params;\n\n\t\tif (!data) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Shared elements\n\t\tif (newSearch) {\n\t\t\tthis.clearRelatedQueries();\n\t\t\tthis.clearSpellingSuggestion();\n\t\t\tthis.renderRealtedQueries(data);\n\t\t}\n\n\t\t// Remove no query element\n\t\tif (State.searchContainer && State.searchContainer.classList.contains('no-query')) {\n\t\t\tState.searchContainer.classList.remove('no-query');\n\n\t\t\tif (State.noSearchText) {\n\t\t\t\tState.noSearchText.parentElement.removeChild(State.noSearchText);\n\t\t\t}\n\t\t}\n\n\t\t// Each view\n\t\tlet viewsWithResults = [];\n\t\tfor (let view of Object.keys(State.views)) {\n\t\t\tif (!newSearch && view !== State.activeView) {\n\t\t\t\tif (State.views[view].elems.results.children.length) {\n\t\t\t\t\tviewsWithResults.push(view);\n\t\t\t\t}\n\n\t\t\t\t// This view doesn't need an update\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (newSearch || clear) {\n\t\t\t\tif (State.views[view].loop54FiltersHandler) {\n\t\t\t\t\tState.views[view].loop54FiltersHandler.handleFacets(data, newSearch);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (restoredState) {\n\t\t\t\tif (State.views[view].elems.searchFacets) {\n\t\t\t\t\tState.views[view].elems.searchFacets.dataset.skipFacetUpdate = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst viewHasResults = this.updateViewState(view, data, newSearch, restoredState);\n\t\t\tif (viewHasResults) {\n\t\t\t\tviewsWithResults.push(view);\n\t\t\t}\n\n\t\t\tthis.updateResults(view, data);\n\t\t}\n\n\t\tif (viewsWithResults.length) {\n\t\t\tState.searchContainer.classList.remove('no-results');\n\n\t\t\t// Check if active view has no results\n\t\t\tif (State.views[State.activeView].params.allItemsCount === 0) {\n\t\t\t\tState.views[viewsWithResults[0]].elems.elem.click();\n\t\t\t}\n\t\t} else {\n\t\t\tState.searchContainer.classList.add('no-results');\n\t\t}\n\n\t\tif (State.makesSense) {\n\t\t\tif (!viewsWithResults.length && !data.makesSense) {\n\t\t\t\tState.makesSense.textContent = Settings.searchMakesNoSenseText + ' \"' + State.params.searchTerm + '\".';\n\t\t\t\tState.makesSense.style.display = 'block';\n\t\t\t} else {\n\t\t\t\tState.makesSense.textContent = '';\n\t\t\t\tState.makesSense.style.display = '';\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateViewSearchOpts(view, optsObj) {\n\t\toptsObj.skip = State.views[view].params.currentIndex;\n\t\toptsObj.take = Settings.views[view].itemsPerPage;\n\n\n\t\tif (Settings.isCategory) {\n\t\t\t// Ensure that we don't load more than max items.\n\n\t\t\tconst maxItems = Settings.views.products.maxItems || false;\n\n\t\t\tif ((maxItems > 0)) {\n\t\t\t\tif (maxItems < optsObj.take) {\n\t\t\t\t\toptsObj.take = maxItems;\n\t\t\t\t} else {\n\n\t\t\t\t\tif (optsObj.skip + optsObj.take > maxItems) {\n\t\t\t\t\t\toptsObj.take = maxItems - optsObj.skip;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tif (optsObj.skip > maxItems) {\n\t\t\t\t\toptsObj.take = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\tif (Settings.isCategory && Settings.views[view]?.resultsOptions?.filter) {\n\t\t\toptsObj.filter = Settings.views[view].resultsOptions.filter;\n\t\t}\n\n\t\tif (Settings.views[view].possibleFacets.length) {\n\t\t\toptsObj.facets = State.views[view].params.userFacets;\n\t\t}\n\n\n\n\t\t// Inject pre-selected facets here.\n\t\tif (Settings.isCategory && State.firstLoad && !(State.restoreState && State.restoreState.views[view])) {\n\n\n\t\t\tconst urlFacets = State.views[view].loop54FiltersHandler.getUrlFacets();\n\n\t\t\tconst possibleFacets = Settings.views[view]?.possibleFacets || [];\n\n\t\t\t// Filter out facets that are not allowed.\n\t\t\tconst userFacets = Object.entries({ ...(Settings.views[view]?.userFacets || {}), ...urlFacets }).reduce((acc, [key, value]) => {\n\n\t\t\t\tif (possibleFacets.includes(key)) {\n\t\t\t\t\tacc[key] = value;\n\t\t\t\t}\n\t\t\t\treturn acc;\n\t\t\t}, {});\n\n\t\t\tif (userFacets && Object.keys(userFacets).length) {\n\n\t\t\t\tState.views[view].loop54FiltersHandler.writeFacets(userFacets, true);\n\n\t\t\t\toptsObj.facets = State.views[view].loop54FiltersHandler.getCurrentFacets();\n\t\t\t}\n\n\t\t\t// This would allow automatic selection of target group. However,\n\t\t\t// in order to work properly this would need additional checks (do not apply women in mens category for example)\n\t\t\t// and should be merger with userFacets if those are provided.\n\t\t\t// const navTargetGroups = this.getPrefferredTargetGroup();\n\n\t\t\t// if (navTargetGroups) {\n\t\t\t// \tState.views[view].loop54FiltersHandler.writeFacets({\n\t\t\t// \t\ttargetGroups: navTargetGroups\n\t\t\t// \t}, true);\n\n\t\t\t// \toptsObj.facets = State.views.products.loop54FiltersHandler.getCurrentFacets();\n\t\t\t// }\n\n\n\t\t}\n\n\t\tif (State.views[view].loop54FiltersHandler) {\n\t\t\tState.views[view].loop54FiltersHandler.updateOrderBy();\n\t\t}\n\n\t\tif (State.views[view].params.orderBy) {\n\t\t\toptsObj.sortBy = State.views[view].params.orderBy;\n\t\t}\n\t}\n\n\tgetViewSearchOpts(view, searchOptions) {\n\t\tlet optsObj = null;\n\n\t\t// Load more results for current view\n\t\tif (view === 'products') {\n\n\t\t\tif (!searchOptions.resultsOptions) {\n\t\t\t\tsearchOptions.resultsOptions = {};\n\t\t\t}\n\t\t\toptsObj = searchOptions.resultsOptions;\n\t\t} else if (view === 'articles') {\n\t\t\tif (!searchOptions.customData) {\n\t\t\t\tsearchOptions.customData = {};\n\t\t\t}\n\t\t\tif (!searchOptions.customData.pageResultsOptions) {\n\t\t\t\tsearchOptions.customData.pageResultsOptions = {};\n\t\t\t}\n\t\t\toptsObj = searchOptions.customData.pageResultsOptions;\n\n\t\t\t// If scoped term is used, but this view does not support them\n\t\t\tif (State.params.scopedTerm && State.params.scope && !Settings.views[view].scopedTerms) {\n\t\t\t\toptsObj = null;\n\t\t\t\tdelete searchOptions.customData.pageResultsOptions;\n\t\t\t}\n\t\t} else if (view === 'shops') {\n\t\t\tif (!searchOptions.customData) {\n\t\t\t\tsearchOptions.customData = {};\n\t\t\t}\n\t\t\tif (!searchOptions.customData.shopResultsOptions) {\n\t\t\t\tsearchOptions.customData.shopResultsOptions = {};\n\t\t\t}\n\t\t\toptsObj = searchOptions.customData.shopResultsOptions;\n\n\t\t\t// If scoped term is used, but this view does not support them\n\t\t\tif (State.params.scopedTerm && State.params.scope && !Settings.views[view].scopedTerms) {\n\t\t\t\toptsObj = null;\n\t\t\t\tdelete searchOptions.customData.shopResultsOptions;\n\t\t\t}\n\t\t}\n\n\t\tif (optsObj) {\n\t\t\tthis.updateViewSearchOpts(view, optsObj);\n\t\t}\n\n\t\treturn optsObj;\n\t}\n\n\tgetPrefferredTargetGroup() {\n\t\tlet storageType = localStorage;\n\t\tif (!storageType) {\n\t\t\tstorageType = sessionStorage;\n\t\t}\n\n\t\tconst mappings = {\n\t\t\tmen: ['Miehet'],\n\t\t\twomen: ['Naiset'],\n\t\t\tchildren: ['Tytöt', 'Pojat', 'Lapset']\n\t\t}\n\n\t\tif (storageType && storageType.getItem('navigationState')) {\n\t\t\ttry {\n\t\t\t\tconst navigationData = JSON.parse(storageType.getItem('navigationState'));\n\t\t\t\treturn mappings[navigationData.navigation] || false;\n\t\t\t} catch (error) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\thandleSearch(searchParams = {}) {\n\n\t\tconst { clear, clearScope, keepFilters, newSearch, redirectToSearch } = { clear: true, clearScope: true, keepFilters: false, newSearch: true, ...searchParams };\n\n\t\tif (searchParams.activeView && searchParams.activeView !== State.activeView) {\n\t\t\tState.activeView = searchParams.activeView;\n\t\t}\n\n\t\tif (State.suggestionsController) {\n\t\t\tState.suggestionsController.abort();\n\t\t}\n\n\t\tthis.resetStoredState();\n\n\t\t// This is intended for search engines only. When using page param\n\t\t// only current page items are loaded. Also not intended for search.\n\t\tlet hasPageParam = false;\n\t\tlet urlParams = false\n\t\tif (Settings.isCategory) {\n\t\t\turlParams = new URLSearchParams(window.location.search);\n\t\t\thasPageParam = urlParams.has(Settings.pageParam);\n\t\t\tState.hadPageParam = hasPageParam;\n\t\t} else {\n\t\t\tState.params.page = false;\n\t\t}\n\n\t\tif (clear) {\n\t\t\tif (hasPageParam && !State.firstLoad) {\n\t\t\t\turlParams.delete(Settings.pageParam);\n\t\t\t\tconst urlParamsString = urlParams.toString();\n\t\t\t\thistory.replaceState(null, '', urlParamsString ? '?' + urlParamsString : window.location.pathname);\n\t\t\t}\n\t\t\tconst value = String(State.searchBoxDesktop.value).trim();\n\t\t\tState.params.searchTerm = value;\n\t\t} else {\n\t\t\tif (hasPageParam) {\n\t\t\t\tconst previousPage = parseInt(urlParams.get(Settings.pageParam));\n\t\t\t\tif (previousPage > 0) {\n\t\t\t\t\turlParams.set(Settings.pageParam, previousPage + 1);\n\t\t\t\t\tconst urlParamsString = urlParams.toString();\n\t\t\t\t\thistory.replaceState(null, '', '?' + urlParamsString);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update views\n\t\tif (newSearch) {\n\t\t\tfor (let view of Object.keys(State.views)) {\n\t\t\t\tif (State.views[view].loop54FiltersHandler) {\n\t\t\t\t\tState.views[view].loop54FiltersHandler.resetFacets();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (clear && clearScope) {\n\t\t\tState.params.scopedTerm = false;\n\t\t}\n\n\t\tif (!Settings.isCategory || redirectToSearch) {\n\n\t\t\t// Not on search page. Search will be directed to search page.\n\t\t\t// We'll use session storage for search parameter so that search page\n\t\t\t// will load quickly from cache.\n\t\t\tif (!State.page || redirectToSearch) {\n\t\t\t\tif (State.params.scopedTerm && State.params.scope) {\n\t\t\t\t\tsessionStorage.setItem(Settings.searchScopeTermKey, State.params.scopedTerm);\n\t\t\t\t\tsessionStorage.setItem(Settings.searchScopeKey, State.params.scope);\n\t\t\t\t}\n\t\t\t\tsessionStorage.setItem(Settings.searchParamKey, State.params.searchTerm);\n\t\t\t\twindow.location.href = Settings.endpoint;\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tsessionStorage.removeItem(Settings.searchScopeTermKey);\n\t\t\t\tsessionStorage.removeItem(Settings.searchScopeKey);\n\t\t\t\tsessionStorage.removeItem(Settings.searchParamKey);\n\t\t\t}\n\t\t}\n\n\t\tif (State.searchController) {\n\t\t\tState.restoreState = false;\n\t\t\tState.searchController.abort();\n\t\t}\n\n\t\tif (!Settings.isCategory) {\n\t\t\tif (!State.params.searchTerm) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (const searchText of State.searchText) {\n\t\t\t\tsearchText.textContent = State.params.searchTerm;\n\t\t\t}\n\n\t\t\tif (State.params.scopedTerm) {\n\t\t\t\tdocument.title = `Hakutulokset: \"${State.params.searchTerm}\" kategoriassa ${State.params.scopedTerm} ${Settings.titleSuffix}`;\n\t\t\t} else {\n\t\t\t\tdocument.title = `Hakutulokset: \"${State.params.searchTerm}\" ${Settings.titleSuffix}`;\n\t\t\t}\n\n\t\t\tfor (const searchTextScoped of State.searchTextScoped) {\n\t\t\t\t//if (Workset.params.scopedTerm && String(Workset.params.scopedTerm).trim().toLowerCase() !== String(Workset.params.searchTerm).toLowerCase()) {\n\t\t\t\tif (State.params.scopedTerm) {\n\t\t\t\t\tsearchTextScoped.textContent = ` kategoriassa ${State.params.scopedTerm}`;\n\t\t\t\t} else {\n\t\t\t\t\tsearchTextScoped.textContent = '';\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\t\t\turlParams.set(Settings.searchQueryParam, State.params.searchTerm);\n\n\t\t\tif (State.params.scopedTerm && State.params.scope) {\n\t\t\t\turlParams.set(Settings.scopedQueryParam, State.params.scopedTerm);\n\t\t\t\turlParams.set(Settings.scopeParam, State.params.scope);\n\t\t\t}\n\n\t\t\tif (clear && clearScope) {\n\t\t\t\turlParams.delete(Settings.scopedQueryParam);\n\t\t\t\turlParams.delete(Settings.scopeParam);\n\t\t\t}\n\n\t\t\thistory.replaceState(null, '', '?' + urlParams);\n\n\n\n\t\t\tif (clear) {\n\t\t\t\tthis.clearSuggestions();\n\t\t\t\t//this.clearRelatedQueries();\n\t\t\t\t//this.clearSpellingSuggestion();\n\t\t\t}\n\n\t\t}\n\n\t\tconst hadScope = State.params.scopedTerm && State.params.scope;\n\n\t\tfor (let view of Object.keys(State.views)) {\n\t\t\t// Update only relevant views\n\t\t\tif (newSearch || (!newSearch && view === State.activeView)) {\n\t\t\t\t// Clear previous search\n\t\t\t\tif (clear) {\n\t\t\t\t\t// Reset current index\n\t\t\t\t\tState.views[view].params.currentIndex = 0;\n\n\t\t\t\t\t// Remove old results and related results\n\t\t\t\t\tif (newSearch) {\n\t\t\t\t\t\twhile (State.views[view].elems.relatedResults && State.views[view].elems.relatedResults.firstChild) {\n\t\t\t\t\t\t\tState.views[view].elems.relatedResults.removeChild(State.views[view].elems.relatedResults.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (State.views[view].elems.results && State.views[view].elems.results.firstChild) {\n\t\t\t\t\t\tState.views[view].elems.results.removeChild(State.views[view].elems.results.firstChild);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set scope if scoped terms are used for this view\n\t\t\tif (State.views[view].loop54FiltersHandler) {\n\t\t\t\tif (hadScope && Settings.views[view].scopedTerms) {\n\t\t\t\t\tState.views[view].params.selectedFacets[State.params.scope] = [State.params.scopedTerm];\n\n\t\t\t\t\tState.views[view].loop54FiltersHandler.getCurrentFacets();\n\t\t\t\t\tState.views[view].loop54FiltersHandler.writeFacets(State.views[view].params.selectedFacets, true);\n\t\t\t\t}\n\n\t\t\t\tif (!keepFilters && !hadScope) {\n\t\t\t\t\tState.views[view].loop54FiltersHandler.getCurrentFacets(true);\n\t\t\t\t}\n\n\t\t\t\tif (!keepFilters) {\n\t\t\t\t\tState.views[view].loop54FiltersHandler.filterDropdownListener(true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\t// Get search query options\n\t\tlet searchOptions = {};\n\t\tlet restoredState = false;\n\t\tif (newSearch) {\n\t\t\t// Default search params\n\t\t\tif (Settings.isCategory) {\n\t\t\t\tsearchOptions = { ...Settings.loop54Options.category };\n\t\t\t} else {\n\t\t\t\tsearchOptions = { ...Settings.loop54Options.search };\n\t\t\t}\n\n\t\t\t// Update all view params\n\t\t\tfor (let view of Object.keys(State.views)) {\n\t\t\t\tconst optsObj = this.getViewSearchOpts(view, searchOptions);\n\n\t\t\t\t// Restore search state\n\t\t\t\tif (optsObj && State.restoreState && State.restoreState.views[view]) {\n\t\t\t\t\trestoredState = true;\n\n\t\t\t\t\toptsObj.skip = 0;\n\t\t\t\t\toptsObj.take = State.restoreState.views[view].currentIndex || Settings.views[view].itemsPerPage;\n\n\t\t\t\t\tState.views[view].params.currentIndex = State.restoreState.views[view].currentIndex || 0;\n\n\t\t\t\t\tif (State.restoreState.views[view].orderBy) {\n\t\t\t\t\t\tState.views[view].params.orderBy = State.restoreState.views[view].orderBy;\n\t\t\t\t\t\toptsObj.sortBy = State.restoreState.views[view].orderBy;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Settings.views[view].possibleFacets.length && State.views[view].loop54FiltersHandler) {\n\t\t\t\t\t\tif (State.restoreState.views[view].userFacets) {\n\t\t\t\t\t\t\tState.views[view].params.userFacets = State.restoreState.views[view].userFacets;\n\t\t\t\t\t\t\toptsObj.facets = State.restoreState.views[view].userFacets;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (State.restoreState.views[view].selectedFacets) {\n\t\t\t\t\t\t\tState.views[view].loop54FiltersHandler.writeFacets(State.restoreState.views[view].selectedFacets, true);\n\t\t\t\t\t\t\tState.views[view].params.selectedFacets = State.restoreState.views[view].selectedFacets;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (State.params.page && State.params.page > 0) {\n\t\t\t\tState.views[State.activeView].params.currentIndex = (Math.max(State.params.page - 1, 1)) * Settings.views[State.activeView].itemsPerPage;\n\t\t\t\tsearchOptions.resultsOptions.skip = State.views[State.activeView].params.currentIndex;\n\t\t\t}\n\t\t\tState.params.page = false;\n\n\t\t} else {\n\t\t\t// Update only current view\n\t\t\tthis.getViewSearchOpts(State.activeView, searchOptions);\n\t\t}\n\n\n\t\t// Remove custom data if nothing is being fetched\n\t\tif (searchOptions.customData && Object.keys(searchOptions.customData).length === 0) {\n\t\t\tdelete searchOptions.customData;\n\t\t}\n\n\t\tif (!clear && dataLayer && !Settings.isCategory) {\n\t\t\tconst itemsPerPage = Settings.views[State.activeView].itemsPerPage;\n\t\t\tconst skip = searchOptions?.resultsOptions?.skip ?? searchOptions?.customData?.pageResultsOptions?.skip ?? false;\n\n\t\t\tif (itemsPerPage && skip) {\n\t\t\t\tdataLayer.push({\n\t\t\t\t\tevent: 'GAEvent',\n\t\t\t\t\teventCategory: 'Loop54Search',\n\t\t\t\t\teventAction: `Load result page (${State.activeView})`,\n\t\t\t\t\teventLabel: `${(skip + itemsPerPage) / itemsPerPage}/${Math.ceil(State.views[State.activeView].params.allItemsCount / itemsPerPage)}`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (State.views[State.activeView].elems.showMoreResults) {\n\t\t\tState.views[State.activeView].elems.showMoreResults.classList.add('loading');\n\t\t}\n\n\t\tif (Settings.isCategory) {\n\n\t\t\tconst { attribute = false, customData = false } = Settings.views[State.activeView] || {};\n\t\t\tif (attribute) {\n\t\t\t\tsearchOptions.attribute = attribute;\n\t\t\t}\n\n\t\t\tif (customData) {\n\t\t\t\tsearchOptions.customData = customData;\n\t\t\t}\n\n\t\t\tState.searchController = State.client[attribute ? 'getEntitiesByAttribute' : 'getEntities'](searchOptions, (data) => {\n\t\t\t\tif (data && data.error !== true) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.resultsAnalytics(data);\n\t\t\t\t\t\tthis.handleSearchResults({ data, newSearch, restoredState, clear });\n\n\t\t\t\t\t\tif (State.restoreState && State.restoreState.scrollPosition) {\n\t\t\t\t\t\t\twindow.scroll(State.restoreState.scrollPosition.x, State.restoreState.scrollPosition.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.log(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (State.views[State.activeView].elems.showMoreResults) {\n\t\t\t\t\t\tState.views[State.activeView].elems.showMoreResults.classList.remove('loading');\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('No data.');\n\t\t\t\t}\n\n\t\t\t\tState.restoreState = false;\n\t\t\t\tState.suggestionsController = false;\n\t\t\t});\n\n\t\t} else {\n\t\t\tState.searchController = State.client.search(State.params.searchTerm, searchOptions, (data) => {\n\t\t\t\tif (data && data.error !== true) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.resultsAnalytics(data);\n\t\t\t\t\t\tthis.handleSearchResults({ data, newSearch, restoredState, clear });\n\n\t\t\t\t\t\tif (State.restoreState && State.restoreState.scrollPosition) {\n\t\t\t\t\t\t\twindow.scroll(State.restoreState.scrollPosition.x, State.restoreState.scrollPosition.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.log(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (State.views[State.activeView].elems.showMoreResults) {\n\t\t\t\t\t\tState.views[State.activeView].elems.showMoreResults.classList.remove('loading');\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log('No search data.');\n\t\t\t\t}\n\n\t\t\t\tState.restoreState = false;\n\t\t\t\tState.suggestionsController = false;\n\t\t\t});\n\t\t}\n\n\t\tState.firstLoad = false;\n\t}\n\n\t/**\n\t * Add analytics data based on response data.\n\t *\n\t * @param {Object} responseData - Response data from Loop54.\n\t */\n\tresultsAnalytics(responseData) {\n\n\t\tif (responseData && Array.isArray(dataLayer)) {\n\t\t\t// A/B testing dimension for sorting. Yeah, dimension name doesn't make sense.\n\t\t\tif (responseData?.customData?.side && !State.cache.ab) {\n\t\t\t\tState.cache.ab = true;\n\t\t\t\tdataLayer.push({ 'MobileCart2019': responseData?.customData?.side });\n\t\t\t}\n\t\t}\n\t}\n\n\tclearRelatedQueries() {\n\t\tif (State.relatedQueries) {\n\t\t\tState.relatedQueries.textContent = '';\n\t\t\tState.relatedQueries.classList.remove('visible');\n\t\t}\n\t}\n\n\tclearSpellingSuggestion() {\n\t\tif (State.spellingSuggestions) {\n\t\t\tState.spellingSuggestions.textContent = '';\n\t\t\tState.spellingSuggestions.classList.remove('visible');\n\t\t}\n\t}\n\n\tclearSuggestions() {\n\t\tif (State.suggestions) {\n\t\t\tfor (const suggestion of State.suggestions) {\n\t\t\t\tsuggestion.classList.remove('has-results');\n\t\t\t\tsuggestion.classList.remove('visible');\n\t\t\t\tif (State.hasSuggestionListener) {\n\t\t\t\t\tdocument.body.removeEventListener('click', this.suggestionBoxListeners);\n\t\t\t\t\tState.hasSuggestionListener = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsuggestionBoxListeners(e) {\n\t\tconst elem = e.target;\n\t\tif (!elem.closest('.search-box-wrapper, .search-suggestions')) {\n\n\n\t\t\tif (!(Array.from(State.searchBoxes).includes(document.activeElement)) && State.suggestions) {\n\t\t\t\tfor (const suggestion of State.suggestions) {\n\t\t\t\t\tsuggestion.classList.remove('visible');\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\n\tprocessSuggestions(data) {\n\t\tif (!data) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst suggestionsObject = {\n\t\t\tsuggestions: data.queries ? data.queries.items : [],\n\t\t\tscoped: []\n\t\t};\n\n\t\tif (data.scopedQuery && data.scopedQuery.scopes) {\n\t\t\tfor (const scope of data.scopedQuery.scopes.slice(0, Settings.showMaxScopedSuggestions)) {\n\t\t\t\tsuggestionsObject.scoped.push({\n\t\t\t\t\tquery: data.scopedQuery.query,\n\t\t\t\t\tscope: data.scopedQuery.scopeAttributeName,\n\t\t\t\t\tsuggestedScope: scope,\n\t\t\t\t\tsuggestion: data.scopedQuery.query,\n\t\t\t\t\tsuggestedCategory: scope,\n\t\t\t\t\tisScoped: true\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst elements = State.suggestions;\n\n\t\tif (!elements.length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\n\t\tif (suggestionsObject.suggestions.length === 0 && suggestionsObject.scoped.length === 0) {\n\t\t\tthis.clearSuggestions();\n\t\t\treturn true;\n\t\t}\n\n\t\tlet suggestionsTemplate = Templates.suggestions;\n\t\tMustache.parse(suggestionsTemplate);\n\n\t\tif (suggestionsObject.suggestions && suggestionsObject.suggestions.length > 0 || suggestionsObject.scoped && suggestionsObject.scoped.length > 0) {\n\n\t\t\tconst removeSuggestionsCount = suggestionsObject.suggestions.length + suggestionsObject.scoped.length - Settings.showMaxSuggestions;\n\t\t\tconst renderData = {\n\t\t\t\tquery: State.params.suggestionsQuery,\n\t\t\t\tsuggestions: suggestionsObject.suggestions,\n\t\t\t\tscoped: suggestionsObject.scoped,\n\t\t\t\titems: []\n\t\t\t};\n\n\t\t\tif (removeSuggestionsCount > 0) {\n\t\t\t\trenderData.suggestions = renderData.suggestions.slice(0, Math.max(renderData.suggestions.length - removeSuggestionsCount), 0);\n\t\t\t}\n\n\t\t\trenderData.items = renderData.suggestions.concat(renderData.scoped);\n\n\t\t\tif (renderData.items.length > 0) {\n\t\t\t\tconst lastItem = renderData.items[renderData.items.length - 1];\n\t\t\t\tlastItem.last = true;\n\t\t\t}\n\n\t\t\tfor (const element of elements) {\n\t\t\t\telement.innerHTML = Mustache.render(suggestionsTemplate, renderData);\n\t\t\t\telement.classList.add('has-results');\n\t\t\t\telement.classList.add('visible');\n\t\t\t\telement.style.maxHeight = `calc(100vh - ${element.getBoundingClientRect().top}px)`;\n\t\t\t}\n\t\t\tif (!State.hasSuggestionListener) {\n\t\t\t\tState.hasSuggestionListener = true;\n\t\t\t\tdocument.body.addEventListener('click', this.suggestionBoxListeners);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.clearSuggestions();\n\t\t}\n\n\t}\n\n\thandleSuggestions() {\n\t\tlet value = State.searchBoxDesktop.value;\n\t\tif (State.suggestionsController !== false) {\n\t\t\tState.suggestionsController.abort();\n\t\t}\n\n\t\tif (value) {\n\t\t\tvalue = String(value).trim();\n\t\t\tif (value.length >= Settings.minSuggestionLetters) {\n\t\t\t\tState.params.suggestionsQuery = value,\n\t\t\t\tState.suggestionsController = State.client.autoComplete(value, Settings.loop54Options.suggestions, (data) => {\n\t\t\t\t\tif (data && data.error !== true) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tLoop54SearchProxy.processSuggestions(data);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.log(error);\n\t\t\t\t\t\t\tLoop54SearchProxy.clearSuggestions();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.log('No suggestions data.');\n\t\t\t\t\t\tLoop54SearchProxy.clearSuggestions();\n\t\t\t\t\t}\n\t\t\t\t\tState.suggestionsController = false;\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tLoop54SearchProxy.clearSuggestions();\n\t\t}\n\n\t}\n\n\tresetStoredState() {\n\t\tsessionStorage.removeItem(Settings.stateStoreKey);\n\t}\n\n\tsaveSearchState() {\n\n\t\tconst state = {\n\t\t\tactiveView: State.activeView,\n\t\t\tviews: {},\n\t\t\tparams: State.params,\n\n\t\t\tscrollPosition: { x: window.scrollX, y: window.scrollY }\n\t\t};\n\n\t\tfor (let view of Object.keys(State.views)) {\n\t\t\tstate.views[view] = {\n\t\t\t\tcurrentIndex: State.views[view].params.currentIndex,\n\t\t\t\tuserFacets: State.views[view].params.userFacets,\n\t\t\t\tselectedFacets: State.views[view].params.selectedFacets,\n\t\t\t\torderBy: State.views[view].params.orderBy\n\t\t\t}\n\t\t}\n\n\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\tif (urlParams.has(Settings.searchQueryParam)) {\n\t\t\turlParams.delete(Settings.searchQueryParam);\n\t\t}\n\n\t\tif (urlParams.has(Settings.scopedQueryParam)) {\n\t\t\turlParams.delete(Settings.scopedQueryParam);\n\t\t}\n\n\t\tif (urlParams.has(Settings.scopeParam)) {\n\t\t\turlParams.delete(Settings.scopeParam);\n\t\t}\n\n\n\t\tif (Array.from(urlParams.keys()).length === 0) {\n\t\t\thistory.replaceState(null, '', window.location.pathname);\n\t\t} else {\n\t\t\thistory.replaceState(null, '', '?' + urlParams);\n\t\t}\n\n\t\tlet states = sessionStorage.getItem(Settings.stateStoreKey);\n\t\ttry {\n\t\t\tstates = JSON.parse(states);\n\t\t\tif (!(typeof states === 'object' && states)) {\n\t\t\t\tstates = {};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tstates = {};\n\t\t}\n\n\t\tstates[window.location.pathname] = state;\n\n\t\tsessionStorage.setItem(Settings.stateStoreKey, JSON.stringify(states));\n\t}\n\n\trestoreState() {\n\t\tif (!State.page) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlet states = sessionStorage.getItem(Settings.stateStoreKey);\n\t\ttry {\n\t\t\tstates = JSON.parse(states);\n\t\t\tif (!(typeof states === 'object' && states)) {\n\t\t\t\tstates = false;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tstates = false;\n\t\t}\n\n\t\tconst stateObject = states[window.location.pathname];\n\n\t\tif (states && stateObject) {\n\n\t\t\tif (!Settings.isCategory) {\n\t\t\t\tconst urlParams = new URLSearchParams(window.location.search);\n\n\t\t\t\turlParams.set(Settings.searchQueryParam, stateObject.params.searchTerm);\n\n\t\t\t\tif (stateObject.params.scopedTerm) {\n\t\t\t\t\turlParams.set(Settings.scopedQueryParam, stateObject.params.scopedTerm);\n\t\t\t\t}\n\n\t\t\t\tif (stateObject.params.scope) {\n\t\t\t\t\turlParams.set(Settings.scopeParam, stateObject.params.scope);\n\t\t\t\t}\n\n\t\t\t\thistory.replaceState(null, '', '?' + urlParams);\n\t\t\t}\n\n\t\t\tconst activeView = stateObject.activeView || State.activeView;\n\t\t\tState.restoreState = {\n\t\t\t\tscrollPosition: stateObject.scrollPosition ? stateObject.scrollPosition : false,\n\t\t\t\tactiveView: activeView,\n\t\t\t\tviews: stateObject.views || {},\n\t\t\t\tparams: stateObject.params\n\t\t\t};\n\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nexport default Loop54Search;\n"],"sourceRoot":""}