(function (){
'use strict';
if(typeof slp1GuestBooking==='undefined'){
return;
}
var cfg=slp1GuestBooking;
(function prefillFromQuery(){
var params=new URLSearchParams(window.location.search);
var number=params.get('booking');
if(!number){
return;
}
var numberInput=document.querySelector('.slp1-guest-lookup-form [name="booking_number"]');
if(numberInput){
numberInput.value=number;
}
var manageTab=document.getElementById('slp1-manage-tab');
if(manageTab&&typeof bootstrap!=='undefined'&&bootstrap.Tab){
try { new bootstrap.Tab(manageTab).show(); } catch (e){  }}
}());
var cards=window.slp1BookingCards||{};
var esc=cards.esc||function (s){ return s==null ? '':String(s); };
var statusClass=cards.statusClass||function (){ return 'slp1-status-pill slp1-status-pill--neutral'; };
var rendererLoading=null;
function ensureRenderer(cb){
if(typeof window.slp1RenderBookingCards==='function'){
cb(true);
return;
}
if(!cfg.cardsScript){
cb(false);
return;
}
if(!rendererLoading){
rendererLoading=new Promise(function (resolve){
var s=document.createElement('script');
s.src=cfg.cardsScript
+ (cfg.cardsScript.indexOf('?')===-1 ? '?':'&')
+ 'rcbfix=' + Date.now();
s.onload=function (){ resolve(typeof window.slp1RenderBookingCards==='function'); };
s.onerror=function (){ resolve(false); };
document.head.appendChild(s);
});
}
rendererLoading.then(function (ok){ cb(ok); });
}
document.querySelectorAll('.slp1-guest-lookup-form').forEach(function (form){
var box=form.closest('.slp1-guest-portal__box')||form.parentNode;
var errorEl=form.querySelector('.slp1-gbp-error');
var submitBtn=form.querySelector('.slp1-gbp-submit');
var resultEl=box.querySelector('.slp1-gbp-result');
form.addEventListener('submit', function (e){
e.preventDefault();
hideError();
var email=(form.querySelector('[name="email"]')||{}).value||'';
var number=(form.querySelector('[name="booking_number"]')||{}).value||'';
if(!email.trim()||!number.trim()){
showError('Bitte E-Mail und Buchungsnummer eingeben.');
return;
}
setLoading(true);
var body=new URLSearchParams();
body.append('action', cfg.lookupAction);
body.append('nonce', cfg.nonce);
body.append('email', email.trim());
body.append('booking_number', number.trim());
fetch(cfg.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body })
.then(function (r){ return r.json(); })
.then(function (resp){
setLoading(false);
if(resp&&resp.success&&resp.data&&resp.data.booking){
renderBooking(resp.data.booking, resp.data.token);
}else{
showError((resp&&resp.data&&resp.data.message)||'Buchung nicht gefunden.');
}})
.catch(function (){
setLoading(false);
showError('Verbindungsfehler. Bitte erneut versuchen.');
});
});
function renderBooking(b, token){
if(typeof window.slp1RenderBookingCards!=='function'){
ensureRenderer(function (ok){
if(ok){
renderBooking(b, token);
}else{
showError('Buchungsdetails konnten nicht geladen werden. Bitte die Seite neu laden.');
}});
return;
}
if(!resultEl){
showError('Buchungsdetails konnten nicht geladen werden. Bitte die Seite neu laden.');
return;
}
var ticketUrl=cfg.adminPostUrl
+ '?action=' + encodeURIComponent(cfg.ticketAction)
+ '&booking_id=' + encodeURIComponent(b.id)
+ '&token=' + encodeURIComponent(token)
+ '&nonce=' + encodeURIComponent(cfg.nonce);
var cardsHtml;
try {
cardsHtml=window.slp1RenderBookingCards(b, {
ticketUrl: ticketUrl,
edit: !!cfg.editAction
});
} catch (err){
showError('Buchungsdetails konnten nicht angezeigt werden. Bitte die Seite neu laden.');
return;
}
if(!cardsHtml){
showError('Buchungsdetails konnten nicht angezeigt werden. Bitte die Seite neu laden.');
return;
}
var cancelOpen=b.cancellable
? '<div class="slp1-card p-4"><button type="button" class="btn btn-outline-danger slp1-gbp-cancel-open">'
+ '<i class="bi bi-x-circle me-2"></i>Stornieren</button></div>'
: '';
resultEl.innerHTML=cardsHtml + cancelOpen + cancelFormHtml(b, token);
resultEl.classList.remove('d-none');
form.classList.add('d-none');
wireCancel(b, token);
if(b.editable&&cfg.editAction&&window.slp1BookingEdit){
window.slp1BookingEdit.wire(resultEl, {
ajaxUrl: cfg.ajaxUrl,
editFormAction: cfg.editFormAction,
editAction: cfg.editAction,
nonce: cfg.nonce,
nonceParam: 'nonce',
bookingId: b.id,
extraParams: { token: token },
onSuccess: function (data){
renderBooking((data&&data.booking)||b, token);
}});
}}
function cancelFormHtml(b, token){
if(!b.cancellable){
return '';
}
return ''
+ '<div class="slp1-gbp-cancel-panel card border-danger mt-3 d-none">'
+ '  <div class="card-body">'
+ '    <div class="alert alert-warning">Diese Aktion kann nicht rückgängig gemacht werden. '
+ '      Der Betrag wird auf dein ursprüngliches Zahlungsmittel zurückerstattet.</div>'
+ '    <div class="mb-3">'
+ '      <label class="form-label">Grund der Stornierung <span class="text-danger">*</span></label>'
+ '      <select class="form-select slp1-gbp-reason" required>'
+ '        <option value="">— Bitte wählen —</option>'
+ '        <option value="Reise abgesagt">Reise abgesagt</option>'
+ '        <option value="Anderer Anbieter gewählt">Anderer Anbieter gewählt</option>'
+ '        <option value="Flug storniert / verschoben">Flug storniert / verschoben</option>'
+ '        <option value="Falsche Daten eingegeben">Falsche Daten eingegeben</option>'
+ '        <option value="Sonstiger Grund">Sonstiger Grund</option>'
+ '      </select>'
+ '    </div>'
+ '    <div class="slp1-gbp-cancel-alert alert d-none" role="alert"></div>'
+ '    <button type="button" class="btn btn-danger slp1-gbp-cancel-confirm">Ja, stornieren</button>'
+ '  </div>'
+ '</div>';
}
function wireCancel(b, token){
var openBtn=resultEl.querySelector('.slp1-gbp-cancel-open');
var panel=resultEl.querySelector('.slp1-gbp-cancel-panel');
if(!openBtn||!panel){
return;
}
openBtn.addEventListener('click', function (){ panel.classList.remove('d-none'); });
var confirmBtn=panel.querySelector('.slp1-gbp-cancel-confirm');
var reasonSel=panel.querySelector('.slp1-gbp-reason');
var alertEl=panel.querySelector('.slp1-gbp-cancel-alert');
confirmBtn.addEventListener('click', function (){
if(!reasonSel.value){
reasonSel.classList.add('is-invalid');
return;
}
reasonSel.classList.remove('is-invalid');
confirmBtn.disabled=true;
confirmBtn.innerHTML='<span class="spinner-border spinner-border-sm me-1"></span>Wird storniert…';
alertEl.classList.add('d-none');
var body=new URLSearchParams();
body.append('action', cfg.cancelAction);
body.append('nonce', cfg.nonce);
body.append('booking_id', b.id);
body.append('token', token);
body.append('reason', reasonSel.value);
fetch(cfg.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body })
.then(function (r){ return r.json(); })
.then(function (resp){
if(resp&&resp.success){
alertEl.className='slp1-gbp-cancel-alert alert alert-success';
alertEl.textContent=(resp.data&&resp.data.message)||'Buchung wurde storniert.';
alertEl.classList.remove('d-none');
confirmBtn.remove();
var openBtn=resultEl.querySelector('.slp1-gbp-cancel-open');
if(openBtn){ openBtn.remove(); }
var ticketBtn=resultEl.querySelector('.slp1-gbp-ticket');
if(ticketBtn){ ticketBtn.remove(); }
var statusBadge=resultEl.querySelector('.slp1-gbp-status');
if(statusBadge){
statusBadge.textContent='Storniert';
statusBadge.className='slp1-gbp-status ' + statusClass('cancelled');
}}else{
alertEl.className='slp1-gbp-cancel-alert alert alert-danger';
alertEl.textContent=(resp&&resp.data&&resp.data.message)||'Fehler bei der Stornierung.';
alertEl.classList.remove('d-none');
confirmBtn.disabled=false;
confirmBtn.textContent='Ja, stornieren';
}})
.catch(function (){
alertEl.className='slp1-gbp-cancel-alert alert alert-danger';
alertEl.textContent='Verbindungsfehler. Bitte erneut versuchen.';
alertEl.classList.remove('d-none');
confirmBtn.disabled=false;
confirmBtn.textContent='Ja, stornieren';
});
});
}
function showError(msg){
if(!errorEl){ return; }
errorEl.textContent=msg;
errorEl.classList.remove('d-none');
}
function hideError(){
if(errorEl){ errorEl.classList.add('d-none'); }}
function setLoading(on){
if(!submitBtn){ return; }
submitBtn.disabled=on;
submitBtn.style.opacity=on ? '0.7':'';
}});
}());