Ugrás a tartalomhoz

„MediaWiki:Common.js” változatai közötti eltérés

Innen: MKOE wiki
Nincs szerkesztési összefoglaló
Címke: Kézi visszaállítás
Nincs szerkesztési összefoglaló
 
(56 közbenső módosítás ugyanattól a felhasználótól nincs mutatva)
1. sor: 1. sor:
// Bootstrap Icons betöltése
/**
* VECTOR 2022 TELEPORT BUGFIX - DRGYZ
* Létrehozza a hiányzó teleportációs célpontokat, mielőtt a skin JS elhasalna
*/
(function() {
    function injectVectorTargets() {
        var targets = ['p-lang-btn', 'vector-user-links-dropdown', 'vector-toc-landmark'];
 
        targets.forEach(function(id) {
            if (!document.getElementById(id)) {
                var dummy = document.createElement('div');
                dummy.id = id;
                dummy.className = 'vector-teleport-dummy-target';
                dummy.style.display = 'none';
                document.body.appendChild(dummy);
            }
        });
    }
 
    injectVectorTargets();
 
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', injectVectorTargets);
    }
})();
 
/**
* ============================================================================
* LIGHTGALLERY GLOBÁLIS INTEGRÁCIÓ (Egyedi sablon galériák előkészítése)
* ============================================================================
*/
(function() {
    $(function() {
        if ($('.wiki-dynamic-gallery').length > 0) {
            initWikiDynamicGallery();
        }
        if ($('.egyedi-galeria-container').length > 0) {
            prePrepareEgyediGaleriak();
        }
    });
 
    // --- RÉGI WIKI DYNAMIC GALLERY LOGIKA ---
    function initWikiDynamicGallery() {
        $('.wiki-dynamic-gallery').each(function() {
            var $container = $(this);
            if ($container.data('initialized')) return;
            $container.data('initialized', true);
 
            var searchTerm = $container.data('search');
            var limit = $container.data('limit') || 3;
            var targetHeight = 200;
 
            var apiUrl = "https://commons.wikimedia.org/w/api.php?action=query&format=json&generator=search&gsrsearch=File:" +
                        encodeURIComponent(searchTerm) + "&gsrlimit=" + limit +
                        "&prop=imageinfo&iiprop=url|size&iiurlheight=" + targetHeight + "&origin=*";
 
            $.getJSON(apiUrl, function(data) {
                if (data && data.query && data.query.pages) {
                    var pages = data.query.pages;
                    var galleryHtml = '';
 
                    for (var id in pages) {
                        if (!pages[id].imageinfo) continue;
                        var img = pages[id].imageinfo[0];
 
                        // Szebbé tesszük a címet a felugró ablakhoz
                        var title = pages[id].title.replace('File:', '').replace(/\.[^/.]+$/, "");
 
                        // LightGallery felugró ablak felirata és az ERDETI NAGY KÉP LINKJE (img.url)
                        var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + title + '</h4>' +
                                          '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
                                          'Forrás: <a href="' + img.url + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">Wikimedia Commons</a> ↗' +
                                          '</span></div>';
 
                        // ÖSSZEÁLLÍTJUK A JAVÍTOTT KÁRTYA STRUKTÚRÁT
                        galleryHtml += '<div class="galeria-elem">';
                        galleryHtml += '  <div class="kulso-url-doboz" data-src="' + img.url + '" data-elokeszitve="true">';
                        galleryHtml += '    <figure class="mw-default-size col-url-figure" style="position: relative !important; overflow: visible !important;">';
 
                        // HIBÁTLAN LIGHTGALLERY INTEGRÁCIÓ: a href és data-src attribútumba is a NAGY KÉP (img.url) megy!
                        galleryHtml += '      <a href="' + img.url + '" class="lg-egyedi-kulso-item lg-dinamikus-item" data-src="' + img.url + '" data-sub-html="' + captionHtml.replace(/"/g, '&quot;') + '" style="display: block !important; position: relative !important;">';
                        galleryHtml += '        <img src="' + img.thumburl + '" class="galeria-kep url-kep" alt="' + title + '" />';
 
                        // A FÖLDGÖMB IKONT KÖZVETLENÜL A KÉPRE (A LINKEN BELÜLRE) POZICIONÁLJUK A BAL FELSŐ SAROKBA
                        galleryHtml += '        <div class="kulso-link-ikon" style="position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;">🌐</div>';
                        galleryHtml += '      </a>';
 
                        // FIGCAPTION: Kizárólag a galéria feliratot tartalmazza, a forrás szöveg (Wikimedia Commons) KI LETT TÖRÖLVE!
                        galleryHtml += '      <figcaption>';
                        galleryHtml += '        <span class="galeria-felirat">' + title + '</span>';
                        galleryHtml += '      </figcaption>';
                        galleryHtml += '    </figure>';
                        galleryHtml += '  </div>';
                        galleryHtml += '</div>';
                    }
                    // Behelyezzük a kártyákat a konténerbe és megadjuk neki a globális galéria osztályt
                    $container.addClass('egyedi-galeria-container').html(galleryHtml);
                }
            });
        });
    }
 
    // --- EGYEDI GALÉRIÁK ELŐKÉSZÍTÉSE (Csak a feliratokat és a DOM-ot hozzuk helyre, de nem inicializálunk LG-t) ---
    function prePrepareEgyediGaleriak() {
        $('.egyedi-galeria-container').each(function() {
            var $container = $(this);
 
            // 1. Külső URL és Commons dobozok formázása (MediaWiki kompatibilis <figure> struktúra)
            $container.find('.kulso-url-doboz').each(function() {
                var $doboz = $(this);
                if ($doboz.data('elokeszitve')) return;
                $doboz.data('elokeszitve', true);
 
                var eredetiUrl = $doboz.attr('data-src');
                var biztonsagosUrl = eredetiUrl;
 
                // HTTPS képproxy (weserv.nl) a vegyes tartalom és a hotlink tiltás ellen
                if (eredetiUrl && eredetiUrl.indexOf('http://') === 0) {
                    var tisztaUrl = eredetiUrl.replace('http://', '');
                    biztonsagosUrl = 'https://images.weserv.nl/?url=' + encodeURIComponent(tisztaUrl);
                }
 
                var forrasNev = $doboz.attr('data-forras-nev') || 'Külső forrás';
                var $feliratElem = $doboz.find('.galeria-felirat');
                var felirat = $feliratElem.text().trim();
 
                if (!felirat) {
                    var fileTitle = eredetiUrl.substring(eredetiUrl.lastIndexOf('/') + 1).split('.')[0];
                    felirat = decodeURIComponent(fileTitle).replace(/_/g, ' ');
                }
 
                // LightGallery felugró ablak felirata
                var forrasLinkHtml = '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
                                    'Forrás: <a href="' + eredetiUrl + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">' + forrasNev + '</a> ↗' +
                                    '</span>';
                var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + felirat + '</h4>' + forrasLinkHtml + '</div>';
 
                // ÖSSZEÁLLÍTJUK A JAVÍTOTT, EGYSÉGES SZABVÁNYOS MEDIAWIKI STRUKTÚRÁT:
                var $figure = $('<figure>', {
                    'class': 'mw-default-size col-url-figure',
                    'style': 'position: relative !important; overflow: visible !important;'
                });
 
                var $lgItem = $('<a>', {
                    'href': biztonsagosUrl,
                    'class': 'lg-egyedi-kulso-item',
                    'data-src': biztonsagosUrl,
                    'data-sub-html': captionHtml,
                    'style': 'display: block !important; position: relative !important;'
                });
 
                // A beágyazott előkép
                $('<img>', {
                    'src': biztonsagosUrl,
                    'class': 'galeria-kep url-kep',
                    'alt': felirat
                }).appendTo($lgItem);
 
                // JAVÍTÁS: A FÖLDGÖMB IKON BEKERÜL A LINKEN BELÜLRE, ABSZOLÚT POZÍCIÓVAL A BAL FELSŐ SAROKBA
                $('<div>', {
                    'class': 'kulso-link-ikon',
                    'style': 'position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;',
                    'text': '🌐'
                }).appendTo($lgItem);
 
                // JAVÍTÁS: Szabványos figcaption, amiből a zárójeles forrásszöveg teljesen ki lett hagyva
                var $figcaption = $('<figcaption>').html(
                    '<span class="galeria-felirat">' + felirat + '</span>'
                );
 
                // Egymás mögé fűzzük őket a dobozon belül
                $lgItem.appendTo($figure);
                $figcaption.appendTo($figure);
 
                $doboz.empty().append($figure);
            });
 
            // 2. Belső képek noviewer osztállyal való ellátása
            $container.find('figure a.mw-file-description').addClass('noviewer');
        });
    }
})();
 
/**
* ============================================================================
* KIEGÉSZÍTŐIKONOK ÉS STÍLUSLAPOK BETÖLTÉSE
* ============================================================================
*/
var link = document.createElement("link");
var link = document.createElement("link");
link.rel = "stylesheet";
link.rel = "stylesheet";
//link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css";
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css";
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css";
document.head.appendChild(link);
document.head.appendChild(link);


/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */
/**
// Fülek elrejtése anonim felhasználók számára
* ============================================================================
* JOGOSULTSÁGKEZELÉS (Fülek elrejtése anonim felhasználóknak)
* ============================================================================
*/
if (mw.config.get('wgUserName') === null) {
if (mw.config.get('wgUserName') === null) {
     var hideTabs = function () {
     var hideTabs = function () {
15. sor: 204. sor:
         if (el2) el2.style.display = 'none';
         if (el2) el2.style.display = 'none';


        // Ha mindkét elem megtalálható, leállítjuk az ismétlést
         if (el1 || el2) clearInterval(observer);
         if (el1 || el2) clearInterval(observer);
     };
     };
    // 100ms-onként ellenőrizzük, hogy megjelentek-e a fülek
     var observer = setInterval(hideTabs, 100);
     var observer = setInterval(hideTabs, 100);
}
}


/* MediaWikiben az alapértelmezett viselkedés az, hogy a külső hivatkozások (pl. [https://példa.hu link szövege]) ugyanazon a lapon nyílnak meg.
/**
Ahhoz, hogy ezek új lapon nyíljanak meg:*/
* ============================================================================
* KÜLSŐ LINK VISLEKEDÉS (Új lapon nyíló külső hivatkozások)
* ============================================================================
*/
$(function () {
$(function () {
  $('a.external').attr('target', '_blank');
    $('a.external').attr('target', '_blank');
});
});


// Egy "Tetejére" gomb megjelenítése és kattintáskor scrollozás az oldal tetejére
/**
* ============================================================================
* NAVIGÁCIÓS GOMBOK (Tetejére és Vissza gomb logikája)
* ============================================================================
*/
$(function() {
$(function() {
    // Létrehozzuk a gombot
     var $btn = $('<button/>', {
     var $btn = $('<button/>', {
        //text: '⬆ Tetejére',
         html: '<i class="bi bi-arrow-up-square"></i> Tetejére',
         html: '<i class="bi bi-arrow-up-square"></i> Tetejére',
         id: 'backToTopBtn',
         id: 'backToTopBtn',
43. sor: 234. sor:
             padding: '10px 15px',
             padding: '10px 15px',
             'font-size': '14px',
             'font-size': '14px',
             'background-color': '#337ab7',
             'background-color': '#888446ff',
             color: 'white',
             color: 'white',
             border: 'none',
             border: 'none',
             'border-radius': '10px',
             'border-radius': '10px',
             cursor: 'pointer',
             cursor: 'pointer',
             display: 'none',   // alapból rejtve
             display: 'none',
             width: '100px',
             width: '100px',
             'z-index': 1000
             'z-index': 1000
57. sor: 248. sor:
     });
     });


    // A body végére tesszük a gombot
    $('body').append($btn);
    // Megjelenítés, ha az oldal le van görgetve 100px-nél
    $(window).scroll(function() {
        if ($(window).scrollTop() > 100) {
            $btn.fadeIn();
        } else {
            $btn.fadeOut();
        }
    });
});
// Egy "Vissza" gomb megjelenítése, ami az előző oldalra mutat
$(function() {
    // Vissza gomb létrehozása
     var $backBtn = $('<button/>', {
     var $backBtn = $('<button/>', {
//      text: '⬅ Vissza',
         html: '<i class="bi bi-arrow-left-square"></i> Vissza',
         html: '<i class="bi bi-arrow-left-square"></i> Vissza',
         id: 'backBtn',
         id: 'backBtn',
80. sor: 254. sor:
         css: {
         css: {
             position: 'fixed',
             position: 'fixed',
             bottom: '60px', // a "Tetejére" gomb fölé kerül
             bottom: '60px',
             right: '20px',
             right: '20px',
             padding: '10px 15px',
             padding: '10px 15px',
             'font-size': '14px',
             'font-size': '14px',
             'background-color': '#5cb85c',
             'background-color': '#547454ff',
             color: 'white',
             color: 'white',
             border: 'none',
             border: 'none',
98. sor: 272. sor:
     });
     });


    // Hozzáadás a DOM-hoz
     $('body').append($btn).append($backBtn);
     $('body').append($backBtn);


    // Megjelenítés görgetés után
     $(window).scroll(function() {
     $(window).scroll(function() {
         if ($(window).scrollTop() > 100) {
         if ($(window).scrollTop() > 100) {
            $btn.fadeIn();
             $backBtn.fadeIn();
             $backBtn.fadeIn();
         } else {
         } else {
            $btn.fadeOut();
             $backBtn.fadeOut();
             $backBtn.fadeOut();
         }
         }
     });
     });
});
});
/**
* ============================================================================
* TAXOBOX ÉS RENDSZERTANI LINKEK KEZELÉSE
* ============================================================================
*/
$(document).ready(function() {
    $('.taxobox-icons a').attr('target', '_blank');
});
/**
* ============================================================================
* DATATABLES INTEGRÁCIÓ (Javított táblázatkezelés)
* ============================================================================
*/
mw.loader.using( ['jquery', 'mediawiki.util'] ).done( function () {
    if ( $( '.datatable-hook' ).length > 0 ) {
        $.getScript( 'https://cdn.datatables.net/2.1.8/js/dataTables.min.js' )
            .done( function() {
                $( '.datatable-hook' ).each( function() {
                    var $table = $(this);
                    var $headerRow = $table.find( 'tr:has(th)' ).first();
                    if ( $headerRow.length > 0 ) {
                        var $thead = $( '<thead></thead>' );
                        $headerRow.detach().appendTo( $thead );
                        $table.prepend( $thead );
                    }
                    $table.DataTable({
                        language: {
                            url: '//cdn.datatables.net/plug-ins/2.1.8/i18n/hu.json'
                        },
                        layout: {
                            topStart: 'pageLength',
                            topEnd: 'search',
                            bottomStart: 'info',
                            bottomEnd: 'paging'
                        },
                        pageLength: 10,
                        columnDefs: [ { targets: '_all', defaultContent: '' } ]
                    });
                });
            })
            .fail( function() {
                console.error( 'Hiba: Nem sikerült betölteni a DataTables szkriptet.' );
            });
    }
});
/**
* ============================================================================
* SZUKKULENS NÖVÉNYHATÁROZÓ KULCSOK LOGIKÁJA
* ============================================================================
*/
mw.hook('wikipage.content').add(function () {
    const aktualisKategoriak = mw.config.get('wgCategories') || [];
    if (!aktualisKategoriak.includes('Szukkulens növényhatározó kulcsok')) {
        return;
    }
    const regexKoztespont = /^Szukkulens határozó:/;
    const bodyContent = document.getElementById('bodyContent');
    if (!bodyContent) return;
    bodyContent.querySelectorAll('a').forEach(a => {
        const teljesNev = a.getAttribute('title') || '';
        if (regexKoztespont.test(teljesNev)) {
            let tisztaGombSzöveg = teljesNev.replace(/\s*\(a lap nem létezik\)$/, '');
            a.innerHTML = '';
            const arrowSpan = document.createElement('span');
            arrowSpan.className = 'arrow-prefix';
            arrowSpan.textContent = '→';
            const spaceNode = document.createTextNode(' ');
            const textNode = document.createTextNode(tisztaGombSzöveg);
            a.appendChild(arrowSpan);
            a.appendChild(spaceNode);
            a.appendChild(textNode);
            a.className = "new hatarozo-koztespont-btn";
            let previousNode = a.previousSibling;
            if (previousNode && previousNode.nodeType === Node.TEXT_NODE) {
                previousNode.textContent = previousNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
            }
        }
    });
    bodyContent.querySelectorAll('li').forEach(li => {
        const bendoLinkek = li.querySelectorAll('a[href*="/wiki/"]:not(.external)');
        bendoLinkek.forEach(link => {
            const title = link.getAttribute('title') || '';
            if (regexKoztespont.test(title) || link.classList.contains('hatarozo-koztespont-btn')) {
                return;
            }
            let vizsgaltNode = link.previousSibling;
            if (link.parentElement.tagName.toLowerCase() === 'i') {
                vizsgaltNode = link.parentElement.previousSibling;
            }
            let elotteLevoSzo = "";
            if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                elotteLevoSzo = vizsgaltNode.textContent;
            }
            if (!elotteLevoSzo.includes('Pl.') && !elotteLevoSzo.includes('(')) {
                if (!link.classList.contains('hatarozo-vegpont-btn')) {
                    const tisztaFajnev = link.textContent.replace(/^[→\s\xA0]+/, '').replace(/[→\s\xA0]+$/, '').trim() || title;
                    link.innerHTML = `<span class="arrow-prefix">→ </span><span class="botanical-name">${tisztaFajnev}</span>`;
                    link.classList.add("hatarozo-vegpont-btn");
                    if (link.parentElement.tagName.toLowerCase() === 'i') {
                        link.parentElement.style.fontStyle = "normal";
                    }
                }
                if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                    vizsgaltNode.textContent = vizsgaltNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
                }
            }
        });
    });
});
/**
* ============================================================================
* GLOBÁLIS, ÖSSZEFÜGGŐ DINAMIKUS LIGHTGALLERY (Minden képet egy galériába fűz)
* ============================================================================
*/
window.addEventListener('click', function(e) {
    // Elkapjuk az összes lehetséges képlinket (Natív MediaWiki, Előkészített egyedi külső, és régi dinamikus galéria)
    var targetLink = e.target.closest('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');
    if (!targetLink) return;
    // Fájl leíró oldalakon hagyjuk a gyári működést
    if (window.location.pathname.includes('/wiki/F%C3%A1jl:') || window.location.pathname.includes('/wiki/File:')) {
        return;
    }
    // Elfojtjuk a gyári átirányítást és eseményeket
    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();
    var dynamicSlides = [];
    var clickedIndex = 0;
    // Szelektáljuk az ÖSSZES képlinket az oldalon a megjelenés sorrendjében
    var $mindenKepA = $('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');
    $mindenKepA.each(function(index) {
        var $el = $(this);
        var $img = $el.find('img');
        // JAVÍTVA: Ha külső egyedi galéria elemről van szó, nem kötelező az <img> tag jelenléte!
        if ($img.length === 0 && !$el.hasClass('lg-egyedi-kulso-item')) return;
        if ($el.is(targetLink)) {
            clickedIndex = dynamicSlides.length; // Pontos index elmentése a dinamikus tömbben
        }
        var origSrc = '';
        var thumbSrc = $img.attr('src') || '';
        var captionText = '';
        // 1. ESET: Előkészített egyedi külső URL / Commons doboz kép (Nincs kötelező <img> tag!)
        if ($el.hasClass('lg-egyedi-kulso-item')) {
            origSrc = $el.attr('data-src');
            thumbSrc = origSrc; // Indexképként is a külső forrást használjuk, mivel nincs helyi thumb
            captionText = $el.attr('data-sub-html') || '';
        }
        // 2. ESET: Régi dinamikus (Commons search) galéria elem
        else if ($el.hasClass('lg-dinamikus-item')) {
            origSrc = $el.attr('data-src');
            captionText = $el.attr('data-sub-html') || '';
        }
        // 3. ESET: Natív cikkbeli kép (Hagyományos MediaWiki galéria vagy <figure>)
        else {
            // Intelligens URL tisztítás az eredeti képhez
            origSrc = thumbSrc;
            if (origSrc.indexOf('/thumb/') !== -1) {
                origSrc = origSrc.replace('/thumb/', '/');
                if (origSrc.lastIndexOf('/') !== -1) {
                    origSrc = origSrc.substring(0, origSrc.lastIndexOf('/'));
                }
            }
            // Képaláírás kinyerése
            var nativeEl = $el[0];
            if (nativeEl) {
                var figure = nativeEl.closest('figure, .thumb');
                if (figure) {
                    var figcaption = figure.querySelector('figcaption, .thumbcaption');
                    if (figcaption) {
                        captionText = figcaption.textContent.replace(/×/g, '').trim();
                    }
                }
            }
            if (!captionText) {
                captionText = $img.attr('alt') || $img.attr('title') || '';
            }
            if (captionText) {
                captionText = '<h4>' + captionText + '</h4>';
            }
        }
        dynamicSlides.push({
            src: origSrc,
            thumb: thumbSrc,
            subHtml: captionText
        });
    });
    // LightGallery indítása az összesített tömbbel
    if (window.lightGallery && dynamicSlides.length > 0) {
        var container = document.createElement('div');
        var dynamicGallery = lightGallery(container, {
            dynamic: true,
            dynamicEl: dynamicSlides,
            licenseKey: '0000-0000-000-0000',
            thumbnail: true,
            animateThumb: true,
            showThumbByDefault: true,
            index: clickedIndex,
            download: true,
            counter: dynamicSlides.length > 1,
            getCaptionFromTitleOrAlt: false
        });
        dynamicGallery.openGallery();
    } else {
        console.error("LightGallery hiba: Nem sikerült elindítani a globális galériát.");
    }
}, true); // Capturing fázis!

A lap jelenlegi, 2026. június 19., 10:25-kori változata

/**
 * VECTOR 2022 TELEPORT BUGFIX - DRGYZ
 * Létrehozza a hiányzó teleportációs célpontokat, mielőtt a skin JS elhasalna
 */
(function() {
    function injectVectorTargets() {
        var targets = ['p-lang-btn', 'vector-user-links-dropdown', 'vector-toc-landmark'];

        targets.forEach(function(id) {
            if (!document.getElementById(id)) {
                var dummy = document.createElement('div');
                dummy.id = id;
                dummy.className = 'vector-teleport-dummy-target';
                dummy.style.display = 'none';
                document.body.appendChild(dummy);
            }
        });
    }

    injectVectorTargets();

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', injectVectorTargets);
    }
})();

/**
 * ============================================================================
 * LIGHTGALLERY GLOBÁLIS INTEGRÁCIÓ (Egyedi sablon galériák előkészítése)
 * ============================================================================
 */
(function() {
    $(function() {
        if ($('.wiki-dynamic-gallery').length > 0) {
            initWikiDynamicGallery();
        }
        if ($('.egyedi-galeria-container').length > 0) {
            prePrepareEgyediGaleriak();
        }
    });

    // --- RÉGI WIKI DYNAMIC GALLERY LOGIKA ---
    function initWikiDynamicGallery() {
        $('.wiki-dynamic-gallery').each(function() {
            var $container = $(this);
            if ($container.data('initialized')) return;
            $container.data('initialized', true);

            var searchTerm = $container.data('search');
            var limit = $container.data('limit') || 3;
            var targetHeight = 200;

            var apiUrl = "https://commons.wikimedia.org/w/api.php?action=query&format=json&generator=search&gsrsearch=File:" +
                         encodeURIComponent(searchTerm) + "&gsrlimit=" + limit +
                         "&prop=imageinfo&iiprop=url|size&iiurlheight=" + targetHeight + "&origin=*";

            $.getJSON(apiUrl, function(data) {
                if (data && data.query && data.query.pages) {
                    var pages = data.query.pages;
                    var galleryHtml = '';

                    for (var id in pages) {
                        if (!pages[id].imageinfo) continue;
                        var img = pages[id].imageinfo[0];

                        // Szebbé tesszük a címet a felugró ablakhoz
                        var title = pages[id].title.replace('File:', '').replace(/\.[^/.]+$/, "");

                        // LightGallery felugró ablak felirata és az ERDETI NAGY KÉP LINKJE (img.url)
                        var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + title + '</h4>' +
                                          '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
                                          'Forrás: <a href="' + img.url + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">Wikimedia Commons</a> ↗' +
                                          '</span></div>';

                        // ÖSSZEÁLLÍTJUK A JAVÍTOTT KÁRTYA STRUKTÚRÁT
                        galleryHtml += '<div class="galeria-elem">';
                        galleryHtml += '  <div class="kulso-url-doboz" data-src="' + img.url + '" data-elokeszitve="true">';
                        galleryHtml += '    <figure class="mw-default-size col-url-figure" style="position: relative !important; overflow: visible !important;">';

                        // HIBÁTLAN LIGHTGALLERY INTEGRÁCIÓ: a href és data-src attribútumba is a NAGY KÉP (img.url) megy!
                        galleryHtml += '      <a href="' + img.url + '" class="lg-egyedi-kulso-item lg-dinamikus-item" data-src="' + img.url + '" data-sub-html="' + captionHtml.replace(/"/g, '&quot;') + '" style="display: block !important; position: relative !important;">';
                        galleryHtml += '        <img src="' + img.thumburl + '" class="galeria-kep url-kep" alt="' + title + '" />';

                        // A FÖLDGÖMB IKONT KÖZVETLENÜL A KÉPRE (A LINKEN BELÜLRE) POZICIONÁLJUK A BAL FELSŐ SAROKBA
                        galleryHtml += '        <div class="kulso-link-ikon" style="position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;">🌐</div>';
                        galleryHtml += '      </a>';

                        // FIGCAPTION: Kizárólag a galéria feliratot tartalmazza, a forrás szöveg (Wikimedia Commons) KI LETT TÖRÖLVE!
                        galleryHtml += '      <figcaption>';
                        galleryHtml += '        <span class="galeria-felirat">' + title + '</span>';
                        galleryHtml += '      </figcaption>';
                        galleryHtml += '    </figure>';
                        galleryHtml += '  </div>';
                        galleryHtml += '</div>';
                    }
                    // Behelyezzük a kártyákat a konténerbe és megadjuk neki a globális galéria osztályt
                    $container.addClass('egyedi-galeria-container').html(galleryHtml);
                }
            });
        });
    }

    // --- EGYEDI GALÉRIÁK ELŐKÉSZÍTÉSE (Csak a feliratokat és a DOM-ot hozzuk helyre, de nem inicializálunk LG-t) ---
    function prePrepareEgyediGaleriak() {
        $('.egyedi-galeria-container').each(function() {
            var $container = $(this);

            // 1. Külső URL és Commons dobozok formázása (MediaWiki kompatibilis <figure> struktúra)
            $container.find('.kulso-url-doboz').each(function() {
                var $doboz = $(this);
                if ($doboz.data('elokeszitve')) return;
                $doboz.data('elokeszitve', true);

                var eredetiUrl = $doboz.attr('data-src');
                var biztonsagosUrl = eredetiUrl;

                // HTTPS képproxy (weserv.nl) a vegyes tartalom és a hotlink tiltás ellen
                if (eredetiUrl && eredetiUrl.indexOf('http://') === 0) {
                    var tisztaUrl = eredetiUrl.replace('http://', '');
                    biztonsagosUrl = 'https://images.weserv.nl/?url=' + encodeURIComponent(tisztaUrl);
                }

                var forrasNev = $doboz.attr('data-forras-nev') || 'Külső forrás';
                var $feliratElem = $doboz.find('.galeria-felirat');
                var felirat = $feliratElem.text().trim();

                if (!felirat) {
                    var fileTitle = eredetiUrl.substring(eredetiUrl.lastIndexOf('/') + 1).split('.')[0];
                    felirat = decodeURIComponent(fileTitle).replace(/_/g, ' ');
                }

                // LightGallery felugró ablak felirata
                var forrasLinkHtml = '<br/><span class="galeria-forras-jelzo" style="font-size:0.85em; color:#bbb; display:block; margin-top:4px;">' +
                                     'Forrás: <a href="' + eredetiUrl + '" target="_blank" rel="noopener noreferrer" style="color:#66b2ff; text-decoration:underline;">' + forrasNev + '</a> ↗' +
                                     '</span>';
                var captionHtml = '<div class="lg-egyedi-felirat"><h4>' + felirat + '</h4>' + forrasLinkHtml + '</div>';

                // ÖSSZEÁLLÍTJUK A JAVÍTOTT, EGYSÉGES SZABVÁNYOS MEDIAWIKI STRUKTÚRÁT:
                var $figure = $('<figure>', {
                    'class': 'mw-default-size col-url-figure',
                    'style': 'position: relative !important; overflow: visible !important;'
                });

                var $lgItem = $('<a>', {
                    'href': biztonsagosUrl,
                    'class': 'lg-egyedi-kulso-item',
                    'data-src': biztonsagosUrl,
                    'data-sub-html': captionHtml,
                    'style': 'display: block !important; position: relative !important;'
                });

                // A beágyazott előkép
                $('<img>', {
                    'src': biztonsagosUrl,
                    'class': 'galeria-kep url-kep',
                    'alt': felirat
                }).appendTo($lgItem);

                // JAVÍTÁS: A FÖLDGÖMB IKON BEKERÜL A LINKEN BELÜLRE, ABSZOLÚT POZÍCIÓVAL A BAL FELSŐ SAROKBA
                $('<div>', {
                    'class': 'kulso-link-ikon',
                    'style': 'position: absolute !important; top: 6px !important; left: 6px !important; z-index: 10 !important; font-size: 14px !important; background: rgba(255, 255, 255, 0.85) !important; padding: 2px 4px !important; border-radius: 4px !important; box-shadow: 0 1px 3px rgba(0,0,0,0.3) !important; line-height: 1 !important; display: block !important;',
                    'text': '🌐'
                }).appendTo($lgItem);

                // JAVÍTÁS: Szabványos figcaption, amiből a zárójeles forrásszöveg teljesen ki lett hagyva
                var $figcaption = $('<figcaption>').html(
                    '<span class="galeria-felirat">' + felirat + '</span>'
                );

                // Egymás mögé fűzzük őket a dobozon belül
                $lgItem.appendTo($figure);
                $figcaption.appendTo($figure);

                $doboz.empty().append($figure);
            });

            // 2. Belső képek noviewer osztállyal való ellátása
            $container.find('figure a.mw-file-description').addClass('noviewer');
        });
    }
})();

/**
 * ============================================================================
 * KIEGÉSZÍTŐIKONOK ÉS STÍLUSLAPOK BETÖLTÉSE
 * ============================================================================
 */
var link = document.createElement("link");
link.rel = "stylesheet";
link.href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css";
document.head.appendChild(link);

/**
 * ============================================================================
 * JOGOSULTSÁGKEZELÉS (Fülek elrejtése anonim felhasználóknak)
 * ============================================================================
 */
if (mw.config.get('wgUserName') === null) {
    var hideTabs = function () {
        var el1 = document.querySelector('#ca-history');
        var el2 = document.querySelector('#ca-viewsource');
        if (el1) el1.style.display = 'none';
        if (el2) el2.style.display = 'none';

        if (el1 || el2) clearInterval(observer);
    };
    var observer = setInterval(hideTabs, 100);
}

/**
 * ============================================================================
 * KÜLSŐ LINK VISLEKEDÉS (Új lapon nyíló külső hivatkozások)
 * ============================================================================
 */
$(function () {
    $('a.external').attr('target', '_blank');
});

/**
 * ============================================================================
 * NAVIGÁCIÓS GOMBOK (Tetejére és Vissza gomb logikája)
 * ============================================================================
 */
$(function() {
    var $btn = $('<button/>', {
        html: '<i class="bi bi-arrow-up-square"></i> Tetejére',
        id: 'backToTopBtn',
        title: 'Az oldal tetejére',
        css: {
            position: 'fixed',
            bottom: '20px',
            right: '20px',
            padding: '10px 15px',
            'font-size': '14px',
            'background-color': '#888446ff',
            color: 'white',
            border: 'none',
            'border-radius': '10px',
            cursor: 'pointer',
            display: 'none',
            width: '100px',
            'z-index': 1000
        },
        click: function() {
            window.scrollTo({top: 0, behavior: 'smooth'});
        }
    });

    var $backBtn = $('<button/>', {
        html: '<i class="bi bi-arrow-left-square"></i> Vissza',
        id: 'backBtn',
        title: 'Előző oldal',
        css: {
            position: 'fixed',
            bottom: '60px',
            right: '20px',
            padding: '10px 15px',
            'font-size': '14px',
            'background-color': '#547454ff',
            color: 'white',
            border: 'none',
            'border-radius': '10px',
            cursor: 'pointer',
            display: 'none',
            width: '100px',
            'z-index': 1000
        },
        click: function() {
            window.history.back();
        }
    });

    $('body').append($btn).append($backBtn);

    $(window).scroll(function() {
        if ($(window).scrollTop() > 100) {
            $btn.fadeIn();
            $backBtn.fadeIn();
        } else {
            $btn.fadeOut();
            $backBtn.fadeOut();
        }
    });
});

/**
 * ============================================================================
 * TAXOBOX ÉS RENDSZERTANI LINKEK KEZELÉSE
 * ============================================================================
 */
$(document).ready(function() {
    $('.taxobox-icons a').attr('target', '_blank');
});

/**
 * ============================================================================
 * DATATABLES INTEGRÁCIÓ (Javított táblázatkezelés)
 * ============================================================================
 */
mw.loader.using( ['jquery', 'mediawiki.util'] ).done( function () {
    if ( $( '.datatable-hook' ).length > 0 ) {
        $.getScript( 'https://cdn.datatables.net/2.1.8/js/dataTables.min.js' )
            .done( function() {
                $( '.datatable-hook' ).each( function() {
                    var $table = $(this);
                    var $headerRow = $table.find( 'tr:has(th)' ).first();

                    if ( $headerRow.length > 0 ) {
                        var $thead = $( '<thead></thead>' );
                        $headerRow.detach().appendTo( $thead );
                        $table.prepend( $thead );
                    }

                    $table.DataTable({
                        language: {
                            url: '//cdn.datatables.net/plug-ins/2.1.8/i18n/hu.json'
                        },
                        layout: {
                            topStart: 'pageLength',
                            topEnd: 'search',
                            bottomStart: 'info',
                            bottomEnd: 'paging'
                        },
                        pageLength: 10,
                        columnDefs: [ { targets: '_all', defaultContent: '' } ]
                    });
                });
            })
            .fail( function() {
                console.error( 'Hiba: Nem sikerült betölteni a DataTables szkriptet.' );
            });
    }
});

/**
 * ============================================================================
 * SZUKKULENS NÖVÉNYHATÁROZÓ KULCSOK LOGIKÁJA
 * ============================================================================
 */
mw.hook('wikipage.content').add(function () {
    const aktualisKategoriak = mw.config.get('wgCategories') || [];
    if (!aktualisKategoriak.includes('Szukkulens növényhatározó kulcsok')) {
        return;
    }

    const regexKoztespont = /^Szukkulens határozó:/;
    const bodyContent = document.getElementById('bodyContent');
    if (!bodyContent) return;

    bodyContent.querySelectorAll('a').forEach(a => {
        const teljesNev = a.getAttribute('title') || '';

        if (regexKoztespont.test(teljesNev)) {
            let tisztaGombSzöveg = teljesNev.replace(/\s*\(a lap nem létezik\)$/, '');
            a.innerHTML = '';

            const arrowSpan = document.createElement('span');
            arrowSpan.className = 'arrow-prefix';
            arrowSpan.textContent = '→';

            const spaceNode = document.createTextNode(' ');
            const textNode = document.createTextNode(tisztaGombSzöveg);

            a.appendChild(arrowSpan);
            a.appendChild(spaceNode);
            a.appendChild(textNode);

            a.className = "new hatarozo-koztespont-btn";

            let previousNode = a.previousSibling;
            if (previousNode && previousNode.nodeType === Node.TEXT_NODE) {
                previousNode.textContent = previousNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
            }
        }
    });

    bodyContent.querySelectorAll('li').forEach(li => {
        const bendoLinkek = li.querySelectorAll('a[href*="/wiki/"]:not(.external)');

        bendoLinkek.forEach(link => {
            const title = link.getAttribute('title') || '';

            if (regexKoztespont.test(title) || link.classList.contains('hatarozo-koztespont-btn')) {
                return;
            }

            let vizsgaltNode = link.previousSibling;
            if (link.parentElement.tagName.toLowerCase() === 'i') {
                vizsgaltNode = link.parentElement.previousSibling;
            }

            let elotteLevoSzo = "";
            if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                elotteLevoSzo = vizsgaltNode.textContent;
            }

            if (!elotteLevoSzo.includes('Pl.') && !elotteLevoSzo.includes('(')) {
                if (!link.classList.contains('hatarozo-vegpont-btn')) {
                    const tisztaFajnev = link.textContent.replace(/^[→\s\xA0]+/, '').replace(/[→\s\xA0]+$/, '').trim() || title;

                    link.innerHTML = `<span class="arrow-prefix">→ </span><span class="botanical-name">${tisztaFajnev}</span>`;
                    link.classList.add("hatarozo-vegpont-btn");

                    if (link.parentElement.tagName.toLowerCase() === 'i') {
                        link.parentElement.style.fontStyle = "normal";
                    }
                }

                if (vizsgaltNode && vizsgaltNode.nodeType === Node.TEXT_NODE) {
                    vizsgaltNode.textContent = vizsgaltNode.textContent.replace(/[→\s\xA0&rarr;]+$/, '');
                }
            }
        });
    });
});

/**
 * ============================================================================
 * GLOBÁLIS, ÖSSZEFÜGGŐ DINAMIKUS LIGHTGALLERY (Minden képet egy galériába fűz)
 * ============================================================================
 */
window.addEventListener('click', function(e) {
    // Elkapjuk az összes lehetséges képlinket (Natív MediaWiki, Előkészített egyedi külső, és régi dinamikus galéria)
    var targetLink = e.target.closest('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');
    if (!targetLink) return;

    // Fájl leíró oldalakon hagyjuk a gyári működést
    if (window.location.pathname.includes('/wiki/F%C3%A1jl:') || window.location.pathname.includes('/wiki/File:')) {
        return;
    }

    // Elfojtjuk a gyári átirányítást és eseményeket
    e.preventDefault();
    e.stopPropagation();
    e.stopImmediatePropagation();

    var dynamicSlides = [];
    var clickedIndex = 0;

    // Szelektáljuk az ÖSSZES képlinket az oldalon a megjelenés sorrendjében
    var $mindenKepA = $('a.mw-file-description, a.image, a.lg-egyedi-kulso-item, a.lg-dinamikus-item');

    $mindenKepA.each(function(index) {
        var $el = $(this);
        var $img = $el.find('img');

        // JAVÍTVA: Ha külső egyedi galéria elemről van szó, nem kötelező az <img> tag jelenléte!
        if ($img.length === 0 && !$el.hasClass('lg-egyedi-kulso-item')) return;

        if ($el.is(targetLink)) {
            clickedIndex = dynamicSlides.length; // Pontos index elmentése a dinamikus tömbben
        }

        var origSrc = '';
        var thumbSrc = $img.attr('src') || '';
        var captionText = '';

        // 1. ESET: Előkészített egyedi külső URL / Commons doboz kép (Nincs kötelező <img> tag!)
        if ($el.hasClass('lg-egyedi-kulso-item')) {
            origSrc = $el.attr('data-src');
            thumbSrc = origSrc; // Indexképként is a külső forrást használjuk, mivel nincs helyi thumb
            captionText = $el.attr('data-sub-html') || '';
        }
        // 2. ESET: Régi dinamikus (Commons search) galéria elem
        else if ($el.hasClass('lg-dinamikus-item')) {
            origSrc = $el.attr('data-src');
            captionText = $el.attr('data-sub-html') || '';
        }
        // 3. ESET: Natív cikkbeli kép (Hagyományos MediaWiki galéria vagy <figure>)
        else {
            // Intelligens URL tisztítás az eredeti képhez
            origSrc = thumbSrc;
            if (origSrc.indexOf('/thumb/') !== -1) {
                origSrc = origSrc.replace('/thumb/', '/');
                if (origSrc.lastIndexOf('/') !== -1) {
                    origSrc = origSrc.substring(0, origSrc.lastIndexOf('/'));
                }
            }

            // Képaláírás kinyerése
            var nativeEl = $el[0];
            if (nativeEl) {
                var figure = nativeEl.closest('figure, .thumb');
                if (figure) {
                    var figcaption = figure.querySelector('figcaption, .thumbcaption');
                    if (figcaption) {
                        captionText = figcaption.textContent.replace(/×/g, '').trim();
                    }
                }
            }
            if (!captionText) {
                captionText = $img.attr('alt') || $img.attr('title') || '';
            }
            if (captionText) {
                captionText = '<h4>' + captionText + '</h4>';
            }
        }

        dynamicSlides.push({
            src: origSrc,
            thumb: thumbSrc,
            subHtml: captionText
        });
    });

    // LightGallery indítása az összesített tömbbel
    if (window.lightGallery && dynamicSlides.length > 0) {
        var container = document.createElement('div');
        var dynamicGallery = lightGallery(container, {
            dynamic: true,
            dynamicEl: dynamicSlides,
            licenseKey: '0000-0000-000-0000',
            thumbnail: true,
            animateThumb: true,
            showThumbByDefault: true,
            index: clickedIndex,
            download: true,
            counter: dynamicSlides.length > 1,
            getCaptionFromTitleOrAlt: false
        });

        dynamicGallery.openGallery();
    } else {
        console.error("LightGallery hiba: Nem sikerült elindítani a globális galériát.");
    }
}, true); // Capturing fázis!