<div class="mheader"> <div> % if ($departure->{train_no} or $departure->{train_line}) { <span class="train-line <%= $linetype %>"><%= $departure->{train_type} %> <%= $departure->{train_line} // $departure->{train_no} %></span> <span class="train-no"><%= $departure->{train_line} ? $departure->{train_no} : q{} %></span> % } </div> <div> % if ($departure->{origin}) { <span class="train-origin"><%= $departure->{origin} %></span> → % } <span class="train-dest"><%= $departure->{destination} // q{???} %></span> </div> </div> <!-- mheader --> <div class="mfooter"> <div class="dataline"> <div> <div class="arrival <%= $departure->{arrival_hidden} ? 'timehidden' : q{} %>"> % if ($departure->{is_cancelled} and $departure->{sched_arrival}) { <span class="minfo">An: ––:––</span><br/>Plan: <%= $departure->{sched_arrival} %> % } % elsif ($departure->{arrival_is_cancelled}) { <span class="minfo">Beginnt hier</span><br/>Plan: <%= $departure->{sched_arrival} %> % } % elsif ($departure->{arrival}) { % if ($departure->{arrival} ne $departure->{sched_arrival}) { % if (($departure->{arrival_delay} // 0) < 0) { An: <span class="undelay"><%= $departure->{arrival} %></span> % } % else { An: <span class="minfo"><%= $departure->{arrival} %></span> % } <br/>Plan: <%= $departure->{sched_arrival} %> % } % else { An: <%= $departure->{arrival} %> % } % } % elsif ($departure->{sched_arrival}) { An: <%= $departure->{sched_arrival} %> % } % elsif ($departure->{prep_time}) { Ein: <%= $departure->{prep_time} %> % } % if ($departure->{tz_offset} and $departure->{local_sched_arr}) { <br/>Lokal: <%= $departure->{local_sched_arr}->strftime('%H:%M') %> % } </div> </div> <div> <div class="platform"> % if (@{$departure->{replaced_by}}) { % for my $replacement (@{$departure->{replaced_by}}) { <span class="replaced">Ersatzfahrt: <a href="/z/<%= $replacement %>/<%= stash('station_name') // q{} %>"><%= $replacement %></a></span><br/> % } % } % if (@{$departure->{replacement_for}}) { % for my $replacement (@{$departure->{replacement_for}}) { <span class="replacement">Ersatzfahrt für <a href="/z/<%= $replacement %>/<%= stash('station_name') // q{} %>"><%= $replacement %></a></span><br/> % } % } % if ($departure->{arrival_is_cancelled} and $departure->{departure_is_cancelled}) { <span class="minfo">Fahrt fällt aus</span> % } % else { % my $left = ''; % my $right = ''; % if ($departure->{direction} and $departure->{direction} eq 'l') { % $left = '◀ '; % } % elsif ($departure->{direction} and $departure->{direction} eq 'r') { % $right = ' ▶'; % } % if ($departure->{scheduled_platform} and $departure->{platform} % and $departure->{scheduled_platform} ne $departure->{platform}) { <span class="minfo"><%= $left %>Gleis <%= $departure->{platform} %><%= $right %></span> % } % elsif ($departure->{scheduled_platform} or $departure->{platform}) { <%= $left %>Gleis <%= $departure->{platform} // $departure->{scheduled_platform} %><%= $right %> % } % } % if ($departure->{arrival_hidden} and not $departure->{prep_time}) { <br/><span class="timehidden">Nur Einstieg</span> % } % if ($departure->{departure_hidden}) { <br/><span class="timehidden">Nur Ausstieg</span> % } </div> </div> <div> <div class="departure <%= $departure->{departure_hidden} ? 'timehidden' : q{} %>"> % if ($departure->{is_cancelled} and $departure->{sched_departure}) { <span class="minfo">Ab: ––:––</span><br/>Plan: <%= $departure->{sched_departure} %> % } % elsif ($departure->{departure_is_cancelled}) { <span class="minfo">Endet hier</span><br/>Plan: <%= $departure->{sched_departure} %> % } % elsif ($departure->{departure}) { % if ($departure->{departure} ne $departure->{sched_departure}) { Ab: <span class="minfo"><%= $departure->{departure} %></span> <br/>Plan: <%= $departure->{sched_departure} %> % } % else { Ab: <%= $departure->{departure} %> % } % } % elsif ($departure->{sched_departure}) { Ab: <%= $departure->{sched_departure} %> % } % if ($departure->{tz_offset} and $departure->{local_sched_dep}) { <br/>Lokal: <%= $departure->{local_sched_dep}->strftime('%H:%M') %> % } </div> </div> </div> <!-- dataline --> % if (my $wr = $departure->{wr}) { <div class="wagonorder-preview"> % my @wagons = $wr->wagons; % my $direction = $wr->direction ? $wr->direction == 100 ? '→' : '←' : q{}; % if ($departure->{direction}) { % $direction = $departure->{direction} eq 'l' ? '◀' : '▶'; % if (($departure->{direction} eq 'l' ? 0 : 100) != $wr->direction) { % @wagons = reverse @wagons; % } % } <a href="/_wr/<%= $departure->{train_no} %>/<%= $departure->{wr_link} %>?e=<%= $departure->{direction} // '' %>"> %= $direction % my $gi; % for my $wagon (@wagons) { % if (not ($wagon->is_locomotive or $wagon->is_powercar)) { % if (defined $gi and $gi != $wagon->group_index) { • % } % if ($wagon->is_closed) { X % } % else { %= $wagon->number || ($wagon->type =~ m{AB} ? '½' : $wagon->type =~ m{A} ? '1.' : $wagon->type =~ m{B} ? '2.' : $wagon->type ) % } % } % $gi = $wagon->group_index; % } %= $direction </a> </div> % } <div class="verbose"> % if ($departure->{trip_id}) { % if (stash('station_name')) { <a class="smallbutton" href="/map/<%= $departure->{trip_id} =~ s{#}{%23}gr %>/<%= $departure->{train_line} || 0 %>?from=<%= stash('station_name') %>&hafas=<%= param('hafas') // q{} %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a> % } % else { <a class="smallbutton" href="/map/<%= $departure->{trip_id} =~ s{#}{%23}gr %>/<%= $departure->{train_line} || 0 %>?hafas=<%= param('hafas') // q{} %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a> % } % } % if ($departure->{wr_link}) { <a class="smallbutton" href="/_wr/<%= $departure->{train_no} %>/<%= $departure->{wr_link} %>?e=<%= $departure->{direction} // '' %>"><i class="material-icons" aria-hidden="true">train</i> <%= $departure->{wr_text} || 'Wagen' %> </a> % } % if ($departure->{train_type} and $departure->{train_no}) { <a class="smallbutton" href="https://bahn.expert/details/<%= $departure->{train_type} %>%20<%= $departure->{train_no} %>/<%= ($departure->{date} // DateTime->now(time_zone => 'Europe/Berlin'))->iso8601 %>?evaNumberAlongRoute=<%= $departure->{eva} %>"><img src="/static/icons/bahn-expert.svg">Details</a> % } % for my $link (@{$departure->{links}}) { <a class="smallbutton" href="<%= $link->[1] %>"><i class="material-icons" aria-hidden="true">warning</i> <%= $link->[0] %></a> % } </div> % if (not $departure->{departure_is_cancelled}) { % if (my $u = $departure->{utilization}) { <div class="verbose"> % my ($text, $icon1, $icon2) = utilization_icon($u); <%= $text %><span style="padding-right: 0.5em;">.</span> 1. <i class="material-icons" aria-hidden="true" style="padding-right: 0.5em; vertical-align: bottom;"><%= $icon1 %></i> 2. <i class="material-icons" aria-hidden="true" style="vertical-align: bottom;"><%= $icon2 %></i> </div> % } % elsif (my $o = $departure->{occupancy}) { <div class="verbose"> % my ($text, $icon) = occupancy_icon($o); <%= $text %><span style="padding-right: 0.5em;">.</span> <i class="material-icons" aria-hidden="true" style="padding-right: 0.5em; vertical-align: bottom;"><%= $icon %></i></i> </div> % } % } % % if ($departure->{missing_realtime}) { <div class="verbose"> <i class="material-icons no-realtime" aria-hidden="true" style="padding-right: 0.5em; vertical-align: bottom;">gps_off</i> Echtzeitdaten fehlen. Ob die Zugfahrt wie im Fahrplan vorgesehen stattfindet, ist nicht bekannt. </div> % } % elsif ($departure->{no_realtime_yet}) { <div class="verbose"> <i class="material-icons" aria-hidden="true" style="padding-right: 0.5em; vertical-align: bottom;">gps_off</i> Für diese Zugfahrt sind derzeit nur Fahrplandaten bekannt. </div> % } % if ($departure->{moreinfo} and @{$departure->{moreinfo}}) { Meldungen <ul class="messages"> % for my $pair (@{$departure->{moreinfo}}) { <li> % if (ref($pair->[0]) eq 'DateTime') { % if ($pair->[0]->day != $dt_now->day) { % $pair->[0]->set_locale('de_DE'); %= $pair->[0]->strftime('%a %H:%M') % } % else { %= $pair->[0]->strftime('%H:%M') % } <span class="reason"> %= $pair->[1] </span> % } % else { % if ($pair->[1]{icon}) { <i class="material-icons"><%= $pair->[1]{icon} %></i> % } %= $pair->[0] % if (length($pair->[0]) > 25) { <br/> % } <span class="reason"> %= $pair->[1]{text} </span> % } </li> % } % if ($departure->{route_info}) { <li><%= $departure->{route_info} %></li> % } </ul> % } % if ($departure->{route_pre_diff} and $departure->{route_post_diff}) { % if ($departure->{date}) { Fahrtverlauf am % if (stash('train') !~ m{[|]}) { <a href="<%= url_for('train', train => stash('train'))->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas'), date => $departure->{date}->clone->subtract(days => 1)->strftime('%d.%m.%Y'), highlight => param('highlight') // stash('station')}) %>">◀</a> % } %= $departure->{date}->strftime('%d.%m.%Y') % if (stash('train') !~ m{[|]}) { <a href="<%= url_for('train', train => stash('train'))->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas'), date => $departure->{date}->clone->add(days => 1)->strftime('%d.%m.%Y'), highlight => param('highlight') // stash('station')}) %>">▶</a> % } % } <ul class="mroute"> % for my $stop (@{$departure->{route_pre_diff}}) { <li class="<%= $stop->{isPast} ? 'past-stop' : 'future-stop' %>"> <a href="<%= url_for('station', station => $stop->{eva} // $stop->{name})->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class=" % if ($stop->{isAdditional}) { additional-stop % } % elsif ($stop->{isCancelled}) { cancelled-stop % } % elsif ($self->is_important($stop->{name})) { important-stop % } % else { generic-stop % } % if (($stop->{rt_dep} and $stop->{dep_delay}) or (not $stop->{rt_dep} and $stop->{rt_arr} and $stop->{arr_delay})) { "><%= ($stop->{rt_dep} // $stop->{rt_arr})->strftime('%H:%M') %> <span class="sched-delayed"><%= ($stop->{sched_dep} // $stop->{sched_arr})->strftime('%H:%M') %></span> % } % else { "><%= ($stop->{sched_dep} // $stop->{sched_arr}) ? ($stop->{sched_dep} // $stop->{sched_arr})->strftime('%H:%M') : q{} %> % if ($stop->{rt_bogus}) { <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i> % } % } % if ($stop->{tz_offset} and $stop->{local_dt_da}) { (lokal <%= $stop->{local_dt_da}->strftime('%H:%M') %>) % } <%= $stop->{name} %></a> % if ($stop->{load}{FIRST} or $stop->{load}{SECOND}) { % my ($text, $icon1, $icon2) = utilization_icon([$stop->{load}{FIRST}, $stop->{load}{SECOND}]); <i class="material-icons" aria-hidden="true"><%= $icon1 %></i> <i class="material-icons" aria-hidden="true"><%= $icon2 %></i> % } </li> % } % if (stash('station_name')) { <li class="<%= $departure->{is_cancelled} ? 'cancelled-stop' : q{} %> <%= $departure->{isPast} ? 'past-stop' : 'future-stop' %>"> %= $departure->{departure} // $departure->{arrival} // $departure->{sched_departure} // $departure->{sched_arrival} // q{} % if ($departure->{departure} and $departure->{sched_departure} and $departure->{departure} ne $departure->{sched_departure}) { <span class="sched-delayed"><%= $departure->{sched_departure} // $departure->{sched_arrival} // q{} %></span> % } % elsif ($departure->{arrival} and $departure->{sched_arrival} and $departure->{arrival} ne $departure->{sched_arrival}) { <span class="sched-delayed"><%= $departure->{sched_departure} // $departure->{sched_arrival} // q{} %></span> % } % if ($departure->{missing_realtime} or $departure->{no_realtime_yet}) { <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i> % } % if ($departure->{tz_offset} and $departure->{local_dt_da}) { (lokal <%= $departure->{local_dt_da}->strftime('%H:%M') %>) % } <strong><%= stash('station_name') %></strong> % if (my $u = $departure->{utilization}) { % my ($text, $icon1, $icon2) = utilization_icon($u); <i class="material-icons" aria-hidden="true"><%= $icon1 %></i> <i class="material-icons" aria-hidden="true"><%= $icon2 %></i> % } </li> % } % for my $stop (@{$departure->{route_post_diff}}) { <li class="<%= $stop->{isPast} ? 'past-stop' : 'future-stop' %>"> <a href="<%= url_for('station', station => $stop->{eva} // $stop->{name})->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class=" % if ($stop->{isAdditional}) { additional-stop % } % elsif ($stop->{isCancelled}) { cancelled-stop % } % elsif ($self->is_important($stop->{name})) { important-stop % } % else { generic-stop % } % if (($stop->{rt_arr} and $stop->{arr_delay}) or (not $stop->{rt_arr} and $stop->{rt_dep} and $stop->{dep_delay})) { "><%= ($stop->{rt_arr} // $stop->{rt_dep})->strftime('%H:%M') %> <span class="sched-delayed"><%= ($stop->{sched_arr} // $stop->{sched_dep})->strftime('%H:%M') %></span> % } % else { "><%= ($stop->{sched_arr} // $stop->{sched_dep}) ? ($stop->{sched_arr} // $stop->{sched_dep})->strftime('%H:%M') : q{} %> % if ($stop->{rt_bogus}) { <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i> % } % } % if ($stop->{tz_offset} and $stop->{local_dt_ad}) { (lokal <%= $stop->{local_dt_ad}->strftime('%H:%M') %>) % } <%= $stop->{name} %></a> % if ($stop->{load}{FIRST} or $stop->{load}{SECOND}) { % my ($text, $icon1, $icon2) = utilization_icon([$stop->{load}{FIRST}, $stop->{load}{SECOND}]); <i class="material-icons" aria-hidden="true"><%= $icon1 %></i> <i class="material-icons" aria-hidden="true"><%= $icon2 %></i> % } </li> % } </ul> <!-- mroute --> % } % if ($departure->{operator}) { <div class="details">Betrieb: <%= $departure->{operator} %></div> % } % if ($departure->{details} and @{$departure->{details}}) { <div class="details">Details: <ul> % for my $pair (@{$departure->{details}}) { <li> % if ($pair->[1]{icon}) { <i class="material-icons"><%= $pair->[1]{icon} %></i> % } %= $pair->[0] % if (length($pair->[0]) > 25) { <br/> % } <span class="reason"> %= $pair->[1]{text} </span> </li> % } % if ($departure->{route_info}) { <li><%= $departure->{route_info} %></li> % } </ul> </div> % } </div> <!-- mfooter -->