`, adSuggestion: (params) => `
${params.NAME} ${params.TAG} ` }; } // event handlers if (!window.inputFocused) { window.inputFocused = function(el, event) { const id = el.closest('[sve-search-component]').getAttribute('sve-search-component'); const searchComponent = el.closest(`[sve-search-component]`); const searchResultsContainer = searchComponent.querySelector('.sve-search-results-container'); searchResultsContainer.classList.add('hidden'); openSearchDropdown(el, event); window.addEventListener('click', window.searchState[id].specificMethods.clickOutsideHandler); createNewAbortController(id); } } if (!window.searchNavigate) { window.searchNavigate = function(searchInputValue, id) { if (window.searchState[id].currentSearchResults.length === 1) { // go to RLP window.location.href = `/${window.searchState[id].currentSearchResults[0].seo_url}`; } else { // go to wl url window.location.href = `${window.searchState[id].config.wlUrl}/search?query=${searchInputValue}`; } } } function inputKeyUp(element, event) { const searchComponent = element.closest(`[sve-search-component]`); const id = searchComponent.getAttribute('sve-search-component'); window.abortPreviousSearches(id); window.createNewAbortController(id); const searchWrapper = element.closest('.sve-search-wrapper'); const searchInputField = searchWrapper.querySelector('input'); const clearButton = searchWrapper.querySelector('[sve-clear-button]'); const searchResultsContainer = searchComponent.querySelector('.sve-search-results-container'); const popularShopsContainer = searchComponent.querySelector('.sve-search-popular-shops-container'); window.searchState[id].searchInputLength = searchInputField.value.length; window.searchState[id].searchInputValue = searchInputField.value; if (event.keyCode === CONSTANTS.KEYS.RETURN) { // navigate window.searchNavigate(window.searchState[id].searchInputValue, id); return; } if (searchInputField.value.length > 0) { clearButton.classList.remove('hidden'); } //if input value length is greater than 2 character, so generate auto suggestion list if (searchInputField.value.length >= window.searchState[id].config.minSearchLength) { popularShopsContainer.classList.add('hidden'); // do regular searches (fetch ajax && getAdmarketplaceSuggestions Promise.all([ window.getAdMarketplaceSuggestionsData(searchInputField.value, id), window.fetchSearchResultsData(searchInputField.value, id) ]).then((results) => { const adsData = results[0]; const searchData = results[1]; window.searchState[id].currentSearchResults = searchData; const options = { hasShowAllElement: window.searchState[id].config.hasShowAllElement } // work with the HTML updateSearchDropdownHtml(id, searchInputField.value, searchData, adsData, options); searchResultsContainer.classList.remove('hidden'); }); } else { if (searchInputField.value.length === 0) { window.searchState[id].searchInputLength = 0; popularShopsContainer.classList.remove('hidden'); clearButton.classList.add('hidden'); searchResultsContainer.classList.add('hidden'); return } } } function fetchSearchResultsData (searchTerm, id) { const url = `${window.searchState[id].config.wlUrl}/ajax/search_autosuggestion?query=` + encodeURIComponent(searchTerm); return fetch(url, {signal: window.searchState[id].abortController.signal}).then((response) => { return response.json(); }) } if (!window.updateSearchDropdownHtml) { window.updateSearchDropdownHtml = function(id, searchTerm, listSearch, listAds = [], config) { // get main reference const searchComponent = document.querySelector(`[sve-search-component="${id}"]`); // fetch elements const searchDropdownContainer = searchComponent.querySelector('.sve-search-dropdown-container'); const searchUl = searchDropdownContainer.querySelector('[sve-search-results-list]'); const adsUl = searchDropdownContainer.querySelector('[sve-ads-results-list]'); const autosuggestionList = searchComponent.querySelector('[sve-search-results-list]'); const autoSuggestionTitle = searchComponent.querySelector('.sve-search-regular-results-title'); autoSuggestionTitle.innerText= 'Recommended results: ' || "Recommended results:"; searchUl.innerHTML = '' adsUl.innerHTML = ''; listSearch.forEach((retailerData) => { const params = { SEO_URL: `/${retailerData.seo_url}`, IMAGE_URL: `${retailerData.image_logo_page_small}`, IMAGE_ALT: `${retailerData.image_alt}`, NAME: retailerData.name, DISCOUNTS_COUNT: retailerData.numberActiveVouchers } searchUl.insertAdjacentHTML('beforeend', window.htmlGenerators.autoSuggestion(params)); }); listAds.forEach((retailerData) => { const params = { SEO_URL: `${retailerData.link}`, IMAGE_URL: `${retailerData.image_logo_page_small}`, IMAGE_ALT: retailerData.image_alt, NAME: retailerData.name, DISCOUNTS_COUNT: retailerData.offers_available } adsUl.insertAdjacentHTML('beforeend', window.htmlGenerators.adSuggestion(params)); }); if (window.searchState[id].config.hasShowAllElement) { const showAllItem = createShowAllItem(searchTerm, id); autosuggestionList.appendChild(showAllItem); } } } function handleCTA(element, event){ const searchComponent = element.closest('[sve-search-component]'); const id = searchComponent.getAttribute('sve-search-component'); const searchWrapper = element.closest('.sve-search-wrapper'); const searchInputField = searchWrapper.querySelector('input'); if (window.searchState[id].searchInputLength === 0) { searchInputField.focus(); } else { window.searchNavigate(window.searchState[id].searchInputValue, id); } } function openSearchDropdown(element, event) { // get main reference const searchComponent = element.closest(`[sve-search-component]`); // fetch elements const popularShopsContainer = searchComponent.querySelector('.sve-search-popular-shops-container'); const searchDropdownContainer = searchComponent.querySelector('.sve-search-dropdown-container'); // show the dropdown searchDropdownContainer.classList.remove('hidden'); // show the popular shops popularShopsContainer.classList.remove('hidden'); } if (!window.createNewAbortController) { window.createNewAbortController = function(id) { // generate a new abort controller window.searchState[id].abortController = new AbortController(); } } if (!window.abortPreviousSearches) { window.abortPreviousSearches = function(id) { if (window.searchState[id].abortController) { window.searchState[id].abortController.abort(); window.searchState[id].abortController = undefined; } } } function clearSearchInput(element, event) { const searchWrapper = element.closest('.sve-search-wrapper'); const searchInputField = searchWrapper.querySelector('input'); const clearButton = searchWrapper.querySelector('[sve-clear-button]'); const id = element.closest('[sve-search-component]').getAttribute('sve-search-component'); const searchComponent = document.querySelector(`[sve-search-component="unique"]`); const searchResultsContainer = searchComponent.querySelector('.sve-search-results-container'); const searchDropdownContainer = searchComponent.querySelector('.sve-search-popular-shops-container'); // clear the input field searchInputField.value = ''; clearButton.classList.add('hidden'); searchResultsContainer.classList.add('hidden'); searchDropdownContainer.classList.remove('hidden'); abortPreviousSearches(id); } if (!window.inputBlurred) { window.inputBlurred = function (element, event) { const id = element.closest('[sve-search-component]').getAttribute('sve-search-component'); element.value = ''; if(!window.searchState[id].isMobileViewPort) { const searchComponent = element.closest('[sve-search-component]'); const clearButton = searchComponent.querySelector('[sve-clear-button]'); clearButton.classList.add('hidden'); } } } // JSONP callback if (!window._processAdMarketplaceSuggestions) { window._processAdMarketplaceSuggestions = function(result) { let ret = []; if (result.paid_suggestions) { ret = result.paid_suggestions.filter((suggestion) => { return suggestion.brand; }).map((suggestion) => { return new AdMarketplaceDataType(suggestion); }); } return window.searchState[id].adMarketplacePromise.resolve(ret); }; } if (!window.getAdMarketplaceSuggestionsData) { window.getAdMarketplaceSuggestionsData = function(searchTerm, id) { const adMarketplaceEndpoint = "".replace(/&/gmi, "&"); return new Promise((resolve, reject) => { // assign the resolver for future use window.searchState[id].adMarketplacePromise.resolve = resolve; if (!adMarketplaceEndpoint || typeof adMarketplaceEndpoint !== 'string') { return resolve([]); } // Set the url to the web service API from where // the data to be retrieve const elementId = 'jsonp-call'; const url = `${adMarketplaceEndpoint}&qt=${encodeURIComponent(searchTerm)}&callback=_processAdMarketplaceSuggestions`; // Create the script element dynamically through JavaScript const scriptElement = document.createElement("script"); // Set the src and id attributes of the script element scriptElement.setAttribute("src", url); scriptElement.setAttribute("id", elementId); const oldScriptElement= document.getElementById(elementId); // Get the head element const head = document.getElementsByTagName("head")[0]; if (oldScriptElement == null) { /* If there is no script element then append a new element to the head. */ head.appendChild(scriptElement); } else { /* If there is already a element in the head, then replace it with the new script element. */ head.replaceChild(scriptElement, oldScriptElement); } }); } } if (!window.openSearch) { window.openSearch = function(element, event) { event.stopPropagation(); const currentSearchComponent = element.closest('[sve-search-component]'); const searchInputField = currentSearchComponent.querySelector('input'); const popularShopsContainer = currentSearchComponent.querySelector('.sve-search-popular-shops-container'); const searchDropdownContainer = currentSearchComponent.querySelector('.sve-search-dropdown-container'); const searchInputContainer = currentSearchComponent.querySelector('.sve-search-input-wrapper'); const closeButton = currentSearchComponent.querySelector('[sve-close-button]'); const searchWrapper = currentSearchComponent.querySelector('.sve-search-wrapper'); const openSearchIcon = currentSearchComponent.querySelector('.sve-search-open-icon'); const id = currentSearchComponent.getAttribute('sve-search-component'); searchWrapper.classList.remove('hidden'); openSearchIcon.classList.remove('hidden'); searchInputField.classList.remove('hidden'); if(window.searchState[id].isMobileViewPort) { openSearchIcon.classList.add('hidden'); closeButton.classList.remove('hidden'); searchInputField.focus(); searchInputContainer.classList.remove('hidden'); searchWrapper.classList.add('open-search-wrapper'); currentSearchComponent.classList.add('open-search-component'); popularShopsContainer.classList.remove('hidden'); searchDropdownContainer.classList.remove('hidden'); } window.searchState[id].searchIsOpen = true; } } if (!window.closeSearchInput) { window.closeSearchInput = function(element, event) { const currentSearchComponent = element.closest('[sve-search-component]'); const id = currentSearchComponent.getAttribute('sve-search-component'); const searchInputField = currentSearchComponent.querySelector('input'); const searchInputFieldContainer = currentSearchComponent.querySelector('.sve-search-input-wrapper'); const closeButton = currentSearchComponent.querySelector('[sve-close-button]'); const clearButton = currentSearchComponent.querySelector('[sve-clear-button]'); const searchDropdownContainer = currentSearchComponent.querySelector('.sve-search-dropdown-container'); const popularShopsContainer = currentSearchComponent.querySelector('.sve-search-popular-shops-container'); const searchWrapper = currentSearchComponent.querySelector('.sve-search-wrapper'); const openSearchIcon = currentSearchComponent.querySelector('.sve-search-open-icon'); event.stopPropagation(); if (window.searchState[id].isMobileViewPort) { const props = currentSearchComponent.getAttribute('props'); if (!props.hasInitialInputShown) { openSearchIcon.classList.remove('hidden'); searchWrapper.classList.add('hidden'); } searchInputFieldContainer.classList.add('hidden'); searchWrapper.classList.remove('open-search-wrapper'); currentSearchComponent.classList.remove('open-search-component'); } searchInputField.value = ''; closeButton.classList.add('hidden'); clearButton.classList.add('hidden'); searchDropdownContainer.classList.add('hidden'); popularShopsContainer.classList.add('hidden'); window.searchState[id].searchIsOpen = false; } } function createShowAllItem(searchedValue, id) { const searchComponent = document.querySelector(`[sve-search-component="${id}"]`); const autoSuggestionTitle = searchComponent.querySelector('.sve-search-regular-results-title'); const domain = document.location.href.split("/")[2]; const ItemNameSpan = document.createElement('span'); const showMoreTranslation = 'All results' || 'See all offers' ; ItemNameSpan.textContent = showMoreTranslation; const retailerAnchor = document.createElement('a'); retailerAnchor.href = `${window.searchState[id].config.wlUrl}/search?query=${searchedValue}`; retailerAnchor.classList.add('see-all'); retailerAnchor.appendChild(ItemNameSpan); const retailerItem = document.createElement('li'); retailerItem.classList.add('auto-suggestion-search-all'); retailerItem.appendChild(retailerAnchor); if(window.searchState[id].currentSearchResults.length === 0) { const noStoreFoundTranslation = ''; ItemNameSpan.innerText = ""; retailerAnchor.classList.add('no-result'); retailerAnchor.href = ""; autoSuggestionTitle.innerText= noStoreFoundTranslation || 'No stores found'; autoSuggestionTitle.style.fontWeight = '500'; } return retailerItem; }