Загрузка данных
document.addEventListener("DOMContentLoaded", () => {
// --- УТИЛИТА: Безопасное добавление событий ---
const addEvent = (id, event, callback) => {
const el = document.getElementById(id) || document.querySelector(id);
if (el) el.addEventListener(event, callback);
};
// --- 1. МАСКА ТЕЛЕФОНА ---
addEvent('input[name="phone"]', "input", (e) => {
let value = e.target.value.replace(/\D/g, "");
if (value.startsWith("7") || value.startsWith("8")) value = value.substring(1);
let formatted = "+7 ";
if (value.length > 0) formatted += "(" + value.substring(0, 3);
if (value.length > 3) formatted += ") " + value.substring(3, 6);
if (value.length > 6) formatted += "-" + value.substring(6, 8);
if (value.length > 8) formatted += "-" + value.substring(8, 10);
e.target.value = formatted.substring(0, 18);
});
// --- 2. ВАЛИДАЦИЯ ПАРОЛЯ ---
const pass = document.getElementById("password");
const confirm = document.getElementById("password_confirm");
const submitBtn = document.querySelector(".reg-button");
if (pass && confirm) {
const validate = () => {
const isMatch = confirm.value.length === 0 || pass.value === confirm.value;
confirm.style.borderColor = isMatch ? "var(--border-color)" : "#ff4b4b";
if (submitBtn) {
submitBtn.disabled = !isMatch || pass.value.length < 4;
submitBtn.style.opacity = submitBtn.disabled ? "0.5" : "1";
}
};
pass.addEventListener("input", validate);
confirm.addEventListener("input", validate);
}
// --- 3. ПЕРЕКЛЮЧАТЕЛЬ ТИПА ПОЛЬЗОВАТЕЛЯ ---
const btnPrivate = document.getElementById('btn-private');
const btnCompany = document.getElementById('btn-company');
const labelName = document.getElementById('label-name');
const typeInput = document.getElementById('user-type');
if (btnPrivate && btnCompany) {
[btnPrivate, btnCompany].forEach(btn => {
btn.addEventListener('click', () => {
btnPrivate.classList.toggle('active', btn === btnPrivate);
btnCompany.classList.toggle('active', btn === btnCompany);
if (typeInput) typeInput.value = btn === btnPrivate ? 'private' : 'company';
if (labelName) labelName.innerText = btn === btnPrivate ? 'ФИО' : 'Название компании';
});
});
}
// --- 4. ЯЗЫКОВОЙ ДРОПДАУН ---
addEvent('.dropbtn', 'click', (e) => {
e.stopPropagation();
document.querySelector(".dropdown-content")?.classList.toggle("show");
});
document.querySelectorAll(".dropdown-content a").forEach(link => {
link.addEventListener("click", (e) => {
const langText = document.getElementById("languageText");
if (langText) langText.textContent = link.getAttribute("data-lang");
document.querySelector(".dropdown-content")?.classList.remove("show");
});
});
// --- 5. ЛОГИКА СЛАЙДЕРА (ПОРТФОЛИО) ---
const track = document.getElementById("track");
if (track) {
const slides = document.querySelectorAll(".slide");
const prevBtn = document.getElementById("prevBtn");
const nextBtn = document.getElementById("nextBtn");
let currentIndex = 1; // Обычно начинают с 1, если есть клоны
let isTransitioning = false;
const updateCarousel = (animate = true) => {
track.style.transition = animate ? "transform 0.6s cubic-bezier(0.22, 1, 0.36, 1)" : "none";
const slideWidth = slides[0].offsetWidth;
const gap = parseInt(window.getComputedStyle(track).gap) || 0;
const viewportWidth = track.parentElement.offsetWidth;
// Центрирование активного слайда
const centerOffset = (viewportWidth - slideWidth) / 2;
const position = -(currentIndex * (slideWidth + gap)) + centerOffset;
track.style.transform = `translateX(${position}px)`;
slides.forEach((s, i) => s.classList.toggle("active", i === currentIndex));
};
const moveSlide = (direction) => {
if (isTransitioning) return;
isTransitioning = true;
currentIndex += direction;
updateCarousel();
};
// Назначаем события кнопкам здесь, а не в HTML
prevBtn?.addEventListener('click', () => moveSlide(-1));
nextBtn?.addEventListener('click', () => moveSlide(1));
track.addEventListener("transitionend", () => {
isTransitioning = false;
// Бесконечный цикл (логика клонов)
if (currentIndex === slides.length - 1) {
currentIndex = 1;
updateCarousel(false);
} else if (currentIndex === 0) {
currentIndex = slides.length - 2;
updateCarousel(false);
}
});
window.addEventListener("resize", () => updateCarousel(false));
// Инициализация
setTimeout(() => updateCarousel(false), 100);
}
});