const CONFIG = { telegram: "sochi_privet", // без @ email: "youredik@yandex.ru", apiBase: "https://d5dkbvcelljvkq2p8l5n.s183zexc.apigw.yandexcloud.net", }; const form = document.getElementById("order-form"); const status = document.getElementById("form-status"); const tgLink = document.getElementById("tg-link"); const mailLink = document.getElementById("mail-link"); const year = document.getElementById("year"); if (year) year.textContent = new Date().getFullYear(); if (tgLink) tgLink.href = `https://t.me/${CONFIG.telegram}`; if (mailLink) mailLink.href = `mailto:${CONFIG.email}`; function buildMessage() { if (!form) return ""; const data = new FormData(form); const value = (name) => String(data.get(name) || "").trim(); return [ "Заявка на песню", `Имя: ${value("name")}`, `Связь: ${value("contact")}`, `Повод: ${value("occasion")}`, `История: ${value("story")}`, value("deadline") ? `Когда нужно: ${value("deadline")}` : "", "", "Согласие на обработку данных и AI-пометку: да", ] .filter(Boolean) .join("\n"); } async function copyText(text) { try { await navigator.clipboard.writeText(text); return true; } catch { const area = document.createElement("textarea"); area.value = text; area.style.position = "fixed"; area.style.opacity = "0"; document.body.appendChild(area); area.select(); const ok = document.execCommand("copy"); area.remove(); return ok; } } function setLinks(text) { if (tgLink) tgLink.href = `https://t.me/${CONFIG.telegram}?text=${encodeURIComponent(text)}`; if (mailLink) { mailLink.href = `mailto:${CONFIG.email}?subject=${encodeURIComponent( "Заявка на песню" )}&body=${encodeURIComponent(text)}`; } } if (form) { form.addEventListener("submit", async (event) => { event.preventDefault(); if (!form.reportValidity()) return; const data = new FormData(form); const value = (name) => String(data.get(name) || "").trim(); const payload = { name: value("name"), contact: value("contact"), occasion: value("occasion"), story: value("story"), consent: true, }; if (!status) return; status.textContent = "Отправляем заявку…"; status.style.color = "#6b6258"; try { const response = await fetch(`${CONFIG.apiBase}/orders`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); const result = await response.json(); if (!response.ok) throw new Error(result.error || "request_failed"); status.textContent = "Заявка отправлена. Мы свяжемся с вами в течение рабочего дня."; status.style.color = "#3c6b4a"; form.reset(); } catch { const text = buildMessage(); setLinks(text); const copied = await copyText(text); status.textContent = copied ? "Не удалось отправить автоматически. Заявка скопирована — откройте Telegram или письмо." : "Не удалось отправить автоматически. Выделите текст формы и скопируйте вручную."; status.style.color = copied ? "#3c6b4a" : "#b94a28"; } }); } // Плеер фрагмента const audio = document.getElementById("audio"); const playBtn = document.getElementById("play"); const playIcon = playBtn ? playBtn.querySelector(".play-icon") : null; const progress = document.getElementById("progress"); const waveFill = document.getElementById("wave-fill"); const current = document.getElementById("current"); function formatTime(seconds) { if (!Number.isFinite(seconds)) return "0:00"; const s = Math.max(0, Math.round(seconds)); return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, "0")}`; } function updateProgress() { if (!audio || !waveFill) return; const duration = audio.duration || 60; const ratio = Math.min(1, audio.currentTime / duration); waveFill.style.clipPath = `inset(0 ${(1 - ratio) * 100}% 0 0)`; if (current) current.textContent = formatTime(audio.currentTime); if (progress) progress.setAttribute("aria-valuenow", String(Math.round(audio.currentTime))); } if (audio && playBtn) { audio.volume = 0.9; playBtn.addEventListener("click", () => { if (audio.paused) audio.play(); else audio.pause(); }); audio.addEventListener("play", () => { playBtn.classList.add("playing"); playBtn.setAttribute("aria-pressed", "true"); playBtn.setAttribute("aria-label", "Пауза"); if (playIcon) playIcon.textContent = "❚❚"; }); audio.addEventListener("pause", () => { playBtn.classList.remove("playing"); playBtn.setAttribute("aria-pressed", "false"); playBtn.setAttribute("aria-label", "Играть фрагмент"); if (playIcon) playIcon.textContent = "▶"; }); audio.addEventListener("timeupdate", updateProgress); audio.addEventListener("loadedmetadata", updateProgress); audio.addEventListener("ended", () => { audio.currentTime = 0; updateProgress(); }); } if (progress && audio) { const seek = (event) => { const rect = progress.getBoundingClientRect(); const ratio = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width)); audio.currentTime = ratio * (audio.duration || 60); updateProgress(); }; progress.addEventListener("click", seek); progress.addEventListener("keydown", (event) => { if (event.key === "ArrowRight") audio.currentTime = Math.min(audio.duration || 60, audio.currentTime + 2); if (event.key === "ArrowLeft") audio.currentTime = Math.max(0, audio.currentTime - 2); updateProgress(); }); }