Files
hotel777/public/scripts.js
2026-05-06 00:35:49 +05:00

490 lines
29 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Глобальные переводы (расширены для location, about, booking, food)
window.translations = {
ru: {
gallery_title: "Фотогалерея",
nav_about: "О нас",
nav_food: "Кухня",
nav_location: "Где мы",
nav_booking: "Бронь",
hero_title: "Добро пожаловать",
hero_subtitle: "Ваш идеальный отдых на берегу Черного моря",
hero_btn: "Забронировать номер",
about_title: "Море в шаговой доступности",
about_subtitle: "Бескрайние пляжи Гудауты",
about_text: "Наш отель расположен в живописном селе Мгудзырхуа на берегу Черного моря. Мы предлагаем комфортные номера с современными удобствами, прямой выход к широкому галечно-песчаному пляжу и впечатляющие виды на Кавказские горы. В окрестностях можно прогуляться по историческим улочкам, попробовать свежие местные продукты и блюда абхазской кухни. Гости ценят спокойствие, уют и близость к природе; для семей предусмотрены удобства и развлечения на территории.",
about_extra: "Гудаутский район известен как «Золотой берег Абхазии» здесь самые широкие пляжи, прогретое море и уникальный микроклимат, сочетающий горный и морской воздух.",
fact1: "🏝️ Золотой берег Абхазии",
fact2: "🌡️ Температура моря до +28°C летом",
fact3: "⛰️ Чистейший воздух у подножия Кавказа",
fact4: "🍇 Собственные виноградники и вино",
food_title: "Вкус Абхазии",
food_subtitle: "Домашняя кухня из местных продуктов",
food_text: "Почувствуйте гостеприимство! Свежайший сыр сулугуни, мамалыга, овощи с грядки и домашнее вино.",
food_request: "🍽️ Учитываем пожелания по питанию",
food_chef: "👨‍🍳 Приготовим блюдо для Вас спросите у шефа",
food_breakfast: "🕒 Завтрак: с 8:30 до 10:00",
food_lunch: "🕒 Обед: с 12:00 до 14:00",
food_dinner: "🕒 Ужин: с 19:00 до 21:00",
food_note: "📢 Сообщите администратору о любых предпочтениях при заселении мы всё организуем!",
loc_title: "Удобное расположение",
book_title: "Забронировать отдых",
label_name: "Ваше имя",
label_phone: "Номер телефона",
ph_name: "Иван Иванов",
fz152: "Согласие на обработку данных (152-ФЗ)",
book_btn: "Отправить заявку",
footer_text: "© 2026 Hotel 777. Абхазия, Мгудзырхуа.",
cookie_text: "Мы используем файлы cookie для улучшения работы сайта.",
cookie_btn: "Согласен",
alert_msg: "Спасибо! Ваша заявка принята.",
loc_address_label: "Наш Адрес:",
loc_coords_label: "Координаты:",
loc_show_map: "Показать карту",
loc_city_sukhum: "Сухум",
loc_city_ochamchyra: "Очамчыра",
loc_city_tkvarcheli: "Ткуарчал",
loc_city_gal: "Гал",
loc_city_new_athos: "Новый Афон",
loc_city_primorsk: "Приморск",
loc_city_gudauta: "Гудаута",
loc_km: "км",
book_adults: "Количество взрослых",
book_children: "Количество детей (до 12 лет)",
book_checkin: "Дата заезда",
book_checkout: "Дата выезда",
please_fill_all: "Пожалуйста, заполните все обязательные поля",
booking_success: "Заявка отправлена! Мы свяжемся с вами.",
booking_error: "Ошибка отправки. Попробуйте позже.",
loc_facts_sukhum: [
"🏛️ Один из древнейших городов мира, основан в VI веке до н.э.",
"🌿 Ботанический сад — один из старейших на Кавказе (основан в 1838 году).",
"🐬 Летом можно наблюдать дельфинов прямо у набережной."
],
loc_facts_ochamchyra: [
"🌊 Известен своим широким пляжем и чистой водой.",
"🏚️ В окрестностях находятся руины древнего храма.",
"🍊 Славится цитрусовыми садами."
],
loc_facts_tkvarcheli: [
"⛰️ Город расположен в живописном ущелье, окружён горами.",
"🚂 Железнодорожная станция на живописной ветке.",
"💧 Рядом находятся уникальные горные озёра."
],
loc_facts_gal: [
"🌾 Важный сельскохозяйственный центр Абхазии.",
"🍈 Знаменит дынями и арбузами, выращиваемыми в регионе.",
"🏛️ Имеет богатую историю, связанную с мегрельской культурой."
],
loc_facts_new_athos: [
"⛪ Знаменит Новоафонским монастырём (XIX век).",
"🕯️ Экскурсия в пещеру — одно из самых ярких впечатлений.",
"🚞 Работает канатная дорога к монастырю."
],
loc_facts_primorsk: [
"🌅 Уютный посёлок с отличными пляжами.",
"🏞️ Близость к Пицундскому заповеднику.",
"🍷 В окрестностях производят домашнее вино."
],
loc_facts_gudauta: [
"🎖️ Город воинской славы, родина многих героев.",
"🏖️ Широкие галечные пляжи — одни из лучших в Абхазии.",
"🍇 Традиционные виноградники и знаменитые сорта винограда."
],
loc_facts_default: "✨ Удивительные места ждут вас!",
summer_title: "Летнее кафе у моря",
summer_subtitle: "Свежие блюда и летний бриз",
summer_text: "Летнее кафе приглашает вас насладиться лёгкими блюдами на открытом воздухе. Экзотические фрукты, прохладительные напитки и тёплый морской воздух создают идеальный день у моря.",
summer_note: "Мы рекомендуем забронировать столик на закате; фотографии будут добавлены позже.",
summer_alt: "Летнее кафе у моря"
},
en: {
gallery_title: "Photo Gallery",
nav_about: "About Us",
nav_food: "Cuisine",
nav_location: "Where We Are",
nav_booking: "Booking",
hero_title: "Welcome",
hero_subtitle: "Your perfect getaway on the Black Sea coast",
hero_btn: "Book a room",
about_title: "Sea within walking distance",
about_subtitle: "Endless beaches of Gudauta",
about_text: "Our hotel is located in the picturesque village of Mgudzyrkhua on the shores of the Black Sea. We offer comfortable rooms with modern amenities, direct access to a wide pebble-sand beach, and stunning views of the Caucasus mountains. Nearby you can stroll historic streets, enjoy fresh local produce, and sample authentic Abkhaz cuisine. We welcome guests for short visits and extended stays with family-friendly services.",
about_extra: "The Gudauta district is known as the 'Golden Beach of Abkhazia' the widest beaches, warm sea, and a unique microclimate combining mountain and sea air.",
fact1: "🏝️ Golden Beach of Abkhazia",
fact2: "🌡️ Sea temperature up to +28°C in summer",
fact3: "⛰️ Cleanest air at the foot of the Caucasus",
fact4: "🍇 Own vineyards and wine",
food_title: "Taste of Abkhazia",
food_subtitle: "Homemade cuisine from local ingredients",
food_text: "Feel the hospitality! Suluguni cheese, mamalyga, garden vegetables, and homemade wine.",
food_request: "🍽️ We accommodate dietary preferences",
food_chef: "👨‍🍳 We'll cook a dish for you ask the chef",
food_breakfast: "🕒 Breakfast: 8:30 10:00",
food_lunch: "🕒 Lunch: 12:00 14:00",
food_dinner: "🕒 Dinner: 19:00 21:00",
food_note: "📢 Tell the administrator about any preferences at check-in we'll arrange everything!",
loc_title: "Convenient location",
book_title: "Book your holiday",
label_name: "Your name",
label_phone: "Phone number",
ph_name: "Ivan Ivanov",
fz152: "Consent to data processing (152-FZ RF)",
book_btn: "Send request",
footer_text: "© 2026 Hotel 777. Abkhazia, Mgudzyrkhua.",
cookie_text: "We use cookies to improve the website.",
cookie_btn: "Agree",
alert_msg: "Thank you! Your request has been accepted.",
loc_address_label: "Our Address:",
loc_coords_label: "Coordinates:",
loc_show_map: "Show map",
loc_city_sukhum: "Sukhum",
loc_city_ochamchyra: "Ochamchira",
loc_city_tkvarcheli: "Tkvarcheli",
loc_city_gal: "Gal",
loc_city_new_athos: "New Athos",
loc_city_primorsk: "Primorsk",
loc_city_gudauta: "Gudauta",
loc_km: "km",
book_adults: "Number of adults",
book_children: "Number of children (under 12)",
book_checkin: "Check-in date",
book_checkout: "Check-out date",
please_fill_all: "Please fill all required fields",
booking_success: "Request sent! We will contact you.",
booking_error: "Submission error. Please try again later.",
loc_facts_sukhum: [
"🏛️ One of the oldest cities in the world, founded in the 6th century BC.",
"🌿 Botanical Garden one of the oldest in the Caucasus (founded 1838).",
"🐬 Dolphins can be seen near the embankment in summer."
],
loc_facts_ochamchyra: [
"🌊 Known for its wide beach and clear water.",
"🏚️ Ruins of an ancient temple are nearby.",
"🍊 Famous for citrus groves."
],
loc_facts_tkvarcheli: [
"⛰️ The city is located in a picturesque gorge, surrounded by mountains.",
"🚂 Railway station on a scenic branch.",
"💧 Unique mountain lakes are nearby."
],
loc_facts_gal: [
"🌾 An important agricultural center of Abkhazia.",
"🍈 Famous for melons and watermelons grown in the region.",
"🏛️ Has a rich history related to Mingrelian culture."
],
loc_facts_new_athos: [
"⛪ Famous for the New Athos Monastery (19th century).",
"🕯️ A tour of the cave is one of the most vivid experiences.",
"🚞 A cable car runs to the monastery."
],
loc_facts_primorsk: [
"🌅 A cozy town with excellent beaches.",
"🏞️ Close to the Pitsunda Nature Reserve.",
"🍷 Homemade wine is produced in the area."
],
loc_facts_gudauta: [
"🎖️ City of military glory, birthplace of many heroes.",
"🏖️ Wide pebble beaches some of the best in Abkhazia.",
"🍇 Traditional vineyards and famous grape varieties."
],
loc_facts_default: "✨ Amazing places are waiting for you!",
summer_title: "Summer Café by the Sea",
summer_subtitle: "Fresh dishes and summer breeze",
summer_text: "The Summer Café invites you to enjoy light meals outdoors. Exotic fruits, cold drinks and the sea breeze create a perfect seaside day.",
summer_note: "We recommend reserving a table at sunset; photos will be added later.",
summer_alt: "Summer Café by the Sea"
},
ab: {
gallery_title: "Афотоқәа ргалерея",
nav_about: "Ҳара ҳхәыҷра",
nav_food: "Аџьа",
nav_location: "Ҳара иҟоу",
nav_booking: "Аҭагалара",
hero_title: "Бзиала шәаабеит",
hero_subtitle: "Амшын Еиқәа аԥшазы уара уидеалтә уахыҧсыра",
hero_btn: "Аҭаӡара аҭагалатә",
about_title: "Амшын ашьапыла ихьчо",
about_subtitle: "Гәдоуҭа иаҵәаку аҧшаҳәақәа",
about_text: "Ҳара ахәҭа ҳҟоуп агәаҟаратә ақыҭа Мгудзырхуа. Ҳара ҳааҭауеит комфорттә аҭаӡарақәа нас амшын аҟныҵла аҩаӡара.",
about_extra: "Гәдоуҭа араион иҭоуҳәоуп «Аԥсны Аџьа аԥша» ҳәа абар аҧшаҳәақәа иреиҳау, амшын аҵаԥхьа ишәоит +28°C, уи аҭыԥ амикроклимат ҳаирҭоит ашьха нас амшын.",
fact1: "🏝️ Аԥсны Аџьа аԥша",
fact2: "🌡️ Амшын аҵаԥхьа +28°C аҟынӡа",
fact3: "⛰️ Акавказ аҵаҟа иҟоу аҵхыҵ",
fact4: "🍇 Ҳара авиноградникқәа нас авин",
food_title: "Аԥсны аҵәа",
food_subtitle: "Аџьа ҭаацәарантәи аҭыԥтә афасаҟәақәа рыла",
food_text: "Ашьааҭра шәаазыр! Ибжьа асулугуни, абаста, аҵиаа ҵаҟатәи нас аҭаацәарантәи аҵаа.",
food_request: "🍽️ Ашәхәаҭаҩра аиҭаҵра шәаазырҵоит",
food_chef: "👨‍🍳 Шәы жәҩаны ахәылҵа ишәаазырҵоит ашеф ишәааҽазыр",
food_breakfast: "🕒 Ашәхә: 8:30 10:00 азы",
food_lunch: "🕒 Абжьара: 12:00 14:00",
food_dinner: "🕒 Аҵх: 19:00 21:00",
food_note: "📢 Администратор ишәааҽазыр ахынчә қәыԥсқәа ҳара иҭабуп!",
loc_title: "Каратә аҭыԥкаара",
book_title: "Ахыҧсыра аҭагалара",
label_name: "Шәхы",
label_phone: "Ателефон аномер",
ph_name: "Иван Иванов",
fz152: "Аинформациа аҟаҵаразы аиҭаҵра (152-ФЗ РФ)",
book_btn: "Азаявка аҭаҭатә",
footer_text: "© 2026 Hotel 777. Аԥсны, Мгудзырхуа.",
cookie_text: "Ҳара асаит аҟаҵара аҵәаҵәаразы cookie-файлқәа ҳхылаҩуеит.",
cookie_btn: "Аиҭаҵра",
alert_msg: "Иҭабуп! Шәзаявка алырҵеит.",
loc_address_label: "Ҳара адрес:",
loc_coords_label: "Акоординатқәа:",
loc_show_map: "Ахәаҧшра карта",
loc_city_sukhum: "Аҟәа",
loc_city_ochamchyra: "Очамчыра",
loc_city_tkvarcheli: "Тҟәарчал",
loc_city_gal: "Гал",
loc_city_new_athos: "Афон Ҿыц",
loc_city_primorsk: "Приморск",
loc_city_gudauta: "Гәдоуҭа",
loc_km: "км",
book_adults: "Аҧшәмаҭааҩцәа рхыҧхьаӡара",
book_children: "Аҵлақәа рхыҧхьаӡара (12 шықәса рҟынӡа)",
book_checkin: "Аҭагалара амш",
book_checkout: "Акәылара амш",
please_fill_all: "Ишәҧшәа, азықәҭа змоу аҭыԥқәа рымч",
booking_success: "Азаявка ацәыҵит! Ҳара шәыҟазаалак шәааҽазыр.",
booking_error: "Ацәыҵра аҟаҵаразы алшара. Ушәа агәаҧш, ушәа шәааҽаз.",
loc_facts_sukhum: [
"🏛️ Адунеи аиҳабылакьықәа руакы, VI ашәышықәса рахь нҵа иҟоуп.",
"🌿 Аботаникатә сад — Акавказ аиҳабылакьықәа руакы (1838 ш.).",
"🐬 Амшын аҟынӡа дельфинқәа аԥсабарала уаԥхьоит."
],
loc_facts_ochamchyra: [
"🌊 Иҭоуҳәоуп иаау аҧшаҳәаҟынтәи ласа аҵакыра.",
"🏚️ Иҝеиԥшу аҩныҵҟатәи ацқьатә уахәама иҟоуп.",
"🍊 Ацитрусқәа рҵаҵәра рымоуп."
],
loc_facts_tkvarcheli: [
"⛰️ Ақалақь ашьхақәа рыкәтә аҟны иҟоуп.",
"🚂 Ацәахаҵатә аиаша аҟны астанциа.",
"💧 Ихадоу ашьхатә иоу аӡиқәа ҷыдала иҟоуп."
],
loc_facts_gal: [
"🌾 Аԥсны аҳәынҭқарратә аԥштәыҩсатә центр.",
"🍈 Иҭоуҳәоуп аҵәа, арбузқәа.",
"🏛️ Амингрел ҳәынҭқарратә культура иааҵанакуеит."
],
loc_facts_new_athos: [
"⛪ Иҭоуҳәоуп Афон Ҵыцтәи ауахәама (XIX ашә.).",
"🕯️ Ацқьатә хьаҧсаҟны аиҭаҵра — аиҳабылакьықәа руакы.",
"🚞 Ауахәамаҟны аканат аҩра ұсуеит."
],
loc_facts_primorsk: [
"🌅 Амшын аԥшазы ухыҧсыразы ҷыдатә ақыҭа.",
"🏞️ Пицундатә заповедник аҟынтәи аҩаӡара.",
"🍷 Аҭыҧ аҟны аҭаацәарантәи аҵаа аҟаҵоуп."
],
loc_facts_gudauta: [
"🎖️ Аиааира аиҭаҵра ақалақь, аиааираҭҵаақәа рҭаацәара.",
"🏖️ Иаау аҧшаҳәақәа — Аԥсны аиҳабылакьықәа руакы.",
"🍇 Аҭыԥтәи авиноградникқәа нас иҭоуҳәоу авин асортқәа."
],
loc_facts_default: "✨ Амилакьатә аҭыԥқәа шәаажәлар!",
summer_title: "Амшынаҿы иҟоу аҧшьатә кафе",
summer_subtitle: "Ацәа ҭаҭақәаи аҧшьатә абризи",
summer_text: "Аҧшьатә кафе шәыҭахуеит ауаҩы аҿы аҵыс-ҵыс ҭаҭақәа рылҵшәаразы. Екзотикатә аплодқәа, асыжь шәақәа, амшынатә абриз ирызҵоуп амшынаҿы иҭаҵаку амш.",
summer_note: "Ҳҭакуп амш иҭамхара шәстол ахьчразы; афотографиақәа ахала иацҵоит.",
summer_alt: "Амшынаҿы иҟоу аҧшьатә кафе"
}
};
// Функция закрытия модального окна
window.closeModal = function() {
const modal = document.getElementById('cityModal');
if (modal) modal.style.display = 'none';
};
// Принятие куки
window.acceptCookies = function() {
localStorage.setItem('cookiesAccepted', 'true');
const banner = document.getElementById('cookieBanner');
if (banner) banner.classList.remove('show');
};
document.addEventListener("DOMContentLoaded", () => {
// Инициализация AOS (Анимации при скролле)
if (typeof AOS !== 'undefined') {
AOS.init({
duration: 800,
once: true,
offset: 100
});
}
// Инициализация Swiper (Галерея)
if (typeof Swiper !== 'undefined') {
new Swiper('.mySwiper', {
loop: true,
autoplay: {
delay: 3000,
disableOnInteraction: false,
},
pagination: {
el: '.swiper-pagination',
clickable: true,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
breakpoints: {
320: { slidesPerView: 1, spaceBetween: 10 },
768: { slidesPerView: 2, spaceBetween: 20 },
1024: { slidesPerView: 3, spaceBetween: 30 }
}
});
}
// --- Установка статичного фона для hero (первое изображение) ---
const hero = document.querySelector('.hero');
const firstImage = 'img/h777.webp';
const img = new Image();
img.src = firstImage;
img.onload = () => {
hero.style.backgroundImage = `linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6)), url('${img.src}')`;
};
// Ошибка 404 tiny.webp больше не возникает, так как мы не используем его в качестве фона по умолчанию
// Локализация основных элементов (с data-i18n)
const langSelect = document.getElementById('langSwitch');
// По умолчанию выбор — русский, затем английский, абхазский
let currentLang = localStorage.getItem('siteLang') || 'ru';
// Применить язык без перезагрузки страницы
function setLanguage(lang) {
if (!lang || !window.translations[lang]) return;
const previousLang = localStorage.getItem('siteLang');
localStorage.setItem('siteLang', lang);
// Обновление текстов на странице
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
if (window.translations[lang][key] !== undefined) el.innerHTML = window.translations[lang][key];
});
document.querySelectorAll('[data-i18n-ph]').forEach(el => {
const key = el.getAttribute('data-i18n-ph');
if (window.translations[lang][key] !== undefined) el.placeholder = window.translations[lang][key];
});
// Обновление модульных секций
if (typeof window.updateLocationLanguage === 'function') window.updateLocationLanguage(lang);
if (typeof window.updateAboutLanguage === 'function') window.updateAboutLanguage(lang);
if (typeof window.updateFoodLanguage === 'function') window.updateFoodLanguage(lang);
if (typeof window.updateSummerCafeLanguage === 'function') window.updateSummerCafeLanguage(lang);
// Принудительное полное обновление страницы при смене языка
if (previousLang && previousLang !== lang) {
window.location.reload();
}
}
const updateText = (lang) => {
document.querySelectorAll('[data-i18n]').forEach(el => {
const key = el.getAttribute('data-i18n');
if (window.translations[lang][key]) el.innerHTML = window.translations[lang][key];
});
document.querySelectorAll('[data-i18n-ph]').forEach(el => {
const key = el.getAttribute('data-i18n-ph');
if (window.translations[lang][key]) el.placeholder = window.translations[lang][key];
});
localStorage.setItem('siteLang', lang);
if (typeof window.updateLocationLanguage === 'function') {
window.updateLocationLanguage(lang);
}
if (typeof window.updateAboutLanguage === 'function') {
window.updateAboutLanguage(lang);
}
if (typeof window.updateFoodLanguage === 'function') {
window.updateFoodLanguage(lang);
}
if (typeof window.updateSummerCafeLanguage === 'function') {
window.updateSummerCafeLanguage(lang);
}
};
langSelect.value = currentLang;
// Применяем язык на старте
setLanguage(currentLang);
// Обработчик смены языка без перезагрузки страницы
langSelect.onchange = (e) => setLanguage(e.target.value);
// Cookie
if (!localStorage.getItem('cookiesAccepted')) {
setTimeout(() => document.getElementById('cookieBanner').classList.add('show'), 2000);
}
// Форма бронирования (без intl-tel-input)
const bookingForm = document.getElementById('bookingForm');
if (bookingForm) {
bookingForm.onsubmit = async (e) => {
e.preventDefault();
const lang = localStorage.getItem('siteLang') || 'ru';
const name = document.getElementById('name').value.trim();
const phone = document.getElementById('phone').value.trim();
const adults = parseInt(document.getElementById('adults').value);
const children = parseInt(document.getElementById('children').value) || 0;
const checkin = document.getElementById('checkin').value;
const checkout = document.getElementById('checkout').value;
const consent = document.getElementById('consent').checked;
if (!name || !phone || !adults || !checkin || !checkout || !consent) {
alert(window.translations[lang].please_fill_all);
return;
}
const payload = { name, phone, adults, children, checkin, checkout };
try {
const response = await fetch('/api/bookings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json();
const msgDiv = document.getElementById('bookingMessage');
if (response.ok) {
msgDiv.innerHTML = `<div style="color: green; background:#e0f2e9; padding:0.8rem; border-radius:12px;">${window.translations[lang].booking_success}</div>`;
bookingForm.reset();
document.getElementById('adults').value = '1';
document.getElementById('children').value = '0';
} else {
msgDiv.innerHTML = `<div style="color: red;">${result.error || window.translations[lang].booking_error}</div>`;
}
} catch (err) {
document.getElementById('bookingMessage').innerHTML = `<div style="color: red;">${window.translations[lang].booking_error}</div>`;
}
};
}
// Анимации при скролле (один IntersectionObserver)
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.animationPlayState = 'running';
observer.unobserve(entry.target); // отключаем после появления
}
});
}, { threshold: 0.1, rootMargin: '50px' });
document.querySelectorAll('.animate').forEach(el => {
el.style.animationPlayState = 'paused';
observer.observe(el);
});
// Модальное окно: закрытие по крестику и по клику на фон
const modal = document.getElementById('cityModal');
if (modal) {
const closeBtn = modal.querySelector('.modal-close');
if (closeBtn) closeBtn.addEventListener('click', window.closeModal);
modal.addEventListener('click', (e) => {
if (e.target === modal) window.closeModal();
});
}
});