| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /proc/self/root/tmp/ |
Upload File : |
<!DOCTYPE html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover"><meta name="robots" content="noindex,nofollow"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="theme-color" content="#0d2c44"><link rel="manifest" href="https://seaside.pacim.de/manifest.php?term=a9023dd8ba92734f06453c52"><link rel="apple-touch-icon" href="https://seaside.pacim.de/assets/webapp/icon-180.png"><meta name="apple-mobile-web-app-title" content="PaCIM Terminal"><title>ZZ_TERM</title><style>
:root{--navy:#0d2c44;--navy2:#11436b;--blue:#1b6ca8;--ink:#16384f;--muted:#5b7488;--line:#e6eef4;}
*{box-sizing:border-box;margin:0;padding:0;}
.d-none{display:none!important;}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;}
body{font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;background:#eef3f7;color:var(--ink);min-height:100vh;
padding:calc(env(safe-area-inset-top,0px)) env(safe-area-inset-right,0px) calc(40px + env(safe-area-inset-bottom,0px)) env(safe-area-inset-left,0px);touch-action:manipulation;}
.hd{background:linear-gradient(135deg,var(--navy) 0%,var(--navy2) 65%,var(--blue) 130%);color:#fff;padding:22px 18px 18px;}
.tm-hdwrap{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;}
.tm-hdact{flex:0 0 auto;display:flex;gap:8px;}
.tm-set{flex:0 0 auto;width:40px;height:40px;border:0;border-radius:50%;background:rgba(255,255,255,.16);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;text-decoration:none;-webkit-tap-highlight-color:transparent;}
.tm-set:active{background:rgba(255,255,255,.3);} .tm-set svg{width:21px;height:21px;}
/* „Alle Ansichten": gleiche Außen-Abstände (Seitengutter) wie der Dashboard-Slider */
.tm-allwrap{padding:0 14px;}
.tmset-lbl{display:block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:12px 0 5px;}
.tmset-in{width:100%;border:1px solid var(--line);border-radius:10px;padding:11px 12px;font-size:15px;font-family:inherit;}
.tmset-pinbtn{width:100%;border:1px dashed #cdd9e4;background:#f6f9fc;border-radius:10px;padding:12px;font-size:15px;font-weight:700;color:var(--navy);cursor:pointer;font-family:inherit;}
.tmset-hint{font-size:12px;color:var(--muted);margin-top:6px;}
.tmset-msg{font-size:13px;font-weight:600;margin:10px 0;min-height:16px;} .tmset-msg.ok{color:#1d7a33;} .tmset-msg.err{color:#a23030;}
.tmset-save{width:100%;background:var(--blue);color:#fff;border:0;border-radius:11px;padding:13px;font-size:16px;font-weight:800;cursor:pointer;font-family:inherit;}
.hd .k{font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;opacity:.8;}
.hd .t{font-size:22px;font-weight:800;margin-top:3px;}
.wrap{max-width:560px;margin:0 auto;}
.grid{display:grid;grid-template-columns:1fr;gap:12px;padding:16px;}
@media(min-width:480px){.grid{grid-template-columns:1fr 1fr;}}
.tile{display:block;text-decoration:none;color:inherit;background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px;box-shadow:0 2px 8px rgba(13,44,68,.06);transition:transform .08s ease,box-shadow .12s ease;}
.tile:active{transform:scale(.98);}
.tile .tl{font-size:17px;font-weight:800;color:var(--navy);}
.tile .td{font-size:13px;color:var(--muted);margin-top:2px;}
.tile .chips{margin-top:8px;display:flex;flex-wrap:wrap;gap:5px;}
.chip{background:#eef3f7;border-radius:999px;padding:2px 9px;font-size:11.5px;font-weight:600;color:var(--navy);}
.tile .go{margin-top:10px;font-size:13px;font-weight:700;color:var(--blue);}
.empty{margin:30px 18px;padding:24px;background:#fff;border-radius:14px;text-align:center;color:var(--muted);border:1px dashed var(--line);}
.foot{color:var(--muted);font-size:12px;text-align:center;margin-top:8px;}
/* Dashboard-Slider (oben): bis zu 3 Anreisetage als native Widget-Karten (horizontal swipebar). */
.dswipe-wrap{padding:14px 0 4px;}
.dswipe{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;gap:0;scrollbar-width:none;}
.dswipe::-webkit-scrollbar{display:none;}
.dslide{flex:0 0 100%;scroll-snap-align:center;padding:0 14px;box-sizing:border-box;}
.dwidget{background:#fff;border-radius:16px;box-shadow:0 4px 18px rgba(13,44,68,.12);overflow:hidden;display:flex;flex-direction:column;max-height:66vh;}
.dwidget-h{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:14px 16px 4px;}
.dwidget-k{font-size:10.5px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#8aa0b3;}
.dwidget-t{font-size:18px;font-weight:800;color:#16384f;margin-top:2px;}
.dwidget-open{flex:0 0 auto;background:#eef3f7;color:#1b6ca8;text-decoration:none;font-size:13px;font-weight:700;border-radius:9px;padding:7px 11px;}
.dwidget-open:active{background:#dde7f0;}
.dwidget-sub{padding:0 16px 10px;font-size:13px;color:#5b7488;font-weight:600;border-bottom:1px solid #eef3f7;}
.dwidget .dwt{flex:1 1 auto;min-height:0;}
.dwidget .dwt-body .dw-card:last-child{border-bottom:0;}
.dwidget-body{overflow-y:auto;-webkit-overflow-scrolling:touch;}
.dwidget-body .dw-card:last-child{border-bottom:0;}
.dwidget-empty{padding:24px 16px;text-align:center;color:#8aa0b3;}
.dwt-sub{padding:10px 16px;font-size:13px;color:#5b7488;font-weight:600;border-bottom:1px solid #eef3f7;}
.dwt-load{display:flex;align-items:center;justify-content:center;gap:10px;padding:46px 16px;color:#8aa0b3;font-size:14px;}
.ddots{display:flex;justify-content:center;gap:7px;margin-top:10px;}
.ddot{width:8px;height:8px;border-radius:50%;background:#c4d2de;transition:background .15s,transform .15s;}
.ddot.on{background:var(--navy);transform:scale(1.25);}
.sec-h{max-width:560px;margin:18px auto 0;padding:0 16px;font-size:12px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);}
/* Login-Auswahl (mehrere Login-Zugänge) */
.login-pick{padding:16px;}
.login-pick-h{font-size:13px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin:4px 2px 12px;}
.login-item{display:flex;align-items:center;gap:14px;background:#fff;border:1px solid var(--line);border-radius:14px;padding:16px;margin-bottom:10px;text-decoration:none;color:inherit;box-shadow:0 2px 8px rgba(13,44,68,.06);}
.login-item:active{transform:scale(.99);}
.login-ic{flex:0 0 auto;width:42px;height:42px;border-radius:50%;background:var(--navy);color:#fff;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:800;}
.login-nm{flex:1;min-width:0;font-size:17px;font-weight:700;color:var(--navy);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.login-item svg{width:20px;height:20px;color:var(--muted);flex:0 0 auto;}
/* Alle Ansichten: nach Datum gruppiert (Akkordeon) + Info-Modal */
.dgroup{background:#fff;border:1px solid var(--line);border-radius:14px;margin-bottom:10px;overflow:hidden;box-shadow:0 2px 8px rgba(13,44,68,.05);}
.dgroup-h{width:100%;display:flex;align-items:center;gap:10px;background:none;border:0;cursor:pointer;padding:14px 16px;font:inherit;text-align:left;-webkit-tap-highlight-color:transparent;}
.dgroup-l{flex:1;min-width:0;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;}
.dgroup-d{font-size:16px;font-weight:800;color:var(--navy);}
.dgroup-rel{font-size:12px;font-weight:700;color:#fff;background:var(--blue);border-radius:999px;padding:2px 9px;}
.dgroup-n{flex:0 0 auto;background:#eef3f7;color:var(--navy);font-size:13px;font-weight:800;border-radius:999px;min-width:24px;height:24px;display:flex;align-items:center;justify-content:center;padding:0 7px;}
.dgroup-c{width:20px;height:20px;color:var(--muted);transition:transform .18s ease;flex:0 0 auto;}
.dgroup.open .dgroup-c{transform:rotate(180deg);}
.dgroup-body{display:none;border-top:1px solid var(--line);}
.dgroup.open .dgroup-body{display:block;}
.vrow{display:flex;align-items:stretch;border-bottom:1px solid var(--line);}
.vrow:last-child{border-bottom:0;}
.vrow-main{flex:1;min-width:0;display:flex;align-items:center;gap:10px;text-decoration:none;color:inherit;padding:13px 14px;-webkit-tap-highlight-color:transparent;}
.vrow-main:active{background:#f4f8fb;}
.vmode{flex:0 0 auto;font-size:11px;font-weight:800;border-radius:7px;padding:3px 8px;text-transform:uppercase;letter-spacing:.02em;}
.vmode.m-anreise{background:#e7f1fb;color:#1b6ca8;} .vmode.m-abreise{background:#fdeee7;color:#b5651d;} .vmode.m-dashboard{background:#e9f7ee;background:#e6f4ea;color:#1d7a33;}
.vtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
.vlabel{font-size:15px;font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.vstatus{font-size:12px;color:var(--muted);font-weight:600;} .vstatus b{color:var(--navy);}
.vgo{width:18px;height:18px;color:var(--muted);flex:0 0 auto;}
.vinfo{flex:0 0 auto;width:50px;border:0;border-left:1px solid var(--line);background:none;color:var(--blue);cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-tap-highlight-color:transparent;}
.vinfo svg{width:22px;height:22px;} .vinfo:active{background:#eef3f7;}
.vmodal{position:fixed;inset:0;z-index:70;background:rgba(13,44,68,.45);display:flex;align-items:flex-end;}
.vsheet{background:#fff;width:100%;max-width:560px;margin:0 auto;border-radius:18px 18px 0 0;max-height:80vh;display:flex;flex-direction:column;padding-bottom:env(safe-area-inset-bottom,0px);}
.vsheet-h{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:16px 18px;font-size:17px;font-weight:800;color:var(--navy);border-bottom:1px solid var(--line);}
.vsheet-x{background:none;border:0;font-size:28px;line-height:1;color:var(--muted);cursor:pointer;}
.vsheet-b{overflow-y:auto;padding:16px 18px 22px;}
.vsheet-sub{font-size:12.5px;color:var(--muted);margin-bottom:12px;}
.vbadges{display:flex;flex-wrap:wrap;gap:8px;}
.vbadge{border-radius:999px;padding:7px 13px;font-size:13.5px;font-weight:700;border:1.5px solid transparent;}
.vbadge.b-mode{background:var(--navy);color:#fff;}
.vbadge.b-info{background:#eef3f7;color:var(--navy);border-color:#dde7f0;}
.vbadge.b-ok{background:#e6f4ea;color:#1d7a33;}
.vbadge.b-warn{background:#fdeee7;color:#b5651d;}
.vbadge.b-lock{background:#fdeaea;color:#a23030;}
/* „Alle anzeigen"-Button (weitere Termin-Tage nachladen) */
.term-more{width:100%;max-width:560px;margin:4px auto 0;display:flex;align-items:center;justify-content:center;gap:10px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px;font:inherit;font-size:15px;font-weight:700;color:var(--blue);cursor:pointer;box-shadow:0 2px 8px rgba(13,44,68,.05);-webkit-tap-highlight-color:transparent;}
.term-more:active{background:#f4f8fb;}
.tm-spin{width:18px;height:18px;border:2.5px solid #cdd9e4;border-top-color:var(--blue);border-radius:50%;animation:tmspin .7s linear infinite;}
@keyframes tmspin{to{transform:rotate(360deg);}}
.dw-card{background:#fff;padding:14px 16px 6px;border-bottom:1px solid #e6eef4;}
.dw-card.dw-sumcard{background:#f5f9fc;}
.dw-card-h{font-size:17px;font-weight:800;color:#16384f;}
.dw-muted{font-weight:600;opacity:.55;font-size:14px;}
.dw-sub{font-size:12.5px;opacity:.6;margin-top:1px;}
.dw-stat{margin-top:12px;}
.dw-stat-t{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;opacity:.6;margin-bottom:4px;}
.dw-stat.is-total .dw-stat-t{color:#1b6ca8;opacity:1;}
.dw-grid{display:flex;gap:4px;}
.dw-grid>div{flex:1;text-align:center;padding:4px 2px;}
.dw-grid .dl{display:block;font-size:10.5px;text-transform:uppercase;letter-spacing:.03em;opacity:.55;}
.dw-grid .dv{display:block;font-size:23px;font-weight:800;line-height:1.15;margin-top:2px;color:#16384f;}
.dw-grid .dv.h{color:#c0392b;} .dw-grid .dv.a{color:#1d7a33;} .dw-grid .dv.v{color:#1b6ca8;}
.dw-grid>div.g .dv{color:#0d2c44;}
/* Getabbtes Widget (Terminal-Startseite) */
.dwt{display:flex;flex-direction:column;min-height:0;}
.dwt-tabs{display:flex;border-bottom:1px solid #eef3f7;overflow-x:auto;scrollbar-width:none;flex:0 0 auto;}
.dwt-tabs::-webkit-scrollbar{display:none;}
.dwt-tab{flex:1 0 auto;min-width:78px;border:0;background:none;padding:11px 12px;font:inherit;font-size:13px;font-weight:700;color:#5b7488;cursor:pointer;position:relative;-webkit-tap-highlight-color:transparent;white-space:nowrap;}
.dwt-tab.on{color:#1b6ca8;}
.dwt-tab.on::after{content:"";position:absolute;left:14%;right:14%;bottom:0;height:3px;border-radius:3px 3px 0 0;background:#1b6ca8;}
.dwt-body{overflow-y:auto;-webkit-overflow-scrolling:touch;min-height:0;}
.dwt-pane{display:none;} .dwt-pane.on{display:block;}
/* PIN-Screen: gemeinsame Komponente (pacim_pin_css), hier nicht nötig. */
.err{max-width:440px;background:#fff;border-radius:18px;padding:34px 26px;text-align:center;box-shadow:0 14px 40px rgba(13,44,68,.16);margin:60px auto;}
.err h1{font-size:40px;color:var(--navy);} .err p{color:var(--muted);margin-top:8px;}</style></head><body><div class="hd"><div class="wrap tm-hdwrap"><div><div class="k">Terminal</div><div class="t">ZZ_TERM</div></div>
<div class="tm-hdact">
<a class="tm-set" href="?h=a9023dd8ba92734f06453c52&action=logout" title="Abmelden" aria-label="Abmelden"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><path d="M16 17l5-5-5-5"/><path d="M21 12H9"/></svg></a>
<button type="button" class="tm-set" id="tmSetBtn" title="Einstellungen" aria-label="Einstellungen"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></button>
</div></div></div>
<div class="wrap dswipe-wrap">
<div class="dswipe" id="dswipe">
<div class="dslide">
<div class="dwidget">
<div class="dwidget-h">
<div><div class="dwidget-k">Dashboard · Anreisetag</div><div class="dwidget-t">Sa, 27.06.2026</div></div>
<a class="dwidget-open" href="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-06-27">Details →</a>
</div>
<div class="dwt" data-src="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-06-27&action=dashwidget"><div class="dwt-load"><span class="tm-spin"></span> Kennzahlen werden geladen …</div></div>
</div>
</div>
<div class="dslide">
<div class="dwidget">
<div class="dwidget-h">
<div><div class="dwidget-k">Dashboard · Anreisetag</div><div class="dwidget-t">So, 28.06.2026</div></div>
<a class="dwidget-open" href="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-06-28">Details →</a>
</div>
<div class="dwt" data-src="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-06-28&action=dashwidget"><div class="dwt-load"><span class="tm-spin"></span> Kennzahlen werden geladen …</div></div>
</div>
</div>
<div class="dslide">
<div class="dwidget">
<div class="dwidget-h">
<div><div class="dwidget-k">Dashboard · Anreisetag</div><div class="dwidget-t">Fr, 03.07.2026</div></div>
<a class="dwidget-open" href="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-03">Details →</a>
</div>
<div class="dwt" data-src="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-03&action=dashwidget"><div class="dwt-load"><span class="tm-spin"></span> Kennzahlen werden geladen …</div></div>
</div>
</div>
<div class="dslide">
<div class="dwidget">
<div class="dwidget-h">
<div><div class="dwidget-k">Dashboard · Anreisetag</div><div class="dwidget-t">Sa, 04.07.2026</div></div>
<a class="dwidget-open" href="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-04">Details →</a>
</div>
<div class="dwt" data-src="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-04&action=dashwidget"><div class="dwt-load"><span class="tm-spin"></span> Kennzahlen werden geladen …</div></div>
</div>
</div>
<div class="dslide">
<div class="dwidget">
<div class="dwidget-h">
<div><div class="dwidget-k">Dashboard · Anreisetag</div><div class="dwidget-t">So, 05.07.2026</div></div>
<a class="dwidget-open" href="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-05">Details →</a>
</div>
<div class="dwt" data-src="https://seaside.pacim.de/day-list.php?t=29af348a04d7729d50e9243a&term=a9023dd8ba92734f06453c52&d=2026-07-05&action=dashwidget"><div class="dwt-load"><span class="tm-spin"></span> Kennzahlen werden geladen …</div></div>
</div>
</div>
</div>
<div class="ddots" id="ddots"><span class="ddot on"></span><span class="ddot"></span><span class="ddot"></span><span class="ddot"></span><span class="ddot"></span></div></div>
<div class="wrap tm-allwrap">
<div class="empty">Aktuell keine an-/abreisenden Fahrzeuge in den zugeordneten Ansichten.</div>
<div class="foot">PaCIM Terminal</div>
</div>
<!-- Info-Modal: Berechtigungen/Filter einer Ansicht -->
<div class="vmodal d-none" id="vModal">
<div class="vsheet">
<div class="vsheet-h"><span id="vmTitle">Ansicht</span><button type="button" class="vsheet-x" id="vmClose">×</button></div>
<div class="vsheet-b"><div class="vsheet-sub">Berechtigungen & Filter dieser Ansicht</div><div class="vbadges" id="vmBadges"></div></div>
</div>
</div>
<!-- Einstellungen (eigene PIN / E-Mail) -->
<div class="vmodal d-none" id="tmSet">
<div class="vsheet">
<div class="vsheet-h"><span>Einstellungen</span><button type="button" class="vsheet-x" id="tmSetX">×</button></div>
<div class="vsheet-b">
<label class="tmset-lbl">E-Mail</label>
<input type="email" class="tmset-in" id="tmSetEmail" value="" placeholder="optional">
<label class="tmset-lbl">PIN</label>
<button type="button" class="tmset-pinbtn" id="tmSetPinBtn">PIN ändern</button>
<input type="hidden" id="tmSetPin" value="">
<div class="tmset-hint">PIN leer lassen = unverändert.</div>
<div class="tmset-msg" id="tmSetMsg"></div>
<button type="button" class="tmset-save" id="tmSetSave">Speichern</button>
</div>
</div>
</div>
<script src="https://seaside.pacim.de/assets/js/pin-pad-modal.js?v=1782529534"></script>
<script>(function(){
var btn=document.getElementById('tmSetBtn'), m=document.getElementById('tmSet'); if(!btn||!m) return;
var emailEl=document.getElementById('tmSetEmail'), pinHid=document.getElementById('tmSetPin'),
pinBtn=document.getElementById('tmSetPinBtn'), msg=document.getElementById('tmSetMsg'), save=document.getElementById('tmSetSave');
btn.addEventListener('click', function(){ pinHid.value=''; pinBtn.textContent='PIN ändern'; msg.textContent=''; m.classList.remove('d-none'); });
document.getElementById('tmSetX').addEventListener('click', function(){ m.classList.add('d-none'); });
m.addEventListener('click', function(e){ if(e.target===m) m.classList.add('d-none'); });
if(window.PinSetter) PinSetter.attach(pinBtn, pinHid, { title:'Neue PIN festlegen', optional:true, setLabel:'PIN ändern' });
save.addEventListener('click', function(){ save.disabled=true; msg.textContent='Speichern …'; msg.className='tmset-msg';
var b=new URLSearchParams(); b.set('action','settings_save'); b.set('h','a9023dd8ba92734f06453c52'); b.set('email', emailEl.value||''); b.set('pin', pinHid.value||'');
fetch(location.pathname,{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:b.toString()})
.then(function(r){return r.json();}).then(function(res){ save.disabled=false;
if(res&&res.ok){ msg.textContent='✓ Gespeichert.'; msg.className='tmset-msg ok'; setTimeout(function(){ m.classList.add('d-none'); },900); }
else { msg.textContent=(res&&res.error)||'Fehler.'; msg.className='tmset-msg err'; } })
.catch(function(){ save.disabled=false; msg.textContent='Netzwerkfehler.'; msg.className='tmset-msg err'; });
});
})();</script>
<script>(function(){
var modal=document.getElementById('vModal'), vmB=document.getElementById('vmBadges'), vmT=document.getElementById('vmTitle');
var KMAP={mode:'b-mode',info:'b-info',ok:'b-ok',warn:'b-warn',lock:'b-lock'};
function esc(s){return String(s==null?'':s).replace(/[&<>"]/g,function(c){return {'&':'&','<':'<','>':'>','"':'"'}[c];});}
// Akkordeon (Datum auf-/zuklappen) + Info-Button (Berechtigungs-Modal), delegiert.
document.addEventListener('click', function(e){
var h=e.target.closest('.dgroup-h'); if(h){ var g=h.closest('.dgroup'); var op=g.classList.toggle('open'); h.setAttribute('aria-expanded', op?'true':'false'); return; }
var inf=e.target.closest('.vinfo'); if(inf && modal){ vmT.textContent=inf.getAttribute('data-title')||'Ansicht'; var arr=[]; try{ arr=JSON.parse(inf.getAttribute('data-badges')||'[]'); }catch(_){}
vmB.innerHTML=arr.map(function(b){ return '<span class="vbadge '+(KMAP[b.k]||'b-info')+'">'+esc(b.t)+'</span>'; }).join(''); modal.classList.remove('d-none'); return; }
});
if(modal){ document.getElementById('vmClose').addEventListener('click',function(){ modal.classList.add('d-none'); });
modal.addEventListener('click',function(e){ if(e.target===modal) modal.classList.add('d-none'); }); }
// „Alle anzeigen": weitere Termin-Tage per AJAX nachladen (Ladesymbol bis fertig).
var moreBtn=document.getElementById('termMoreBtn'), moreBox=document.getElementById('termMore'), moreSpin=document.getElementById('termMoreSpin');
if(moreBtn && moreBox){ moreBtn.addEventListener('click', function(){
var off=moreBtn.getAttribute('data-offset')||'0'; moreBtn.disabled=true;
var lab=moreBtn.querySelector('.tm-label'); if(lab) lab.classList.add('d-none'); if(moreSpin) moreSpin.classList.remove('d-none');
var u=location.pathname+location.search; u+=(u.indexOf('?')>=0?'&':'?')+'action=more&offset='+encodeURIComponent(off);
fetch(u,{headers:{'X-Requested-With':'XMLHttpRequest'},cache:'no-store'}).then(function(r){return r.ok?r.text():'';}).then(function(html){
moreBox.insertAdjacentHTML('beforeend', html||''); moreBtn.parentNode.removeChild(moreBtn);
}).catch(function(){ moreBtn.disabled=false; if(lab) lab.classList.remove('d-none'); if(moreSpin) moreSpin.classList.add('d-none'); });
}); }
})();</script>
<script>(function(){
// Dots-Indikator für den Tages-Slider
var sw=document.getElementById('dswipe'), dots=document.getElementById('ddots');
if(sw&&dots){ var d=dots.querySelectorAll('.ddot');
sw.addEventListener('scroll',function(){ var i=Math.round(sw.scrollLeft/sw.clientWidth); for(var k=0;k<d.length;k++) d[k].classList.toggle('on',k===i); },{passive:true}); }
// Tab-Umschaltung in den Widgets (delegiert – funktioniert für alle Tages-Widgets).
document.addEventListener('click',function(e){ var b=e.target.closest('.dwt-tab'); if(!b) return;
var dwt=b.closest('.dwt'); if(!dwt) return; var p=b.getAttribute('data-p');
var ts=dwt.querySelectorAll('.dwt-tab'); for(var i=0;i<ts.length;i++) ts[i].classList.toggle('on', ts[i]===b);
var ps=dwt.querySelectorAll('.dwt-pane'); for(var j=0;j<ps.length;j++) ps[j].classList.toggle('on', ps[j].getAttribute('data-p')===p);
});
// Zahlen live nachladen (AJAX, jede Minute) – aktiver Tab + Scrollposition bleiben erhalten.
function refresh(){
var ws=document.querySelectorAll('.dwt[data-src]');
for(var i=0;i<ws.length;i++){ (function(dwt){
fetch(dwt.getAttribute('data-src'),{headers:{'X-Requested-With':'XMLHttpRequest'},cache:'no-store'})
.then(function(r){return r.ok?r.text():null;}).then(function(html){ if(!html) return;
var at=dwt.querySelector('.dwt-tab.on'); var ap=at?at.getAttribute('data-p'):'ges';
var body=dwt.querySelector('.dwt-body'); var sc=body?body.scrollTop:0;
dwt.innerHTML=html;
var tb=dwt.querySelector('.dwt-tab[data-p="'+ap+'"]');
if(tb){ var ts=dwt.querySelectorAll('.dwt-tab'); for(var k=0;k<ts.length;k++) ts[k].classList.toggle('on',ts[k]===tb);
var ps=dwt.querySelectorAll('.dwt-pane'); for(var m=0;m<ps.length;m++) ps[m].classList.toggle('on',ps[m].getAttribute('data-p')===ap); }
var nb=dwt.querySelector('.dwt-body'); if(nb) nb.scrollTop=sc;
}).catch(function(){});
})(ws[i]); }
}
refresh(); // sofort laden (Kennzahlen erscheinen, sobald fertig)
setInterval(refresh, 60000);
})();</script>
<script>(function(){function go(){var e=document.documentElement,r=e.requestFullscreen||e.webkitRequestFullscreen;if(r){try{r.call(e);}catch(_){}}}document.addEventListener("pointerdown",function f(e){if(e.target&&e.target.closest&&e.target.closest("a,button,input,textarea,select,label"))return;document.removeEventListener("pointerdown",f);go();},{passive:true});})();</script><style>
#pwi-ov{position:fixed;inset:0;z-index:9000;display:none;flex-direction:column;align-items:center;justify-content:flex-start;
background:linear-gradient(160deg,#0d2c44 0%,#11436b 60%,#1b6ca8 130%);color:#fff;overflow-y:auto;-webkit-overflow-scrolling:touch;
padding:calc(34px + env(safe-area-inset-top,0px)) 22px calc(28px + env(safe-area-inset-bottom,0px));
font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;}
#pwi-ov.pwi-show{display:flex;}
.pwi-card{width:100%;max-width:430px;margin:auto 0;text-align:center;}
.pwi-icon{width:96px;height:96px;border-radius:22px;box-shadow:0 12px 34px rgba(0,0,0,.32);margin:0 auto 18px;display:block;background:#fff;}
.pwi-name{font-size:25px;font-weight:800;letter-spacing:.2px;}
.pwi-sub{font-size:14.5px;opacity:.82;margin-top:6px;line-height:1.5;}
.pwi-steps{margin:22px 0 6px;text-align:left;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14);border-radius:16px;padding:16px 16px 6px;}
.pwi-step{display:flex;align-items:flex-start;gap:12px;padding:0 0 14px;}
.pwi-num{flex:0 0 auto;width:26px;height:26px;border-radius:50%;background:#fff;color:#0d2c44;font-weight:800;font-size:14px;display:flex;align-items:center;justify-content:center;margin-top:1px;}
.pwi-txt{font-size:14.5px;line-height:1.5;}
.pwi-txt b{font-weight:800;}
.pwi-ic{display:inline-flex;vertical-align:-5px;margin:0 1px;}
.pwi-ic svg{width:19px;height:19px;}
.pwi-install{display:none;width:100%;margin-top:18px;background:#fff;color:#0d2c44;border:0;border-radius:13px;padding:15px;font-size:16px;font-weight:800;cursor:pointer;-webkit-tap-highlight-color:transparent;}
.pwi-install:active{transform:scale(.98);}
.pwi-install.pwi-show{display:block;}
.pwi-cont{display:inline-block;margin-top:18px;color:#cfe2f2;font-size:14px;font-weight:600;text-decoration:underline;cursor:pointer;background:none;border:0;-webkit-tap-highlight-color:transparent;}
.pwi-hint{font-size:12px;opacity:.6;margin-top:14px;}
</style>
<div id="pwi-ov" role="dialog" aria-label="App installieren">
<div class="pwi-card">
<img class="pwi-icon" src="https://seaside.pacim.de/assets/webapp/icon-192.png" alt="" width="96" height="96">
<div class="pwi-name">PaCIM Terminal</div>
<div class="pwi-sub">Für den schnellsten Zugriff diese App zum Startbildschirm hinzufügen – sie öffnet dann im Vollbild wie eine echte App.</div>
<div class="pwi-steps" id="pwi-ios" style="display:none">
<div class="pwi-step"><span class="pwi-num">1</span><span class="pwi-txt">Unten in der Safari-Leiste auf das <b>Teilen-Symbol</b>
<span class="pwi-ic"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M12 16V4M8 8l4-4 4 4"/><path d="M5 12v6a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-6"/></svg></span>
tippen.</span></div>
<div class="pwi-step"><span class="pwi-num">2</span><span class="pwi-txt">Im Menü <b>„Zum Home-Bildschirm"</b> wählen.</span></div>
<div class="pwi-step"><span class="pwi-num">3</span><span class="pwi-txt">Oben rechts auf <b>„Hinzufügen"</b> tippen – fertig.</span></div>
</div>
<div class="pwi-steps" id="pwi-android" style="display:none">
<div class="pwi-step"><span class="pwi-num">1</span><span class="pwi-txt">Oben rechts im Browser auf das <b>Menü</b>
<span class="pwi-ic"><svg viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="12" cy="19" r="2"/></svg></span>
tippen.</span></div>
<div class="pwi-step"><span class="pwi-num">2</span><span class="pwi-txt"><b>„App installieren"</b> bzw. <b>„Zum Startbildschirm hinzufügen"</b> wählen.</span></div>
<div class="pwi-step"><span class="pwi-num">3</span><span class="pwi-txt">Mit <b>„Installieren"</b> bestätigen – fertig.</span></div>
</div>
<div class="pwi-steps" id="pwi-other" style="display:none">
<div class="pwi-step"><span class="pwi-num">1</span><span class="pwi-txt">Im Browser-Menü <b>„Zum Startbildschirm hinzufügen"</b> bzw. <b>„App installieren"</b> wählen.</span></div>
</div>
<button type="button" class="pwi-install" id="pwi-install">App installieren</button>
<br><button type="button" class="pwi-cont" id="pwi-cont">Im Browser fortfahren</button>
<div class="pwi-hint">Diese Anleitung erscheint nur im Browser, nicht in der installierten App.</div>
</div>
</div>
<script>(function(){
var ov=document.getElementById('pwi-ov'); if(!ov) return;
var KEY='pwiSkip';
function standalone(){ return (window.matchMedia&&window.matchMedia('(display-mode: standalone)').matches) || window.navigator.standalone===true; }
function embedded(){ try{ return window.self!==window.top; }catch(e){ return true; } }
var skipped=false; try{ skipped=sessionStorage.getItem(KEY)==='1'; }catch(e){}
if(standalone()||embedded()||skipped) return;
var ua=navigator.userAgent||'';
var isIOS=/iphone|ipad|ipod/i.test(ua) || (navigator.platform==='MacIntel' && navigator.maxTouchPoints>1);
var isAndroid=/android/i.test(ua);
document.getElementById( isIOS?'pwi-ios':(isAndroid?'pwi-android':'pwi-other') ).style.display='block';
// Ein-Tipp-Installation, falls der Browser sie anbietet (Chrome/Edge mit erfüllten Kriterien).
var deferred=null, btn=document.getElementById('pwi-install');
window.addEventListener('beforeinstallprompt', function(e){ e.preventDefault(); deferred=e; if(btn) btn.classList.add('pwi-show'); });
if(btn) btn.addEventListener('click', function(){ if(!deferred) return; deferred.prompt(); deferred.userChoice.then(function(c){ deferred=null; btn.classList.remove('pwi-show'); if(c&&c.outcome==='accepted') hide(); }); });
// Wurde die App während der Sitzung installiert → Overlay weg.
window.addEventListener('appinstalled', function(){ hide(); });
function hide(){ ov.classList.remove('pwi-show'); }
document.getElementById('pwi-cont').addEventListener('click', function(){ try{ sessionStorage.setItem(KEY,'1'); }catch(e){} hide(); });
ov.classList.add('pwi-show');
})();</script>
</body></html>