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", () => { //lightboxes lightboxObj = constructLightbox(); document.body.appendChild(lightboxObj.dialog); function setImageMaxSize(img) { const { maxWidth: origMaxWidth, maxHeight: origMaxHeight, minWidth: origMinWidth, minHeight: origMinHeight, } = getComputedStyle(img); console.log(img, img.naturalWidth, img.naturalHeight, origMinWidth, origMinHeight, origMaxWidth, origMaxHeight) if (img.naturalWidth < parseInt(origMinWidth)) { console.log(1) img.style.minWidth = img.naturalWidth + "px"; } if (img.naturalHeight < parseInt(origMinHeight)) { console.log(2) img.style.minHeight = img.naturalHeight + "px"; } if (img.naturalWidth < parseInt(origMaxWidth)) { console.log(3) img.style.maxWidth = img.naturalWidth + "px"; } if (img.naturalHeight < parseInt(origMaxHeight)) { console.log(4) img.style.maxHeight = img.naturalHeight + "px"; } } const postImages = document.querySelectorAll(".post-inner img.post-image"); 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); }); }); const postAndSigImages = document.querySelectorAll("img.post-image"); postAndSigImages.forEach(image => { if (image.complete) { setImageMaxSize(image); } else { image.addEventListener("load", () => setImageMaxSize(image)); } }) });