diff options
Diffstat (limited to 'public/static/js/collapse.js')
-rw-r--r-- | public/static/js/collapse.js | 219 |
1 files changed, 171 insertions, 48 deletions
diff --git a/public/static/js/collapse.js b/public/static/js/collapse.js index 59d42b2..e861169 100644 --- a/public/static/js/collapse.js +++ b/public/static/js/collapse.js @@ -1,45 +1,77 @@ +/* + * Copyright (C) 2020-2023 Birte Kristina Friesel + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +function setLang(lang) { + document.cookie = 'lang=' + lang + ';SameSite=None;Secure'; + location.reload(); +} + +function setTheme(theme) { + localStorage.setItem('theme', theme); + if (!otherTheme.hasOwnProperty(theme)) { + theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + } + addStyleSheet(theme, 'theme'); +} + function reload_app() { - $.get(window.location.href, {ajax: 1}, function(data) { - $('div.app > ul').html(data); - dbf_reg_handlers(); - setTimeout(reload_app, 60000); - }).fail(function() { - setTimeout(reload_app, 10000); - }); + // TODO use a variable instead of window.location.href, as + // window.location.href may be /z/... + // Until then, we guard it by only reloading whin moreinfo is not expanded. + if ($('.expanded-moreinfo').length == 0) { + $.get(window.location.href, {ajax: 1}, function(data) { + // TODO check expanded-moreinfo again here (until the issue itself has been resolved) + $('div.app > ul').html(data); + dbf_reg_handlers(); + setTimeout(reload_app, 60000); + }).fail(function() { + setTimeout(reload_app, 10000); + }); + } else { + setTimeout(reload_app, 30000); + } } -function dbf_reg_handlers() { - $('div.app > ul > li').click(function() { - var trainElem = $(this); - var routeprev = trainElem.data('routeprev').split('|'); - var routenext = trainElem.data('routenext').split('|'); - var moreinfo = trainElem.data('moreinfo').split('|'); - $('.moreinfo').each(function() { - var infoElem = $(this); - $('.moreinfo .train-line').removeClass('bahn sbahn fern ext').addClass(trainElem.data('linetype')); +function dbf_show_moreinfo(trainElem, keep_old) { + const routeprev = trainElem.data('routeprev').split('|'); + const routenext = trainElem.data('routenext').split('|'); + const moreinfo = trainElem.data('moreinfo').split('|'); + $('.moreinfo').each(function() { + const infoElem = $(this); + if (!keep_old) { + $('.moreinfo .train-line').removeClass('sbahn fern ext ubahn bus tram').addClass(trainElem.data('linetype')); $('.moreinfo .train-line').text(trainElem.data('line')); $('.moreinfo .train-no').text(trainElem.data('no')); $('.moreinfo .train-origin').text(trainElem.data('from')); $('.moreinfo .train-dest').text(trainElem.data('to')); - if ($('.moreinfo .loading').length == 0) { - $('.moreinfo .mheader').append('<div class="loading">Lade Daten, bitte warten...</div>'); - } $('.moreinfo .minfo').text(''); $('.moreinfo .mfooter').html(''); $('.moreinfo .verbose').html(''); $('.moreinfo .mroute').html(''); $('.moreinfo ul').html(''); - if (trainElem.data('platform') != '') { - $('.moreinfo .mfooter').append('<div class="platforminfo">Gleis ' + trainElem.data('platform') + '</div>'); - } - var timebuf = ''; + var dataline = ''; if (trainElem.data('arrival') != '') { - timebuf += 'Ankunft: ' + trainElem.data('arrival') + '<br/>'; + dataline += '<div><div class="arrival">An: ' + trainElem.data('arrival') + '</div></div>'; + } else { + dataline += '<div><div class="arrival"></div></div>'; + } + if (trainElem.data('platform') != '') { + dataline += '<div><div class="platform">Gleis ' + trainElem.data('platform') + '</div></div>'; + } else { + dataline += '<div><div class="platform"></div></div>'; } if (trainElem.data('departure') != '') { - timebuf += 'Abfahrt: ' + trainElem.data('departure'); + dataline += '<div><div class="departure">Ab: ' + trainElem.data('departure') + '</div></div>'; + } else { + dataline += '<div><div class="departure"></div></div>'; + } + $('.moreinfo .mfooter').append('<div class="dataline">' + dataline + '</div>'); + if ($('.moreinfo .loading').length == 0) { + $('.moreinfo .mfooter').append('<div class="loading">Lade Daten, bitte warten...</div>'); } - $('.moreinfo .mfooter').append('<div class="timeinfo">' + timebuf + '</div>'); if (trainElem.data('moreinfo') != '') { var ibuf = ''; for (var key in moreinfo) { @@ -47,41 +79,102 @@ function dbf_reg_handlers() { } $('.moreinfo .mfooter').append('Meldungen: <ul>' + ibuf + '</ul>'); } + var routebuf = ''; if (trainElem.data('routeprev') != '') { - var routebuf = ''; for (var key in routeprev) { routebuf += '<li>' + routeprev[key] + '</li>'; } - $('.moreinfo .mfooter').append('Von: <ul class="mroute">' + routebuf + '</ul>'); } + routebuf += '<li><strong>' + document.title + '</strong></li>'; if (trainElem.data('routenext') != '') { - var routebuf = ''; for (var key in routenext) { routebuf += '<li>' + routenext[key] + '</li>'; } - $('.moreinfo .mfooter').append('Nach: <ul class="mroute">' + routebuf + '</ul>'); } - $.get(window.location.href, {train: trainElem.data('train'), ajax: 1}, function(data) { - $('.moreinfo').html(data); - }).fail(function() { - $('.moreinfo .mfooter').append('Der Zug ist abgefahren (Zug nicht gefunden)'); - }); - infoElem.removeClass('collapsed-moreinfo'); - infoElem.addClass('expanded-moreinfo'); + $('.moreinfo .mfooter').append('Fahrtverlauf: <ul class="mroute">' + routebuf + '</ul>'); + } + $.get(window.location.href, {train: trainElem.data('train'), jid: trainElem.data('jid'), ajax: 1}, function(data) { + $('.moreinfo').html(data); + }).fail(function() { + $('.moreinfo .mfooter').append('Keine weiteren Details verfügbar'); + $('.moreinfo .loading').remove(); }); + infoElem.removeClass('collapsed-moreinfo'); + infoElem.addClass('expanded-moreinfo'); }); } -$(function() { - if (document.location.hash.length > 1) { - var wanted = document.location.hash.replace('#', ''); - $('div.app > ul > li > .moreinfo, div.infoscreen > ul > li > .moreinfo').each(function() { - if ($(this).data('train') == wanted) { - $(this).removeClass('collapsed-moreinfo'); - $(this).addClass('expanded-moreinfo'); +function dbf_reg_handlers() { + $('div.app > ul > li').click(function(event) { + const trainElem = $(this); + const station = $('div.app').data('station'); + const param = new URLSearchParams(window.location.search); + event.preventDefault(); + var suffix = '?'; + if (param.get('detailed')) { + suffix += '&detailed=1'; + } + if (param.get('dbris') && param.get('dbris') != '0') { + suffix += '&dbris=' + param.get('dbris') + '&highlight=' + trainElem.data('station'); + } + if (param.get('efa') && param.get('efa') != '0') { + suffix += '&efa=' + param.get('efa') + '&highlight=' + trainElem.data('station'); + } + if (param.get('hafas') && param.get('hafas') != '0') { + suffix += '&hafas=' + param.get('hafas') + '&highlight=' + trainElem.data('station'); + } + if (param.get('past')) { + suffix += '&past=1'; + } + if (param.get('rt') || param.get('show_realtime')) { + suffix += '&rt=1'; + } + if (param.get('hafas') && param.get('hafas') != '0') { + history.pushState({'page':'traindetail','jid':trainElem.data('jid')}, 'test', '/z/' + trainElem.data('jid') + suffix); + } else if (param.get('efa') && param.get('efa') != '0') { + history.pushState({'page':'traindetail','jid':trainElem.data('jid')}, 'test', '/z/' + trainElem.data('jid') + suffix); + } else if (param.get('dbris') && param.get('dbris') != '0') { + history.pushState({'page':'traindetail','jid':trainElem.data('jid')}, 'test', '/z/' + trainElem.data('jid') + suffix); + } else { + history.pushState({'page':'traindetail','station':station,'train':trainElem.data('no')}, 'test', '/z/' + trainElem.data('train') + '/' + trainElem.data('station') + suffix); + } + dbf_show_moreinfo(trainElem, false); + }); + const trainid = $(location).attr('hash').substr(1); + if (trainid) { + var found = false; + $('div.app > ul > li').each(function(index) { + if (found) { + return; } + $(this).find('.anchor').each(function() { + if ($(this).attr('id') == trainid) { + found = true; + } + }); }); + if (found) { + found = false; + $('div.app > ul > li').each(function(index) { + if (found) { + return; + } + $(this).find('.anchor').each(function() { + if ($(this).attr('id') == trainid) { + found = true; + } + }); + if (found) { + $(this).addClass('selected'); + } else { + $(this).addClass('past'); + } + }); + } } +} + +$(function() { $('.moresettings-header').each(function() { $(this).click(function() { var moresettings = $('.moresettings'); @@ -116,12 +209,42 @@ $(function() { } }); }); - $('.moreinfo').click(function() { - $(this).removeClass('expanded-moreinfo'); - $(this).addClass('collapsed-moreinfo'); - }); dbf_reg_handlers(); if ($('.content .app').length) { setTimeout(reload_app, 30000); + history.replaceState({'page':'station'}, document.title, ''); } + window.onpopstate = function(event) { + if (event.state != null) { + if ((event.state['page'] == 'station')) { + $('.moreinfo').each(function() { + $(this).removeClass('expanded-moreinfo'); + $(this).addClass('collapsed-moreinfo'); + }); + if (!$('div.app > ul').length) { + $('div.app').append('<ul></ul>'); + reload_app(); + } + } else if ((event.state['page'] == 'traindetail')) { + var success = false; + $('div.app > ul > li').each(function() { + const trainElem = $(this); + if (trainElem.data('no') == event.state['train']) { + dbf_show_moreinfo(trainElem, true); + success = true; + return; + } + }); + if (!success) { + $('.moreinfo').each(function() { + $(this).removeClass('collapsed-moreinfo'); + $(this).addClass('expanded-moreinfo'); + }); + $('.moreinfo .mfooter').append('Der Zug ist abgefahren (Zug nicht gefunden)'); + } + } + } else { + console.log("unhandled popstate! " + document.location); + } + }; }); |