1const searchInput=document.querySelector('.main-panel__search-input') 2const searchInputMobile=document.querySelector('.search-results__mobile-input input') 3const searchResults=document.querySelector('.search-results.desktop') 4const searchResultsMobile=document.querySelector('.search-results.mobiles') 5const overlay=document.querySelector('.search-overlay') 6const screenWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;const searchDataParam='searchText';const MINIMUM_SEARCH_CHARACTERS=1 7const SEARCH_THROTTLE_MS=500 8function createThrottledSearch(search,interval=SEARCH_THROTTLE_MS){let abortController 9let lastFireTime=0 10let trailingTimeoutId 11let lastTerm=null 12const normalize=(term)=>term.replace(/\s+/g,'') 13const fire=(term)=>{clearTimeout(trailingTimeoutId) 14lastFireTime=Date.now() 15lastTerm=normalize(term) 16if(abortController){abortController.abort()} 17abortController=new AbortController() 18search(term,abortController.signal).catch((error)=>{if(error.name!=='AbortError'){console.error(error)}})} 19return(term)=>{if(normalize(term)===lastTerm){clearTimeout(trailingTimeoutId) 20return} 21const elapsed=Date.now()-lastFireTime 22clearTimeout(trailingTimeoutId) 23if(elapsed>=interval){fire(term)}else{trailingTimeoutId=setTimeout(()=>fire(term),interval-elapsed)}}} 24searchInput.addEventListener('focus',(e)=>{console.log('FOCUS') 25const isSticky=e.target.closest('#navbar').classList.contains('sticky') 26if(!isSticky&&screenWidth>=1200){document.querySelector('.main-menu-button.main-menu-button--voucher').classList.add('hidden')}}) 27searchInput.addEventListener('blur',(e)=>{e.target.value=''}) 28searchInput.addEventListener('mouseenter',(e)=>{if(document.activeElement!==e.target){}}) 29searchInput.addEventListener('mouseleave',(e)=>{if(document.activeElement!==e.target){e.target.style.boxShadow='none'}}) 30const searchDesktop=createThrottledSearch(async(term,signal)=>{const response=await fetch('/api/v1/search/search',{method:'POST',headers:{'Content-Type':'application/json',},body:JSON.stringify({term:term,}),signal,});if(response.ok){const data=await response.json();if(term.length>0){document.querySelector('.main-panel__search i').style.zIndex='13' 31searchResults.style.display='block' 32overlay.style.display='block' 33searchInput.style.zIndex='12' 34document.body.style.overflowY='hidden';document.body.classList.add('overlay') 35const resultsList=searchResults.querySelector('.search-results__list') 36resultsList.innerHTML='';if(data.length===0){resultsList.innerHTML='No results found.';return;} 37const resultsDiv=document.createElement('div');resultsDiv.classList.add('search-results__container') 38data.forEach(result=>{const resultItem=document.createElement('a');resultItem.setAttribute('href',result.path);const resultPrice=result&&result.priceAfterDiscount?result.priceAfterDiscount:"";const resultInner=`${result.type!=='listing'?`<img src="${result.pictureUrl}"alt="Gift image">`:''}<div class='search-result-item-info'><div>${result.name}${result.type==='listing'?' '+`(${result.itemsCount})`:''}</div>${result.type!=='listing'?`<div><span class='price'>${resultPrice}</span>${__default_currency_symbol}</div>`:''}</div>`;resultItem.classList.add('search-results__item');resultItem.innerHTML=resultInner;resultsDiv.appendChild(resultItem);});resultsList.appendChild(resultsDiv);window.onclick=function(e){if(e.target===searchInput){}else{searchResults.style.display='none' 39overlay.style.display='none' 40searchInput.style.zIndex='auto' 41document.body.style.overflowY='auto' 42document.body.classList.remove('overlay') 43document.querySelector('.main-panel__search i').style.zIndex='10' 44document.querySelector('.main-menu-button.main-menu-button--voucher').classList.remove('hidden') 45e.target.value=''}}}else{searchResults.style.display='none' 46overlay.style.display='none' 47document.body.classList.remove('overlay') 48searchInput.style.zIndex='auto' 49document.body.style.overflowY='auto';document.querySelector('.main-panel__search i').style.zIndex='10'}}else{console.error(response);}});searchInput.addEventListener('input',(e)=>{searchDesktop(e.target.value)}) 50searchInput.addEventListener('keypress',(e)=>{if(e.key==='Enter'&&e.target.value.trim().length>=MINIMUM_SEARCH_CHARACTERS){window.location.href=`${window.location.origin}${e.target.dataset.search}?${searchDataParam}=${e.target.value}`;}}) 51document.querySelector('.search-results__mobile-input input') 52function handleMobileSearch(){const screenWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;const isMobile=screenWidth<=899;if(isMobile){searchResultsMobile.style.display='block' 53searchInput.style.zIndex='12' 54if(document.getElementById('navbar').classList.contains('sticky')){document.querySelector('.search-results.mobiles').style.top='0px'} 55document.body.style.overflowY='hidden';document.querySelector('.main-panel__search i').style.display='none'}} 56function handleCloseMobileSearch(){searchResultsMobile.style.display='none' 57document.querySelector('.search-results.mobiles').style.top='10px' 58document.body.style.overflowY='auto';document.querySelector('.main-panel__search i').style.display='inline-block'} 59const searchMobile=createThrottledSearch(async(term,signal)=>{const response=await fetch('/api/v1/search/search',{method:'POST',headers:{'Content-Type':'application/json',},body:JSON.stringify({term:term,}),signal,});if(response.ok){const data=await response.json();if(term.length>0){const resultsList=document.querySelector('.search-results.mobiles .search-results__list') 60resultsList.innerHTML='';
60if(data.hits.length===0){resultsList.innerHTML='No results found.';return;} 61const resultsDiv=document.createElement('div');resultsDiv.classList.add('search-results__container') 62data.hits.forEach(result=>{const resultItem=document.createElement('a');resultItem.setAttribute('href',result.url);const resultPrice=result&&result.price?result.price:"";const resultInner=`${result.type!=='category'?`<img src="${result.image}"alt="Gift image">`:''}<div class='search-result-item-info'><div>${result.title}${result.type==='category'?' '+`(${result.counter})`:''}</div>${result.type!=='category'?`<div><span class='price'>${resultPrice}</span>${__default_currency_symbol}</div>`:''}</div>`;resultItem.classList.add('search-results__item');resultItem.innerHTML=resultInner;resultsDiv.appendChild(resultItem);});resultsList.appendChild(resultsDiv);}else{}}else{console.error(response);}});searchResultsMobile.querySelector('input').addEventListener('input',(e)=>{searchMobile(e.target.value)}) 63searchInputMobile.addEventListener('keypress',(e)=>{if(e.key==='Enter'&&e.target.value.trim().length>=MINIMUM_SEARCH_CHARACTERS){window.location.href=`${window.location.origin}${e.target.dataset.search}?${searchDataParam}=${e.target.value}`;}})
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.