(function (){
'use strict';
function esc(str){
var d=document.createElement('div');
d.textContent=str==null ? '':String(str);
return d.innerHTML;
}
function sectionTitle(icon, label){
return '<div class="slp1-section-title"><i class="bi ' + icon + '"></i>' + esc(label) + '</div>';
}
function dataRow(label, valueHtml){
return '<div class="slp1-data-row"><span class="label">' + esc(label)
+ '</span><span class="value">' + valueHtml + '</span></div>';
}
function statusClass(status){
if(status==='paid'||status==='completed'){ return 'slp1-status-pill slp1-status-pill--ok'; }
if(status==='cancelled'||status==='refunded'||status==='failed'){
return 'slp1-status-pill slp1-status-pill--bad';
}
return 'slp1-status-pill slp1-status-pill--neutral';
}
function renderBookingCards(b, opts){
opts=opts||{};
var refCard=''
+ '<div class="slp1-card p-4 mb-3">'
+ '  <div class="d-flex align-items-center justify-content-between">'
+ '    <span class="text-muted small">Buchungsnummer</span>'
+ '    <span class="slp1-ref-badge font-monospace">' + esc(b.booking_number) + '</span>'
+ '  </div>'
+ '  <div class="d-flex align-items-center justify-content-between mt-2">'
+ '    <span class="text-muted small">Status</span>'
+ '    <span class="slp1-gbp-status ' + statusClass(b.status) + '">' + esc(b.status_label) + '</span>'
+ '  </div>'
+ '</div>';
var detailRows='';
if(b.product_title){
detailRows +=''
+ sectionTitle('bi-geo-alt-fill', 'Parkplatz')
+ '<div class="mb-3"><div class="fw-bold fs-5">' + esc(b.product_title) + '</div>'
+ (b.address ? '<div class="text-muted small">' + esc(b.address) + '</div>':'')
+ '</div>';
}
detailRows +=''
+ sectionTitle('bi-calendar-event', 'Zeitraum')
+ dataRow(b.arrival_label||'Anreise', esc(b.arrival))
+ dataRow(b.departure_label||'Abreise', esc(b.departure));
var detailCard='<div class="slp1-card p-4 mb-3">' + detailRows + '</div>';
var infoCard='';
var sections=b.info_sections||[];
if(sections.length){
var infoRows='';
sections.forEach(function (sec, i){
infoRows +='<div class="' + (i===0 ? '':'mt-4') + '">'
+ sectionTitle(sec.icon||'bi-info-circle', sec.title||'');
(sec.rows||[]).forEach(function (r){
infoRows +=dataRow(r.label, esc(r.value));
});
infoRows +='</div>';
});
infoCard='<div class="slp1-card p-4 mb-3">' + infoRows + '</div>';
}
var contactCard='';
var fullName=(b.first_name + ' ' + b.last_name).trim();
if(fullName||b.mobile){
contactCard='<div class="slp1-card p-4 mb-3">'
+ sectionTitle('bi-person-vcard', 'Kontaktdaten')
+ (fullName ? dataRow('Name', esc(fullName)):'')
+ (b.mobile ? dataRow('Telefon', esc(b.mobile)):'')
+ '</div>';
}
var extras='';
(b.price_extras||[]).forEach(function (x){
extras +='<div class="slp1-extra-row"><span>' + esc(x.label)
+ (x.qty > 1 ? ' &times;' + x.qty:'') + '</span><span>' + esc(x.amount) + '</span></div>';
});
var paymentCard='<div class="slp1-card p-4 mb-3">'
+ sectionTitle('bi-credit-card', 'Bezahlter Betrag')
+ extras
+ '<div class="slp1-total-row"><span class="fw-semibold">Gesamt</span>'
+ '<span class="fw-bold fs-4">' + esc(b.price) + '</span></div>'
+ '</div>';
var ticketCard='';
if(b.ticket&&opts.ticketUrl){
ticketCard='<div class="slp1-card p-4">'
+ '<a class="btn btn-outline-primary slp1-gbp-ticket" href="' + esc(opts.ticketUrl) + '">'
+ '<i class="bi bi-download me-2"></i>Ticket herunterladen</a>'
+ '</div>';
}
var editCard='';
if(b.editable&&opts.edit){
editCard='<div class="slp1-card p-4 slp1-edit-open-wrap">'
+ '<button type="button" class="btn btn-outline-secondary slp1-booking-edit-open">'
+ '<i class="bi bi-pencil-square me-2"></i>Buchung bearbeiten</button>'
+ '</div>';
}
return refCard + detailCard + infoCard + contactCard + paymentCard + ticketCard + editCard;
}
function wireEdit(container, opts){
var openBtn=container.querySelector('.slp1-booking-edit-open');
if(!openBtn){ return; }
var panel=null;
function buildBody(action){
var body=new URLSearchParams();
body.append('action', action);
body.append(opts.nonceParam||'_wpnonce', opts.nonce);
body.append('booking_id', opts.bookingId);
var extra=opts.extraParams||{};
Object.keys(extra).forEach(function (k){ body.append(k, extra[k]); });
return body;
}
openBtn.addEventListener('click', function (){
if(panel){
panel.classList.toggle('d-none');
return;
}
openBtn.disabled=true;
var original=openBtn.innerHTML;
openBtn.innerHTML='<span class="spinner-border spinner-border-sm me-1"></span>Wird geladen…';
fetch(opts.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: buildBody(opts.editFormAction) })
.then(function (r){ return r.json(); })
.then(function (resp){
openBtn.disabled=false;
openBtn.innerHTML=original;
if(resp&&resp.success&&resp.data&&resp.data.html){
injectPanel(resp.data.html);
}else{
openBtn.insertAdjacentHTML('afterend',
'<div class="alert alert-danger mt-2">'
+ esc((resp&&resp.data&&resp.data.message)||'Formular konnte nicht geladen werden.')
+ '</div>');
}})
.catch(function (){
openBtn.disabled=false;
openBtn.innerHTML=original;
openBtn.insertAdjacentHTML('afterend',
'<div class="alert alert-danger mt-2">Verbindungsfehler. Bitte erneut versuchen.</div>');
});
});
function injectPanel(html){
panel=document.createElement('div');
panel.className='slp1-booking-edit-panel card border-secondary mt-3';
panel.innerHTML='<div class="card-body">'
+ '<h5 class="card-title mb-3">Buchung bearbeiten</h5>'
+ '<form class="slp1-booking-edit-form" novalidate>' + html
+ '<div class="slp1-booking-edit-alert alert d-none mt-3" role="alert"></div>'
+ '<div class="d-flex gap-2 mt-3">'
+ '<button type="submit" class="btn btn-primary slp1-booking-edit-save">Änderungen speichern</button>'
+ '<button type="button" class="btn btn-outline-secondary slp1-booking-edit-cancel">Abbrechen</button>'
+ '</div></form></div>';
var wrap=openBtn.closest('.slp1-edit-open-wrap')||openBtn.parentNode;
wrap.parentNode.insertBefore(panel, wrap.nextSibling);
wirePanel();
}
function wirePanel(){
var form=panel.querySelector('.slp1-booking-edit-form');
var saveBtn=panel.querySelector('.slp1-booking-edit-save');
var cancelBtn=panel.querySelector('.slp1-booking-edit-cancel');
var alertEl=panel.querySelector('.slp1-booking-edit-alert');
cancelBtn.addEventListener('click', function (){ panel.classList.add('d-none'); });
form.addEventListener('submit', function (e){
e.preventDefault();
if(!form.checkValidity()){
form.reportValidity();
return;
}
saveBtn.disabled=true;
var originalSave=saveBtn.innerHTML;
saveBtn.innerHTML='<span class="spinner-border spinner-border-sm me-1"></span>Wird gespeichert…';
alertEl.classList.add('d-none');
var body=buildBody(opts.editAction);
form.querySelectorAll('[name]').forEach(function (el){
if((el.type==='checkbox'||el.type==='radio')&&!el.checked){ return; }
body.append(el.name, el.value);
});
fetch(opts.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: body })
.then(function (r){ return r.json(); })
.then(function (resp){
if(resp&&resp.success){
alertEl.className='slp1-booking-edit-alert alert alert-success mt-3';
alertEl.textContent=(resp.data&&resp.data.message)
|| 'Buchung wurde aktualisiert.';
alertEl.classList.remove('d-none');
window.setTimeout(function (){
if(typeof opts.onSuccess==='function'){
opts.onSuccess(resp.data||{});
}else{
window.location.reload();
}}, 1400);
}else{
alertEl.className='slp1-booking-edit-alert alert alert-danger mt-3';
alertEl.textContent=(resp&&resp.data&&resp.data.message)
|| 'Die Änderung konnte nicht gespeichert werden.';
alertEl.classList.remove('d-none');
saveBtn.disabled=false;
saveBtn.innerHTML=originalSave;
}})
.catch(function (){
alertEl.className='slp1-booking-edit-alert alert alert-danger mt-3';
alertEl.textContent='Verbindungsfehler. Bitte erneut versuchen.';
alertEl.classList.remove('d-none');
saveBtn.disabled=false;
saveBtn.innerHTML=originalSave;
});
});
}}
window.slp1RenderBookingCards=renderBookingCards;
window.slp1BookingCards={
esc: esc,
sectionTitle: sectionTitle,
dataRow: dataRow,
statusClass: statusClass,
render: renderBookingCards
};
window.slp1BookingEdit={ wire: wireEdit };}());