💒 Hochzeit
🎂 Geburtstag
🏢 Firmenevent
🕯️ Trauerfeier
🎉 Sonstiges
/* ============================================
CATERING FORMULAR - JAVASCRIPT
Café zum Esel
============================================ */
// State
const packages = {
vorspeisen: { price: 0, count: 0, selected: [] },
hauptgerichte: { price: 0, count: 0, selected: [], beilagen: 0 },
dessert: { price: 0, count: 0, selected: [] },
salat: { price: 0, count: 0 },
brot: { price: 0 },
mitternacht: { price: 0 },
beilagen: { selected: [] }
};
let extrasTotal = 0;
// Toggle Section
function toggleSection(header) {
header.parentElement.classList.toggle('collapsed');
}
// Select Event Type
function selectEventType(btn) {
document.querySelectorAll('.event-type-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
}
// Select Package
function selectPackage(el, category, price, count) {
// Deselect all in category
el.parentElement.querySelectorAll('.package-option').forEach(opt => opt.classList.remove('selected'));
el.classList.add('selected');
packages[category].price = price;
packages[category].count = count;
// Special handling for Hauptgerichte (has beilagen)
if (category === 'hauptgerichte') {
packages.hauptgerichte.beilagen = parseInt(el.dataset.beilagen) || 0;
// Show/hide hauptgerichte selection
const showHauptgerichte = count > 0;
document.getElementById('hauptgerichteInfo').style.display = showHauptgerichte ? 'flex' : 'none';
document.getElementById('hauptgerichteList').style.display = showHauptgerichte ? 'block' : 'none';
document.getElementById('beilagenInfo').style.display = showHauptgerichte ? 'flex' : 'none';
document.getElementById('beilagenList').style.display = showHauptgerichte ? 'block' : 'none';
// Clear selections if package changed
packages.hauptgerichte.selected = [];
packages.beilagen.selected = [];
document.querySelectorAll('#hauptgerichteList .menu-item, #beilagenList .menu-item').forEach(item => {
item.classList.remove('selected');
item.querySelector('.checkbox').innerHTML = '';
});
}
// Show/hide menu selection for vorspeisen, dessert
if (['vorspeisen', 'dessert'].includes(category)) {
const show = count > 0;
document.getElementById(category + 'Info').style.display = show ? 'flex' : 'none';
document.getElementById(category + 'List').style.display = show ? 'block' : 'none';
// Clear selections
packages[category].selected = [];
document.querySelectorAll(`#${category}List .menu-item`).forEach(item => {
item.classList.remove('selected');
item.querySelector('.checkbox').innerHTML = '';
});
}
updateCounters();
calculate();
}
// Toggle Menu Item
function toggleMenuItem(el, category) {
const maxCount = category === 'beilagen' ? packages.hauptgerichte.beilagen : packages[category].count;
const currentSelected = category === 'beilagen' ? packages.beilagen.selected : packages[category].selected;
const itemName = el.querySelector('.item-name').textContent;
const isSelected = el.classList.contains('selected');
if (isSelected) {
// Deselect
el.classList.remove('selected');
el.querySelector('.checkbox').innerHTML = '';
const idx = currentSelected.indexOf(itemName);
if (idx > -1) currentSelected.splice(idx, 1);
} else {
// Check if we can select more
if (currentSelected.length >= maxCount) {
// Shake animation or alert
el.style.animation = 'shake 0.3s';
setTimeout(() => el.style.animation = '', 300);
return;
}
el.classList.add('selected');
el.querySelector('.checkbox').innerHTML = '✓';
currentSelected.push(itemName);
}
updateCounters();
}
// Toggle Extra
function toggleExtra(el) {
const price = parseFloat(el.dataset.price) || 0;
const isSelected = el.classList.toggle('selected');
if (isSelected) {
el.querySelector('.checkbox').innerHTML = '✓';
extrasTotal += price;
} else {
el.querySelector('.checkbox').innerHTML = '';
extrasTotal -= price;
}
calculate();
}
// Update Counters
function updateCounters() {
['vorspeisen', 'hauptgerichte', 'dessert'].forEach(cat => {
const counter = document.getElementById(cat + 'Counter');
if (counter) {
const current = packages[cat].selected.length;
const max = packages[cat].count;
counter.textContent = `${current} / ${max}`;
counter.className = 'counter';
if (current === max && max > 0) counter.classList.add('complete');
if (current > max) counter.classList.add('over');
}
});
// Beilagen counter
const beilagenCounter = document.getElementById('beilagenCounter');
if (beilagenCounter) {
const current = packages.beilagen.selected.length;
const max = packages.hauptgerichte.beilagen;
beilagenCounter.textContent = `${current} / ${max}`;
beilagenCounter.className = 'counter';
if (current === max && max > 0) beilagenCounter.classList.add('complete');
if (current > max) beilagenCounter.classList.add('over');
}
}
// Calculate Total
function calculate() {
const guests = parseInt(document.getElementById('guestCount').value) || 30;
// Calculate per-person costs
let perPerson = 0;
perPerson += packages.vorspeisen.price;
perPerson += packages.hauptgerichte.price;
perPerson += packages.dessert.price;
perPerson += packages.salat.price;
perPerson += packages.brot.price;
perPerson += packages.mitternacht.price;
// Total
let total = perPerson * guests + extrasTotal;
// Update subtotals
updateSubtotal('subtotalVorspeisen', packages.vorspeisen.price * guests);
updateSubtotal('subtotalHauptgerichte', packages.hauptgerichte.price * guests);
updateSubtotal('subtotalDessert', packages.dessert.price * guests);
updateSubtotal('subtotalSalat', packages.salat.price * guests);
updateSubtotal('subtotalBrot', packages.brot.price * guests);
updateSubtotal('subtotalMitternacht', packages.mitternacht.price * guests);
updateSubtotal('subtotalExtras', extrasTotal);
// Update display
document.getElementById('totalDisplay').textContent = total.toLocaleString('de-DE', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}) + ' €';
document.getElementById('perPersonDisplay').textContent = perPerson.toLocaleString('de-DE', {
minimumFractionDigits: 2,
maximumFractionDigits: 2
}) + ' € pro Person (ohne Extras)';
}
// Update Subtotal Display
function updateSubtotal(id, value) {
const el = document.getElementById(id);
if (el) {
if (value > 0) {
el.textContent = value.toLocaleString('de-DE', {minimumFractionDigits: 2}) + ' €';
} else {
el.textContent = '';
}
}
}
// Submit Request
function submitRequest() {
const name = document.getElementById('customerName').value;
const email = document.getElementById('customerEmail').value;
if (!name || !email) {
alert('Bitte geben Sie mindestens Name und E-Mail an.');
return;
}
let summary = `Catering-Anfrage Café zum Esel\n\n`;
summary += `Name: ${name}\n`;
summary += `E-Mail: ${email}\n`;
summary += `Telefon: ${document.getElementById('customerPhone').value}\n`;
summary += `Datum: ${document.getElementById('eventDate').value}\n`;
summary += `Uhrzeit: ${document.getElementById('eventTime').value}\n`;
summary += `Personenzahl: ${document.getElementById('guestCount').value}\n\n`;
summary += `=== MENÜAUSWAHL ===\n\n`;
if (packages.vorspeisen.price > 0) {
summary += `VORSPEISEN (${packages.vorspeisen.price.toFixed(2)} € p.P.):\n`;
packages.vorspeisen.selected.forEach(s => summary += ` - ${s}\n`);
summary += '\n';
}
if (packages.hauptgerichte.price > 0) {
summary += `HAUPTGERICHTE (${packages.hauptgerichte.price.toFixed(2)} € p.P.):\n`;
packages.hauptgerichte.selected.forEach(s => summary += ` - ${s}\n`);
summary += `BEILAGEN:\n`;
packages.beilagen.selected.forEach(s => summary += ` - ${s}\n`);
summary += '\n';
}
if (packages.dessert.price > 0) {
summary += `DESSERTS (${packages.dessert.price.toFixed(2)} € p.P.):\n`;
packages.dessert.selected.forEach(s => summary += ` - ${s}\n`);
summary += '\n';
}
if (packages.salat.price > 0) {
summary += `SALATBUFFET: ${packages.salat.price.toFixed(2)} € p.P.\n\n`;
}
if (packages.brot.price > 0) {
summary += `BROTAUSWAHL: ${packages.brot.price.toFixed(2)} € p.P.\n\n`;
}
if (packages.mitternacht.price > 0) {
summary += `MITTERNACHTSSNACK: ${packages.mitternacht.price.toFixed(2)} € p.P.\n\n`;
}
if (extrasTotal > 0) {
summary += `EXTRAS: ${extrasTotal.toFixed(2)} € pauschal\n`;
document.querySelectorAll('.extra-item.selected').forEach(el => {
summary += ` - ${el.querySelector('.extra-name').textContent}\n`;
});
summary += '\n';
}
summary += `===================\n`;
summary += `GESAMTPREIS: ${document.getElementById('totalDisplay').textContent}\n`;
summary += `Pro Person: ${document.getElementById('perPersonDisplay').textContent}\n\n`;
summary += `Bemerkungen:\n${document.getElementById('notes').value}`;
const subject = encodeURIComponent(`Catering-Anfrage ${document.getElementById('eventDate').value || 'TBD'}`);
const body = encodeURIComponent(summary);
window.location.href = `mailto:info@cafezumesel.de?subject=${subject}&body=${body}`;
}
// Initial calculation on page load
document.addEventListener('DOMContentLoaded', function() {
calculate();
});
Café zum Esel · Handgemacht mit Liebe
Wählen Sie Ihre Menü-Pakete und stellen Sie sich aus unseren Gerichten Ihr Wunschmenü zusammen. Die Preise sind Bruttopreise pro Person. Kinder bis 3 Jahre essen kostenfrei, bis 10 Jahre zahlen 50%. Vegetarische, vegane oder spezielle Menüwünsche realisieren wir gern in gemeinsamer Absprache.