function customSearch() { let searchableContent = document.querySelectorAll('tr td:not(:last-of-type)'); let searchInput = document.querySelector('input[type="search"]'); let searchResults = document.querySelector('#search_results'); let isResultOpen = false; let resultAmount = 0; let resultAmountText = document.querySelector('#result_amount'); let hilightedWords; let typingTimer; let currentSelectedWord = 0; let downArrow = document.querySelector('#search_results div div img:first-of-type'); let upArrow = document.querySelector('#search_results div div img:last-of-type'); let thereAreResults = false; let inputIsActive = false; searchInput.addEventListener('focus', () => { inputIsActive = true; toggleSearchResults(); }); searchInput.addEventListener('blur', () => { inputIsActive = false; }); searchInput.addEventListener('keydown', function(e) { if ((e.key === 'Enter' || e.keyCode === 13) && resultAmount > 1) { if (+resultAmountText.innerText.split('/')[0] === resultAmount) { getToFirstOccurence(); } else { getToNextOccurence(downArrow); } } else { triggerSearch(); } }); function triggerSearch() { setTimeout(() => { hilightedWords = []; resultAmount = 0; removeHighlightTags(); let input = searchInput.value.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); if (searchInput.value.length >= 3) { thereAreResults = true; clearTimeout(typingTimer); typingTimer = setTimeout(function() { searchInContent(input); let currentScroll = window.scrollY; if (hilightedWords.length != 0) { searchResults.querySelector('div p:first-of-type').style.display = "block"; searchResults.querySelector('div p:last-of-type').style.display = "none"; for (let i = 0; i < hilightedWords.length; i++) { let wordBoundingTop = hilightedWords[i].getBoundingClientRect().top; if (hilightedWords.length <= 1) { let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); currentSelectedWord = 1; resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText; upArrow.classList.add('disabled'); downArrow.classList.add('disabled'); } else { if (currentScroll <= wordBoundingTop + currentScroll && i === 0) { let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); currentSelectedWord = 1; resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText; upArrow.classList.add('disabled'); downArrow.classList.remove('disabled'); break; } else if ( currentScroll <= wordBoundingTop + currentScroll && currentScroll >= hilightedWords[i - 1]?.getBoundingClientRect().top + currentScroll ) { let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); currentSelectedWord = i + 1; resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText; upArrow.classList.remove('disabled'); if (i === hilightedWords.length - 1) { downArrow.classList.add('disabled'); } else { downArrow.classList.remove('disabled'); } break; } else if (currentScroll >= wordBoundingTop && i === hilightedWords.length - 1) { let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); currentSelectedWord = hilightedWords.length; resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText; upArrow.classList.remove('disabled'); downArrow.classList.add('disabled'); break; } } } } else { searchResults.querySelector('div p:first-of-type').style.display = "none"; searchResults.querySelector('div p:last-of-type').style.display = "block"; upArrow.classList.add('disabled'); downArrow.classList.add('disabled'); } }, 800); } else { removeHighlightTags(); clearTimeout(typingTimer); thereAreResults = false; searchResults.querySelector('div p:first-of-type').style.display = "none"; searchResults.querySelector('div p:last-of-type').style.display = "block"; upArrow.classList.add('disabled'); downArrow.classList.add('disabled'); } }, 10); } function searchInContent(input) { for (let content of searchableContent) { if (content.innerText != '') { if (content.children.length > 0) { for (let textEl of content.children) { compareTexts(textEl, input); } } else { compareTexts(content, input); } } } resultAmountText.innerText = resultAmount; } function compareTexts(textEl, input) { if (textEl.innerText !== '') { if (textEl.parentElement.tagName === "TR") { input = input.replace(/'/g, '’'); } if (textEl.innerHTML.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").includes(input)) { let splitContent = textEl.innerHTML.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").split(input); let processedText = ''; for (let i = 0; i < splitContent.length; i++) { if (splitContent[0] !== '' || splitContent[splitContent.length - 1] !== '') { if (i === 0) { processedText += textEl.innerHTML.substring(0, splitContent[i].length); } else { let amountOfTextToConcatenate = 0; for (let j = 0; j <= i - 1; j ++) { amountOfTextToConcatenate += splitContent[j].length + input.length; } processedText += '' + textEl.innerHTML.substring(amountOfTextToConcatenate - input.length, amountOfTextToConcatenate) + '' + textEl.innerHTML.substring( amountOfTextToConcatenate, amountOfTextToConcatenate + splitContent[i].length ); } } else if (splitContent[splitContent.length - 1] === '' && splitContent[0] === '') { processedText = '' + textEl.innerHTML + ''; } } textEl.innerHTML = processedText; hilightedWords = document.querySelectorAll('.highlight'); resultAmount = hilightedWords.length; } } } function removeHighlightTags() { for (let content of searchableContent) { if (content.innerHTML.includes('')) { content.innerHTML = content.innerHTML.replace(/|<\/span>/g, ''); } } } function toggleSearchResults() { // dans le if thereAreResults || inputIsActive // si on veut que les résultats restent ouvert // quand il y a des résultats if (inputIsActive) { searchResults.style.top = `${searchInput.getBoundingClientRect().bottom + 5}px`; searchResults.style.display = "block"; searchResults.style.opacity = 1; searchResults.style.maxHeight = "1000px"; isResultOpen = true; } else { searchResults.style.opacity = 0; searchResults.style.maxHeight = "0px"; isResultOpen = false; setTimeout(() => { searchResults.style.display = "none"; }, 300); } } upArrow.addEventListener('click', function (el) { getToPrevOccurence(el) }); function getToPrevOccurence(el) { if (!el.target.classList.contains('disabled')) { let currentScroll = window.scrollY; currentSelectedWord--; let wordBoundingTop = hilightedWords[currentSelectedWord - 1].getBoundingClientRect().top; let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText.split('/')[1]; if (currentSelectedWord === 1) { upArrow.classList.add('disabled'); downArrow.classList.remove('disabled'); } else { upArrow.classList.remove('disabled'); downArrow.classList.remove('disabled'); } } } downArrow.addEventListener('click', function (el) { getToNextOccurence(el.target); }); function getToNextOccurence(el) { if (!el.classList.contains('disabled')) { let currentScroll = window.scrollY; currentSelectedWord++; let wordBoundingTop = hilightedWords[currentSelectedWord - 1].getBoundingClientRect().top; let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText.split('/')[1]; if (currentSelectedWord === hilightedWords.length) { downArrow.classList.add('disabled'); upArrow.classList.remove('disabled'); } else { downArrow.classList.remove('disabled'); upArrow.classList.remove('disabled'); } } } function getToFirstOccurence() { let currentScroll = window.scrollY; currentSelectedWord = 1; let wordBoundingTop = hilightedWords[currentSelectedWord - 1].getBoundingClientRect().top; let scrollValue = (wordBoundingTop + currentScroll) - window.innerHeight / 2; window.scrollTo({ top: scrollValue, behavior: 'smooth' }); resultAmountText.innerText = currentSelectedWord + "/" + resultAmountText.innerText.split('/')[1]; downArrow.classList.remove('disabled'); upArrow.classList.add('disabled'); } let tagsDiv = document.querySelector('#search_results > div:last-of-type'); window.addEventListener('click', function (el) { if (!searchResults.contains(el.target) && isResultOpen && el.target != searchInput && el.target != tagsDiv) { toggleSearchResults(); } }); let searchWordList = document.querySelector('#content_search_tag'); searchWordList = searchWordList.innerText.substring(1, searchWordList.innerText.length - 1).split(', '); for (let tag of searchWordList) { let tagWrapper = document.createElement('p'); tagWrapper.innerText = tag; tagWrapper.addEventListener('click', function () { searchInput.value = tag; triggerSearch(); }); tagsDiv.appendChild(tagWrapper); } } export { customSearch };