document.addEventListener('DOMContentLoaded', function() { let viewerOpen = false; let currentIndex = -1; let imageList = []; // Initialize imageList with all images on the page function initializeImageList() { imageList = Array.from(document.querySelectorAll('.image img.clickable')); } const viewerOverlay = document.getElementById('image-viewer-overlay'); // Set the innerHTML of viewerOverlay viewerOverlay.innerHTML = `


`; const imageView = viewerOverlay.querySelector('#image-viewer'); const imagesContainer = document.querySelector('.images'); function openImageViewer(element) { initializeImageList(); const parentImageDiv = element.closest('.image'); if (!parentImageDiv) return; currentIndex = imageList.findIndex(img => img === parentImageDiv.querySelector('img.clickable')); if (currentIndex === -1) return; displayImage(currentIndex); viewerOpen = true; imagesContainer.classList.remove('images_viewer_hidden'); document.body.classList.add('viewer-open'); viewerOverlay.style.display = 'block'; imageView.classList.replace('image_hide', 'image_show'); } let fullImageUrl, sourceUrl, proxyFullUrl; function displayImage(index) { if (index < 0 || index >= imageList.length) return; imageList.forEach(img => { const parentImageDiv = img.closest('.image'); parentImageDiv?.classList.remove('image_selected'); }); const imgElement = imageList[index]; const parentImageDiv = imgElement.closest('.image'); parentImageDiv?.classList.add('image_selected'); fullImageUrl = imgElement.getAttribute('data-full') || imgElement.src; sourceUrl = imgElement.getAttribute('data-source'); proxyFullUrl = imgElement.getAttribute('data-proxy-full') || fullImageUrl; const viewerImage = document.getElementById('viewer-image'); const viewerTitle = document.getElementById('viewer-title'); viewerTitle.textContent = imgElement.alt || 'Untitled'; viewerImage.onerror = () => viewerImage.src = proxyFullUrl; viewerImage.onload = () => {}; viewerImage.src = fullImageUrl; } document.getElementById('viewer-copy-link').onclick = () => { navigator.clipboard.writeText(window.location.origin + fullImageUrl).catch(console.error); }; document.getElementById('viewer-open-image').onclick = () => { window.open(fullImageUrl, '_blank'); }; document.getElementById('viewer-open-source').onclick = () => { window.open(sourceUrl || proxyFullUrl, '_blank'); }; document.getElementById('viewer-download-image').onclick = (event) => { event.stopPropagation(); const a = document.createElement('a'); a.href = fullImageUrl; a.download = fullImageUrl.split('/').pop(); document.body.appendChild(a); a.click(); document.body.removeChild(a); }; document.body.addEventListener('click', e => { const clickableElement = e.target.closest('img.clickable, .img_title.clickable'); if (clickableElement) { e.preventDefault(); openImageViewer(clickableElement); } }); function closeImageViewer() { imageView.classList.replace('image_show', 'image_hide'); viewerOpen = false; currentIndex = -1; imagesContainer.classList.add('images_viewer_hidden'); document.body.classList.remove('viewer-open'); viewerOverlay.style.display = 'none'; imageList.forEach(img => img.closest('.image')?.classList.remove('image_selected')); } document.getElementById('viewer-close-button').onclick = closeImageViewer; document.getElementById('viewer-prev-button').onclick = () => currentIndex > 0 && displayImage(--currentIndex); document.getElementById('viewer-next-button').onclick = () => currentIndex < imageList.length - 1 && displayImage(++currentIndex); document.addEventListener('click', e => { if (viewerOpen && !viewerOverlay.contains(e.target) && !e.target.closest('.image')) { closeImageViewer(); } }); document.addEventListener('keydown', e => { if (!viewerOpen) return; if (e.key === 'Escape') closeImageViewer(); if (e.key === 'ArrowLeft' && currentIndex > 0) displayImage(--currentIndex); if (e.key === 'ArrowRight' && currentIndex < imageList.length - 1) displayImage(++currentIndex); }); });