Lompat ke isi

MediaWiki:Common.js: Perbedaan antara revisi

Dari Mippedia bahasa Indonesia, ensiklopedia umum
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
 
(218 revisi perantara oleh 2 pengguna tidak ditampilkan)
Baris 1: Baris 1:
/* Otomatis alihkan Special:Upload ke Mippedia Commons */
if (mw.config.get('wgCanonicalSpecialPageName') === 'Upload') {
    window.location.href = 'https://commons.mippedia.org/wiki/Special:Upload';
}
/* Script Estimasi Waktu Baca - Spesialis Mobile (Minerva) & Desktop */
/* Script Estimasi Waktu Baca - Spesialis Mobile (Minerva) & Desktop */
$(document).ready(function() {
$(document).ready(function() {
     // Hanya jalan di halaman artikel asli
     // Hanya jalan di halaman artikel asli dan BUKAN di Halaman Utama
     if (mw.config.get('wgIsArticle') && mw.config.get('wgAction') === 'view' && mw.config.get('wgNamespaceNumber') === 0) {
     if (mw.config.get('wgIsArticle') && mw.config.get('wgAction') === 'view' && mw.config.get('wgNamespaceNumber') === 0 && !mw.config.get('wgIsMainPage')) {
          
          
         function hitungWaktuBaca() {
         function hitungWaktuBaca() {
Baris 15: Baris 20:
             // Bikin elemen tampilannya
             // Bikin elemen tampilannya
             var icon = '🕒'; // Emoji jam biar simpel dan ringan
             var icon = '🕒'; // Emoji jam biar simpel dan ringan
             var label = (readingTime <= 1) ? 'Kurang dari 1 menit' : readingTime + ' menit';
             var label = (readingTime <= 1) ? '- 1 menit' : readingTime + ' menit';
              
              
             var html = '<div id="reading-time-auto" style="font-size: 0.9em; color: #54595d; margin-bottom: 15px; display: flex; align-items: center; font-family: sans-serif;">';
             var html = '<div id="reading-time-auto" style="font-size: 0.9em; color: #54595d; margin-bottom: 15px; display: flex; align-items: center; font-family: sans-serif;">';
             html += '<span style="margin-right: 5px;">' + icon + '</span>';
             html += '<span style="margin-right: 5px;">' + icon + '</span>';
             html += '<span>Estimasi waktu baca: <b>' + label + '</b></span>';
             html += '<span>Estimasi waktu baca : <b>' + label + '</b></span>';
             html += '</div>';
             html += '</div>';


Baris 36: Baris 41:
     }
     }
});
});


/* Script Tombol Back to Top (Spesial Mobile) */
/* Script Tombol Back to Top (Spesial Mobile) */
Baris 60: Baris 64:
});
});


 
/* ==========================================================
/* Smart Glossary Pop-up (Pratinjau Link Ringan) */
  🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis)
  Hanya memunculkan tombol jika data tersedia di pusat.
  ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
     if (mw.config.get('wgIsArticle') && mw.config.get('wgAction') === 'view') {
     var pageName = mw.config.get('wgPageName');
       
    var namespace = mw.config.get('wgNamespaceNumber');
        var timer;
    var dataDomain = 'https://data.mippedia.org';
        // Targetkan link di dalam konten artikel saja
        $('#mw-content-text a').on('mouseenter touchstart', function(e) {
            var $link = $(this);
            var title = $link.attr('title');
           
            // Jangan jalan kalau link-nya bukan artikel (misal link luar atau redlink)
            if (!title || $link.hasClass('new') || $link.hasClass('external')) return;
 
            timer = setTimeout(function() {
                $.getJSON(mw.util.wikiScript('api'), {
                    action: 'query',
                    prop: 'extracts',
                    exintro: true,
                    exsentences: 2, // Ambil 2 kalimat aja biar singkat
                    titles: title,
                    explaintext: true,
                    format: 'json'
                }, function(data) {
                    var pages = data.query.pages;
                    var pageId = Object.keys(pages)[0];
                    var extract = pages[pageId].extract;
 
                    if (extract) {
                        // Hapus pop-up lama kalau ada
                        $('.wiki-preview').remove();
 
                        var preview = $('<div class="wiki-preview" style="position:absolute; background:#fff; color:#202122; border:1px solid #a2a9b1; padding:12px; border-radius:8px; box-shadow:0 4px 12px rgba(0,0,0,0.2); z-index:10001; font-size:13px; max-width:250px; line-height:1.4; opacity:0; transition:opacity 0.3s ease;"></div>');
                        preview.text(extract);
                       
                        $('body').append(preview);
 
                        // Atur posisi pop-up di deket link
                        var offset = $link.offset();
                        preview.css({
                            top: offset.top + 25,
                            left: Math.min(offset.left, $(window).width() - 270),
                            opacity: 1
                        });


                        // Hilang kalau klik di mana aja atau setelah 5 detik
    // Jalankan hanya di namespace artikel
                        setTimeout(function() { $('.wiki-preview').fadeOut(function() { $(this).remove(); }); }, 5000);
    if (namespace === 0) {
        // Cek apakah halaman tersebut ada di Mippedia Data
        $.ajax({
            url: dataDomain + '/api.php',
            data: {
                action: 'query',
                titles: pageName,
                format: 'json',
                origin: '*'
            },
            dataType: 'jsonp',
            success: function(res) {
                var pages = res.query.pages;
                var isExist = false;
               
                // Cek apakah ID halaman > 0 (artinya halaman ada)
                for (var id in pages) {
                    if (parseInt(id) > 0) {
                        isExist = true;
                        break;
                     }
                     }
                 });
                 }
            }, 600); // Delay 0.6 detik biar gak ganggu kalau cuma scrolling lewat
        }).on('mouseleave', function() {
            clearTimeout(timer);
        });


        $(document).on('mousedown touchstart', function() {
                // Jika data ditemukan, munculkan tombol melayang
            $('.wiki-preview').remove();
                if (isExist) {
                    injectFloatingDataBtn(pageName, dataDomain);
                }
            }
         });
         });
     }
     }
});


    function injectFloatingDataBtn(name, domain) {
        if ($('#mippedia-data-btn').length) return;


/* 1. Auto-Hide Header (Minerva Mobile Optimized) */
        var $btn = $('<a>', {
$(document).ready(function() {
            id: 'mippedia-data-btn',
    var lastScrollTop = 0;
            href: domain + '/wiki/' + encodeURIComponent(name),
    var delta = 5;
            target: '_blank',
    var navbarHeight = $('.header-container').outerHeight() || 50;
            style: 'position: absolute; right: 10px; top: -32px; background: #36c; color: #fff; padding: 4px 10px; border-radius: 4px; font-weight: bold; font-size: 10px; text-decoration: none; z-index: 1000; box-shadow: 0 2px 4px rgba(0,0,0,0.1);',
            text: 'DATA'
        });


    $(window).scroll(function() {
        // Target: Area menu aksi (dekat ikon pensil)
         var st = $(this).scrollTop();
        // Mendukung skin Mobile (Minerva) dan Desktop
         var $target = $('.page-actions-menu, .mw-editsection-visualeditor, #ca-edit, .minerva__tab-container').first();
          
          
        // Cek scroll harus lebih dari delta
         if ($target.length) {
         if(Math.abs(lastScrollTop - st) <= delta) return;
             $target.css('position', 'relative').append($btn);
       
        // Scroll ke bawah & sudah lewat navbar
        if (st > lastScrollTop && st > navbarHeight){
            // Sembunyiin Header
             $('.header-container, .minerva-header').css({
                'transform': 'translateY(-100%)',
                'transition': 'transform 0.3s ease-in-out'
            });
         } else {
         } else {
             // Scroll ke atas
             // Fallback jika header tidak standar
             if(st + $(window).height() < $(document).height()) {
             $('#firstHeading').css('position', 'relative').append($btn);
                $('.header-container, .minerva-header').css({
                    'transform': 'translateY(0)',
                    'transition': 'transform 0.3s ease-in-out'
                });
            }
         }
         }
        lastScrollTop = st;
     }
     });
});
});


/* ==========================================================
  🚀 MIPPEDIA COMMAND CENTER: AUTO-SYNC ENGINE (V4)
  Status: Global Login User | Auto-Purge | High Reliability
  ========================================================== */
(function($, mw) {
    "use strict";


/* 3. Notifikasi Link Luar */
    var conf = mw.config.get(['wgNamespaceNumber', 'wgAction', 'wgPageName', 'wgIsMainPage', 'wgUserName']);
$(document).ready(function() {
    // Filter: Hanya artikel, hanya saat baca, hanya user yang sudah login
    $('a.external').click(function(e) {
    if (conf.wgNamespaceNumber !== 0 || conf.wgAction !== 'view' || conf.wgIsMainPage || conf.wgUserName === null) return;
        var url = $(this).attr('href');
        if (!confirm('Anda akan meninggalkan Mippedia menuju situs luar:\n' + url + '\n\nLanjutkan?')) {
            e.preventDefault();
        }
    });
});


    $(document).ready(function() {
        var currentTitle = conf.wgPageName;
        // Penentuan subdomain (id, en, concise)
        var hostParts = window.location.hostname.split('.');
        var langKey = hostParts[0] === 'mippedia' || hostParts[0] === 'www' ? 'id' : hostParts[0];


/* 3. Anti-Ghosting pada Link Kosong (Redlinks) */
        $.ajax({
$(document).ready(function() {
            url: 'https://data.mippedia.org/api.php',
    $('a.new').click(function(e) {
            data: {  
        var confirmCreate = confirm("Halaman ini belum tersedia di Mippedia.\n\nApakah Anda ingin berkontribusi membuatnya?");
                action: 'query',
        if (!confirmCreate) {
                prop: 'revisions',
            e.preventDefault();
                titles: 'MediaWiki:ShortDesc-Data.json',
        }
                rvprop: 'content',
    });
                format: 'json',
});
                origin: '*'
            },
            dataType: 'jsonp',
            success: function(res) {
                try {
                    var pages = res.query.pages;
                    var pageId = Object.keys(pages)[0];
                    if (pageId === "-1") return;


/* 1. Navigasi Bab Melayang (Vertical Stack Edition) */
                    var fullData = JSON.parse(pages[pageId].revisions[0]['*']);
$(document).ready(function() {
                    var targetDesc = (fullData[currentTitle] && fullData[currentTitle][langKey]) ? fullData[currentTitle][langKey].trim() : "";
    if (mw.config.get('wgIsArticle') && $('#toc').length) {
       
        // CSS untuk posisi menumpuk secara vertikal
        var $quickNav = $('<div id="quick-nav" style="position:fixed; bottom:20px; right:20px; width:45px; height:45px; background:#36c; color:#fff; border-radius:50%; display:flex; align-items:center; justify-content:center; z-index:9996; box-shadow:0 4px 12px rgba(0,0,0,0.2); cursor:pointer; font-size:20px; transition: all 0.3s ease;">≡</div>');
       
        // Tombol Back to Top lo biasanya di bottom: 80px atau 90px kan?  
        // Kita paksa Back to Top naik sedikit, dan navigasi bab ada di bawahnya.
        // Script ini bakal otomatis menyesuaikan posisi tombol panah atas lo.
       
        $('body').append($quickNav);


        // Menyesuaikan posisi tombol Back to Top bawaan (jika ada) biar gak tabrakan
                    syncMetadata(currentTitle, targetDesc);
        // Kita set navigasi di bottom 20px, dan Back to Top di bottom 80px
                } catch (e) {
        $('.back-to-top, #mw-mf-back-to-top').css('bottom', '85px');
                    console.log("Mippedia System: Data sync not required or entry missing.");
                }
            }
        });


         $quickNav.click(function() {
         function syncMetadata(title, dataCenterDesc) {
             var $toc = $('#toc ul').first().clone();
             var api = new mw.Api();
             var $modal = $('<div id="nav-modal" style="position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.5); z-index:20001; display:flex; align-items:flex-end; justify-content:center; backdrop-filter:blur(5px); opacity:0; transition:opacity 0.3s ease;">' +
             api.get({
                '<div id="nav-card" style="background:#fff; width:100%; max-height:75%; overflow-y:auto; border-top-left-radius:30px; border-top-right-radius:30px; padding:25px; transform:translateY(100%); transition:transform 0.4s cubic-bezier(0.23, 1, 0.32, 1);">' +
                action: 'query',  
                 '<div style="width:50px; height:5px; background:#eee; border-radius:10px; margin:0 auto 20px;"></div>' +
                 prop: 'revisions',
                 '<h3 style="margin-top:0; color:#36c; font-size:1.3em; text-align:center;">Daftar Isi</h3>' +
                 titles: title,
                 '<div id="nav-list" style="margin-top:10px;"></div>' +
                 rvprop: 'content',
                 '</div></div>');
                 formatversion: 2
              
             }).done(function(data) {
            $('body').append($modal);
                var content = data.query.pages[0].revisions[0].content;
            $modal.find('#nav-list').append($toc);
                var shortDescPattern = /\{\{SHORTDESC:.*?\}\}\n?/gi;
           
                 var hasLocalDesc = shortDescPattern.test(content);
            setTimeout(function() {
                  
                 $modal.css('opacity', '1');
                var localMatch = content.match(/\{\{SHORTDESC:(.*?)\}\}/i);
                 $modal.find('#nav-card').css('transform', 'translateY(0)');
                var currentLocalDesc = localMatch ? localMatch[1].trim() : "";
            }, 10);


            // Styling link agar terasa seperti menu aplikasi
                // AKSI 1: HAPUS (Jika di pusat kosong/dihapus, tapi di artikel lokal masih ada)
            $modal.find('a').css({
                if (dataCenterDesc === "" && hasLocalDesc) {
                 'display':'block',
                    console.log("Mippedia: Purging metadata...");
                 'padding':'15px 10px',
                    saveEdit(title, content.replace(shortDescPattern, ""), "Purge out-of-sync metadata");
                 'color':'#333',  
                 }
                'text-decoration':'none',  
                 // AKSI 2: UPDATE/TAMBAH (Jika data di pusat ada dan beda dengan lokal)
                'border-bottom':'1px solid #f9f9f9',
                 else if (dataCenterDesc !== "" && dataCenterDesc !== currentLocalDesc) {
                 'font-size':'1.1em'
                    console.log("Mippedia: Syncing with Data Center...");
                    var cleanedContent = content.replace(shortDescPattern, "");
                    // Menaruh di paling atas agar terbaca Extension ShortDescription
                    var newContent = '{{SHORTDESC:' + dataCenterDesc + '}}\n' + cleanedContent;
                    saveEdit(title, newContent, "Sync metadata: " + dataCenterDesc);
                 }
             });
             });
        }


            function closeModal() {
        function saveEdit(title, text, summary) {
                $modal.find('#nav-card').css('transform', 'translateY(100%)');
            // Menggunakan token user yang sedang login saat ini
                 $modal.css('opacity', '0');
            new mw.Api().postWithEditToken({
                setTimeout(function() { $modal.remove(); }, 400);
                action: 'edit',
            }
                 title: title,
                text: text,
                summary: '🤖 ' + summary,
                minor: true // Menandai sebagai suntingan kecil
                // Parameter 'bot: true' DIHAPUS agar bisa dijalankan semua pengguna login
            }).done(function() {
                console.log("Mippedia: " + title + " synced successfully.");
            });
        }
    });
})(jQuery, mediaWiki);


            $modal.on('click', function(e) { if(e.target === this) closeModal(); });
/* ==========================================================
        });
  🚀 MIPPEDIA METADATA GUARD - RADAR SYSTEM (V5)
     }
  Status: Professional Messaging | Hybrid Mobile/Desktop
});
  ========================================================== */
(function($, mw) {
     "use strict";


/* 2. Auto-Night Shift (Berdasarkan Jam Lokal) */
     var ns = mw.config.get('wgNamespaceNumber');
$(document).ready(function() {
     if (ns !== 0 || mw.config.get('wgIsMainPage')) return;
     var hour = new Date().getHours();
     if (hour >= 21 || hour < 6) { // Jam 9 malem sampe 6 pagi
        $("<style id='night-shift'>").prop("type", "text/css").html(`
            body::after {
                content: "";
                position: fixed;
                top: 0; left: 0;
                width: 100vw; height: 100vh;
                background: rgba(255, 165, 0, 0.05); /* Filter orange tipis */
                pointer-events: none;
                z-index: 99999;
            }
        `).appendTo("head");
    }
});


/* 3. Smooth Fade-In saat Ganti Halaman */
    var shortDescRegex = /\{\{SHORTDESC:.*?\}\}/gi;
$(document).ready(function() {
     var originalShortDesc = null;
    $('body').css({'opacity': '0', 'transition': 'opacity 0.5s ease'});
     setTimeout(function() { $('body').css('opacity', '1'); }, 100);
});


/* 1. Smart Text Selection Menu (Pop-up Action) */
    function validateAndBlock(e) {
$(document).ready(function() {
        var $textbox = $('#wpTextbox1, textarea.previewable-render, .editor-container textarea, textarea[name="wpTextbox1"]');
    var $selectMenu = $('<div id="select-menu" style="position:absolute; display:none; background:#333; color:#fff; padding:5px 10px; border-radius:8px; font-size:12px; z-index:11000; box-shadow:0 4px 10px rgba(0,0,0,0.3);"></div>');
        if (!$textbox.length) return true;
    var $copyBtn = $('<span style="cursor:pointer; margin-right:10px;">📋 Salin</span>');
    var $searchBtn = $('<span style="cursor:pointer;">🔍 Cari</span>');
   
    $selectMenu.append($copyBtn).append($searchBtn);
    $('body').append($selectMenu);


    $(document).on('mouseup touchend', function(e) {
        var currentContent = $textbox.val() || "";
         var selection = window.getSelection();
         var currentMatch = currentContent.match(shortDescRegex);
         var selectedText = selection.toString().trim();
         var currentShortDesc = currentMatch ? currentMatch[0] : "";


         if (selectedText.length > 3) {
         if (originalShortDesc === null) {
             var range = selection.getRangeAt(0).getBoundingClientRect();
             originalShortDesc = currentShortDesc;
             $selectMenu.css({
             return true;
                top: range.top + window.scrollY - 40,
                left: range.left + window.scrollX + (range.width / 2) - 40,
                display: 'block'
            });
        } else {
            $selectMenu.hide();
         }
         }
    });


    $copyBtn.click(function() {
        if (originalShortDesc !== currentShortDesc) {
        document.execCommand('copy');
            // --- PESAN PROFESIONAL BARU ---
        alert('Teks tersalin!');
            window.alert(
        $selectMenu.hide();
                "MIPPEDIA SYSTEM NOTIFICATION\n" +
     });
                "────────────────────────────\n\n" +
                "Suntingan anda tidak bisa di lanjutkan untuk di terbitkan, Karena sinkronisasi otomatis terdeteksi tidak valid.\n\n" +
                "Untuk menjaga integritas metadata, deskripsi singkat (ShortDescription) wajib dikelola melalui repositori Mippedia Data.\n\n" +
                "Harap urungkan perubahan manual pada kode {{SHORTDESC}} untuk melanjutkan proses penyimpanan."
            );
           
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();
            return false;
        }
        return true;
     }


     $searchBtn.click(function() {
     // Radar untuk menangkap elemen editor saat muncul (terutama di Mobile)
         var text = window.getSelection().toString();
    var observer = new MutationObserver(function() {
        window.location.href = '/w/index.php?search=' + encodeURIComponent(text);
         var $textbox = $('#wpTextbox1, .editor-container textarea, textarea[name="wpTextbox1"]');
        if ($textbox.length && originalShortDesc === null) {
            var content = $textbox.val() || "";
            var match = content.match(shortDescRegex);
            originalShortDesc = match ? match[0] : "";
        }
     });
     });
});


/* 3. Smooth Scroll Behavior */
    observer.observe(document.body, { childList: true, subtree: true });
$("<style>").prop("type", "text/css").html(`
    html { scroll-behavior: smooth; }
    @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
`).appendTo("head");


/* 2. Auto-Source on Copy (Kredit Otomatis) */
    // Event listener untuk tombol simpan di berbagai platform
document.addEventListener('copy', function(e) {
     $(document).on('click mousedown touchstart',
     var selection = window.getSelection();
         '#wpSave, .mw-ui-button.primary, button.submit, .editor-save, .save-button, button[type="submit"]',
    if (selection.toString().length > 1) { // Hanya aktif kalau copy lebih dari 50 karakter
         function(e) {
        var body_element = document.getElementsByTagName('body')[0];
             return validateAndBlock(e);
         var newdiv = document.createElement('div');
         }
        newdiv.style.position = 'absolute';
     );
        newdiv.style.left = '-99999px';
        body_element.appendChild(newdiv);
        newdiv.innerHTML = selection + '<br /><br />Sumber: ' + document.title + '<br />Link: ' + window.location.href;
         selection.selectAllChildren(newdiv);
        window.setTimeout(function() {
             body_element.removeChild(newdiv);
         }, 0);
     }
});


/* 3. Smooth Selection (Biar Highlight Teks Berwarna Biru Mippedia) */
    window.addEventListener('submit', function(e) {
$("<style>").prop("type", "text/css").html(`
        if (!validateAndBlock(e)) e.preventDefault();
    ::selection { background: #36c; color: #fff; }
     }, true);
     ::-moz-selection { background: #36c; color: #fff; }
`).appendTo("head");


})(jQuery, mediaWiki);


/* 2. Smart Image Glow (Fokus Visual) */
$(function() {
$(document).ready(function() {
     $('.ambox-learn-more').on('click', function(e) {
     $('.mw-parser-output img').css({
         e.preventDefault();
        'transition': 'box-shadow 0.3s ease, transform 0.3s ease',
        var $parentBox = $(this).closest('.ambox');
        'border-radius': '8px'
    });
 
    $(window).scroll(function() {
         $('.mw-parser-output img').each(function() {
            var winTop = $(window).scrollTop();
            var imgTop = $(this).offset().top;
            if (imgTop < winTop + 400 && imgTop > winTop) {
                $(this).css({
                    'box-shadow': '0 10px 30px rgba(54,102,204,0.2)',
                    'transform': 'scale(1.02)'
                });
            } else {
                $(this).css({
                    'box-shadow': 'none',
                    'transform': 'scale(1)'
                });
            }
        });
    });
});
 
/* 1. Smart Did You Know (Fakta Unik Random) */
$(document).ready(function() {
    if (mw.config.get('wgIsArticle') && mw.config.get('wgNamespaceNumber') === 0) {
        var facts = [
            "Mippedia dikelola sepenuhnya oleh Mippedia Community.",
            "Tahukah kamu? Kamu bisa mendengarkan artikel ini lewat ikon 🔊 di atas!",
            "Mippedia berfokus pada sejarah, musik, dan teknologi.",
            "Ingin berkontribusi? Hubungi pengelola Mippedia sekarang!"
        ];
          
          
         var randomFact = facts[Math.floor(Math.random() * facts.length)];
         $parentBox.toggleClass('ambox-active');
        $parentBox.find('.ambox-text-long').slideToggle('fast');
          
          
         setTimeout(function() {
         // Ubah teks tombol pas dibuka
            var $factPop = $('<div id="fact-pop" style="position:fixed; top:20px; left:20px; right:20px; background:rgba(54,102,204,0.95); color:#fff; padding:12px; border-radius:15px; font-size:12px; z-index:10005; text-align:center; box-shadow:0 10px 20px rgba(0,0,0,0.2); backdrop-filter:blur(5px); display:none;">' +
        if ($parentBox.hasClass('ambox-active')) {
                '💡 <b>Fakta Unik:</b> ' + randomFact +
             $(this).text('Sembunyikan');
                '</div>');
         } else {
           
             $(this).text('Pelajari selengkapnya');
            $('body').append($factPop);
             $factPop.slideDown().delay(5000).slideUp();
         }, 8000); // Muncul setelah 8 detik baca
    }
});
 
/* 2. End-of-Page Social Pulse (Animasi Share di Bawah) */
$(document).ready(function() {
    $(window).scroll(function() {
        if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
             if ($('#end-share').length === 0) {
                var $endShare = $('<div id="end-share" style="text-align:center; padding:20px; background:#f8f9fa; border-top:2px solid #36c; margin-top:20px; animation: fadeIn 0.8s;">' +
                    '<h4 style="color:#36c; margin-bottom:10px;">Bermanfaat? Bagikan sekarang!</h4>' +
                    '<div style="display:flex; justify-content:center; gap:20px;">' +
                        '<a href="https://what.me/?text=' + encodeURIComponent(window.location.href) + '" style="font-size:24px;">🟢</a>' +
                        '<a href="https://facebook.com/sharer/sharer.php?u=' + encodeURIComponent(window.location.href) + '" style="font-size:24px;">🔵</a>' +
                        '<a href="https://twitter.com/intent/tweet?url=' + encodeURIComponent(window.location.href) + '" style="font-size:24px;">⚫</a>' +
                    '</div>' +
                    '</div>');
                $('.mw-parser-output').append($endShare);
            }
         }
         }
    });
});
/* 3. Custom Image Zoom (Tanpa Klik) */
$(document).ready(function() {
    // Memberikan efek zoom halus saat gambar tersentuh di mobile
    $('.mw-parser-output img').on('touchstart', function() {
        $(this).css('transform', 'scale(1.1)');
    }).on('touchend', function() {
        $(this).css('transform', 'scale(1)');
     });
     });
});
});

Revisi terkini sejak 9 November 2026 21.14

/* Otomatis alihkan Special:Upload ke Mippedia Commons */
if (mw.config.get('wgCanonicalSpecialPageName') === 'Upload') {
    window.location.href = 'https://commons.mippedia.org/wiki/Special:Upload';
}

/* Script Estimasi Waktu Baca - Spesialis Mobile (Minerva) & Desktop */
$(document).ready(function() {
    // Hanya jalan di halaman artikel asli dan BUKAN di Halaman Utama
    if (mw.config.get('wgIsArticle') && mw.config.get('wgAction') === 'view' && mw.config.get('wgNamespaceNumber') === 0 && !mw.config.get('wgIsMainPage')) {
        
        function hitungWaktuBaca() {
            // Ambil teks dari konten utama
            var content = $('#mw-content-text').text();
            
            // Hitung jumlah kata (asumsi rata-rata orang baca 200 kata per menit)
            var wordsPerMinute = 200;
            var textLength = content.split(/\s+/).length; // Pecah berdasarkan spasi
            var readingTime = Math.ceil(textLength / wordsPerMinute);
            
            // Bikin elemen tampilannya
            var icon = '🕒'; // Emoji jam biar simpel dan ringan
            var label = (readingTime <= 1) ? '- 1 menit' : readingTime + ' menit';
            
            var html = '<div id="reading-time-auto" style="font-size: 0.9em; color: #54595d; margin-bottom: 15px; display: flex; align-items: center; font-family: sans-serif;">';
            html += '<span style="margin-right: 5px;">' + icon + '</span>';
            html += '<span>Estimasi waktu baca : <b>' + label + '</b></span>';
            html += '</div>';

            // PENEMPELAN TARGET:
            // Di Minerva (HP), judul biasanya ada di .page-heading
            // Di Vector (Desktop), judul ada di #firstHeading
            if ($('.page-heading').length) {
                $('.page-heading').after(html); // Target Mobile
            } else if ($('#firstHeading').length) {
                $('#firstHeading').after(html); // Target Desktop
            }
        }

        // Jalankan fungsi
        hitungWaktuBaca();
    }
});

/* Script Tombol Back to Top (Spesial Mobile) */
$(document).ready(function() {
    // Bikin tombolnya lewat JS biar gak ribet edit CSS/HTML
    var btnHtml = '<div id="backToTop" style="display:none; position:fixed; bottom:80px; right:20px; z-index:9999; background:#36c; color:#fff; width:45px; height:45px; border-radius:50%; text-align:center; line-height:45px; font-size:24px; cursor:pointer; box-shadow: 0 4px 6px rgba(0,0,0,0.3); opacity: 0.8;">↑</div>';
    $('body').append(btnHtml);

    // Fungsi munculin tombol pas di-scroll
    $(window).scroll(function() {
        if ($(this).scrollTop() > 300) {
            $('#backToTop').fadeIn();
        } else {
            $('#backToTop').fadeOut();
        }
    });

    // Fungsi pas tombol diklik
    $('#backToTop').click(function() {
        $('html, body').animate({scrollTop: 0}, 600);
        return false;
    });
});

/* ==========================================================
   🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis)
   Hanya memunculkan tombol jika data tersedia di pusat.
   ========================================================== */
$(document).ready(function() {
    var pageName = mw.config.get('wgPageName');
    var namespace = mw.config.get('wgNamespaceNumber');
    var dataDomain = 'https://data.mippedia.org';

    // Jalankan hanya di namespace artikel
    if (namespace === 0) {
        // Cek apakah halaman tersebut ada di Mippedia Data
        $.ajax({
            url: dataDomain + '/api.php',
            data: { 
                action: 'query', 
                titles: pageName, 
                format: 'json', 
                origin: '*' 
            },
            dataType: 'jsonp',
            success: function(res) {
                var pages = res.query.pages;
                var isExist = false;
                
                // Cek apakah ID halaman > 0 (artinya halaman ada)
                for (var id in pages) {
                    if (parseInt(id) > 0) {
                        isExist = true;
                        break;
                    }
                }

                // Jika data ditemukan, munculkan tombol melayang
                if (isExist) {
                    injectFloatingDataBtn(pageName, dataDomain);
                }
            }
        });
    }

    function injectFloatingDataBtn(name, domain) {
        if ($('#mippedia-data-btn').length) return;

        var $btn = $('<a>', {
            id: 'mippedia-data-btn',
            href: domain + '/wiki/' + encodeURIComponent(name),
            target: '_blank',
            style: 'position: absolute; right: 10px; top: -32px; background: #36c; color: #fff; padding: 4px 10px; border-radius: 4px; font-weight: bold; font-size: 10px; text-decoration: none; z-index: 1000; box-shadow: 0 2px 4px rgba(0,0,0,0.1);',
            text: 'DATA'
        });

        // Target: Area menu aksi (dekat ikon pensil)
        // Mendukung skin Mobile (Minerva) dan Desktop
        var $target = $('.page-actions-menu, .mw-editsection-visualeditor, #ca-edit, .minerva__tab-container').first();
        
        if ($target.length) {
            $target.css('position', 'relative').append($btn);
        } else {
            // Fallback jika header tidak standar
            $('#firstHeading').css('position', 'relative').append($btn);
        }
    }
});

/* ==========================================================
   🚀 MIPPEDIA COMMAND CENTER: AUTO-SYNC ENGINE (V4)
   Status: Global Login User | Auto-Purge | High Reliability
   ========================================================== */
(function($, mw) {
    "use strict";

    var conf = mw.config.get(['wgNamespaceNumber', 'wgAction', 'wgPageName', 'wgIsMainPage', 'wgUserName']);
    // Filter: Hanya artikel, hanya saat baca, hanya user yang sudah login
    if (conf.wgNamespaceNumber !== 0 || conf.wgAction !== 'view' || conf.wgIsMainPage || conf.wgUserName === null) return;

    $(document).ready(function() {
        var currentTitle = conf.wgPageName;
        // Penentuan subdomain (id, en, concise)
        var hostParts = window.location.hostname.split('.');
        var langKey = hostParts[0] === 'mippedia' || hostParts[0] === 'www' ? 'id' : hostParts[0];

        $.ajax({
            url: 'https://data.mippedia.org/api.php',
            data: { 
                action: 'query', 
                prop: 'revisions', 
                titles: 'MediaWiki:ShortDesc-Data.json', 
                rvprop: 'content', 
                format: 'json', 
                origin: '*' 
            },
            dataType: 'jsonp',
            success: function(res) {
                try {
                    var pages = res.query.pages;
                    var pageId = Object.keys(pages)[0];
                    if (pageId === "-1") return;

                    var fullData = JSON.parse(pages[pageId].revisions[0]['*']);
                    var targetDesc = (fullData[currentTitle] && fullData[currentTitle][langKey]) ? fullData[currentTitle][langKey].trim() : "";

                    syncMetadata(currentTitle, targetDesc);
                } catch (e) { 
                    console.log("Mippedia System: Data sync not required or entry missing."); 
                }
            }
        });

        function syncMetadata(title, dataCenterDesc) {
            var api = new mw.Api();
            api.get({ 
                action: 'query', 
                prop: 'revisions', 
                titles: title, 
                rvprop: 'content', 
                formatversion: 2 
            }).done(function(data) {
                var content = data.query.pages[0].revisions[0].content;
                var shortDescPattern = /\{\{SHORTDESC:.*?\}\}\n?/gi;
                var hasLocalDesc = shortDescPattern.test(content);
                
                var localMatch = content.match(/\{\{SHORTDESC:(.*?)\}\}/i);
                var currentLocalDesc = localMatch ? localMatch[1].trim() : "";

                // AKSI 1: HAPUS (Jika di pusat kosong/dihapus, tapi di artikel lokal masih ada)
                if (dataCenterDesc === "" && hasLocalDesc) {
                    console.log("Mippedia: Purging metadata...");
                    saveEdit(title, content.replace(shortDescPattern, ""), "Purge out-of-sync metadata");
                } 
                // AKSI 2: UPDATE/TAMBAH (Jika data di pusat ada dan beda dengan lokal)
                else if (dataCenterDesc !== "" && dataCenterDesc !== currentLocalDesc) {
                    console.log("Mippedia: Syncing with Data Center...");
                    var cleanedContent = content.replace(shortDescPattern, "");
                    // Menaruh di paling atas agar terbaca Extension ShortDescription
                    var newContent = '{{SHORTDESC:' + dataCenterDesc + '}}\n' + cleanedContent;
                    saveEdit(title, newContent, "Sync metadata: " + dataCenterDesc);
                }
            });
        }

        function saveEdit(title, text, summary) {
            // Menggunakan token user yang sedang login saat ini
            new mw.Api().postWithEditToken({
                action: 'edit',
                title: title,
                text: text,
                summary: '🤖 ' + summary,
                minor: true // Menandai sebagai suntingan kecil
                // Parameter 'bot: true' DIHAPUS agar bisa dijalankan semua pengguna login
            }).done(function() {
                console.log("Mippedia: " + title + " synced successfully.");
            });
        }
    });
})(jQuery, mediaWiki);

/* ==========================================================
   🚀 MIPPEDIA METADATA GUARD - RADAR SYSTEM (V5)
   Status: Professional Messaging | Hybrid Mobile/Desktop
   ========================================================== */
(function($, mw) {
    "use strict";

    var ns = mw.config.get('wgNamespaceNumber');
    if (ns !== 0 || mw.config.get('wgIsMainPage')) return;

    var shortDescRegex = /\{\{SHORTDESC:.*?\}\}/gi;
    var originalShortDesc = null;

    function validateAndBlock(e) {
        var $textbox = $('#wpTextbox1, textarea.previewable-render, .editor-container textarea, textarea[name="wpTextbox1"]');
        if (!$textbox.length) return true;

        var currentContent = $textbox.val() || "";
        var currentMatch = currentContent.match(shortDescRegex);
        var currentShortDesc = currentMatch ? currentMatch[0] : "";

        if (originalShortDesc === null) {
            originalShortDesc = currentShortDesc;
            return true;
        }

        if (originalShortDesc !== currentShortDesc) {
            // --- PESAN PROFESIONAL BARU ---
            window.alert(
                "MIPPEDIA SYSTEM NOTIFICATION\n" +
                "────────────────────────────\n\n" +
                "Suntingan anda tidak bisa di lanjutkan untuk di terbitkan, Karena sinkronisasi otomatis terdeteksi tidak valid.\n\n" +
                "Untuk menjaga integritas metadata, deskripsi singkat (ShortDescription) wajib dikelola melalui repositori Mippedia Data.\n\n" +
                "Harap urungkan perubahan manual pada kode {{SHORTDESC}} untuk melanjutkan proses penyimpanan."
            );
            
            e.preventDefault();
            e.stopPropagation();
            e.stopImmediatePropagation();
            return false;
        }
        return true;
    }

    // Radar untuk menangkap elemen editor saat muncul (terutama di Mobile)
    var observer = new MutationObserver(function() {
        var $textbox = $('#wpTextbox1, .editor-container textarea, textarea[name="wpTextbox1"]');
        if ($textbox.length && originalShortDesc === null) {
            var content = $textbox.val() || "";
            var match = content.match(shortDescRegex);
            originalShortDesc = match ? match[0] : "";
        }
    });

    observer.observe(document.body, { childList: true, subtree: true });

    // Event listener untuk tombol simpan di berbagai platform
    $(document).on('click mousedown touchstart', 
        '#wpSave, .mw-ui-button.primary, button.submit, .editor-save, .save-button, button[type="submit"]', 
        function(e) {
            return validateAndBlock(e);
        }
    );

    window.addEventListener('submit', function(e) {
        if (!validateAndBlock(e)) e.preventDefault();
    }, true);

})(jQuery, mediaWiki);

$(function() {
    $('.ambox-learn-more').on('click', function(e) {
        e.preventDefault();
        var $parentBox = $(this).closest('.ambox');
        
        $parentBox.toggleClass('ambox-active');
        $parentBox.find('.ambox-text-long').slideToggle('fast');
        
        // Ubah teks tombol pas dibuka
        if ($parentBox.hasClass('ambox-active')) {
            $(this).text('Sembunyikan');
        } else {
            $(this).text('Pelajari selengkapnya');
        }
    });
});