Slideshow

Von $1

  • You do not have permissions to view this page - please try logging in.
Inhaltsverzeichnis
keine Gliederung

Version seit 14:15, 6 Nov 2026

zu dieser Version.

Zurück zu Versionshistorie.

Zeige aktuelle Version

 

 

(function() {

    var loadBtn  = document.getElementById('galleryLoadBtn');
    var playBtn  = document.getElementById('galleryPlayBtn');
    var stopBtn  = document.getElementById('galleryStopBtn');
    var statusEl = document.getElementById('galleryStatus');
    var grid     = document.getElementById('galleryGrid');
    var lightbox = document.getElementById('galleryLightbox');
    var bigImg   = document.getElementById('galleryBig');
    var caption  = document.getElementById('galleryCaption');
    var prevBtn  = document.getElementById('galleryPrev');
    var nextBtn  = document.getElementById('galleryNext');
    var closeBtn = document.getElementById('galleryClose');
    var overlay  = document.getElementById('galleryOverlay');

    var images     = new Array();
    var currentIdx = 0;
    var slideTimer = null;
    var DELAY      = 3000;
    var IMG_EXTS   = 'jpg jpeg png gif bmp webp svg';

    function setStatus(msg, color) {
        statusEl.textContent = msg;
        statusEl.style.color = color || '#888';
    }

    /* --- Page ID holen --- */
    function getPageId() {
        if (typeof Deki !== 'undefined' && Deki.PageId) { return Deki.PageId; }
        /* Fallback: aus URL parsen */
        var m = window.location.pathname.match(/\/(\d+)\//);
        return m ? m[1] : 0;
    }

    /* --- Bilder der aktuellen Seite laden --- */
    function loadImages() {
        var pageId = getPageId();
        if (!pageId) {
            setStatus('Page-ID nicht gefunden.', '#ff4444');
            return;
        }
        loadBtn.disabled = true;
        setStatus('Lade Seitenbilder...', '#7ecfff');
        grid.innerHTML = '';

        var xhr = new XMLHttpRequest();
        xhr.open('GET', '/@api/deki/pages/' + pageId + '/files?dream.out.format=xml', true);
        xhr.onload = function() {
            if (xhr.status !== 200) {
                setStatus('Fehler HTTP ' + xhr.status, '#ff4444');
                loadBtn.disabled = false;
                return;
            }
            var parser = new DOMParser();
            var xml    = parser.parseFromString(xhr.responseText, 'text/xml');
            var nodes  = xml.getElementsByTagName('file');
            images     = new Array();
            var i;
            for (i = 0; i < nodes.length; i++) {
                var contentsNode = nodes[i].getElementsByTagName('contents');
                var nameNode     = nodes[i].getElementsByTagName('filename');
                if (!contentsNode.length) continue;
                var url  = contentsNode[0].getAttribute('href') || '';
                var name = nameNode.length ? nameNode[0].textContent : '';
                var ext  = name.split('.').pop().toLowerCase();
                if (IMG_EXTS.indexOf(ext) === -1) continue;
                var item  = new Object();
                item.url  = url;
                item.name = name;
                images.push(item);
            }
            loadBtn.disabled = false;
            if (images.length === 0) {
                setStatus('Keine Bilder auf dieser Seite.', '#ff8c69');
                return;
            }
            setStatus(images.length + ' Bild(er) gefunden', '#7fffb0');
            renderGrid();
            playBtn.style.display = 'inline-block';
        };
        xhr.onerror = function() {
            setStatus('API nicht erreichbar.', '#ff4444');
            loadBtn.disabled = false;
        };
        xhr.send();
    }

    /* --- Grid --- */
    function renderGrid() {
        grid.innerHTML = '';
        var i;
        for (i = 0; i < images.length; i++) {
            var img = document.createElement('img');
            img.className = 'galleryThumb';
            img.alt = images[i].name;
            img.src = images[i].url;
            (function(idx) {
                img.onclick = function() { openLightbox(idx); };
            })(i);
            grid.appendChild(img);
        }
    }

    /* --- Lightbox --- */
    function openLightbox(idx) {
        currentIdx = idx;
        updateLightbox();
        lightbox.style.display = 'block';
    }

    function updateLightbox() {
        bigImg.src = '';
        bigImg.src = images[currentIdx].url;
        caption.textContent = (currentIdx + 1) + ' / ' + images.length + '  \u2014  ' + images[currentIdx].name;
        var thumbs = grid.getElementsByTagName('img');
        var i;
        for (i = 0; i < thumbs.length; i++) {
            thumbs[i].className = i === currentIdx ? 'galleryThumb gActive' : 'galleryThumb';
        }
    }

    function closeLightbox() {
        stopSlideshow();
        lightbox.style.display = 'none';
        var thumbs = grid.getElementsByTagName('img');
        var i;
        for (i = 0; i < thumbs.length; i++) { thumbs[i].className = 'galleryThumb'; }
        if (images.length) { playBtn.style.display = 'inline-block'; }
        stopBtn.style.display = 'none';
    }

    function showNext() { currentIdx = (currentIdx + 1) % images.length; updateLightbox(); }
    function showPrev() { currentIdx = (currentIdx - 1 + images.length) % images.length; updateLightbox(); }

    /* --- Slideshow --- */
    function startSlideshow() {
        if (lightbox.style.display !== 'block') { openLightbox(0); }
        playBtn.style.display = 'none';
        stopBtn.style.display = 'inline-block';
        slideTimer = setInterval(function() { showNext(); }, DELAY);
    }

    function stopSlideshow() {
        if (slideTimer) { clearInterval(slideTimer); slideTimer = null; }
        stopBtn.style.display = 'none';
        if (images.length) { playBtn.style.display = 'inline-block'; }
    }

    /* --- Events --- */
    loadBtn.onclick  = function() { loadImages(); };
    playBtn.onclick  = function() { startSlideshow(); };
    stopBtn.onclick  = function() { stopSlideshow(); };
    closeBtn.onclick = function() { closeLightbox(); };
    overlay.onclick  = function() { closeLightbox(); };
    prevBtn.onclick  = function() { showPrev(); };
    nextBtn.onclick  = function() { showNext(); };

    document.onkeydown = function(e) {
        if (lightbox.style.display !== 'block') return;
        var k = e.keyCode;
        if (k === 37)      { showPrev(); }
        else if (k === 39) { showNext(); }
        else if (k === 27) { closeLightbox(); }
    };

})();
NoElements {}

 
Use the language selection below for English Utilise le sélecteur de langue ci-dessous pour français Per l'italiano, utilizzare la selezione della lingua qui sotto Schön sprichst du deutsch :-)