`,
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;
}