let urlCreator = window.URL || window.webkitURL;
let currentAttachmentID = 0;
let currentBeerdName = [];
const deviceID = "web";
async function SavePhoto(self) {
document.getElementById("result").innerHTML = "";
let photo = document.getElementById("file-input").files[0];
let formData = new FormData();
formData.append("f", photo);
formData.append('device_id', deviceID);
let response = await fetch(self.action, { method: "POST", body: formData });
if (response.ok) {
let json = await response.json();
currentAttachmentID = json.uploaded_attach_id;
let text = "
${json.results[key]} (вероятность: ${Math.round(parseFloat(key) * 100)}%)
Описание и фото`;
} else {
text += `
${json.results[key]} (вероятность: ${Math.round(parseFloat(key) * 100)}%)
`;
}
// Поиск всех изображений для текущего результата
let allUrls = [];
for (let imgKey in json.images) {
if (json.images[imgKey].name === json.results[key]) {
allUrls.push(...json.images[imgKey].url);
}
}
text += createGalleryHTML(allUrls);
text += "
";
uniqChecker[json.results[key]] = key;
}
// Обработка дополнительных результатов
for (let key in json.results_net) {
if (uniqChecker[json.results_net[key]] !== undefined) continue;
text += `
${json.results_net[key]}
`;
let allUrls = [];
for (let imgKey in json.images) {
if (json.images[imgKey].name === json.results_net[key]) {
allUrls.push(...json.images[imgKey].url);
}
}
text += createGalleryHTML(allUrls);
text += "
";
}
document.getElementById("result").innerHTML = text;
document.querySelector(".star-rating").style.display = "block";
document.getElementById("rate-stars").style.display = "block";
document.getElementById("feedback").textContent = "";
setTimeout(function(){
window.scrollBy({
top: 300,
behavior: 'smooth'
});
}, 100);
// Внутри функции SavePhoto после вставки HTML:
document.querySelectorAll('.main-image').forEach(img => {
img.addEventListener('click', function (e) {
const urls = JSON.parse(this.dataset.urls);
showModal(urls);
e.stopPropagation();
});
});
// Функции для работы модального окна
function showModal(urls) {
const modal = document.createElement('div');
modal.className = 'modal-overlay';
modal.innerHTML = `
${urls.map(url => `

`).join('')}
`;
modal.addEventListener('click', (e) => {
if (e.target === modal) hideModal();
});
document.body.appendChild(modal);
modal.style.display = 'flex';
document.body.style.overflow = 'hidden';
}
function hideModal() {
const modal = document.querySelector('.modal-overlay');
if (modal) {
document.body.removeChild(modal);
document.body.style.overflow = 'auto';
}
}
let isTouchDevice = 'ontouchstart' in window;
let startX = 0;
let scrollLeft = 0;
document.addEventListener('DOMContentLoaded', () => {
const grid = document.querySelector('.thumbnails-grid');
if (isTouchDevice && grid) {
grid.addEventListener('touchstart', (e) => {
startX = e.touches[0].pageX - grid.offsetLeft;
scrollLeft = grid.scrollLeft;
});
grid.addEventListener('touchmove', (e) => {
e.preventDefault();
const x = e.touches[0].pageX - grid.offsetLeft;
const walk = (x - startX) * 2;
grid.scrollLeft = scrollLeft - walk;
});
}
});
} else {
alert("Ошибка HTTP: " + response.status);
}
}
const fileInput = document.getElementById("file-input");
if (fileInput) {
fileInput.addEventListener("change", function () {
let photo = document.getElementById("file-input").files[0];
let imageUrl = urlCreator.createObjectURL(photo);
document.getElementById("image").src = imageUrl;
document.getElementById("upload-image-text").innerHTML = "Ваше изображение:";
});
}
// Добавляем обработчик клика для бургера
document.addEventListener('DOMContentLoaded', function () {
const burger = document.querySelector('.burger');
const menu = document.querySelector('#menu ul');
burger.addEventListener('click', function () {
this.classList.toggle('active');
menu.classList.toggle('active');
});
// Закрываем меню при ресайзе окна
window.addEventListener('resize', function () {
if (window.innerWidth > 768) {
burger.classList.remove('active');
menu.classList.remove('active');
}
});
});
// описание породы
function openModal(imgElement) {
const modal = document.getElementById('modal');
const modalImg = document.getElementById('modal-img');
const caption = document.getElementById('caption');
modal.style.display = "block";
modalImg.src = imgElement.src;
caption.innerHTML = imgElement.alt;
}
function closeModal() {
document.getElementById('modal').style.display = "none";
}
/* ────────────────────────────────────────────────────── */
/* 3️⃣ Скрипт: выбор звезды, отправка POST‑запроса */
/* ────────────────────────────────────────────────────── */
(() => {
const ratingContainer = document.querySelector('.star-rating');
const stars = Array.from(ratingContainer.querySelectorAll('.star'));
const feedback = document.getElementById('feedback');
let currentRating = 0; // 0 = пока не выбрано
// Установить визуальное состояние (цвет, aria‑checked)
function setRating(value) {
currentRating = value;
stars.forEach(star => {
const starValue = Number(star.dataset.value);
const isSelected = starValue <= value;
star.classList.toggle('selected', isSelected);
star.setAttribute('aria-checked', isSelected);
});
}
// Отправка POST /vote
async function sendVote(value) {
// Подготовьте объект‑payload. Добавьте id‑токены, если нужны.
const payload = {
rate: value,
attachment_id: currentAttachmentID,
beerd_name: currentBeerdName[0],
};
try {
const resp = await fetch('/votes/do', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
credentials: 'include' // если ваш API использует cookies
});
if (!resp.ok) {
throw new Error(`Ошибка ${resp.status}`);
}
feedback.textContent = 'Спасибо за оценку!';
feedback.style.color = '#080';
document.getElementById("rate-stars").style.display = "none";
} catch (err) {
console.error(err);
feedback.textContent = 'Произошла ошибка, попробуйте позже.';
feedback.style.color = '#a00';
}
}
// Обработчики клика и клавиатуры
stars.forEach(star => {
// Клик мышкой
star.addEventListener('click', () => {
const value = Number(star.dataset.value);
setRating(value);
sendVote(value);
});
// Навигация клавиатурой: пробел/Enter выбирает звезду
star.addEventListener('keydown', e => {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
const value = Number(star.dataset.value);
setRating(value);
sendVote(value);
}
});
// При наведении меняем состояние всех звёзд до текущего
star.addEventListener('mouseover', () => {
setRating(Number(star.dataset.value));
});
star.addEventListener('mouseout', () => {
setRating(currentRating); // вернём к сохранённому
});
});
// По умолчанию не показываем выбранную оценку
setRating(0);
})();