| 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 : /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"><title>Check-in · HRO - NA 123</title><style>@font-face{font-family:"EuroPlate";src:url("https://seaside.pacim.de/assets/fonts/EuroPlate.ttf") format("truetype");font-display:swap;}
:root{--navy:#0d2c44;--navy2:#11436b;--blue:#1b6ca8;--green:#2fb344;--red:#d63939;--gold:#f3b53f;--ink:#16384f;--muted:#5b7488;--line:#e6eef4;}
*{box-sizing:border-box;margin:0;padding:0;}
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;display:flex;flex-direction:column;align-items:center;padding:16px 12px 40px;touch-action:manipulation;}
.d-none{display:none!important;}
.card{width:100%;max-width:460px;background:#fff;border-radius:18px 18px 0 0;overflow:hidden;box-shadow:0 14px 40px rgba(13,44,68,.16);}
.hd{position:relative;background:linear-gradient(135deg,var(--navy) 0%,var(--navy2) 65%,var(--blue) 130%);color:#fff;padding:20px 22px 18px;}
.hd .back{position:absolute;top:14px;right:18px;color:#cfe2f2;font-size:13px;text-decoration:none;font-weight:600;}
.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;}
.hd .no{font-size:13px;opacity:.85;margin-top:2px;}
.bd{padding:16px 22px 4px;}
.plate-wrap{position:relative;margin:2px 0 14px;}
.plate{border:2px solid #111;border-radius:8px;text-align:center;font-family:"EuroPlate",ui-monospace,monospace;font-size:30px;letter-spacing:1px;padding:9px 6px;color:#111;cursor:text;}
.plate.editing{outline:2px solid var(--blue);outline-offset:1px;padding-right:64px;text-align:left;padding-left:14px;}
.plate-save{position:absolute;right:6px;top:6px;bottom:6px;width:50px;border:0;border-radius:6px;background:var(--green);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;}
.plate-save svg{width:22px;height:22px;}
.muted{color:var(--muted);font-weight:400;}
.row{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-top:1px solid var(--line);font-size:14.5px;}
.row:first-of-type{border-top:0;}
.row .l{color:var(--muted);} .row .v{font-weight:600;text-align:right;}
.badges{display:flex;gap:8px;margin:14px 0 2px;}
.badge{flex:1;border-radius:12px;padding:11px;text-align:center;font-weight:700;font-size:14px;}
.b-open{background:rgba(214,57,57,.10);color:var(--red);} .b-ok{background:rgba(47,179,68,.12);color:#1d7a33;} .b-warn{background:rgba(243,181,63,.16);color:#8a6400;}
/* Status-Badge im Header (ganz unten rechts, flush in der Ecke) */
.hstat{position:absolute;right:0;bottom:0;font-size:12.5px;font-weight:700;padding:6px 14px;border-radius:8px 0 0 0;white-space:nowrap;}
.hstat.s-blue{background:#2f86d6;color:#fff;} .hstat.s-orange{background:#f59f00;color:#3a2c00;}
.hstat.s-green{background:#2fb344;color:#fff;} .hstat.s-red{background:#d63939;color:#fff;}
.btn.btn-out{background:#eef4f9;color:var(--navy);}
.btn-cancel{margin-top:22px;background:#fff;color:var(--navy);border:0;border-radius:12px;padding:15px 28px;font-size:16px;font-weight:700;cursor:pointer;}
.done-skip{margin-top:14px;font-size:12.5px;opacity:.7;}
.sec{padding:14px 22px;border-top:1px solid var(--line);}
.sec-h{font-weight:700;font-size:15px;color:var(--navy);margin-bottom:10px;}
.fld-l{display:block;font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:8px 0 5px;}
.sel{width:100%;padding:12px;border:1px solid var(--line);border-radius:10px;font-size:15px;background:#fff;color:var(--ink);}
.amount{margin:12px 0;font-size:15px;}
.amount strong{font-size:22px;color:var(--navy);}
.pay-types{display:flex;gap:8px;}
.pt{flex:1;padding:13px 6px;border:2px solid var(--line);background:#fff;border-radius:12px;font-size:14px;font-weight:700;color:var(--ink);cursor:pointer;}
.pt.on{border-color:var(--blue);background:rgba(27,108,168,.08);color:var(--blue);}
.btn{display:block;width:100%;border:0;border-radius:12px;padding:15px;font-size:16px;font-weight:700;text-align:center;cursor:pointer;margin-top:12px;}
.btn-pay{background:var(--green);color:#fff;} .btn-primary{background:var(--blue);color:#fff;} .btn-light{background:#eef4f9;color:var(--navy);}
.btn-warn{background:#f59f00;color:#fff;} .btn-checkin{background:var(--green);color:#fff;} .btn-danger{background:var(--red);color:#fff;}
.btn[disabled]{background:#e7eef4;color:#9bacba;cursor:not-allowed;}
.lnk{background:none;border:0;color:#1d7a33;font-weight:700;text-decoration:underline;cursor:pointer;font-size:13.5px;padding:0;margin-left:4px;}
.modal{width:100%;max-width:420px;background:#fff;border-radius:0;overflow:hidden;box-shadow:0 20px 60px rgba(0,0,0,.35);}
.modal-h{display:flex;align-items:center;justify-content:space-between;background:var(--navy);color:#fff;padding:15px 18px;font-size:16px;font-weight:800;}
.modal-x{background:none;border:0;color:#cfe2f2;font-size:26px;line-height:1;cursor:pointer;padding:0 2px;}
.modal-b{padding:16px 18px 20px;}
.hint{font-size:12px;color:var(--muted);text-align:center;margin-top:8px;}
.modal-err{background:rgba(214,57,57,.10);color:var(--red);border-radius:10px;padding:11px 13px;font-size:13.5px;font-weight:600;margin-top:12px;}
.note{border-radius:10px;padding:12px 14px;font-size:14px;}
.note.ok{background:rgba(47,179,68,.10);color:#1d7a33;} .note.warn{background:rgba(243,181,63,.16);color:#8a6400;}
.status{padding:6px 22px 16px;font-size:13.5px;font-weight:600;text-align:center;}
.status.ok{color:#1d7a33;} .status.err{color:var(--red);}
.foot{margin-top:16px;font-size:12px;color:var(--muted);text-align:center;}
.overlay{position:fixed;inset:0;background:rgba(13,44,68,.92);display:flex;align-items:center;justify-content:center;z-index:50;}
.done-box{text-align:center;color:#fff;padding:30px;}
.check{width:92px;height:92px;border-radius:50%;background:var(--green);color:#fff;font-size:54px;line-height:92px;margin:0 auto 18px;}
.done-t{font-size:24px;font-weight:800;} .done-x{font-size:15px;opacity:.85;margin-top:8px;}
.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="card">
<div class="hd">
<a class="back" href="https://seaside.pacim.de/day-list.php?date=2026-06-27&h=ae6c96c6793e9dae3d10aa1e4ed3be55">← Liste</a>
<div class="k">Check-in & Zahlung</div>
<div class="t">Arndt, Nico</div>
<div class="no">HHHRZF</div>
<span class="hstat" id="ci-status-badge"></span>
</div>
<div class="bd">
<div class="plate-wrap">
<div class="plate fe" id="ci-plate" spellcheck="false" data-ro="1">HRO - NA 123</div>
<button type="button" class="plate-save d-none" id="ci-plate-save" title="Speichern" aria-label="Speichern"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M5 13l4 4L19 7"/></svg></button>
</div>
<div class="row"><span class="l">Schiff</span><span class="v">AIDAdiva<br><span class="muted">7 Tage</span></span></div>
<div class="row"><span class="l">Stellplatz</span><span class="v">Außen</span></div>
<div class="row"><span class="l">Zeitraum</span><span class="v">27.06. – 04.07.26</span></div>
<div class="row"><span class="l">Boarding</span><span class="v">09:00 Uhr</span></div> </div>
<div class="sec"><div class="note warn">Diese Buchung ist storniert – keine Aktion möglich.</div></div>
<div class="status" id="ci-status"></div>
</div>
<!-- Check-in Erfolg / Countdown -->
<div class="overlay d-none" id="ci-done">
<div class="done-box">
<div class="check">✓</div>
<div class="done-t">Check-in erfasst</div>
<div class="done-x">Zurück zur Liste in <span id="ci-cd">3</span> s …</div>
<button type="button" class="btn-cancel" id="ci-cancel">Abbrechen – hier bleiben</button>
<div class="done-skip">irgendwo tippen, um sofort zur Liste zu wechseln</div>
</div>
</div>
<div class="foot">SeaSide Travel · Parken am Schiff</div>
<script>
var CFG = {"b":115266,"h":"ed2b5fb2b9c92c38670bfde0a8d2f7a0","paid":false,"arrived":false,"storno":true,"isAida":false,"coupon":0,"amounts":[90,85,81],"payType":0,"back":"https:\/\/seaside.pacim.de\/day-list.php?date=2026-06-27&h=ae6c96c6793e9dae3d10aa1e4ed3be55"};
(function(){
// Browser-Zoom unterbinden (iOS Safari ignoriert user-scalable=no)
['gesturestart','gesturechange','gestureend'].forEach(function(ev){ document.addEventListener(ev, function(e){ e.preventDefault(); }, {passive:false}); });
document.addEventListener('touchmove', function(e){ if(e.touches && e.touches.length>1) e.preventDefault(); }, {passive:false});
var API = location.pathname; // gleiche Datei
var $ = function(id){ return document.getElementById(id); };
var coupon = $('ci-coupon'), amountEl = $('ci-amount'), status = $('ci-status');
var selType = CFG.payType || 0; // keine Zahlungsart vorausgewählt
function eur(v){ return v.toFixed(2).replace('.',',') + ' €'; }
function setStatus(t,k){ status.textContent = t||''; status.className = 'status' + (k?(' '+k):''); }
function refreshAmount(){ if(amountEl) amountEl.textContent = eur(CFG.amounts[coupon ? coupon.value : 0]); }
function markType(){ var ts=document.querySelectorAll('#ci-types .pt'); for(var i=0;i<ts.length;i++) ts[i].classList.toggle('on', parseInt(ts[i].dataset.type,10)===selType); }
function statusBadge(){
var sb=$('ci-status-badge'); if(!sb) return;
var cls,txt;
if(CFG.storno){ cls='s-red'; txt='Storniert'; }
else if(CFG.arrived){ cls='s-green'; txt='Angereist'; }
else if(CFG.paid){ cls='s-blue'; txt='Check-in offen'; }
else { cls='s-orange'; txt='Zahlung offen'; }
sb.className='hstat '+cls; sb.textContent=txt;
}
var PAYNAMES={1:'Überweisung',2:'EC-Karte',3:'Bar'};
function renderState(){
statusBadge();
if(CFG.storno) return;
var paidSec=$('ci-paid-sec'), btn=$('ci-action-btn');
if(paidSec){
if(CFG.paid && !CFG.isAida){
paidSec.classList.remove('d-none');
$('ci-paid-info').textContent = eur(CFG.amounts[CFG.coupon||0]) + ' · ' + (PAYNAMES[CFG.payType]||'');
} else paidSec.classList.add('d-none');
}
if(btn){
btn.disabled=false;
if(CFG.arrived){ btn.textContent='Fahrzeug auschecken'; btn.className='btn btn-danger'; btn.dataset.act='uncheckin'; }
else if(CFG.paid){ btn.textContent='Check-in erfassen'; btn.className='btn btn-checkin'; btn.dataset.act='checkin'; }
else { btn.textContent='Zahlung erfassen'; btn.className='btn btn-warn'; btn.dataset.act='pay'; }
}
}
if(coupon){ coupon.value = CFG.coupon || 0; coupon.addEventListener('change', refreshAmount); refreshAmount(); }
var types=document.querySelectorAll('#ci-types .pt');
for(var i=0;i<types.length;i++){ types[i].addEventListener('click', function(){ selType=parseInt(this.dataset.type,10); markType(); payClearErr(); }); }
markType();
function post(data, cb){
var fd=new URLSearchParams(); fd.set('b',CFG.b); fd.set('h',CFG.h);
for(var k in data) fd.set(k,data[k]);
fetch(API,{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded;charset=UTF-8'},body:fd.toString()})
.then(function(r){return r.json();}).then(cb).catch(function(){ setStatus('Serverfehler.','err'); });
}
// ---- Zahlungs-Modal
var payModal=$('ci-pay-modal'), payErr=$('ci-pay-err');
function payError(m){ if(payErr){ payErr.textContent=m||'Fehler.'; payErr.classList.remove('d-none'); } else setStatus(m,'err'); }
function payClearErr(){ if(payErr){ payErr.textContent=''; payErr.classList.add('d-none'); } }
function openPay(){ if(!payModal) return; selType=CFG.payType||0; if(coupon){coupon.value=CFG.coupon||0; refreshAmount();} markType(); payClearErr(); payModal.classList.remove('d-none'); }
function closePay(){ if(payModal) payModal.classList.add('d-none'); }
var payClose=$('ci-pay-close'); if(payClose) payClose.addEventListener('click', closePay);
if(payModal) payModal.addEventListener('click', function(e){ if(e.target===payModal) closePay(); });
var payBtn=$('ci-pay-btn');
if(payBtn) payBtn.addEventListener('click', function(){
payClearErr();
if(!selType){ payError('Bitte Zahlungsart wählen.'); return; }
payBtn.disabled=true;
post({action:'pay', type:selType, coupon:(coupon?coupon.value:0)}, function(res){
payBtn.disabled=false;
if(!res||!res.ok){ payError((res&&res.error)||'Fehler.'); return; } // Fehler bleibt im Modal, keine Rechnung erstellt
CFG.paid=true; CFG.coupon=res.coupon; CFG.payType=res.type;
closePay(); renderState();
setStatus('✓ Zahlung erfasst ('+res.amount_fmt+' · '+res.type_name+')','ok');
});
});
var editBtn=$('ci-edit-btn');
if(editBtn) editBtn.addEventListener('click', function(){ openPay(); });
function startCountdown(){
var ov=$('ci-done'); if(!ov){ location.href=CFG.back; return; }
ov.classList.remove('d-none');
var n=3, cd=$('ci-cd'), done=false; cd.textContent=n;
var t=setInterval(function(){ n--; cd.textContent=n; if(n<=0) finish(); },1000);
function finish(){ if(done) return; done=true; clearInterval(t); location.href=CFG.back; }
function stay(){ if(done) return; done=true; clearInterval(t); ov.classList.add('d-none'); }
var cBtn=$('ci-cancel'); if(cBtn) cBtn.onclick=function(e){ e.stopPropagation(); stay(); }; // Abbrechen -> hier bleiben
ov.onclick=function(e){ if(e.target.closest('#ci-cancel')) return; finish(); }; // woanders -> sofort weiter
}
var actBtn=$('ci-action-btn');
if(actBtn) actBtn.addEventListener('click', function(){
var act=actBtn.dataset.act;
if(act==='pay'){ openPay(); return; }
if(act==='uncheckin'){
actBtn.disabled=true; setStatus('Check-in wird zurückgenommen …');
post({action:'uncheckin'}, function(res){
if(!res||!res.ok){ actBtn.disabled=false; setStatus((res&&res.error)||'Fehler.','err'); return; }
CFG.arrived=false; renderState(); setStatus('Check-in zurückgenommen.','ok');
});
return;
}
if(act==='checkin'){
actBtn.disabled=true; setStatus('Check-in …');
post({action:'checkin'}, function(res){
if(!res||!res.ok){ actBtn.disabled=false; setStatus((res&&res.error)||'Fehler.','err'); return; }
CFG.arrived=true; renderState(); startCountdown();
});
}
});
// Kennzeichen ändern – direkt im Kennzeichen-Feld (Klick rein aktiviert, Speichern-Button rechts)
var plate=$('ci-plate'), plSave=$('ci-plate-save'), plOrig = plate ? plate.textContent : '';
if(plate && plSave && !plate.getAttribute('data-ro')){
function startEdit(){
if(plate.isContentEditable) return;
plOrig = plate.textContent;
plate.contentEditable='true'; plate.classList.add('editing'); plSave.classList.remove('d-none');
plate.focus();
try{ var rng=document.createRange(); rng.selectNodeContents(plate); rng.collapse(false); var sel=getSelection(); sel.removeAllRanges(); sel.addRange(rng); }catch(e){}
}
function stopEdit(){ plate.contentEditable='false'; plate.classList.remove('editing'); plSave.classList.add('d-none'); }
plate.addEventListener('click', startEdit);
plate.addEventListener('keydown', function(ev){
if(ev.key==='Enter'){ ev.preventDefault(); plSave.click(); }
else if(ev.key==='Escape'){ plate.textContent=plOrig; stopEdit(); }
});
plSave.addEventListener('mousedown', function(ev){ ev.preventDefault(); }); // Fokus im Feld halten
plSave.addEventListener('click', function(ev){
ev.stopPropagation();
var v=(plate.textContent||'').replace(/\s+/g,' ').trim();
if(!v){ setStatus('Bitte ein Kennzeichen eingeben.','err'); return; }
setStatus('Kennzeichen wird gespeichert …');
post({action:'plate', plate:v}, function(res){
if(!res||!res.ok){ setStatus((res&&res.error)||'Fehler.','err'); plate.textContent=plOrig; return; }
plate.textContent=res.plate; plOrig=res.plate; stopEdit();
setStatus('✓ Kennzeichen aktualisiert','ok');
});
});
}
renderState();
})();
</script>
</body></html>