{#snippet renderLocalTime( time: Date, forceAbsolute = false )}{#await localTime(time, forceAbsolute, now)}{isRelativeTime && !forceAbsolute ? timeRelative(time.getTime(), now) : time.getUTCHours() + ':' + time.getUTCMinutes() + (time.getUTCSeconds() !== 0 ? `:${time.getUTCSeconds()}` : '') + ' UTC'}{:then t}{t}{/await}{/snippet} {#if stopTimes} {#each stopTimes.stopTimes // garbage data .filter((v) => v.agencyUrl !== 'http://www.rta.ae') as departure} {@const expectedTime = new Date( (isArrivals ? departure.place.scheduledArrival : departure.place.scheduledDeparture) ?? '0' ).getTime() / 1000 / 60} {@const receivedTime = new Date( (isArrivals ? departure.place.arrival : departure.place.departure) ?? '0' ).getTime() / 1000 / 60} {@const delayMinutes = receivedTime - expectedTime} {@const avoidGlyph = departure.routeShortName.startsWith('FlixTrain')} {@const routeShortName = (() => { let n = departure.routeShortName; if (n.startsWith('EC ')) n = n.replace('EC ', 'EC'); if (departure.mode === 'TRAM' && !isNaN(parseInt(n))) n = 'T ' + n; if (departure.mode === 'BUS' && !isNaN(parseInt(n))) n = 'B ' + n; if ( departure.routeShortName === 'European Sleeper' && departure.agencyName === 'Eu Sleeper' ) n = 'EN'; // TODO: validate these are real euronights if (n === '?') n = ''; if (n.startsWith('FlixTrain ')) n = n.substring(10); // Note: may also catch ECs/ICs/EXTs operated by DB if ( departure.agencyId === '12681' && departure.agencyName === 'DB Fernverkehr AG' && departure.mode === 'HIGHSPEED_RAIL' && departure.source.startsWith('de_DELFI.gtfs.zip/') && !isNaN(parseInt(n)) ) n = `ICE ${n}`; return n; })()} {@const pictogram = (() => { switch (true) { case departure.mode === Mode.Bike: return 'Velo_l'; case departure.mode === Mode.ODM: case departure.mode === Mode.Rental: return 'Taxi_l'; case departure.mode === Mode.Car: case departure.mode === Mode.CarDropoff: case departure.mode === Mode.CarParking: return 'Auto_l'; // Transit // case departure.mode === Mode.Airplane: return 'Abflug_l'; case departure.mode === Mode.LongDistanceRail: case departure.mode === Mode.RegionalFastRail: case departure.mode === Mode.RegionalRail: case departure.mode === Mode.Metro: case departure.mode === Mode.HighspeedRail: return 'Zug_l'; case departure.mode === Mode.NightRail: return 'Schlafwagen'; case departure.mode === Mode.Subway: return 'Metro_l_' + (m.lang_short() === 'en' ? 'de' : m.lang_short()); case departure.mode === Mode.Bus: return 'Bus_l'; case departure.mode === Mode.Coach: return 'Fernbus_l'; case departure.mode === Mode.Tram: case departure.mode === Mode.CableTram: return 'Tram_l'; case departure.mode === Mode.Funicular: return 'Zahnradbahn_l'; case departure.mode === Mode.AerialLift: // return 'Gondelbahn_l'; return 'Luftseilbahn_l'; case departure.mode === Mode.Ferry: return 'Schiff_l'; case departure.mode === Mode.Other: default: return 'Licht'; } })()} {@const notices = (() => { let notices = [] as [pictogram: string[], content: string][]; if (departure.cancelled) notices.push([ ['Cancellation', 'Attention'], m.brief_north_otter_cherish(), ]); if (delayMinutes < -0.5) { notices.push([ ['Hint'], m.vehicle_is_early({ minutes: -delayMinutes, arrival: isArrivals.toString(), }), ]); } else if (delayMinutes >= 1) { notices.push([ delayMinutes >= 5 ? ['Delay', 'Attention'] : delayMinutes >= 3 ? ['Delay', 'Hint'] : ['Hint'], m.next_long_lark_bask({ minutes: delayMinutes.toFixed(0), }), ]); } return notices; })()} {@const situationIsBad = notices.find((v) => v[0].includes('Attention'))}
No results have been found for the station {placeName ?? placeId}.
Please try again.
No results have been found for the station {placeName ?? placeId}.
Please try again.
Please input a station in the search field above and select a search result.
Examples:
{/if}