function activateSelfDeactivateSibs(button) { if (button.classList.contains("active")) return; Array.from(button.parentNode.children).forEach(s => { if (s === button){ button.classList.add('active'); } else { s.classList.remove('active'); } const targetId = s.dataset.targetId; const target = document.getElementById(targetId); if (!target) return; if (s.classList.contains('active')) { target.classList.add('active'); target.dispatchEvent(new CustomEvent("tab-activated", {bubbles: false})) } else { target.classList.remove('active'); } }); } function openLightbox(post, idx) { lightboxCurrentPost = post; lightboxCurrentIdx = idx; lightboxObj.img.src = lightboxImages.get(post)[idx].src; lightboxObj.openOriginalAnchor.href = lightboxImages.get(post)[idx].src lightboxObj.prevButton.disabled = lightboxImages.get(post).length === 1 lightboxObj.nextButton.disabled = lightboxImages.get(post).length === 1 lightboxObj.imageCount.textContent = `Image ${idx + 1} of ${lightboxImages.get(post).length}` if (!lightboxObj.dialog.open) { lightboxObj.dialog.showModal(); } } const modulo = (n, m) => ((n % m) + m) % m function lightboxNext() { const l = lightboxImages.get(lightboxCurrentPost).length; const target = modulo(lightboxCurrentIdx + 1, l); openLightbox(lightboxCurrentPost, target); } function lightboxPrev() { const l = lightboxImages.get(lightboxCurrentPost).length; const target = modulo(lightboxCurrentIdx - 1, l); openLightbox(lightboxCurrentPost, target); } function constructLightbox() { const dialog = document.createElement("dialog"); dialog.classList.add("lightbox-dialog"); dialog.addEventListener("click", (e) => { if (e.target === dialog) { dialog.close(); } }) const dialogInner = document.createElement("div"); dialogInner.classList.add("lightbox-inner"); dialog.appendChild(dialogInner); const img = document.createElement("img"); img.classList.add("lightbox-image") dialogInner.appendChild(img); const openOriginalAnchor = document.createElement("a") openOriginalAnchor.text = "Open original in new window" openOriginalAnchor.target = "_blank" openOriginalAnchor.rel = "noopener noreferrer nofollow" dialogInner.appendChild(openOriginalAnchor); const navSpan = document.createElement("span"); navSpan.classList.add("lightbox-nav"); const prevButton = document.createElement("button"); prevButton.type = "button"; prevButton.textContent = "Previous"; prevButton.addEventListener("click", lightboxPrev); const nextButton = document.createElement("button"); nextButton.type = "button"; nextButton.textContent = "Next"; nextButton.addEventListener("click", lightboxNext); const imageCount = document.createElement("span"); imageCount.textContent = "Image of "; navSpan.appendChild(prevButton); navSpan.appendChild(imageCount); navSpan.appendChild(nextButton); dialogInner.appendChild(navSpan); return { img: img, dialog: dialog, openOriginalAnchor: openOriginalAnchor, prevButton: prevButton, nextButton: nextButton, imageCount: imageCount, } } let lightboxImages = new Map(); //.post-inner : Array let lightboxObj = null; let lightboxCurrentPost = null; let lightboxCurrentIdx = -1; document.addEventListener("DOMContentLoaded", () => { // tabs document.querySelectorAll(".tab-button").forEach(button => { button.addEventListener("click", () => { activateSelfDeactivateSibs(button); }); }); // accordions const accordions = document.querySelectorAll(".accordion"); accordions.forEach(accordion => { const header = accordion.querySelector(".accordion-header"); const toggleButton = header.querySelector(".accordion-toggle"); const content = accordion.querySelector(".accordion-content"); const toggle = (e) => { e.stopPropagation(); accordion.classList.toggle("hidden"); content.classList.toggle("hidden"); toggleButton.textContent = content.classList.contains("hidden") ? "►" : "▼" } toggleButton.addEventListener("click", toggle); }); //lightboxes lightboxObj = constructLightbox(); document.body.appendChild(lightboxObj.dialog); const postImages = document.querySelectorAll(".post-inner img.block-img"); postImages.forEach(postImage => { const belongingTo = postImage.closest(".post-inner"); const images = lightboxImages.get(belongingTo) ?? []; images.push({ src: postImage.src, alt: postImage.alt, }); const idx = images.length - 1; lightboxImages.set(belongingTo, images); postImage.style.cursor = "pointer"; postImage.addEventListener("click", () => { openLightbox(belongingTo, idx); }); }); });