Lompat ke isi

MediaWiki:Common.js: Perbedaan antara revisi

Dari Mippedia bahasa Indonesia, ensiklopedia umum
Tidak ada ringkasan suntingan
Tanda: Dikembalikan Suntingan perangkat seluler Suntingan peramban seluler
Tidak ada ringkasan suntingan
Tanda: Suntingan perangkat seluler Suntingan peramban seluler
 
(246 revisi perantara oleh 2 pengguna tidak ditampilkan)
Baris 1: Baris 1:
/* Script Otomatis Artikel Terkait - Support Mobile (Minerva) & Desktop */
/* 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() {
$(document).ready(function() {
     function initRelatedArticles() {
     // 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() {
            // 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 categories = mw.config.get('wgCategories');
             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;">';
             if (categories.length > 0) {
            html += '<span style="margin-right: 5px;">' + icon + '</span>';
                 // Filter kategori sampah/internal
            html += '<span>Estimasi waktu baca : <b>' + label + '</b></span>';
                var cleanCats = categories.filter(function(cat) {
            html += '</div>';
                    return !cat.match(/halaman|artikel|maintenance|dispute|wiki/i);
 
                });
            // PENEMPELAN TARGET:
                var targetCat = cleanCats.length > 0 ? cleanCats[0] : categories[0];
            // 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();
    }
});


                $.getJSON(mw.util.wikiScript('api'), {
/* Script Tombol Back to Top (Spesial Mobile) */
                    action: 'query',
$(document).ready(function() {
                    list: 'categorymembers',
    // Bikin tombolnya lewat JS biar gak ribet edit CSS/HTML
                    cmtitle: 'Category:' + targetCat,
    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>';
                    cmlimit: 50,
    $('body').append(btnHtml);
                    format: 'json'
                }, function(data) {
                    var members = data.query.categorymembers;
                    if (!members) return;


                    var currentTitle = mw.config.get('wgPageName').replace(/_/g, ' ');
    // Fungsi munculin tombol pas di-scroll
                    var filteredMembers = members.filter(function(item) {
    $(window).scroll(function() {
                        return item.title !== currentTitle;
        if ($(this).scrollTop() > 300) {
                    });
            $('#backToTop').fadeIn();
        } else {
            $('#backToTop').fadeOut();
        }
    });


                    // ACAK DAFTARNYA
    // Fungsi pas tombol diklik
                    filteredMembers.sort(function() { return 0.5 - Math.random(); });
    $('#backToTop').click(function() {
                    var finalSelection = filteredMembers.slice(0, 4);
        $('html, body').animate({scrollTop: 0}, 600);
        return false;
    });
});


                    var html = '<div id="related-footer" style="clear:both; background-color: #f8f9fa; border: 1px solid #a2a9b1; padding: 15px; margin: 20px 0; border-radius: 5px;">';
/* ==========================================================
                    html += '<h3 style="margin-top:0; border-bottom: 1px solid #a2a9b1; padding-bottom: 5px; font-size: 1.1em; color: #000;">Halaman Terkait</h3><ul style="list-style-type: none; margin: 10px 0 0 0; padding: 0;">';
  🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis)
                   
  Hanya memunculkan tombol jika data tersedia di pusat.
                    var count = 0;
  ========================================================== */
                    $.each(finalSelection, function(i, item) {
$(document).ready(function() {
                        html += '<li style="margin-bottom: 10px; border-bottom: 1px solid #eaecf0; padding-bottom: 5px;">• <a style="font-weight: bold; color: #0645ad; text-decoration: none;" href="' + mw.util.getUrl(item.title) + '">' + item.title + '</a></li>';
    var pageName = mw.config.get('wgPageName');
                        count++;
    var namespace = mw.config.get('wgNamespaceNumber');
                    });
    var dataDomain = 'https://data.mippedia.org';


                    html += '</ul></div>';
    // Jalankan hanya di namespace artikel
                   
    if (namespace === 0) {
                    if (count > 0) {
        // Cek apakah halaman tersebut ada di Mippedia Data
                        // FIX BUAT MOBILE (Minerva)
        $.ajax({
                        // Di Minerva, kita tempel di atas footer atau setelah content-text
            url: dataDomain + '/api.php',
                        if ($('.minerva-footer').length) {
            data: {  
                            $('.minerva-footer').before(html); // Pasang di atas footer HP
                action: 'query',
                        } else if ($('#catlinks').length) {
                titles: pageName,
                            $('#catlinks').after(html); // Pasang setelah kategori Desktop
                format: 'json',
                        } else {
                origin: '*'  
                            $('#mw-content-text').after(html); // Backup terakhir
            },
                         }
            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.");
                }
            }
        });


     // Jalankan fungsi
        function syncMetadata(title, dataCenterDesc) {
     initRelatedArticles();
            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');
        }
    });
});
});

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');
        }
    });
});