2020-11-27 21:12:56 +00:00
/ *
2023-07-03 15:59:25 +00:00
* Copyright ( C ) 2020 Birte Kristina Friesel
2020-11-27 21:12:56 +00:00
*
2021-01-29 17:32:13 +00:00
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2020-11-27 21:12:56 +00:00
* /
2019-10-29 20:18:46 +00:00
var j _departure = 0 ;
2019-05-10 15:58:13 +00:00
var j _duration = 0 ;
var j _arrival = 0 ;
2019-10-29 20:18:46 +00:00
var j _dest = '' ;
var j _stops = [ ] ;
2023-02-27 21:14:54 +00:00
var j _token = '' ;
2019-05-10 15:58:13 +00:00
function upd _journey _data ( ) {
$ ( '.countdown' ) . each ( function ( ) {
2023-02-27 21:14:54 +00:00
const journey _token = $ ( this ) . data ( 'token' ) ;
if ( journey _token ) {
j _token = journey _token ;
}
2019-10-29 20:18:46 +00:00
var journey _data = $ ( this ) . data ( 'journey' ) ;
if ( journey _data ) {
journey _data = journey _data . split ( ';' ) ;
j _departure = parseInt ( journey _data [ 0 ] ) ;
j _arrival = parseInt ( journey _data [ 1 ] ) ;
j _duration = j _arrival - j _departure ;
}
var journey _dest = $ ( this ) . data ( 'dest' ) ;
if ( journey _dest ) {
j _dest = journey _dest ;
}
var stops = $ ( this ) . data ( 'route' ) ;
if ( stops ) {
stops = stops . split ( '|' ) ;
j _stops = [ ] ;
for ( var stop _id in stops ) {
var stopdata = stops [ stop _id ] . split ( ';' ) ;
for ( var i = 1 ; i < 5 ; i ++ ) {
stopdata [ i ] = parseInt ( stopdata [ i ] ) ;
}
j _stops . push ( stopdata ) ;
}
}
2019-05-10 15:58:13 +00:00
} ) ;
}
function upd _countdown ( ) {
2023-07-02 08:48:34 +00:00
const now = Date . now ( ) / 1000 ;
2019-10-29 20:18:46 +00:00
if ( j _departure > now ) {
$ ( '.countdown' ) . text ( 'Abfahrt in ' + Math . round ( ( j _departure - now ) / 60 ) + ' Minuten' ) ;
} else if ( j _arrival > 0 ) {
2019-05-10 15:58:13 +00:00
if ( j _arrival > now ) {
2023-07-02 08:48:34 +00:00
var diff = Math . round ( ( j _arrival - now ) / 60 ) ;
if ( diff >= 120 ) {
$ ( '.countdown' ) . text ( 'Ankunft in ' + Math . floor ( diff / 60 ) + ' Stunden und ' + ( diff % 60 ) + ' Minuten' ) ;
} else if ( diff >= 60 ) {
$ ( '.countdown' ) . text ( 'Ankunft in 1 Stunde und ' + ( diff % 60 ) + ' Minuten' ) ;
} else {
$ ( '.countdown' ) . text ( 'Ankunft in ' + diff + ' Minuten' ) ;
}
2019-05-10 15:58:13 +00:00
} else {
$ ( '.countdown' ) . text ( 'Ziel erreicht' ) ;
}
}
}
2019-10-29 20:18:46 +00:00
function hhmm ( epoch ) {
var date = new Date ( epoch * 1000 ) ;
var h = date . getHours ( ) ;
var m = date . getMinutes ( ) ;
return ( h < 10 ? '0' + h : h ) + ':' + ( m < 10 ? '0' + m : m ) ;
}
function odelay ( sched , rt ) {
if ( sched < rt ) {
return ' (+' + ( ( rt - sched ) / 60 ) + ')' ;
}
else if ( sched == rt ) {
return '' ;
}
return ' (' + ( ( rt - sched ) / 60 ) + ')' ;
}
2019-04-23 16:08:07 +00:00
function tvly _run ( link , req , err _callback ) {
2018-10-05 17:12:49 +00:00
var error _icon = '<i class="material-icons">error</i>' ;
2022-07-14 19:05:07 +00:00
var progressbar ;
if ( link . data ( 'tr' ) ) {
progressbar = $ ( '<tr><td colspan="' + link . data ( 'tr' ) + '"><div class="progress"><div class="indeterminate"></div></div></td></tr>' ) ;
}
else {
progressbar = $ ( '<div class="progress"><div class="indeterminate"></div></div>' ) ;
}
2018-10-21 13:57:38 +00:00
link . hide ( ) ;
link . after ( progressbar ) ;
$ . post ( '/action' , req , function ( data ) {
if ( data . success ) {
2019-04-23 16:08:07 +00:00
$ ( location ) . attr ( 'href' , data . redirect _to ) ;
2018-10-21 13:57:38 +00:00
} else {
M . toast ( { html : error _icon + ' ' + data . error } ) ;
progressbar . remove ( ) ;
if ( err _callback ) {
err _callback ( ) ;
}
link . append ( ' ' + error _icon ) ;
link . show ( ) ;
}
} ) ;
}
2019-04-23 20:27:13 +00:00
function tvly _update ( ) {
$ . get ( '/ajax/status_card.html' , function ( data ) {
$ ( '.statuscol' ) . html ( data ) ;
tvly _reg _handlers ( ) ;
2019-05-10 15:58:13 +00:00
upd _journey _data ( ) ;
setTimeout ( tvly _update , 40000 ) ;
2019-04-23 20:27:13 +00:00
} ) . fail ( function ( ) {
2019-04-26 20:27:07 +00:00
$ ( '.sync-failed-marker' ) . css ( 'display' , 'block' ) ;
2019-05-10 15:58:13 +00:00
upd _countdown ( ) ;
2019-05-07 16:01:49 +00:00
setTimeout ( tvly _update , 5000 ) ;
2019-05-02 08:05:15 +00:00
} ) ;
}
function tvly _update _public ( ) {
var user _name ;
2023-06-04 16:48:05 +00:00
var profile _status = 0 ;
2019-05-02 08:05:15 +00:00
$ ( '.publicstatuscol' ) . each ( function ( ) {
user _name = $ ( this ) . data ( 'user' ) ;
2023-06-04 16:48:05 +00:00
profile _status = $ ( this ) . data ( 'profile' ) ;
2019-05-02 08:05:15 +00:00
} ) ;
2023-06-04 16:48:05 +00:00
$ . get ( '/ajax/status/' + user _name + '.html' , { token : j _token , profile : profile _status } , function ( data ) {
2019-05-02 08:05:15 +00:00
$ ( '.publicstatuscol' ) . html ( data ) ;
2019-05-10 15:58:13 +00:00
upd _journey _data ( ) ;
setTimeout ( tvly _update _public , 40000 ) ;
2019-05-02 08:05:15 +00:00
} ) . fail ( function ( ) {
$ ( '.sync-failed-marker' ) . css ( 'display' , 'block' ) ;
2019-05-10 15:58:13 +00:00
upd _countdown ( ) ;
2019-05-07 16:01:49 +00:00
setTimeout ( tvly _update _public , 5000 ) ;
2019-04-23 20:27:13 +00:00
} ) ;
}
2019-05-10 15:58:13 +00:00
function tvly _journey _progress ( ) {
var now = Date . now ( ) / 1000 ;
var progress = 0 ;
if ( j _duration > 0 ) {
progress = 1 - ( ( j _arrival - now ) / j _duration ) ;
if ( progress < 0 ) {
progress = 0 ;
}
if ( progress > 1 ) {
progress = 1 ;
}
$ ( '.progress .determinate' ) . css ( 'width' , ( progress * 100 ) + '%' ) ;
2019-10-29 20:18:46 +00:00
for ( stop in j _stops ) {
var stop _name = j _stops [ stop ] [ 0 ] ;
var sched _arr = j _stops [ stop ] [ 1 ] ;
var rt _arr = j _stops [ stop ] [ 2 ] ;
var sched _dep = j _stops [ stop ] [ 3 ] ;
var rt _dep = j _stops [ stop ] [ 4 ] ;
if ( stop _name == j _dest ) {
$ ( '.next-stop' ) . html ( '' ) ;
break ;
}
if ( ( rt _arr != 0 ) && ( rt _arr - now > 0 ) ) {
$ ( '.next-stop' ) . html ( stop _name + '<br/>' + hhmm ( rt _arr ) + odelay ( sched _arr , rt _arr ) ) ;
break ;
}
if ( ( rt _dep != 0 ) && ( rt _dep - now > 0 ) ) {
$ ( '.next-stop' ) . html ( stop _name + '<br/>' + hhmm ( rt _arr ) + ' → ' + hhmm ( rt _dep ) + odelay ( sched _dep , rt _dep ) ) ;
break ;
}
}
2019-05-10 15:58:13 +00:00
setTimeout ( tvly _journey _progress , 5000 ) ;
}
}
2019-04-23 20:27:13 +00:00
function tvly _reg _handlers ( ) {
2018-10-05 14:33:59 +00:00
$ ( '.action-checkin' ) . click ( function ( ) {
var link = $ ( this ) ;
2018-10-21 13:57:38 +00:00
var req = {
2018-10-05 14:33:59 +00:00
action : 'checkin' ,
station : link . data ( 'station' ) ,
train : link . data ( 'train' ) ,
2019-05-19 08:32:57 +00:00
dest : link . data ( 'dest' ) ,
2018-10-05 14:33:59 +00:00
} ;
2019-04-23 16:08:07 +00:00
tvly _run ( link , req ) ;
2018-10-05 14:33:59 +00:00
} ) ;
$ ( '.action-checkout' ) . click ( function ( ) {
var link = $ ( this ) ;
2018-10-21 13:57:38 +00:00
var req = {
2018-10-05 14:33:59 +00:00
action : 'checkout' ,
station : link . data ( 'station' ) ,
force : link . data ( 'force' ) ,
} ;
2019-04-23 16:08:07 +00:00
tvly _run ( link , req , function ( ) {
2022-08-18 16:22:13 +00:00
if ( ! link . data ( 'force' ) ) {
link . append ( ' – Ohne Echtzeitdaten auschecken?' )
link . data ( 'force' , true ) ;
}
2018-10-05 14:33:59 +00:00
} ) ;
} ) ;
2018-11-02 20:35:53 +00:00
$ ( '.action-undo' ) . click ( function ( ) {
var link = $ ( this ) ;
2019-12-08 20:04:34 +00:00
var now = Date . now ( ) / 1000 ;
var checkints = parseInt ( link . data ( 'checkints' ) ) ;
2018-11-02 20:35:53 +00:00
var req = {
action : 'undo' ,
2019-03-31 06:45:51 +00:00
undo _id : link . data ( 'id' ) ,
2018-11-02 20:35:53 +00:00
} ;
2019-12-08 20:04:34 +00:00
var do _checkout = true ;
if ( now - checkints > 900 ) {
do _checkout = confirm ( "Checkin wirklich rückgängig machen? Er kann ggf. nicht wiederholt werden." ) ;
}
if ( do _checkout ) {
tvly _run ( link , req ) ;
}
2019-03-19 17:20:05 +00:00
} ) ;
$ ( '.action-cancelled-from' ) . click ( function ( ) {
var link = $ ( this ) ;
var req = {
action : 'cancelled_from' ,
station : link . data ( 'station' ) ,
train : link . data ( 'train' ) ,
} ;
2019-04-23 16:08:07 +00:00
tvly _run ( link , req ) ;
2019-03-19 17:20:05 +00:00
} ) ;
$ ( '.action-cancelled-to' ) . click ( function ( ) {
var link = $ ( this ) ;
var req = {
action : 'cancelled_to' ,
station : link . data ( 'station' ) ,
force : true ,
} ;
2019-04-23 16:08:07 +00:00
tvly _run ( link , req ) ;
2018-11-02 20:35:53 +00:00
} ) ;
2019-04-04 16:26:53 +00:00
$ ( '.action-delete' ) . click ( function ( ) {
var link = $ ( this ) ;
var req = {
action : 'delete' ,
2019-04-23 16:08:07 +00:00
id : link . data ( 'id' ) ,
2019-04-04 16:26:53 +00:00
checkin : link . data ( 'checkin' ) ,
checkout : link . data ( 'checkout' ) ,
} ;
2019-12-08 20:04:34 +00:00
var really _delete = confirm ( "Diese Zugfahrt wirklich löschen? Der Eintrag wird sofort aus der Datenbank entfernt und kann nicht wiederhergestellt werden." ) ;
2019-04-04 16:26:53 +00:00
if ( really _delete ) {
2019-04-23 16:08:07 +00:00
tvly _run ( link , req ) ;
2019-04-04 16:26:53 +00:00
}
} ) ;
2019-05-12 09:44:28 +00:00
$ ( '.action-share' ) . click ( function ( ) {
2019-11-14 16:47:06 +00:00
var text = $ ( this ) . data ( 'text' ) ;
2019-11-14 17:23:21 +00:00
var url = $ ( this ) . data ( 'url' ) ;
2019-05-12 09:44:28 +00:00
if ( navigator . share ) {
shareObj = {
2019-11-14 16:47:06 +00:00
text : text
2019-05-12 09:44:28 +00:00
} ;
2019-11-14 17:23:21 +00:00
if ( url ) {
shareObj [ 'url' ] = url ;
2019-05-12 09:44:28 +00:00
}
navigator . share ( shareObj ) ;
2019-11-14 16:47:06 +00:00
} else {
var el = document . createElement ( 'textarea' ) ;
2019-11-14 17:23:21 +00:00
if ( url ) {
text += ' ' + url ;
}
2019-11-14 16:47:06 +00:00
el . value = text ;
el . setAttribute ( 'readonly' , '' ) ;
el . style . position = 'absolute' ;
el . style . left = '-9999px' ;
document . body . appendChild ( el ) ;
el . select ( ) ;
el . setSelectionRange ( 0 , 99999 ) ;
document . execCommand ( 'copy' ) ;
document . body . removeChild ( el ) ;
M . toast ( { html : 'Text kopiert: „' + text + '“' } ) ;
2019-05-12 09:44:28 +00:00
}
} ) ;
2019-04-23 20:27:13 +00:00
}
$ ( document ) . ready ( function ( ) {
tvly _reg _handlers ( ) ;
if ( $ ( '.statuscol .autorefresh' ) . length ) {
2019-05-10 15:58:13 +00:00
upd _journey _data ( ) ;
setTimeout ( tvly _update , 40000 ) ;
setTimeout ( tvly _journey _progress , 5000 ) ;
2019-05-02 08:05:15 +00:00
}
if ( $ ( '.publicstatuscol .autorefresh' ) . length ) {
2019-05-10 15:58:13 +00:00
upd _journey _data ( ) ;
setTimeout ( tvly _update _public , 40000 ) ;
setTimeout ( tvly _journey _progress , 5000 ) ;
2019-04-23 20:27:13 +00:00
}
2019-05-07 15:56:40 +00:00
$ ( 'a[href]' ) . click ( function ( ) {
2019-05-06 16:07:53 +00:00
$ ( 'nav .preloader-wrapper' ) . addClass ( 'active' ) ;
} ) ;
2022-12-27 10:07:16 +00:00
const elems = document . querySelectorAll ( '.carousel' ) ;
const instances = M . Carousel . init ( elems , {
fullWidth : true ,
indicators : true }
) ;
2018-10-05 14:33:59 +00:00
} ) ;