var knownStations = [] function goToStation(station) { var url = new URL(window.location.href) url.pathname = 'view-station.html' url.searchParams.set('station', station) url.searchParams.set('date', new Date().toISOString()) window.location.href = url.toString() } function searchNormalize(str) { return str .toLowerCase() .replaceAll('ă', 'a') .replaceAll('â', 'a') .replaceAll('î', 'i') .replaceAll('ș', 's') .replaceAll('ț', 't') } var focusedElement = null var _rebuildDebounce = null var _rebuildRequested = false function rebuildSuggestions() { if (_rebuildDebounce !== null) { _rebuildRequested = true return } _rebuildRequested = false _rebuildDebounce = 123 var suggestionsArea = document.getElementById('suggestionsArea') while (suggestionsArea.childNodes.length > 0) { suggestionsArea.childNodes[0].remove() } var stationNameInput = document.getElementById('stationName') var stationName = searchNormalize(stationNameInput.value.trim()) var suggestions = [] if (!stationName) { suggestions = knownStations.slice() } else { for (var i = 0; i < knownStations.length; i++) { if (!searchNormalize(knownStations[i].name).includes(stationName)) { continue } suggestions.push(knownStations[i]) } suggestions.sort((s1, s2) => { var s1n = searchNormalize(s1.name); var s2n = searchNormalize(s2.name); if (s1n.indexOf(stationName) != s2n.indexOf(stationName)) { return s1n.indexOf(stationName) - s2n.indexOf(stationName); } if (s1.stoppedAtBy.length != s2.stoppedAtBy.length) { return s2.stoppedAtBy.length - s1.stoppedAtBy.length; } return s1.name.localeCompare(s2.name); }) } var foundInput = false suggestions.forEach(function (suggestion, index) { if (stationName == searchNormalize(suggestion.name)) { foundInput = true } var suggestionLi = document.createElement('li') suggestionsArea.appendChild(suggestionLi) setTimeout(function () { suggestionLi.classList.add('items') suggestionLi.tabIndex = index + 1 suggestionLi.style.padding = '2px 0' function onAction(e) { goToStation(suggestion.name) } suggestionLi.addEventListener('click', onAction) suggestionLi.addEventListener('keypress', function (e) { if (e.key == 'Enter') { onAction(e) } }) suggestionLi.addEventListener('focus', function (e) { focusedElement = suggestionLi }) var stationNameP = document.createElement('p') suggestionLi.appendChild(stationNameP) stationNameP.textContent = suggestion.name stationNameP.classList.add('pri', 'stationName') // var trainCompanyP = document.createElement('p') // suggestionLi.appendChild(trainCompanyP) // trainCompanyP.textContent = suggestion.company // trainCompanyP.classList.add('thi') }, 0) }) if (!foundInput && stationName) { var suggestionLi = document.createElement('li') suggestionsArea.appendChild(suggestionLi) suggestionLi.classList.add('items') suggestionLi.tabIndex = suggestions.length + 2 suggestionLi.style.padding = '2px 0' function onAction(e) { goToStation(stationNameInput.value.trim()) } suggestionLi.addEventListener('click', onAction) suggestionLi.addEventListener('keypress', function (e) { if (e.key == 'Enter') { onAction(e) } }) suggestionLi.addEventListener('focus', function (e) { focusedElement = suggestionLi }) var stationNameP = document.createElement('p') suggestionLi.appendChild(stationNameP) stationNameP.textContent = stationNameInput.value.trim() stationNameP.classList.add('pri', 'stationName') } setTimeout(function () { _rebuildDebounce = null if (_rebuildRequested) { rebuildSuggestions() } }, 500) } function lsk() { document.getElementById('stationName').focus() } function csk() { if (focusedElement == null) { return } if (focusedElement.id === 'stationName') { goToTrain(document.activeElement.value.trim()) } else { focusedElement.click() } } window.addEventListener('load', function (e) { var stationName = document.getElementById('stationName') stationName.addEventListener('input', function (e) { rebuildSuggestions() }) stationName.addEventListener('focus', function (e) { focusedElement = stationName document.getElementsByClassName('lsk')[0].textContent = '' document.getElementsByClassName('csk')[0].textContent = 'Search' }) stationName.addEventListener('blur', function (e) { document.getElementsByClassName('lsk')[0].textContent = 'Search' document.getElementsByClassName('csk')[0].textContent = 'Select' }) stationName.addEventListener('keypress', function (e) { if (e.key == 'Enter') { goToStation(stationName.value.trim()) } }) document.querySelectorAll('.lsk').forEach(function (lskElem) { lskElem.addEventListener('click', function (e) { lsk() }) }) document.querySelectorAll('.csk').forEach(function (cskElem) { cskElem.addEventListener('click', function (e) { csk() }) }) document.body.addEventListener('keydown', function (e) { if (e.key == 'SoftLeft') { lsk() } else if (e.key == 'Enter') { csk() } }) fetch('https://scraper.infotren.dcdev.ro/v3/stations') .then(function (response) { return response.json() }) .then(function (response) { knownStations = response knownStations.sort(function(a, b) { return b.stoppedAtBy.length - a.stoppedAtBy.length }) }) .then(function () { rebuildSuggestions() }) })