(function() {
// --- KONFIGURATION ---
const BASE_PATH = 'https://app.bendixendans.dk/program/'; // SØRG FOR AT DENNE ER KORREKT
const MAIL_API = BASE_PATH + 'send_mail.php';
// --- SPROG STYRING (UI) ---
const uiTexts = {
da: {
title: "Bestil Prøvetime", subtitle: "Udfyld formularen, så giver vi underviseren besked om, at du kommer.",
lblName: "Dit Fulde Navn *", phName: "F.eks. Jens Jensen",
lblEmail: "E-mail *", phEmail: "din@email.dk",
lblPhone: "Telefon *",
lblCat: "1. Vælg Kategori *", optCatLoad: "Indlæser kategorier...", optCatSelect: "Vælg en kategori...", optCatErr: "Fejl ved indlæsning",
lblTeam: "2. Vælg Hold *", optTeamWait: "Vælg først kategori", optTeamSelect: "Vælg hold fra listen...",
lblDate: "3. Ønsket Dato *", optDateWait: "Vælg et hold for at se datoer", optDateSelect: "Vælg dato...",
lblMsg: "Eventuel besked (Valgfri)", phMsg: "Har du danset før? Har du en dansepartner med?",
captchaPre: "Spam-tjek: Hvad er", captchaPh: "Dit svar", errCaptcha: "Det indtastede svar i spam-tjekket var forkert. Prøv igen.",
btnSubmit: "Send Tilmelding", btnSending: "Sender...", btnSent: "Tilmelding Sendt!",
msgSuccess: "Tak! Din tilmelding er modtaget, og underviseren har fået besked. Vi glæder os til at se dig!",
msgError: "Der opstod en fejl. Prøv venligst igen, eller kontakt os direkte på mail.",
metaInstr: "Underviser", metaDancesOn: "Dette hold danser om", metaDaySuf: "en"
},
en: {
title: "Book a Trial Lesson", subtitle: "Fill out the form below, and we will notify the instructor of your arrival.",
lblName: "Your Full Name *", phName: "e.g. John Doe",
lblEmail: "Email *", phEmail: "your@email.com",
lblPhone: "Phone *",
lblCat: "1. Select Category *", optCatLoad: "Loading categories...", optCatSelect: "Select a category...", optCatErr: "Error loading classes",
lblTeam: "2. Select Class *", optTeamWait: "Select a category first", optTeamSelect: "Select a class from the list...",
lblDate: "3. Preferred Date *", optDateWait: "Select a class to see dates", optDateSelect: "Select a date...",
lblMsg: "Message (Optional)", phMsg: "Have you danced before? Are you bringing a partner?",
captchaPre: "Spam check: What is", captchaPh: "Your answer", errCaptcha: "The answer to the spam check was incorrect. Please try again.",
btnSubmit: "Submit Request", btnSending: "Sending...", btnSent: "Request Sent!",
msgSuccess: "Thank you! Your request has been received, and the instructor has been notified. We look forward to seeing you!",
msgError: "An error occurred. Please try again, or contact us directly via email.",
metaInstr: "Instructor", metaDancesOn: "This class dances on", metaDaySuf: "s"
}
};
// Detekter sprog fra HTML-koden (WPML sætter automatisk denne)
const docLang = document.documentElement.lang.toLowerCase();
const currentLang = docLang.includes('en') ? 'en' : 'da';
const txt = uiTexts[currentLang];
// Mini-ordbog til ugedage (til brug når vi oversætter data fra JSON)
const builtInTranslations = {
"Mandag": "Monday", "Mandage": "Mondays", "Tirsdag": "Tuesday", "Tirsdage": "Tuesdays", "Onsdag": "Wednesday", "Onsdage": "Wednesdays",
"Torsdag": "Thursday", "Torsdage": "Thursdays", "Fredag": "Friday", "Fredage": "Fridays", "Lørdag": "Saturday", "Lørdage": "Saturdays",
"Søndag": "Sunday", "Søndage": "Sundays", "Sal 1": "Room 1", "Sal 2": "Room 2"
};
// Appdater Formular Tekster dynamisk
document.getElementById('ui-title').innerText = txt.title;
document.getElementById('ui-subtitle').innerText = txt.subtitle;
document.getElementById('ui-lbl-name').innerText = txt.lblName;
document.getElementById('ui-ph-name').placeholder = txt.phName;
document.getElementById('ui-lbl-email').innerText = txt.lblEmail;
document.getElementById('ui-ph-email').placeholder = txt.phEmail;
document.getElementById('ui-lbl-phone').innerText = txt.lblPhone;
document.getElementById('ui-lbl-cat').innerText = txt.lblCat;
document.getElementById('ui-opt-cat').innerText = txt.optCatLoad;
document.getElementById('ui-lbl-team').innerText = txt.lblTeam;
document.getElementById('ui-opt-team').innerText = txt.optTeamWait;
document.getElementById('ui-lbl-date').innerText = txt.lblDate;
document.getElementById('ui-opt-date').innerText = txt.optDateWait;
document.getElementById('ui-lbl-msg').innerText = txt.lblMsg;
document.getElementById('ui-ph-msg').placeholder = txt.phMsg;
document.getElementById('ui-captcha-txt').innerText = txt.captchaPre;
document.getElementById('bd-math-answer').placeholder = txt.captchaPh;
document.getElementById('bd-submit-btn').innerText = txt.btnSubmit;
document.getElementById('bd-msg-success').innerText = txt.msgSuccess;
document.getElementById('bd-msg-error').innerText = txt.msgError;
// Vis formularen når teksterne er sat
document.getElementById('bd-form-wrapper').style.opacity = 1;
// --- LOGIK OG DATA ---
let groupedData = {};
let adminTranslations = {};
const catSelect = document.getElementById('bd-cat-select');
const teamSelect = document.getElementById('bd-team-select');
const dateSelect = document.getElementById('bd-date-select');
const teamMeta = document.getElementById('bd-team-meta');
const instrInput = document.getElementById('bd-instructor-input');
const roomInput = document.getElementById('bd-room-input');
const dayMap = {
'mandag': 1, 'mandage': 1, 'tirsdag': 2, 'tirsdage': 2, 'onsdag': 3, 'onsdage': 3,
'torsdag': 4, 'torsdage': 4, 'fredag': 5, 'fredage': 5, 'lørdag': 6, 'lørdage': 6, 'søndag': 0, 'søndage': 0
};
const enDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
// Oversættelses-hjælper (Data)
function t(text) {
if (currentLang !== 'en') return text;
if (!text) return '';
const cleanText = text.trim();
if (adminTranslations && adminTranslations[cleanText]) return adminTranslations[cleanText];
if (builtInTranslations[cleanText]) return builtInTranslations[cleanText];
return text;
}
// CAPTCHA LOGIK
let captchaExpected = 0;
function generateCaptcha() {
const num1 = Math.floor(Math.random() * 10) + 1;
const num2 = Math.floor(Math.random() * 10) + 1;
captchaExpected = num1 + num2;
document.getElementById('bd-math-calc').innerText = `${num1} + ${num2}`;
document.getElementById('bd-math-answer').value = '';
}
generateCaptcha();
// 1. Hent data fra server
async function loadFormData() {
const ts = Date.now();
try {
const [km, cust, hid, trans] = await Promise.all([
fetch(BASE_PATH + 'klubmodulhold.json?v=' + ts),
fetch(BASE_PATH + 'customhold.json?v=' + ts),
fetch(BASE_PATH + 'skjulte_hold.json?v=' + ts),
fetch(BASE_PATH + 'translations.json?v=' + ts)
]);
const kmData = km.ok ? await km.json() : [];
const custData = cust.ok ? await cust.json() : [];
const hidden = hid.ok ? await hid.json() : [];
adminTranslations = trans.ok ? await trans.json() : {};
[...kmData, ...custData].forEach(cat => {
let catName = cat.kategori_navn.trim();
if (!groupedData[catName]) groupedData[catName] = [];
let activeHolds = cat.hold.filter(h => !hidden.includes(h.id));
groupedData[catName].push(...activeHolds);
});
const sortedCats = Object.keys(groupedData).sort((a,b) => a.localeCompare(b));
catSelect.innerHTML = `${txt.optCatSelect}`;
sortedCats.forEach(catName => {
if (groupedData[catName].length > 0) {
const option = document.createElement('option');
// Gem den danske værdi for backend
option.value = catName;
// Vis oversat værdi
option.text = t(catName);
catSelect.appendChild(option);
}
});
} catch (e) {
console.error("Error:", e);
catSelect.innerHTML = `${txt.optCatErr}`;
}
}
// 2. Kategori Valgt
catSelect.addEventListener('change', function() {
const selectedCat = this.value;
const holds = groupedData[selectedCat] || [];
teamSelect.innerHTML = `${txt.optTeamSelect}`;
teamSelect.disabled = false;
dateSelect.innerHTML = `${txt.optDateWait}`;
dateSelect.disabled = true;
teamMeta.style.display = 'none';
holds.sort((a,b) => a.holdnavn.localeCompare(b.holdnavn));
holds.forEach(h => {
const option = document.createElement('option');
// Backend har brug for den danske reference
option.value = `${h.holdnavn} (${h.dag} ${h.tid})`;
const transName = t(h.holdnavn);
const transDay = t(h.dag);
option.text = `${transName} - ${transDay} @ ${h.tid}`;
option.dataset.instructor = h.instructor || "";
option.dataset.room = h.room || "";
option.dataset.day = h.dag || "";
teamSelect.appendChild(option);
});
});
// 3. Hold Valgt -> Datoer
teamSelect.addEventListener('change', function() {
const opt = this.options[this.selectedIndex];
instrInput.value = opt.dataset.instructor;
roomInput.value = opt.dataset.room;
let targetDayName = opt.dataset.day.toLowerCase().trim();
let targetDayIndex = dayMap[targetDayName];
dateSelect.innerHTML = `${txt.optDateSelect}`;
if (targetDayIndex !== undefined) {
for (let i = 0; i < 5; i++) {
let d = new Date();
d.setHours(0,0,0,0);
let currentDay = d.getDay();
let diff = targetDayIndex - currentDay;
if (diff < 0) diff += 7;
d.setDate(d.getDate() + diff + (i * 7));
// Formater dato baseret på sprog
let formattedDate;
if(currentLang === 'en') {
formattedDate = d.toLocaleDateString('en-GB', { weekday: 'long', day: 'numeric', month: 'short', year: 'numeric' });
} else {
formattedDate = d.toLocaleDateString('da-DK', { weekday: 'long', day: 'numeric', month: 'short', year: 'numeric' });
formattedDate = formattedDate.charAt(0).toUpperCase() + formattedDate.slice(1);
}
const dateOpt = document.createElement('option');
dateOpt.value = formattedDate;
dateOpt.text = formattedDate;
dateSelect.appendChild(dateOpt);
}
dateSelect.disabled = false;
const displayDay = currentLang === 'en' ? enDays[targetDayIndex] : opt.dataset.day.toLowerCase();
const translatedRoom = t(opt.dataset.room) || '-';
const displayInstr = opt.dataset.instructor || '-';
teamMeta.style.display = 'block';
teamMeta.innerHTML = `
📍 ${translatedRoom}
👤 ${txt.metaInstr}: ${displayInstr}
📅
${txt.metaDancesOn} ${displayDay}${txt.metaDaySuf}.
`;
} else {
// Hvis der mod forventning ikke er en ugedag
dateSelect.innerHTML = 'Dato aftales / To be agreed';
dateSelect.disabled = false;
teamMeta.style.display = 'none';
}
});
// 4. Send
const form = document.getElementById('bd-trial-form');
form.addEventListener('submit', async function(e) {
e.preventDefault();
// VALIDER CAPTCHA FØRST
const userAnswer = parseInt(document.getElementById('bd-math-answer').value, 10);
if (userAnswer !== captchaExpected) {
alert(txt.errCaptcha);
generateCaptcha();
return;
}
const btn = document.getElementById('bd-submit-btn');
const msgSuccess = document.getElementById('bd-msg-success');
const msgError = document.getElementById('bd-msg-error');
btn.disabled = true;
btn.innerText = txt.btnSending;
msgSuccess.style.display = 'none';
msgError.style.display = 'none';
const formData = {
name: form.name.value,
email: form.email.value,
phone: form.phone.value,
team: form.team.value,
date: form.date.value,
instructor: form.instructor.value,
message: form.message.value,
bot_check: form.bendixen_bot_check.value
};
try {
const response = await fetch(MAIL_API, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formData)
});
if (response.ok) {
msgSuccess.style.display = 'block';
form.reset();
catSelect.value = "";
teamSelect.innerHTML = `${txt.optTeamWait}`;
dateSelect.innerHTML = `${txt.optDateWait}`;
teamSelect.disabled = true;
dateSelect.disabled = true;
teamMeta.style.display = 'none';
btn.innerText = txt.btnSent;
generateCaptcha();
} else {
throw new Error('Server error');
}
} catch (err) {
console.error(err);
msgError.style.display = 'block';
btn.disabled = false;
btn.innerText = txt.btnSubmit;
}
});
loadFormData();
})();