Jump to content

MediaWiki:Common.js: Difference between revisions

From Vanipedia
Kashya (talk | contribs)
No edit summary
Tag: Manual revert
Kashya (talk | contribs)
No edit summary
Line 217: Line 217:
     }
     }
});
});
/* =========================================================
  VANIPEDIA FLIPBOOK POPUP
  ========================================================= */
(function () {
    function createFlipbookOverlay() {
        if (document.getElementById('vani-flipbook-overlay')) {
            return;
        }
        var overlay = document.createElement('div');
        overlay.id = 'vani-flipbook-overlay';
        var modal = document.createElement('div');
        modal.className = 'vani-flipbook-modal';
        var closeButton = document.createElement('button');
        closeButton.className = 'vani-flipbook-close';
        closeButton.type = 'button';
        closeButton.setAttribute('aria-label', 'Close flipbook');
        closeButton.innerHTML = '×';
        var frameHolder = document.createElement('div');
        frameHolder.id = 'vani-flipbook-frame-holder';
        modal.appendChild(closeButton);
        modal.appendChild(frameHolder);
        overlay.appendChild(modal);
        document.body.appendChild(overlay);
        closeButton.addEventListener('click', function () {
            closeFlipbook();
        });
        overlay.addEventListener('click', function (event) {
            if (event.target === overlay) {
                closeFlipbook();
            }
        });
        document.addEventListener('keydown', function (event) {
            if (
                event.key === 'Escape' &&
                overlay.classList.contains('is-open')
            ) {
                closeFlipbook();
            }
        });
    }
    function openFlipbook(book) {
        createFlipbookOverlay();
        var overlay =
            document.getElementById('vani-flipbook-overlay');
        var holder =
            document.getElementById('vani-flipbook-frame-holder');
        /*
        * FIRST make popup visible.
        */
        overlay.classList.add('is-open');
        document.body.classList.add('vani-flipbook-open');
        /*
        * Remove any previous iframe.
        */
        holder.innerHTML = '';
        /*
        * Wait until browser has calculated
        * the real popup dimensions.
        */
        requestAnimationFrame(function () {
            requestAnimationFrame(function () {
                var frame =
                    document.createElement('iframe');
                frame.id =
                    'vani-flipbook-frame';
                frame.title =
                    'Vanipedia Flipbook';
                frame.setAttribute(
                    'allowfullscreen',
                    'true'
                );
frame.src =
    'https://dev.vanipedia.org/flipbook/?book=' +
    encodeURIComponent(book);
                holder.appendChild(frame);
            });
        });
    }
    function closeFlipbook() {
        var overlay =
            document.getElementById('vani-flipbook-overlay');
        var holder =
            document.getElementById('vani-flipbook-frame-holder');
        if (!overlay) {
            return;
        }
        overlay.classList.remove('is-open');
        document.body.classList.remove('vani-flipbook-open');
        if (holder) {
            holder.innerHTML = '';
        }
    }
    function initialiseFlipbooks() {
        var triggers =
            document.querySelectorAll(
                '.vani-flipbook-trigger'
            );
        triggers.forEach(function (trigger) {
            if (
                trigger.getAttribute(
                    'data-flipbook-ready'
                ) === '1'
            ) {
                return;
            }
            trigger.setAttribute(
                'data-flipbook-ready',
                '1'
            );
            trigger.addEventListener(
                'click',
                function (event) {
                    event.preventDefault();
                    var book =
                        trigger.getAttribute(
                            'data-book'
                        );
                    if (book) {
                        openFlipbook(book);
                    }
                }
            );
        });
    }
    createFlipbookOverlay();
    initialiseFlipbooks();
    if (
        window.mw &&
        mw.hook
    ) {
        mw.hook(
            'wikipage.content'
        ).add(function () {
            initialiseFlipbooks();
        });
    }
})();

Revision as of 05:06, 13 September 2026

/* Any JavaScript here will be loaded for all users on every page load. */

if (mw.config.get('wgPageName' ) === 'Krishna_says_in_Bhagavad-gita') { 
  /* switch tooltip texts from content-div to label-div */
  const v_labels = Array.from(document.getElementsByClassName("tabs-label"));
  const v_content = Array.from(document.getElementsByClassName("tabs-content"));
  for (var i = 0; i < v_labels.length; i++) {
    v_labels[i].title = v_content[i].title;
    v_content[i].title = "";
  }
  /* adjust wikitables */
  var arr = Array.from(document.getElementsByClassName("wikitable"));
  for (var t = 0; t < arr.length; t++) {
    /* insert THEAD in wikitable */
    var thead = document.createElement("thead");
    thead.style.display = "block";
    var wtbl = arr[t];
    wtbl.insertBefore(thead, wtbl.firstChild);
    /* move first row of TBODY to THEAD */
    thead.appendChild(wtbl.rows[0]);
    /* make TBODY scrollable */
    var tbody = wtbl.tBodies[0];
    tbody.style.display = "block";
    tbody.style.overflowY = "auto";
    tbody.style.maxHeight = "500px";    
    for (var r = 0; r < wtbl.rows.length; r++) {
      var row = wtbl.rows[r];
      /* adjust column widths and hide from-until columns */
      row.cells[0].classList = "cw_0";
      row.cells[1].classList = "cw_150";
      row.cells[2].classList = "cw_500";
      /* mark the text */ 
      if (r == 0) continue;
      var v_text = row.cells[2].textContent;
      var v_html = ""; var v_from = 0;
      var marks = JSON.parse(row.cells[0].textContent.replaceAll("O", "[").replaceAll("C", "]"));
      for (var m = 0; m < marks.length; m++) {
        v_html += 
          v_text.substr(v_from,marks[m][0]-v_from) + "<mark>" +
          v_text.substr(marks[m][0],marks[m][1]-marks[m][0]+1) + "</mark>";
        v_from = marks[m][1]+1;
      }
      v_html += v_text.substr(v_from);
      row.cells[2].innerHTML = v_html;
    }
  }
}

// install Google Search
// document.write('<script type="text/javascript" src="'
// + 'http://vanipedia.org/w/index.php?title=MediaWiki:GoogleSearch.js'
// + '&action=raw&ctype=text/javascript"></' + 'script>');

// install JQuery
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:JQuery.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');

// install WikEd toolbar and Vanify
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:Vaniquotes.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');
 
// install Replace
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:TextboxReplace.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');
 
// install Unify
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:Unify.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');
 
// install Vanify
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:Vanify.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');

// install Vani_suggest for diacritics auto-suggest pulldown on the search bar
//document.write('<script type="text/javascript" src="'
//+ 'http://vanipedia.org/w/index.php?title=MediaWiki:Vani_suggest.js'
//+ '&action=raw&ctype=text/javascript"></' + 'script>');

// install previous/next links for video categories in all languages
 //document.write('<script type="text/javascript" src="/navcat/navcat.js"></' + 'script>');
 
// Buttons
 
//addOnloadHook(function() {
 
//if (document.editform) {
//addPortletLink("p-cactions", "javascript:Unify()", "unify", "ca-unify", "Convert Balarama fonts to Unicode", "");
// addPortletLink("p-cactions", "javascript:Vanify()", "vanify", "ca-vanify", "Corrects vani markup", "");
// addPortletLink('p-cactions', 'javascript:format()', 'format', 'ca-format', 'Format article', '');
//addPortletLink('p-cactions', 'javascript:wpTextboxReplace()', 'Replace', 'ca-replace', 'Replaces text in the edit window', 'R');
//}
//});
 
// end Buttons

// --- VANIPEDIA DARK MODE TOGGLE (Kasya) ---
$(document).ready(function() {
    // Create the floating button
    var toggleBtn = $('<button id="dark-mode-toggle" title="Toggle Dark Mode" style="position:fixed; bottom:25px; right:25px; z-index:9999; width:45px; height:45px; border-radius:50%; background:#2c3e50; color:#f1c40f; font-size:20px; border:none; box-shadow:0 4px 10px rgba(0,0,0,0.3); cursor:pointer; display:flex; align-items:center; justify-content:center; transition: transform 0.2s;">🌙</button>');
    $('body').append(toggleBtn);

    // Hover effect for the button
    toggleBtn.hover(
        function() { $(this).css('transform', 'scale(1.1)'); },
        function() { $(this).css('transform', 'scale(1.0)'); }
    );

    // Check if the user previously selected dark mode
    if (localStorage.getItem('vanipedia-theme') === 'dark') {
        $('html').addClass('dark-theme');
        toggleBtn.text('🔆').css('background', '#f1c40f').css('color', '#2c3e50');
    }

    // Click event handler
    toggleBtn.click(function() {
        $('html').toggleClass('dark-theme');
        
        if ($('html').hasClass('dark-theme')) {
            localStorage.setItem('vanipedia-theme', 'dark');
            toggleBtn.text('🔆').css('background', '#f1c40f').css('color', '#2c3e50');
        } else {
            localStorage.setItem('vanipedia-theme', 'light');
            toggleBtn.text('☽').css('background', '#2c3e50').css('color', '#f1c40f');
        }
    });
});

// --- YouTube Random Shorts (Kasya) ---
$(document).ready(function() {
    var $widget = $('.vani-shorts-viewport');
    
    if ($widget.length) {
        var $viewport = $widget;
        var $titleFrame = $widget.find('.vani-shorts-title');
        
        new mw.Api().get({
            action: 'query',
            prop: 'revisions',
            titles: 'VanimediaMayapur YouTube SHORTS List',
            rvprop: 'content',
            format: 'json'
        }).done(function(data) {
            try {
                var pages = data.query.pages;
                var pageId = Object.keys(pages)[0];
                
                if (pageId == "-1" || !pages[pageId].revisions) {
                    $viewport.text("Database list page not found.");
                    return;
                }
                
                // FIXED: Corrected MediaWiki revision array syntax lookup
                var rawWikiText = pages[pageId].revisions[0]['*'];
                var lines = rawWikiText.split('\n');
                var validShorts = [];
                
                for (var i = 0; i < lines.length; i++) {
                    var line = $.trim(lines[i]);
                    if (line.indexOf('File:') === 0 && line.toLowerCase().indexOf('link=') !== -1) {
                        validShorts.push(line);
                    }
                }
                
                if (validShorts.length === 0) {
                    $viewport.text("No gallery entries recognized.");
                    return;
                }
                
                var randomLine = validShorts[Math.floor(Math.random() * validShorts.length)];
                var parts = randomLine.split('|');
                
                // Reset defaults before parsing line elements
                var rawUrl = "";
                
                for (var j = 0; j < parts.length; j++) {
                    var part = $.trim(parts[j]);
                    
                    if (part.toLowerCase().indexOf('link=') === 0) {
                        rawUrl = part.substring(5).trim();
                    }
                }
                
                // Clean all template formatting brackets, space characters, and hidden control markers
                var urlCleaned = rawUrl.replace(/[\u200e\u200f\s\}\}\]]/g, ''); 
                
                // Direct YouTube Alphanumeric Pattern Matcher
                var idRegex = /(?:shorts\/|v=|embed\/|\/)([a-zA-Z0-9_-]{11})/;
                var matchResults = urlCleaned.match(idRegex);
                var videoId = "";
                
                if (matchResults && matchResults[1]) {
                    // FIXED: Grabbed index 1 to pull the standalone 11-digit ID without any slashes
                    videoId = matchResults[1].trim();
                }
                
                if (videoId && videoId.length === 11) {
                    // FIXED: Isolated to inject ONLY the video player iframe at the correct 280px width
                   var embedUrl = "https://www.youtube.com/embed/" + videoId;

                    $viewport.html('<iframe width="280" height="225" src="' + embedUrl + '" frameborder="0" allowfullscreen style="border-radius: 8px; border: none;"></iframe>');
                } else {
                    $viewport.html("<div style='color:#c0392b; padding:10px; font-size:11px;'>Invalid video ID sequence extracted.</div>");
                }
                
            } catch (err) {
                console.error("Shorts engine exception:", err);
                $viewport.text("Error handling text structure values.");
            }
        }).fail(function() {
            $viewport.text("API connection failed.");
        });
    }
});
/* =========================================================
   VANIPEDIA FLIPBOOK POPUP
   ========================================================= */

(function () {

    function createFlipbookOverlay() {

        if (document.getElementById('vani-flipbook-overlay')) {
            return;
        }

        var overlay = document.createElement('div');
        overlay.id = 'vani-flipbook-overlay';

        var modal = document.createElement('div');
        modal.className = 'vani-flipbook-modal';

        var closeButton = document.createElement('button');
        closeButton.className = 'vani-flipbook-close';
        closeButton.type = 'button';
        closeButton.setAttribute('aria-label', 'Close flipbook');
        closeButton.innerHTML = '&times;';

        var frameHolder = document.createElement('div');
        frameHolder.id = 'vani-flipbook-frame-holder';

        modal.appendChild(closeButton);
        modal.appendChild(frameHolder);
        overlay.appendChild(modal);

        document.body.appendChild(overlay);
        closeButton.addEventListener('click', function () {
            closeFlipbook();
        });

        overlay.addEventListener('click', function (event) {

            if (event.target === overlay) {
                closeFlipbook();
            }

        });

        document.addEventListener('keydown', function (event) {

            if (
                event.key === 'Escape' &&
                overlay.classList.contains('is-open')
            ) {
                closeFlipbook();
            }
        });
    }

    function openFlipbook(book) {

        createFlipbookOverlay();

        var overlay =
            document.getElementById('vani-flipbook-overlay');

        var holder =
            document.getElementById('vani-flipbook-frame-holder');

        /*
         * FIRST make popup visible.
         */

        overlay.classList.add('is-open');

        document.body.classList.add('vani-flipbook-open');

        /*
         * Remove any previous iframe.
         */
        holder.innerHTML = '';

        /*
         * Wait until browser has calculated
         * the real popup dimensions.
         */
        requestAnimationFrame(function () {

            requestAnimationFrame(function () {

                var frame =
                    document.createElement('iframe');

                frame.id =
                    'vani-flipbook-frame';

                frame.title =
                    'Vanipedia Flipbook';

                frame.setAttribute(
                    'allowfullscreen',
                    'true'
                );

frame.src =
    'https://dev.vanipedia.org/flipbook/?book=' +
    encodeURIComponent(book);
                holder.appendChild(frame);
            });

        });

    }

    function closeFlipbook() {

        var overlay =
            document.getElementById('vani-flipbook-overlay');

        var holder =
            document.getElementById('vani-flipbook-frame-holder');

        if (!overlay) {
            return;
        }

        overlay.classList.remove('is-open');
        document.body.classList.remove('vani-flipbook-open');

        if (holder) {
            holder.innerHTML = '';
        }

    }

    function initialiseFlipbooks() {
        var triggers =
            document.querySelectorAll(
                '.vani-flipbook-trigger'
            );

        triggers.forEach(function (trigger) {

            if (
                trigger.getAttribute(
                    'data-flipbook-ready'
                ) === '1'
            ) {
                return;
            }

            trigger.setAttribute(
                'data-flipbook-ready',
                '1'
            );

            trigger.addEventListener(
                'click',
                function (event) {

                    event.preventDefault();
                    var book =
                        trigger.getAttribute(
                            'data-book'
                        );

                    if (book) {
                        openFlipbook(book);
                    }

                }
            );

        });

    }

    createFlipbookOverlay();
    initialiseFlipbooks();

    if (
        window.mw &&
        mw.hook
    ) {

        mw.hook(
            'wikipage.content'
        ).add(function () {

            initialiseFlipbooks();

        });

    }

})();