kai.infodb/train.js

173 lines
4.5 KiB
JavaScript
Raw Permalink Normal View History

2022-07-13 00:33:59 +03:00
var knownTrains = []
2023-10-24 08:53:55 +02:00
function goToTrip(tripId) {
2022-07-13 00:33:59 +03:00
var url = new URL(window.location.href)
url.pathname = 'view-train.html'
2023-10-24 08:53:55 +02:00
url.searchParams.set('tripId', tripId)
2022-07-13 00:33:59 +03:00
url.searchParams.set('date', new Date().toISOString())
window.location.href = url.toString()
}
var focusedElement = null
2022-07-13 00:33:59 +03:00
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()
}
2023-10-24 08:53:55 +02:00
var suggestions = knownTrains.filter(function (suggestion) {
return suggestion.line.name
})
2022-07-13 00:33:59 +03:00
// Trim the amount of results displayed
if (suggestions.length > 100) {
suggestions.splice(100)
}
2022-07-13 00:33:59 +03:00
suggestions.forEach(function (suggestion, index) {
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) {
2023-10-24 08:53:55 +02:00
goToTrip(suggestion.id)
2022-07-13 00:33:59 +03:00
}
suggestionLi.addEventListener('click', onAction)
suggestionLi.addEventListener('keypress', function (e) {
if (e.key == 'Enter') {
onAction(e)
}
})
suggestionLi.addEventListener('focus', function (e) {
focusedElement = suggestionLi
})
2022-07-13 00:33:59 +03:00
var trainNameP = document.createElement('p')
suggestionLi.appendChild(trainNameP)
2023-10-24 08:53:55 +02:00
trainNameP.textContent = `${suggestion.line.name} (${suggestion.line.fahrtNr})`
2022-07-13 00:33:59 +03:00
trainNameP.classList.add('pri', 'trainName')
2023-10-24 08:53:55 +02:00
var trainRouteP = document.createElement('p')
suggestionLi.appendChild(trainRouteP)
trainRouteP.textContent = `${suggestion.origin.name}${suggestion.destination.name}`
trainRouteP.classList.add('thi')
2022-07-13 00:33:59 +03:00
var trainCompanyP = document.createElement('p')
suggestionLi.appendChild(trainCompanyP)
2023-10-24 08:53:55 +02:00
trainCompanyP.textContent = suggestion.line.operator.name
2022-07-13 00:33:59 +03:00
trainCompanyP.classList.add('thi')
}, 0)
})
setTimeout(function () {
_rebuildDebounce = null
if (_rebuildRequested) {
rebuildSuggestions()
}
}, 500)
}
2023-10-24 08:53:55 +02:00
var fetchAbortController = new AbortController()
function reloadSuggestions() {
var trainNumberInput = document.getElementById('trainNumber')
var trainNumber = trainNumberInput.value.trim()
var tripsUrl = new URL('https://v6.db.transport.rest/trips')
tripsUrl.searchParams.set('query', trainNumber)
tripsUrl.searchParams.set('onlyCurrentlyRunning', 'true')
fetchAbortController.abort()
fetchAbortController = new AbortController()
fetch(tripsUrl.toString(), { signal: fetchAbortController.signal })
.then(function (response) {
return response.json()
})
.then(function (data) {
if (data.trips) {
knownTrains = data.trips
knownTrains.sort(function (s1, s2) {
var diff1 = Math.abs(Date.now() - new Date(s1.plannedDeparture).getTime())
var diff2 = Math.abs(Date.now() - new Date(s2.plannedDeparture).getTime())
return diff1 - diff2
})
rebuildSuggestions()
}
})
}
function lsk() {
document.getElementById('trainNumber').focus()
}
function csk() {
if (focusedElement == null) {
return
}
if (focusedElement.id === 'trainNumber') {
2023-10-24 08:53:55 +02:00
goToTrip(document.activeElement.value.trim())
}
else {
focusedElement.click()
}
}
2022-07-13 00:33:59 +03:00
window.addEventListener('load', function (e) {
var trainNumber = document.getElementById('trainNumber')
trainNumber.addEventListener('input', function (e) {
2023-10-24 08:53:55 +02:00
reloadSuggestions()
2022-07-13 00:33:59 +03:00
})
trainNumber.addEventListener('focus', function (e) {
focusedElement = trainNumber
document.getElementsByClassName('lsk')[0].textContent = ''
2022-07-13 00:33:59 +03:00
document.getElementsByClassName('csk')[0].textContent = 'Search'
})
trainNumber.addEventListener('blur', function (e) {
document.getElementsByClassName('lsk')[0].textContent = 'Search'
2022-07-13 00:33:59 +03:00
document.getElementsByClassName('csk')[0].textContent = 'Select'
})
trainNumber.addEventListener('keypress', function (e) {
if (e.key == 'Enter') {
2023-10-24 08:53:55 +02:00
goToTrip(trainNumber.value.trim())
2022-07-13 00:33:59 +03:00
}
})
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()
}
})
2023-10-24 08:53:55 +02:00
reloadSuggestions()
2022-07-13 00:33:59 +03:00
})