// assets/js/main.js
document.addEventListener('DOMContentLoaded', () => {
const openBtn = document.getElementById('open-invitation-btn');
const envelopeScreen = document.getElementById('envelope-screen');
const mainContent = document.getElementById('main-content');
const audio = document.getElementById('bg-audio');
const audioController = document.getElementById('audio-controller');
const toggleAudioBtn = document.getElementById('toggle-audio-btn');
const iconPlay = document.getElementById('icon-play');
const iconMusic = document.getElementById('icon-music');
let isPlaying = false;
// 1. Envelope Open & Autoplay Music
if (openBtn) {
openBtn.addEventListener('click', () => {
// Hide envelope
envelopeScreen.style.transition = 'opacity 0.8s ease, transform 0.8s ease';
envelopeScreen.style.opacity = '0';
envelopeScreen.style.transform = 'translateY(-200px)';
setTimeout(() => {
envelopeScreen.style.display = 'none';
// Show main content
mainContent.classList.remove('hidden');
mainContent.style.display = 'flex';
// Trigger reflow
void mainContent.offsetWidth;
mainContent.style.opacity = '1';
// Show Audio controller
audioController.classList.remove('hidden');
// Play Audio
audio.play().then(() => {
isPlaying = true;
updateAudioUI();
}).catch(err => {
console.warn('Autoplay blocked:', err);
});
}, 800);
});
}
// 2. Audio Toggle
if (toggleAudioBtn) {
toggleAudioBtn.addEventListener('click', () => {
if (isPlaying) {
audio.pause();
isPlaying = false;
} else {
audio.play();
isPlaying = true;
}
updateAudioUI();
});
}
function updateAudioUI() {
if (isPlaying) {
iconPlay.classList.add('hidden');
iconMusic.classList.remove('hidden');
toggleAudioBtn.classList.add('animate-spin-slow', 'text-amber-500');
} else {
iconPlay.classList.remove('hidden');
iconMusic.classList.add('hidden');
toggleAudioBtn.classList.remove('animate-spin-slow', 'text-amber-500');
}
}
// 3. Countdown Timer
const timerElement = document.getElementById('countdown-timer');
if (timerElement) {
const targetDateStr = timerElement.getAttribute('data-date');
// Example format needed: "July 25, 2026 18:00:00"
// In index.php we output it as "Шілде 25, 2026 18:00:00". We need to map month to English for JS Date parser.
const monthMap = {
'Қаңтар': 'January', 'Ақпан': 'February', 'Наурыз': 'March', 'Сәуір': 'April',
'Мамыр': 'May', 'Маусым': 'June', 'Шілде': 'July', 'Тамыз': 'August',
'Қыркүйек': 'September', 'Қазан': 'October', 'Қараша': 'November', 'Желтоқсан': 'December'
};
let parsedDateStr = targetDateStr;
for (const [kz, en] of Object.entries(monthMap)) {
if (parsedDateStr.includes(kz)) {
parsedDateStr = parsedDateStr.replace(kz, en);
break;
}
}
const targetDate = new Date(parsedDateStr).getTime();
function updateTimer() {
const now = new Date().getTime();
const distance = targetDate - now;
if (distance < 0) {
return; // timer ended
}
const days = Math.floor(distance / (1000 * 60 * 60 * 24));
const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
const seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById('days').innerText = days.toString().padStart(2, '0');
document.getElementById('hours').innerText = hours.toString().padStart(2, '0');
document.getElementById('minutes').innerText = minutes.toString().padStart(2, '0');
document.getElementById('seconds').innerText = seconds.toString().padStart(2, '0');
}
setInterval(updateTimer, 1000);
updateTimer();
}
// 4. RSVP Form Submission
const rsvpFormWrapper = document.getElementById('rsvp-form-wrapper');
const rsvpSuccess = document.getElementById('rsvp-success');
const rsvpForm = document.getElementById('rsvp-form');
function showSuccess(text) {
if (rsvpFormWrapper) rsvpFormWrapper.style.display = 'none';
if (rsvpSuccess) {
rsvpSuccess.style.display = 'block';
rsvpSuccess.innerHTML = text;
}
}
// Если уже отвечал — сразу показываем сообщение
if (localStorage.getItem('rsvp_submitted') === 'true') {
showSuccess('Сіздің жауабыңыз қабылданған.
Рақмет!');
}
if (rsvpForm) {
rsvpForm.addEventListener('submit', async (e) => {
e.preventDefault();
const btn = document.getElementById('rsvp-submit-btn');
btn.disabled = true;
btn.innerText = 'Жіберілуде...';
const formData = new FormData(rsvpForm);
const data = Object.fromEntries(formData.entries());
try {
const response = await fetch('api/rsvp.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
name: data.name,
willAttend: data.willAttend,
guestsCount: parseInt(data.guestsCount || 0),
wishes: data.wishes
})
});
if (response.ok) {
localStorage.setItem('rsvp_submitted', 'true');
showSuccess('Жауабыңыз қабылданды.
Рақмет!');
} else {
alert('Қате пайда болды. Қайта көріңіз.');
btn.disabled = false;
btn.innerText = 'Жіберу';
}
} catch (err) {
alert('Қате пайда болды. Қайта көріңіз.');
btn.disabled = false;
btn.innerText = 'Жіберу';
}
});
}
});