(function (){
function qsa(sel, root){
return Array.prototype.slice.call((root||document).querySelectorAll(sel));
}
function buildOverlay(){
const overlay=document.createElement('div');
overlay.className='eg-lightbox-overlay';
overlay.innerHTML=`
<div class="eg-lightbox-stage">
<button type="button" class="eg-lightbox-close" aria-label="Close">×</button>
<button type="button" class="eg-lightbox-nav eg-lightbox-prev" aria-label="Previous">‹</button>
<img alt="">
<button type="button" class="eg-lightbox-nav eg-lightbox-next" aria-label="Next">›</button>
</div>
<div class="eg-lightbox-caption"></div>
`;
document.body.appendChild(overlay);
return overlay;
}
let overlay=null;
let items=[];
let index=0;
let preloadNextImg=null;
let preloadPrevImg=null;
function preloadAround(idx){
if(!items.length) return;
const nextIdx=(idx + 1) % items.length;
const prevIdx=(idx - 1 + items.length) % items.length;
preloadNextImg=new Image();
preloadNextImg.src=items[nextIdx].getAttribute('href');
preloadPrevImg=new Image();
preloadPrevImg.src=items[prevIdx].getAttribute('href');
}
function show(idx){
if(!overlay) overlay=buildOverlay();
if(!items.length) return;
index=(idx + items.length) % items.length;
const link=items[index];
const img=overlay.querySelector('img');
const cap=overlay.querySelector('.eg-lightbox-caption');
img.src=link.getAttribute('href');
cap.textContent=link.dataset.caption||'';
overlay.classList.add('active');
preloadAround(index);
}
function close(){
if(!overlay) return;
overlay.classList.remove('active');
}
function next(){ show(index + 1); }
function prev(){ show(index - 1); }
document.addEventListener('click', function (e){
const link=e.target.closest('.eg-lightbox-item');
if(!link) return;
e.preventDefault();
const gallery=link.closest('.eg-lightbox-gallery');
if(!gallery) return;
items=qsa('.eg-lightbox-item', gallery);
index=items.indexOf(link);
show(index);
});
document.addEventListener('click', function (e){
if(!overlay||!overlay.classList.contains('active')) return;
if(e.target.classList.contains('eg-lightbox-close')) return close();
if(e.target.classList.contains('eg-lightbox-next')) return next();
if(e.target.classList.contains('eg-lightbox-prev')) return prev();
if(e.target===overlay) return close();
});
document.addEventListener('keydown', function (e){
if(!overlay||!overlay.classList.contains('active')) return;
if(e.key==='Escape') return close();
if(e.key==='ArrowRight') return next();
if(e.key==='ArrowLeft') return prev();
});
let startX=null;
document.addEventListener('touchstart', function (e){
if(!overlay||!overlay.classList.contains('active')) return;
if(!e.touches||e.touches.length!==1) return;
startX=e.touches[0].clientX;
}, { passive: true });
document.addEventListener('touchend', function (e){
if(!overlay||!overlay.classList.contains('active')) return;
if(startX===null) return;
const endX=e.changedTouches&&e.changedTouches[0]
? e.changedTouches[0].clientX
: null;
if(endX===null){ startX=null; return; }
const diff=endX - startX;
startX=null;
if(Math.abs(diff) < 50) return;
if(diff < 0) next();
else prev();
}, { passive: true });
})();