MediaWiki:Common.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () { | |||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
| Line 767: | Line 768: | ||
mw.hook('wikipage.content').add(initBackToTop); | mw.hook('wikipage.content').add(initBackToTop); | ||
})(); | })(); | ||
/* VANISOURCE V2 — Vanipedia V173 shared shell */ | |||
(function() { | |||
var titleText = "VANISOURCE - Books Letters Lectures Conversations"; | |||
var targetUrl = "/wiki/Main_Page"; | |||
function removeGlobalSiteNotice() { | |||
$('#siteNotice, #localNotice, .vector-sitenotice-container, #mainbanner, .sitenotice, .mw-sitenotice, .anonnotice, .dismissable-notice, #centralNotice').remove(); | |||
} | |||
function createHomeLink() { | |||
var homeSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>'; | |||
return $('<a>', { | |||
id: 'vanipedia-topbar-home-link', | |||
href: 'https://dev.vanipedia.org/', | |||
title: 'Vanipedia Entry Portal', | |||
'aria-label': 'Home', | |||
class: 'vanipedia-topbar-home' | |||
}).html('<span class="vanipedia-home-icon">' + homeSvg + '</span><span class="vanipedia-home-text">Home</span>'); | |||
} | |||
function createCenterBlock() { | |||
var blockStyle = 'position:absolute !important; left:50% !important; top:54% !important; transform:translate(-50%, -50%) !important; display:flex !important; flex-direction:column !important; align-items:center !important; justify-content:center !important; text-align:center !important; white-space:nowrap !important; z-index:10 !important; pointer-events:auto !important;'; | |||
var titleStyle = 'position:static !important; transform:none !important; display:block !important; font-family:"Cinzel", Georgia, serif !important; font-size:18px !important; font-weight:700 !important; letter-spacing:2px !important; color:#f5d77f !important; text-decoration:none !important; text-shadow:0 2px 4px rgba(0,0,0,0.9), 0 0 10px rgba(245,215,127,0.3) !important; line-height:1.25 !important; margin:0 0 4px 0 !important; padding:0 !important; user-select:text !important;'; | |||
var vanisevaWrapStyle = 'position:static !important; transform:none !important; display:block !important; margin:0 0 4px 0 !important; line-height:1.2 !important;'; | |||
var vanisevaLinkStyle = 'color:#fff2c4 !important; font-family:"Noto Serif", Georgia, serif !important; font-size:12.5px !important; font-style:normal !important; font-weight:500 !important; letter-spacing:0.35px !important; text-decoration:none !important; border:1px solid rgba(223,173,62,0.35) !important; background:rgba(245,215,127,0.08) !important; outline:none !important; padding:2px 14px !important; border-radius:12px !important; cursor:pointer !important; display:inline-block !important; transition:all 0.18s ease !important;'; | |||
var sisterWrapStyle = 'position:static !important; transform:none !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:14px !important; margin:0 !important; line-height:1.2 !important;'; | |||
var sisterLinkStyle = 'color:#f5d77f !important; font-family:"Noto Serif", Georgia, serif !important; font-size:13px !important; font-weight:600 !important; letter-spacing:0.4px !important; text-decoration:none !important; border:none !important; border-bottom:none !important; outline:none !important; padding:2px 8px !important; border-radius:3px !important; display:inline-flex !important; align-items:center !important; cursor:pointer !important; transition:all 0.18s ease !important;'; | |||
var sepStyle = 'color:rgba(245,215,127,0.4) !important; font-size:11px !important; line-height:1 !important; user-select:none !important;'; | |||
var $block = $('<div>', { | |||
id: 'vanipedia-topbar-center-block', | |||
class: 'vanipedia-topbar-center-block', | |||
style: blockStyle | |||
}); | |||
var $title = $('<div>', { | |||
id: 'vanipedia-topbar-title', | |||
class: 'vanipedia-topbar-main-title', | |||
style: titleStyle, | |||
text: titleText | |||
}); | |||
var $vaniseva = $('<div>', { | |||
class: 'vanipedia-topbar-vaniseva-title', | |||
style: vanisevaWrapStyle | |||
}).html('<a href="https://vaniseva.org" target="_blank" rel="noopener noreferrer" title="Vaniseva" style="' + vanisevaLinkStyle + '">Collaborate with us to invoke and fully manifest Śrīla Prabhupāda's Vani-presence</a>'); | |||
var $sisterLinks = $('<div>', { | |||
class: 'vanipedia-topbar-sister-links', | |||
style: sisterWrapStyle | |||
}).html( | |||
'<a href="https://vanipedia.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vanipedia" style="' + sisterLinkStyle + '">vanipedia.org</a>' + | |||
'<span class="vanipedia-topbar-sister-sep" aria-hidden="true" style="' + sepStyle + '">•</span>' + | |||
'<a href="https://vaniquotes.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vaniquotes" style="' + sisterLinkStyle + '">vaniquotes.org</a>' + | |||
'<span class="vanipedia-topbar-sister-sep" aria-hidden="true" style="' + sepStyle + '">•</span>' + | |||
'<a href="https://vanimedia.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vanimedia" style="' + sisterLinkStyle + '">vanimedia.org</a>' | |||
); | |||
$block.append($title, $vaniseva, $sisterLinks); | |||
return $block; | |||
} | |||
function updateTopBar() { | |||
removeGlobalSiteNotice(); | |||
$('#vanipedia-topbar-center-block, #vanipedia-topbar-center-block-mobile, #vanipedia-topbar-title, #vanipedia-topbar-title-mobile, #vanipedia-topbar-title-link, #vanipedia-topbar-center-title, #vanipedia-topbar-home-link, #vanipedia-topbar-sister-links, #vanipedia-topbar-sister-links-mobile, .vanipedia-topbar-sister-links, .vanipedia-topbar-center-block').remove(); | |||
$('.vector-header-container').css({ | |||
'background': 'transparent', | |||
'background-color': 'transparent', | |||
'border': 'none', | |||
'box-shadow': 'none', | |||
'padding': '0', | |||
'margin': '0', | |||
'min-height': '0', | |||
'height': 'auto', | |||
'width': '100%', | |||
'max-width': '100%' | |||
}); | |||
var isMobile = (window.innerWidth <= 999) || $('body').hasClass('skin-minerva') || $('body').hasClass('skin-vector-mobile') || $('.minerva-header').length > 0; | |||
var $header = $('header.mw-header, header.vector-header').not('.minerva-header').first(); | |||
if (!$header.length && !$('body').hasClass('skin-minerva') && !$('.minerva-header').length) { | |||
$header = $('#mw-head, header').not('.minerva-header').filter(':visible').first(); | |||
} | |||
if ($header.length) { | |||
$header.css({ | |||
'min-height': isMobile ? '52px' : '86px', | |||
'height': isMobile ? '52px' : 'auto', | |||
'max-height': isMobile ? '52px' : 'none', | |||
'padding': isMobile ? '0 10px' : '10px 24px', | |||
'background-color': '#526B50', | |||
'border-bottom': '2px solid #b1873d', | |||
'box-shadow': '0 4px 18px rgba(0,0,0,0.35)', | |||
'position': 'relative', | |||
'display': 'flex', | |||
'flex-wrap': 'nowrap', | |||
'align-items': 'center', | |||
'justify-content': 'space-between', | |||
'box-sizing': 'border-box', | |||
'width': '100%', | |||
'max-width': '100%' | |||
}); | |||
if (!isMobile) { | |||
$header.append(createCenterBlock()); | |||
} | |||
var $search = $header.find('.vector-header-start #p-search, #p-search'); | |||
if ($search.length) { | |||
$search.after(createHomeLink()); | |||
} else if ($header.find('.vector-header-start').length) { | |||
$header.find('.vector-header-start').append(createHomeLink()); | |||
} | |||
} | |||
var $minervaHeader = $('.minerva-header'); | |||
if ($minervaHeader.length) { | |||
// 1. Ensure "Vanipedia" Title Link exists with text in the branding box | |||
var $branding = $minervaHeader.find('.branding-box'); | |||
if ($branding.length) { | |||
var $brandLink = $branding.find('a'); | |||
if ($brandLink.length) { | |||
if (!$brandLink.text().trim()) { | |||
$brandLink.html('<span>Vanisource</span>'); | |||
} | |||
} else { | |||
$branding.html('<a href="/wiki/Main_Page"><span>Vanisource</span></a>'); | |||
} | |||
} else { | |||
var brandHtml = '<div class="branding-box"><a href="/wiki/Main_Page"><span>Vanisource</span></a></div>'; | |||
var $burger = $minervaHeader.find('#mw-mf-main-menu-button, .navigation-drawer.toggle-list').first(); | |||
if ($burger.length) { | |||
$burger.after(brandHtml); | |||
} else { | |||
$minervaHeader.prepend(brandHtml); | |||
} | |||
} | |||
// 2. Ensure Home Link is inserted cleanly | |||
var $minervaForm = $minervaHeader.find('.minerva-search-form, #searchform').first(); | |||
if ($minervaForm.length && !$minervaHeader.find('#vanipedia-topbar-home-link').length) { | |||
$minervaForm.before(createHomeLink()); | |||
} else if (!$minervaHeader.find('#vanipedia-topbar-home-link').length) { | |||
var $minervaUser = $minervaHeader.find('.minerva-user-navigation, #ca-mytalks').first(); | |||
if ($minervaUser.length) { | |||
$minervaUser.before(createHomeLink()); | |||
} else { | |||
$minervaHeader.append(createHomeLink()); | |||
} | |||
} | |||
$minervaHeader.css({ | |||
'flex-wrap': 'nowrap', | |||
'height': '52px', | |||
'min-height': '52px', | |||
'max-height': '52px', | |||
'padding': '0 10px', | |||
'display': 'flex', | |||
'align-items': 'center', | |||
'justify-content': 'space-between', | |||
'box-sizing': 'border-box' | |||
}); | |||
} | |||
var $stageHeader = $('#vani-stage-header-slot'); | |||
if ($stageHeader.length && !$stageHeader.find('.vanipedia-topbar-center-block').length) { | |||
var $stageSearch = $stageHeader.find('#p-search, .search-box, .minerva-search-form').first(); | |||
if ($stageSearch.length && !$stageHeader.find('#vanipedia-topbar-home-link').length) { | |||
$stageSearch.after(createHomeLink()); | |||
} | |||
if (!isMobile) { | |||
$stageHeader.append(createCenterBlock()); | |||
} | |||
} | |||
var $stickyTitle = $('#vector-sticky-header .vector-sticky-header-title, #vector-sticky-header .vector-sticky-header-context-bar .mw-headline'); | |||
if ($stickyTitle.length) { | |||
$stickyTitle.html('<a href="' + targetUrl + '" style="color: inherit; text-decoration: none;">' + titleText + '</a>'); | |||
} | |||
} | |||
$(function() { | |||
removeGlobalSiteNotice(); | |||
}); | |||
var topbarResizeTimer; | |||
$(window).on('resize orientationchange', function() { | |||
clearTimeout(topbarResizeTimer); | |||
topbarResizeTimer = setTimeout(updateTopBar, 150); | |||
}); | |||
$(document).ready(updateTopBar); | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(updateTopBar); | |||
} | |||
})(); | |||
(function initPermanentBottomBar() { | |||
function isEntryPage() { | |||
return ( | |||
document.body.classList.contains('ext-vp3d-fullscreen') || | |||
!!document.querySelector('.vp-entry3d-container') || | |||
!!document.querySelector('.vp-entry3d-wrapper') || | |||
(window.mw && mw.config && (mw.config.get('wgPageName') === 'Entry_Page' || mw.config.get('wgTitle') === 'Entry Page')) | |||
); | |||
} | |||
function setupBottomBar() { | |||
// Never inject on the 3D entry page; remove if already present | |||
if (isEntryPage()) { | |||
var existing = document.getElementById('vh-bottom-bar'); | |||
if (existing) existing.remove(); | |||
return; | |||
} | |||
if (document.getElementById('vh-bottom-bar')) return; | |||
var bar = document.createElement('nav'); | |||
bar.id = 'vh-bottom-bar'; | |||
bar.className = 'vh-bottom-bar'; | |||
bar.setAttribute('aria-label', 'Vanisource Global Navigation'); | |||
bar.innerHTML = | |||
'<div class="vh-bottom-bar-inner" style="display:flex !important; align-items:center !important; width:100% !important; max-width:100% !important; height:100% !important; padding:0 24px !important; box-sizing:border-box !important;">' + | |||
'<div class="vh-bottom-bar-left-space" style="flex:1 1 0 !important; min-width:0 !important;"><div class="vh-bottom-petal-links"><a href="https://vanipedia.org" target="_blank" rel="noopener noreferrer">Vanipedia</a><a href="https://vaniquotes.org" target="_blank" rel="noopener noreferrer">Vaniquotes</a><a href="https://vanimedia.org" target="_blank" rel="noopener noreferrer">Vanimedia</a></div></div>' + | |||
'<div class="vh-bottom-nav-links" style="flex:0 0 auto !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:12px !important; white-space:nowrap !important;">' + | |||
'<a href="https://dev.vanipedia.org/" class="vh-bottom-link vh-bottom-entry">Home</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="/wiki/Main_Page" class="vh-bottom-link vh-bottom-home">Main Page</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="https://vanipedia.org/wiki/Vanipedia_Vision" class="vh-bottom-link">Core Principles</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="https://vaniseva.org" class="vh-bottom-link">Volunteer</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="https://vanipedia.org/wiki/Vanipedia_Community" class="vh-bottom-link">Community</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="https://vanipedia.org/contact.php" target="_blank" rel="noopener noreferrer" class="vh-bottom-link">Contact</a>' + | |||
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' + | |||
'<a href="https://vanipedia.org/wiki/Special:IframePage" class="vh-bottom-link vh-bottom-donate">Donate</a>' + | |||
'</div>' + | |||
'<div class="vh-bottom-bar-right-space" style="flex:1 1 0 !important; min-width:0 !important; display:flex !important; align-items:center !important; justify-content:center !important;">' + | |||
'<div class="vh-bottom-social-links" style="position:static !important; transform:none !important; display:inline-flex !important; align-items:center !important; gap:24px !important;">' + | |||
'<a href="https://www.youtube.com/@VanimediaPrabhupada" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="YouTube" style="display:inline-flex !important;align-items:center !important;">' + | |||
'<img src="https://vanipedia.org/wiki/Special:FilePath/YouTube_Logo_B.png" alt="YouTube" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' + | |||
'</a>' + | |||
'<a href="https://www.facebook.com/vanipedia.org" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Facebook Page" style="display:inline-flex !important;align-items:center !important;">' + | |||
'<img src="https://vanipedia.org/wiki/Special:FilePath/Facebook_Group_Logo.png" alt="Facebook" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' + | |||
'</a>' + | |||
'<a href="https://www.facebook.com/groups/VanipediaGroup" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Facebook Group" style="display:inline-flex !important;align-items:center !important;">' + | |||
'<img src="https://vanipedia.org/wiki/Special:FilePath/Facebook_Logo_2023.png" alt="Facebook Group" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' + | |||
'</a>' + | |||
'<a href="https://www.instagram.com/vanipediaprabhupada/" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Instagram" style="display:inline-flex !important;align-items:center !important;">' + | |||
'<img src="https://vanipedia.org/wiki/Special:FilePath/Instagram_Logo.png" alt="Instagram" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' + | |||
'</a>' + | |||
'</div>' + | |||
'</div>' + | |||
'</div>'; | |||
var stageSlot = document.getElementById('vani-stage-footer-slot'); | |||
if (stageSlot) { | |||
stageSlot.appendChild(bar); | |||
} else { | |||
document.body.appendChild(bar); | |||
} | |||
} | |||
// Remove bar if 3D entry page activates asynchronously | |||
if (window.MutationObserver && document.body) { | |||
var observer = new MutationObserver(function() { | |||
if (isEntryPage()) { | |||
var existing = document.getElementById('vh-bottom-bar'); | |||
if (existing) existing.remove(); | |||
} | |||
}); | |||
observer.observe(document.body, { attributes: true, attributeFilter: ['class'], childList: true }); | |||
} | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', setupBottomBar); | |||
} else { | |||
setupBottomBar(); | |||
} | |||
})(); | |||
(function() { | |||
function initMobileMenuToggle() { | |||
var dropdown = document.getElementById('vector-main-menu-dropdown'); | |||
if (!dropdown || dropdown.dataset.vaniMobileInit) return; | |||
dropdown.dataset.vaniMobileInit = 'true'; | |||
var label = dropdown.querySelector('.vector-dropdown-label'); | |||
var checkbox = document.getElementById('vector-main-menu-dropdown-checkbox'); | |||
var content = dropdown.querySelector('.vector-dropdown-content'); | |||
if (label && checkbox) { | |||
label.addEventListener('click', function(e) { | |||
setTimeout(function() { | |||
if (content) { | |||
if (checkbox.checked) { | |||
content.classList.add('is-open'); | |||
} else { | |||
content.classList.remove('is-open'); | |||
} | |||
} | |||
}, 50); | |||
}); | |||
} | |||
} | |||
$(document).ready(initMobileMenuToggle); | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(initMobileMenuToggle); | |||
} | |||
})(); | |||
/* ========================================================================== | |||
VANIPEDIA MOBILE JAVASCRIPT (MediaWiki:Mobile.js) | |||
1. User Menu Dropdown: Intercepts #ca-mytalks on mobile to show the regular | |||
user dropdown menu (Talk, Preferences, Contributions, Log out) matching desktop. | |||
2. Self-contained styles injected into <head>. | |||
3. Screen Orientation lock to landscape on Main Page. | |||
========================================================================== */ | |||
(function() { | |||
// 1. Inject self-contained dropdown styles immediately into <head> | |||
var styleId = 'vani-mobile-dropdown-styles'; | |||
if (!document.getElementById(styleId)) { | |||
var style = document.createElement('style'); | |||
style.id = styleId; | |||
style.textContent = [ | |||
'#vanipedia-mobile-user-menu {', | |||
' display: none !important;', | |||
' position: fixed !important;', | |||
' top: 52px !important;', | |||
' right: 8px !important;', | |||
' width: 175px !important;', | |||
' background-color: #1f3e45 !important;', | |||
' border: 1.5px solid #b1873d !important;', | |||
' border-radius: 6px !important;', | |||
' box-shadow: 0 8px 24px rgba(0,0,0,0.5) !important;', | |||
' padding: 6px 0 !important;', | |||
' z-index: 999999 !important;', | |||
' box-sizing: border-box !important;', | |||
' flex-direction: column !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu.is-open {', | |||
' display: flex !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu a.vani-user-menu-item {', | |||
' color: #f5d77f !important;', | |||
' font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif !important;', | |||
' font-size: 15px !important;', | |||
' font-weight: 500 !important;', | |||
' padding: 10px 18px !important;', | |||
' text-decoration: none !important;', | |||
' display: block !important;', | |||
' line-height: 1.2 !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu a.vani-user-menu-item:hover,', | |||
'#vanipedia-mobile-user-menu a.vani-user-menu-item:active {', | |||
' background-color: #526B50 !important;', | |||
' color: #ffffff !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu .vani-user-menu-divider {', | |||
' height: 1px !important;', | |||
' background-color: rgba(177, 135, 61, 0.35) !important;', | |||
' margin: 5px 0 !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu a.vani-user-menu-logout {', | |||
' color: #fca5a5 !important;', | |||
'}', | |||
'#vanipedia-mobile-user-menu a.vani-user-menu-logout:hover {', | |||
' background-color: rgba(239, 68, 68, 0.2) !important;', | |||
' color: #ffffff !important;', | |||
'}' | |||
].join('\n'); | |||
document.head.appendChild(style); | |||
} | |||
// 2. Setup user dropdown click interceptor | |||
function initUserMenuDropdown() { | |||
var $userBtn = $('#ca-mytalks'); | |||
if (!mw.config.get('wgUserName')) return; | |||
if (!$userBtn.length || $userBtn.data('vaniMenuInit')) return; | |||
$userBtn.data('vaniMenuInit', true); | |||
// Prevent opening talk page directly | |||
$userBtn.attr('href', 'javascript:void(0)'); | |||
// Build the dropdown container attached to body | |||
var $dropdown = $('#vanipedia-mobile-user-menu'); | |||
if (!$dropdown.length) { | |||
$dropdown = $('<div>', { | |||
id: 'vanipedia-mobile-user-menu', | |||
class: 'vanipedia-mobile-user-dropdown' | |||
}); | |||
var user = (window.mw && mw.config && mw.config.get('wgUserName')) || ''; | |||
var talkUrl = '/wiki/User_talk:' + encodeURIComponent(user); | |||
var prefUrl = '/wiki/Special:Preferences'; | |||
var contUrl = '/wiki/Special:Contributions/' + encodeURIComponent(user); | |||
var page = (window.mw && mw.config && mw.config.get('wgPageName')) || 'Main_Page'; | |||
var logoutUrl = '/w/index.php?title=Special:UserLogout&returnto=' + encodeURIComponent(page) + ''; | |||
$dropdown.html( | |||
'<a href="' + talkUrl + '" class="vani-user-menu-item">Talk</a>' + | |||
'<a href="' + prefUrl + '" class="vani-user-menu-item">Preferences</a>' + | |||
'<a href="' + contUrl + '" class="vani-user-menu-item">Contributions</a>' + | |||
'<div class="vani-user-menu-divider"></div>' + | |||
'<a href="' + logoutUrl + '" class="vani-user-menu-item vani-user-menu-logout">Log out</a>' | |||
); | |||
$('body').append($dropdown); | |||
} | |||
// Toggle on click | |||
$userBtn.on('click', function(e) { | |||
e.preventDefault(); | |||
e.stopPropagation(); | |||
$dropdown.toggleClass('is-open'); | |||
}); | |||
// Close on clicking outside | |||
$(document).on('click touchstart', function(e) { | |||
if (!$(e.target).closest('#ca-mytalks, #vanipedia-mobile-user-menu').length) { | |||
$dropdown.removeClass('is-open'); | |||
} | |||
}); | |||
} | |||
// ========================================================================= | |||
// 3. Container-Level Auto-Landscape & 2D Fitting (STEP 115) | |||
// Matches the exact architecture of VanipediaEntry3D: | |||
// - Keeps <body> stable without full-page transforms. | |||
// - Wraps #vani-home inside #vani-mobile-stage > #vani-rotated-box. | |||
// - Rotates #vani-rotated-box 90deg in portrait mode. | |||
// - Scales the 1200px desktop layout so all sections (Triad, Timeline, | |||
// 4 Taxonomy Cards, Bottom Bar) fit the phone screen without cropping. | |||
// ========================================================================= | |||
/* ========================================================================= | |||
3. STEP 117: UNIFIED 3-SLOT ROTATED LANDSCAPE STAGE (TOP BAR + MAIN PAGE + BOTTOM BAR) | |||
- Puts Top Bar, #vani-home, and Bottom Bar together in landscape. | |||
- Rotates 90deg as a single unified screen when held in portrait. | |||
- Stays completely horizontal with zero rotation when held in native landscape. | |||
- Leaves regular wiki pages and desktop view completely untouched. | |||
========================================================================= */ | |||
function initMobileMainPageStage() { | |||
if (window._vaniMainPageStageInit) return; | |||
var pageName = (window.mw && mw.config && mw.config.get('wgPageName')) || ''; | |||
var isMainPage = pageName === 'Main_Page' || document.body.classList.contains('page-Main_Page'); | |||
if (!isMainPage) return; | |||
var $vh = $('#vani-home'); | |||
if (!$vh.length) return; | |||
window._vaniMainPageStageInit = true; | |||
var $stage = null; | |||
var $rotatedBox = null; | |||
var $headerSlot = null; | |||
var $contentSlot = null; | |||
var $footerSlot = null; | |||
var $topHeader = null; | |||
var $bottomBar = null; | |||
var $headerParent = null; | |||
var $footerParent = null; | |||
var $vhParent = null; | |||
function ensureStage() { | |||
if (!$('#vani-mobile-stage').length) { | |||
$topHeader = $('.vector-header-container, #mw-head, .mw-header, .header-container, header.header-chrome').filter(':visible').first(); | |||
if (!$topHeader.length) { | |||
$topHeader = $('.vector-header-container, #mw-head, .mw-header, .header-container, header.header-chrome').first(); | |||
} | |||
$bottomBar = $('#vh-bottom-bar'); | |||
if ($topHeader.length) $headerParent = $topHeader.parent(); | |||
if ($bottomBar.length) $footerParent = $bottomBar.parent(); | |||
$vhParent = $vh.parent(); | |||
var stageHtml = [ | |||
'<div id="vani-mobile-stage">', | |||
' <div id="vani-rotated-box">', | |||
' <div id="vani-stage-header-slot"></div>', | |||
' <div id="vani-stage-content-slot"></div>', | |||
' <div id="vani-stage-footer-slot"></div>', | |||
' </div>', | |||
'</div>' | |||
].join(''); | |||
$('body').append(stageHtml); | |||
document.body.classList.add('has-vani-stage'); | |||
$stage = $('#vani-mobile-stage'); | |||
$rotatedBox = $('#vani-rotated-box'); | |||
$headerSlot = $('#vani-stage-header-slot'); | |||
$contentSlot = $('#vani-stage-content-slot'); | |||
$footerSlot = $('#vani-stage-footer-slot'); | |||
if ($topHeader.length) { | |||
$headerSlot.append($topHeader); | |||
var $menu = $('#vanipedia-mobile-user-menu'); | |||
if ($menu.length) $headerSlot.append($menu); | |||
} | |||
$contentSlot.append($vh); | |||
if ($bottomBar.length) { | |||
$footerSlot.append($bottomBar); | |||
} | |||
} else { | |||
$stage = $('#vani-mobile-stage'); | |||
$rotatedBox = $('#vani-rotated-box'); | |||
$headerSlot = $('#vani-stage-header-slot'); | |||
$contentSlot = $('#vani-stage-content-slot'); | |||
$footerSlot = $('#vani-stage-footer-slot'); | |||
if (!$footerSlot.find('#vh-bottom-bar').length) { | |||
var $b = $('#vh-bottom-bar'); | |||
if ($b.length) $footerSlot.append($b); | |||
} | |||
if (!$headerSlot.find('.vector-header-container, #mw-head, .header-container').length) { | |||
var $h = $('.vector-header-container, #mw-head, .mw-header, .header-container').first(); | |||
if ($h.length) $headerSlot.append($h); | |||
} | |||
} | |||
if ($headerSlot && !$headerSlot.find('.vanipedia-stage-title-link').length) { | |||
var $st = $('<a class="vanipedia-stage-title-link" href="/wiki/Main_Page">Vanisource</a>'); | |||
var $targetNav = $headerSlot.find('.vector-header-start, .minerva-header, .header-container'); | |||
if ($targetNav.length) { | |||
$targetNav.first().children().first().after($st); | |||
} else { | |||
$headerSlot.prepend($st); | |||
} | |||
} | |||
} | |||
function updateLayout() { | |||
var screenW = window.innerWidth; | |||
var screenH = window.innerHeight; | |||
var isMobile = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (screenW < 900) || (screenH < 900 && screenH > screenW); | |||
if (!isMobile && screenW >= 1000 && screenW > screenH) { | |||
if ($('#vani-mobile-stage').length) { | |||
if ($topHeader && $topHeader.length && $headerParent) { | |||
$headerParent.prepend($topHeader); | |||
} | |||
if ($vhParent) { | |||
$vhParent.append($vh); | |||
} | |||
if ($bottomBar && $bottomBar.length && $footerParent) { | |||
$footerParent.append($bottomBar); | |||
} | |||
var $m = $('#vanipedia-mobile-user-menu'); | |||
if ($m.length) $('body').append($m); | |||
$('#vani-mobile-stage').remove(); | |||
document.body.classList.remove('has-vani-stage'); | |||
$vh.css({ 'transform': '', 'transform-origin': '', 'width': '' }); | |||
} | |||
return; | |||
} | |||
ensureStage(); | |||
var isMobilePortrait = (screenH > screenW) && (screenW < 850); | |||
var landscapeW = isMobilePortrait ? screenH : screenW; | |||
var landscapeH = isMobilePortrait ? screenW : screenH; | |||
$rotatedBox.css({ | |||
'width': landscapeW + 'px', | |||
'height': landscapeH + 'px' | |||
}); | |||
if (isMobilePortrait) { | |||
$rotatedBox.removeClass('is-native-landscape').addClass('is-auto-landscape'); | |||
} else { | |||
$rotatedBox.removeClass('is-auto-landscape').addClass('is-native-landscape'); | |||
} | |||
var headerH = 50; | |||
var footerH = 36; | |||
var availableContentH = Math.max(120, landscapeH - headerH - footerH); | |||
$contentSlot.css({ | |||
'height': availableContentH + 'px' | |||
}); | |||
var baseW = 1200; | |||
var baseH = 475; | |||
var scaleW = landscapeW / baseW; | |||
var scaleH = availableContentH / baseH; | |||
var scale = Math.min(scaleW, scaleH); | |||
if (scale > 0.85) scale = 0.85; | |||
// Scale down to fit small screens without horizontal cropping. | |||
var scaledWidth = baseW * scale; | |||
var offsetX = Math.max(0, (landscapeW - scaledWidth) / 2); | |||
$vh.css({ | |||
'transform': 'translate(' + offsetX.toFixed(1) + 'px, 0) scale(' + scale.toFixed(4) + ')', | |||
'transform-origin': 'top left', | |||
'width': baseW + 'px' | |||
}); | |||
} | |||
var touchStartY = 0; | |||
var touchStartScroll = 0; | |||
window.addEventListener('touchstart', function(e) { | |||
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && e.touches && e.touches.length === 1) { | |||
touchStartY = e.touches[0].clientX; | |||
if ($contentSlot && $contentSlot[0]) { | |||
touchStartScroll = $contentSlot[0].scrollTop || 0; | |||
} | |||
} | |||
}, { passive: true }); | |||
window.addEventListener('touchmove', function(e) { | |||
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && e.touches && e.touches.length === 1) { | |||
var delta = e.touches[0].clientX - touchStartY; | |||
if ($contentSlot && $contentSlot[0]) { | |||
$contentSlot[0].scrollTop = touchStartScroll + delta; | |||
} | |||
} | |||
}, { passive: true }); | |||
window.addEventListener('wheel', function(e) { | |||
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && $contentSlot && $contentSlot[0]) { | |||
$contentSlot[0].scrollTop += e.deltaY; | |||
} | |||
}, { passive: true }); | |||
window.addEventListener('resize', updateLayout); | |||
window.addEventListener('orientationchange', function() { | |||
setTimeout(updateLayout, 150); | |||
}); | |||
updateLayout(); | |||
} | |||
$(document).ready(function() { | |||
initUserMenuDropdown(); | |||
initMobileMainPageStage(); | |||
}); | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(function() { | |||
initUserMenuDropdown(); | |||
initMobileMainPageStage(); | |||
}); | |||
} | |||
})(); | |||
/* ========================================================================== | |||
STEP 119: EXACT DESKTOP SIDEBAR INJECTION INTO MOBILE BURGER DRAWER | |||
1. Empties all irrelevant Minerva items (Nearby, Random, Settings, About). | |||
2. Clones or fetches the exact desktop Vector 2022 sidebar (#vector-main-menu). | |||
3. Tags each section with .vanipedia-sidebar-menu for the true desktop accordion. | |||
4. Connects the 102 Languages live search box. | |||
========================================================================== */ | |||
(function initExactMobileSidebar() { | |||
function cleanAndInject($drawer, sidebarHtml) { | |||
if ($drawer.data('vaniSidebarCleaned')) return; | |||
$drawer.data('vaniSidebarCleaned', true); | |||
// 1. Remove all default Minerva items (Nearby, Random, Personal, Hlist) | |||
$drawer.find('#p-navigation, #p-personal, ul.hlist, .menu__item--nearby, .menu__item--random').remove(); | |||
// 2. Parse and filter desktop sidebar HTML | |||
var $parsed = $('<div>').append($.parseHTML(sidebarHtml)); | |||
var $menus = $parsed.find('.vector-menu'); | |||
if (!$menus.length) { | |||
$menus = $parsed.find('.portal, [id^="p-"]'); | |||
} | |||
var $container = $('<div>', { id: 'vani-mobile-synced-sidebar' }); | |||
$menus.each(function(idx) { | |||
var $menu = $(this).clone(); | |||
var menuId = $menu.attr('id') || ''; | |||
// Ignore personal or search menus if caught | |||
if (menuId === 'p-personal' || menuId === 'p-search' || menuId === 'p-logo') return; | |||
// Apply standard desktop class | |||
$menu.addClass('vanipedia-sidebar-menu'); | |||
// Collapse by default, except the first section (Navigation) | |||
if (idx === 0) { | |||
$menu.removeClass('vanipedia-collapsed'); | |||
} else { | |||
$menu.addClass('vanipedia-collapsed'); | |||
} | |||
$container.append($menu); | |||
}); | |||
// 3. Mount cleanly inside mobile drawer | |||
$drawer.empty().append($container); | |||
// 4. Initialize 102 Languages live search box in the cloned menu | |||
initLanguageSearchInDrawer($container); | |||
} | |||
function initLanguageSearchInDrawer($container) { | |||
var $sidebarMenu = $container.find('#p-102_Languages ul, [id*="102_Languages"] ul').first(); | |||
if ($sidebarMenu.length === 0) { | |||
$container.find('.vector-menu-heading, .portal h3').each(function() { | |||
if ($(this).text().trim().indexOf('102 Languages') !== -1) { | |||
$sidebarMenu = $(this).closest('.vector-menu, .portal').find('ul').first(); | |||
} | |||
}); | |||
} | |||
if (!$sidebarMenu || $sidebarMenu.length === 0 || $sidebarMenu.find('#sidebarLanguageSearch').length) return; | |||
var $searchLi = $('<li id="n-language-search" style="margin: 8px 10px; list-style: none;"></li>'); | |||
var $searchBox = $('<input type="text" id="sidebarLanguageSearch" placeholder="Search 102 Languages..." autocomplete="off" />'); | |||
var $resultsContainer = $('<ul id="sidebarLanguageResults" style="list-style: none; padding: 0; margin: 4px 0 0 0; max-height: 200px; overflow-y: auto; border: 1px solid #2c4c50; background: #ffffff; display: none;"></ul>'); | |||
$searchLi.append($searchBox).append($resultsContainer); | |||
$sidebarMenu.prepend($searchLi); | |||
var api = new mw.Api(); | |||
var languageList = []; | |||
api.get({ | |||
action: 'query', | |||
list: 'categorymembers', | |||
cmtitle: 'Category:Languages_with_Total_Pages', | |||
cmlimit: 'max', | |||
format: 'json' | |||
}).done(function(data) { | |||
if (data.query && data.query.categorymembers) { | |||
languageList = data.query.categorymembers.map(function(member) { | |||
return { | |||
title: member.title, | |||
url: mw.util.getUrl(member.title) | |||
}; | |||
}); | |||
} | |||
}); | |||
$searchBox.on('keyup', function(e) { | |||
e.stopPropagation(); | |||
var term = $(this).val().toLowerCase().trim(); | |||
$resultsContainer.empty(); | |||
if (term.length === 0) { | |||
$resultsContainer.hide(); | |||
return; | |||
} | |||
var matches = languageList.filter(function(item) { | |||
return item.title.toLowerCase().indexOf(term) !== -1; | |||
}); | |||
if (matches.length > 0) { | |||
matches.slice(0, 15).forEach(function(item) { | |||
var $li = $('<li>', { style: 'padding: 6px 12px; border-bottom: 1px solid #eaeff0;' }); | |||
var $a = $('<a>', { | |||
href: item.url, | |||
text: item.title, | |||
style: 'color: #1b3033; text-decoration: none; display: block;' | |||
}); | |||
$li.append($a); | |||
$resultsContainer.append($li); | |||
}); | |||
$resultsContainer.show(); | |||
} else { | |||
$resultsContainer.html('<li style="padding: 6px 12px; color: #888; font-style: italic;">No languages found</li>').show(); | |||
} | |||
}); | |||
$(document).on('click touchstart', function(e) { | |||
if (!$(e.target).closest('#n-language-search').length) { | |||
$resultsContainer.hide(); | |||
} | |||
}); | |||
} | |||
function setupMobileDrawer() { | |||
var $drawer = $('#mw-mf-page-left'); | |||
if (!$drawer.length) return; | |||
// Check if desktop sidebar is already in DOM | |||
var $desktopSidebar = $('#vector-main-menu, .vector-sidebar-container #mw-panel'); | |||
if ($desktopSidebar.length && $desktopSidebar.find('.vector-menu').length) { | |||
cleanAndInject($drawer, $desktopSidebar.html()); | |||
return; | |||
} | |||
// Check sessionStorage cache | |||
var cached = null; | |||
try { cached = sessionStorage.getItem('vani_desktop_sidebar_html'); } catch(e) {} | |||
if (cached) { | |||
cleanAndInject($drawer, cached); | |||
return; | |||
} | |||
// Fetch desktop Vector 2022 page to get exact sidebar markup | |||
var fetchUrl = (window.mw && mw.util && mw.util.getUrl('Main_Page', { useskin: 'vector-2022' })) || | |||
'/wiki/Main_Page?useskin=vector-2022'; | |||
$.ajax({ | |||
url: fetchUrl, | |||
type: 'GET', | |||
dataType: 'html', | |||
success: function(response) { | |||
try { | |||
var $parsed = $('<div>').append($.parseHTML(response)); | |||
var $sidebar = $parsed.find('#vector-main-menu'); | |||
if (!$sidebar.length) { | |||
$sidebar = $parsed.find('#mw-panel, .vector-sidebar-container'); | |||
} | |||
if ($sidebar.length) { | |||
var html = $sidebar.html(); | |||
try { sessionStorage.setItem('vani_desktop_sidebar_html', html); } catch(e) {} | |||
cleanAndInject($drawer, html); | |||
} | |||
} catch(e) { | |||
console.warn('[VANIPEDIA] Error extracting desktop sidebar:', e); | |||
} | |||
} | |||
}); | |||
} | |||
$(document).ready(setupMobileDrawer); | |||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.content').add(setupMobileDrawer); | |||
} | |||
})(); | |||
/* Vanisource portrait rotation; preload before swapping; respect reduced motion. */ | |||
(function () { | |||
function init() { | |||
var home=document.getElementById('vani-home'); | |||
if (!home || home.dataset.vsPortraitReady) return; | |||
home.dataset.vsPortraitReady='1'; | |||
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; | |||
var a=home.querySelector('.vh-photo-a'), b=home.querySelector('.vh-photo-b'), current=1, active=a; | |||
if(!a || !b)return; | |||
window.setInterval(function(){ | |||
if(document.hidden)return; | |||
var next=current%12+1, src='https://vanipedia.org/wiki/Special:Redirect/file/Srila-Prabhupada-Hero-'+String(next).padStart(2,'0')+'.jpg'; | |||
var preload=new Image(); | |||
preload.onload=function(){var incoming=active===a?b:a;incoming.style.backgroundImage='url("'+src+'")';incoming.style.opacity='1';active.style.opacity='0';active=incoming;current=next;}; | |||
preload.src=src; | |||
},10000); | |||
} | |||
$(init); mw.hook('wikipage.content').add(init); | |||
})(); | |||
}); | |||
Revision as of 10:37, 11 October 2026
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
/* 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
// --- 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.");
});
}
});
// Kasya
/* Open Timeline links in a new tab ONLY on the Chapters page */
mw.hook('wikipage.content').add(function($content) {
// Check if we are exactly on the timeline page
if (mw.config.get('wgPageName') === "Chapters_in_Srila_Prabhupada's_Life") {
// If yes, apply the new tab rule to the table
$content.find('#mp-tfp a').attr('target', '_blank').attr('rel', 'noopener noreferrer');
}
});
// Wait for MediaWiki core modules and the DOM to load
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
$(document).ready(function () {
// 1. FIND THE "102 Languages" SIDEBAR SECTION
var $sidebarMenu = $('#p-102_Languages ul').first();
// Fallback in case your specific MediaWiki version formats the ID differently
if ($sidebarMenu.length === 0) {
$('.vector-menu-heading, .portal h3').each(function() {
// Looks for the heading text directly
if ($(this).text().trim() === '102 Languages') {
$sidebarMenu = $(this).closest('.vector-menu, .portal').find('ul').first();
}
});
}
// Exit if the 102 Languages menu isn't found on the page
if (!$sidebarMenu || $sidebarMenu.length === 0) return;
// 2. CREATE THE SEARCH BAR AS A MENU ITEM
var $searchLi = $('<li id="n-language-search" style="margin-top: 10px; margin-bottom: 5px; list-style: none;"></li>');
var $searchBox = $('<input type="text" id="sidebarLanguageSearch" placeholder="Search 102 Languages..." style="width: 100%; box-sizing: border-box; padding: 5px; font-size: 0.85em; border: 1px solid #a2a9b1; border-radius: 2px;" autocomplete="off" />');
// Container for the results (hidden by default)
var $resultsContainer = $('<ul id="sidebarLanguageResults" style="list-style: none; padding: 0; margin: 4px 0 0 0; max-height: 200px; overflow-y: auto; border: 1px solid #eaecf0; background: #ffffff; display: none;"></ul>');
// Build the menu item and append it to the sidebar
$searchLi.append($searchBox).append($resultsContainer);
$sidebarMenu.prepend($searchLi);
var api = new mw.Api();
var languageList = [];
// 3. FETCH LANGUAGES FROM THE CATEGORY VIA API IN THE BACKGROUND
api.get({
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Languages_with_Total_Pages',
cmlimit: 'max',
format: 'json'
}).done(function (data) {
if (data.query && data.query.categorymembers) {
languageList = data.query.categorymembers.map(function (member) {
return {
title: member.title,
url: mw.util.getUrl(member.title)
};
});
}
});
// 4. ADD SEARCH FUNCTIONALITY TO THE SIDEBAR BOX
$('#sidebarLanguageSearch').on('keyup', function (e) {
e.stopPropagation();
var searchTerm = $(this).val().toLowerCase();
$resultsContainer.empty();
// Hide the results box if the search is empty
if (searchTerm.length === 0) {
$resultsContainer.hide();
return;
}
// Filter the fetched languages
var filteredLanguages = languageList.filter(function (lang) {
return lang.title.toLowerCase().indexOf(searchTerm) > -1;
});
// Show results container
$resultsContainer.show();
// Append results using Vector's standard dark text color
if (filteredLanguages.length > 0) {
filteredLanguages.forEach(function (lang) {
$resultsContainer.append('<li style="padding: 4px 6px; border-bottom: 1px solid #f8f9fa;"><a href="' + lang.url + '" style="text-decoration: none; color: #0645ad; display: block; font-size: 0.9em;">' + lang.title + '</a></li>');
});
} else {
$resultsContainer.append('<li style="padding: 4px 6px; color: #72777d; font-size: 0.9em;">No languages found</li>');
}
});
// Prevent typing from accidentally triggering global keyboard shortcuts
$('#sidebarLanguageSearch').on('keydown', function(e) {
e.stopPropagation();
});
// Optional: Hide results when clicking outside the sidebar search
$(document).on('click', function(e) {
if (!$(e.target).closest('#n-language-search').length) {
$resultsContainer.hide();
}
});
// Re-show results if they click back into the search box
$('#sidebarLanguageSearch').on('click', function() {
if ($(this).val().length > 0) {
$resultsContainer.show();
}
});
});
});
// 5. SIDEBAR ACCORDION - STRICT LEFT-COLUMN ISOLATION & TRUE ACCORDION
(function() {
// 1. Tag ONLY menus physically located in the left sidebar
function tagSidebarMenus() {
var allMenus = document.querySelectorAll('.vector-menu');
for (var i = 0; i < allMenus.length; i++) {
var menu = allMenus[i];
// STRICT INCLUSION: Only tag menus inside the modern or legacy left sidebar containers
if (menu.closest('#vector-main-menu, #mw-panel, #mw-navigation')) {
menu.classList.add('vanipedia-sidebar-menu');
// Collapse them by default if they have a heading
if (menu.querySelector('.vector-menu-heading') && !menu.classList.contains('vanipedia-collapsed')) {
menu.classList.add('vanipedia-collapsed');
}
}
}
}
// Run tagging immediately, and again on load as a failsafe
tagSidebarMenus();
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', tagSidebarMenus);
}
// 2. Inject CSS targeted STRICTLY at our newly tagged custom class
var style = document.createElement('style');
style.textContent =
/* Widen only our tagged sidebar menus */
'.vanipedia-sidebar-menu { width: 185px !important; } ' +
/* Core functional hiding rule */
'.vanipedia-sidebar-menu.vanipedia-collapsed .vector-menu-content { display: none !important; } ' +
/* Bold, Dark Header */
'.vanipedia-sidebar-menu .vector-menu-heading { ' +
' cursor: pointer !important; ' +
' background-color: #2c4c50 !important; ' +
' border: 1px solid #1b3033 !important; ' +
' border-radius: 4px !important; ' +
' margin-bottom: 4px !important; ' +
' padding: 10px 12px !important; ' +
' font-weight: 600 !important; ' +
' color: #ffffff !important; ' +
' display: flex !important; ' +
' justify-content: space-between !important; ' +
' align-items: center !important; ' +
' gap: 10px !important; ' +
' transition: all 0.2s ease; ' +
'} ' +
/* Fix header corners when expanded */
'.vanipedia-sidebar-menu:not(.vanipedia-collapsed) .vector-menu-heading { ' +
' border-radius: 4px 4px 0 0 !important; ' +
' margin-bottom: 0 !important; ' +
'} ' +
/* Hover effect */
'.vanipedia-sidebar-menu .vector-menu-heading:hover { background-color: #385e63 !important; } ' +
/* The dropdown caret */
'.vanipedia-sidebar-menu .vector-menu-heading::after { ' +
' content: "▼"; ' +
' font-size: 0.75em; ' +
' color: #ffffff !important; ' +
' transition: transform 0.2s ease; ' +
'} ' +
/* Rotate the arrow when collapsed */
'.vanipedia-sidebar-menu.vanipedia-collapsed .vector-menu-heading::after { ' +
' transform: rotate(-90deg); ' +
'} ' +
/* The Expanded Content Area */
'.vanipedia-sidebar-menu .vector-menu-content { ' +
' background-color: #eaeff0 !important; ' +
' border: 1px solid #2c4c50 !important; ' +
' border-top: none !important; ' +
' border-radius: 0 0 4px 4px !important; ' +
' padding: 0 0 4px 0 !important; ' +
' margin-bottom: 6px !important; ' +
' box-shadow: 0 3px 6px rgba(0,0,0,0.15) !important; ' +
'} ' +
/* Reset the list styles */
'.vanipedia-sidebar-menu .vector-menu-content ul { ' +
' list-style: none !important; ' +
' margin: 0 !important; ' +
' padding: 0 !important; ' +
'} ' +
/* Menu links */
'.vanipedia-sidebar-menu .vector-menu-content li a { ' +
' display: block !important; ' +
' padding: 8px 12px 8px 16px !important; ' +
' color: #1b3033 !important; ' +
' text-decoration: none !important; ' +
' border-left: 3px solid transparent !important; ' +
' border-bottom: 1px solid rgba(44, 76, 80, 0.1) !important; ' +
' transition: all 0.15s ease !important; ' +
'} ' +
/* Remove separator from last item */
'.vanipedia-sidebar-menu .vector-menu-content li:last-child a { ' +
' border-bottom: none !important; ' +
'} ' +
/* Hover effect for individual menu items */
'.vanipedia-sidebar-menu .vector-menu-content li a:hover { ' +
' background-color: #dbe4e6 !important; ' +
' border-left: 3px solid #2c4c50 !important; ' +
' color: #000000 !important; ' +
'} ';
document.head.appendChild(style);
// 3. Helper function to collapse all of our securely tagged menus
function collapseAllSidebarMenus() {
var menus = document.querySelectorAll('.vanipedia-sidebar-menu');
for (var i = 0; i < menus.length; i++) {
menus[i].classList.add('vanipedia-collapsed');
}
}
// 4. Intercept clicks for True Accordion Behavior
document.addEventListener('click', function(e) {
var heading = e.target.closest('.vector-menu-heading');
if (!heading) return;
// ONLY react if this click belongs to one of our tagged sidebar menus
var navContainer = heading.closest('.vanipedia-sidebar-menu');
if (navContainer) {
var isAlreadyOpen = !navContainer.classList.contains('vanipedia-collapsed');
// Forcefully collapse ALL left sidebar menus first
collapseAllSidebarMenus();
// Open the clicked one if it wasn't already open
if (!isAlreadyOpen) {
navContainer.classList.remove('vanipedia-collapsed');
}
e.stopPropagation();
e.preventDefault();
}
}, true);
})();
mw.loader.using('mediawiki.user').then(function() {
// Fetch the user's assigned groups
var userGroups = mw.config.get('wgUserGroups') || [];
// Define the roles that SHOULD see the administrative tabs
var isAuthorized = userGroups.includes('sysop') ||
userGroups.includes('interface-admin') ||
userGroups.includes('Editor');
// If the user is not in one of those groups, restrict the UI
if (!isAuthorized) {
document.body.classList.add('restricted-ui');
}
});
// Function to open accordion from TOC and jump there //
mw.hook('wikipage.content').add(function() {
function handleAccordionTOC(hash) {
if (!hash || hash === '#') return false;
try {
var targetId = hash.substring(1);
var targetElement = document.getElementById(targetId) || document.getElementById(decodeURIComponent(targetId));
if (!targetElement) return false;
var $target = $(targetElement);
// Match either h2 or h3
var $heading = $target.is('h2, h3') ? $target : $target.closest('h2, h3');
if (!$heading.length) return false;
var $accordion = $heading.next('.book-accordion');
// If the heading itself is not followed directly by an accordion,
// check if the heading is located INSIDE a parent accordion (e.g., nested h3)
var $parentAccordions = $heading.parents('.book-accordion');
// If there's no direct accordion next to it and it's not inside any accordion,
// let the browser handle standard jump.
if (!$accordion.length && !$parentAccordions.length) return false;
// 1. Open all ancestor accordions (if target heading is nested inside one)
$parentAccordions.each(function() {
var $parentCollapsible = $(this).children('.mw-collapsible');
if ($parentCollapsible.length && $parentCollapsible.hasClass('mw-collapsed')) {
var pId = $parentCollapsible.attr('id');
if (pId) {
var pToggleClass = pId.replace('mw-customcollapsible-', 'mw-customtoggle-');
$('.' + pToggleClass).first().click();
}
}
});
// 2. Open the accordion immediately following this heading (if present)
if ($accordion.length) {
var $collapsible = $accordion.children('.mw-collapsible, .mw-collapsible-content').first();
if (!$collapsible.length) {
$collapsible = $accordion.find('.mw-collapsible');
}
if ($collapsible.length && $collapsible.hasClass('mw-collapsed')) {
var collapsibleId = $collapsible.attr('id');
if (collapsibleId) {
var toggleClass = collapsibleId.replace('mw-customcollapsible-', 'mw-customtoggle-');
$('.' + toggleClass).first().click();
}
}
}
// Target element to scroll to (the accordion, or the heading itself if accordion is missing)
var $scrollTarget = $accordion.length ? $accordion : $heading;
// 3. Scroll to the visible section
setTimeout(function() {
$('html, body').animate({
scrollTop: $scrollTarget.offset().top - 75
}, 300);
}, 100);
// Return true to indicate we successfully handled the TOC accordion click
return true;
} catch (e) {
console.error("TOC Accordion script error:", e);
return false;
}
}
$(document).off('click.tocAccordion').on('click.tocAccordion', 'a[href^="#"]', function(e) {
if ($(this).closest('#toc, .toc, .vector-toc').length > 0) {
var href = $(this).attr('href');
// Run our function to see if this is an accordion/heading link
var isAccordion = handleAccordionTOC(href);
// ONLY stop the default browser jump if we handled it
if (isAccordion) {
e.preventDefault();
// Update the URL manually so the user can still share the link
if (history.pushState) {
history.pushState(null, null, href);
} else {
window.location.hash = href;
}
}
}
});
if (window.location.hash) {
setTimeout(function() {
handleAccordionTOC(window.location.hash);
}, 500);
}
});
/* Sticky burger menu - Pure Floating Dropdown (Forces Unpinned & Full Title) */
(function () {
let isMenuOpen = false;
// 1. Force the sidebar out of pinned mode and return menu into the dropdown container
function forceUnpinSidebar() {
document.documentElement.classList.remove('vector-feature-main-menu-pinned-enabled', 'vector-feature-main-menu-pinned-clientpref-1');
document.documentElement.classList.add('vector-feature-main-menu-pinned-disabled', 'vector-feature-main-menu-pinned-clientpref-0');
if (document.body) {
document.body.classList.remove('vector-feature-main-menu-pinned-enabled', 'vector-feature-main-menu-pinned-clientpref-1');
document.body.classList.add('vector-feature-main-menu-pinned-disabled', 'vector-feature-main-menu-pinned-clientpref-0');
}
// Clear stored pin preference
document.cookie = "vector-feature-main-menu-pinned=0; path=/; max-age=31536000";
try { localStorage.setItem('vector-feature-main-menu-pinned', '0'); } catch(e) {}
// If #vector-main-menu was moved into the pinned container, move it back into dropdown
const mainMenu = document.getElementById('vector-main-menu');
const unpinnedContainer = document.getElementById('vector-main-menu-unpinned-container') ||
document.querySelector('#vector-main-menu-dropdown .vector-dropdown-content');
const pinnedContainer = document.getElementById('vector-main-menu-pinned-container');
if (mainMenu && unpinnedContainer && pinnedContainer && pinnedContainer.contains(mainMenu)) {
unpinnedContainer.appendChild(mainMenu);
}
}
function getDropdownElement() {
return document.querySelector('#vector-main-menu-dropdown .vector-dropdown-content') ||
document.getElementById('vector-main-menu-dropdown-content') ||
document.getElementById('vector-main-menu-unpinned-container') ||
document.getElementById('vector-main-menu');
}
function openMenu(menuBtn) {
forceUnpinSidebar();
const checkbox = document.getElementById('vector-main-menu-dropdown-checkbox');
const dropdown = getDropdownElement();
if (!dropdown) return;
if (checkbox) {
checkbox.checked = true;
checkbox.dispatchEvent(new Event('change', { bubbles: true }));
}
const rect = menuBtn.getBoundingClientRect();
dropdown.style.setProperty('position', 'fixed', 'important');
dropdown.style.setProperty('top', rect.bottom + 'px', 'important');
dropdown.style.setProperty('left', rect.left + 'px', 'important');
dropdown.style.setProperty('z-index', '99999', 'important');
dropdown.style.setProperty('max-height', (window.innerHeight - rect.bottom - 16) + 'px', 'important');
dropdown.style.setProperty('overflow-y', 'auto', 'important');
dropdown.style.setProperty('display', 'block', 'important');
dropdown.style.setProperty('visibility', 'visible', 'important');
dropdown.style.setProperty('opacity', '1', 'important');
dropdown.style.setProperty('background-color', 'var(--background-color-base, #ffffff)', 'important');
dropdown.style.setProperty('box-shadow', '0 4px 16px rgba(0, 0, 0, 0.2)', 'important');
dropdown.style.setProperty('border-radius', '4px', 'important');
isMenuOpen = true;
}
function closeMenu() {
const checkbox = document.getElementById('vector-main-menu-dropdown-checkbox');
const dropdown = getDropdownElement();
if (!dropdown) return;
if (checkbox) {
checkbox.checked = false;
checkbox.dispatchEvent(new Event('change', { bubbles: true }));
}
dropdown.style.removeProperty('position');
dropdown.style.removeProperty('top');
dropdown.style.removeProperty('left');
dropdown.style.removeProperty('z-index');
dropdown.style.removeProperty('max-height');
dropdown.style.removeProperty('overflow-y');
dropdown.style.removeProperty('background-color');
dropdown.style.removeProperty('box-shadow');
dropdown.style.removeProperty('border-radius');
dropdown.style.setProperty('display', 'none', 'important');
dropdown.style.setProperty('visibility', 'hidden', 'important');
dropdown.style.setProperty('opacity', '0', 'important');
isMenuOpen = false;
}
function initStickyBurger() {
forceUnpinSidebar();
const stickyHeader = document.getElementById('vector-sticky-header');
if (!stickyHeader) return false;
if (document.getElementById('vanipedia-sticky-main-menu')) return true;
// 1. Create burger button
const menuBtn = document.createElement('div');
menuBtn.id = 'vanipedia-sticky-main-menu';
menuBtn.title = 'Main menu';
menuBtn.style.cursor = 'pointer';
menuBtn.className = 'vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--icon-only';
// 2. Add hamburger icon
const iconSpan = document.createElement('span');
iconSpan.className = 'vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu';
menuBtn.appendChild(iconSpan);
// 3. Toggle click handler (1st click opens, 2nd click rolls back)
menuBtn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
if (isMenuOpen) {
closeMenu();
} else {
openMenu(menuBtn);
}
});
// 4. Inject into start container
let startContainer = stickyHeader.querySelector('.vector-sticky-header-start');
if (!startContainer) {
startContainer = document.createElement('div');
startContainer.className = 'vector-sticky-header-start';
stickyHeader.insertBefore(startContainer, stickyHeader.firstChild);
}
startContainer.insertBefore(menuBtn, startContainer.firstChild);
return true;
}
// 5. Close when clicking anywhere outside
document.addEventListener('click', function (e) {
if (!isMenuOpen) return;
const menuBtn = document.getElementById('vanipedia-sticky-main-menu');
const dropdown = getDropdownElement();
if (dropdown && menuBtn && !menuBtn.contains(e.target) && !dropdown.contains(e.target)) {
closeMenu();
}
});
// 6. Bootstrap initializer
if (!initStickyBurger()) {
const checkTimer = setInterval(function () {
if (initStickyBurger()) {
clearInterval(checkTimer);
}
}, 100);
setTimeout(function () { clearInterval(checkTimer); }, 4000);
}
mw.hook('wikipage.content').add(initStickyBurger);
$(initStickyBurger);
})();
/* Floating "Back to Top" Button Controller */
(function () {
function initBackToTop() {
if (document.getElementById('vanipedia-back-to-top')) return;
// 1. Create button element with an up-arrow SVG icon
const btn = document.createElement('button');
btn.id = 'vanipedia-back-to-top';
btn.title = 'Back to top';
btn.setAttribute('aria-label', 'Back to top');
btn.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<polyline points="18 15 12 9 6 15"></polyline>
</svg>
`;
// 2. Smooth scroll to top on click
btn.addEventListener('click', function (e) {
e.preventDefault();
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// 3. Show button only after scrolling down 300px
function toggleVisibility() {
if (window.scrollY > 300) {
btn.classList.add('visible');
} else {
btn.classList.remove('visible');
}
}
window.addEventListener('scroll', toggleVisibility, { passive: true });
toggleVisibility();
document.body.appendChild(btn);
}
$(initBackToTop);
mw.hook('wikipage.content').add(initBackToTop);
})();
/* VANISOURCE V2 — Vanipedia V173 shared shell */
(function() {
var titleText = "VANISOURCE - Books Letters Lectures Conversations";
var targetUrl = "/wiki/Main_Page";
function removeGlobalSiteNotice() {
$('#siteNotice, #localNotice, .vector-sitenotice-container, #mainbanner, .sitenotice, .mw-sitenotice, .anonnotice, .dismissable-notice, #centralNotice').remove();
}
function createHomeLink() {
var homeSvg = '<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>';
return $('<a>', {
id: 'vanipedia-topbar-home-link',
href: 'https://dev.vanipedia.org/',
title: 'Vanipedia Entry Portal',
'aria-label': 'Home',
class: 'vanipedia-topbar-home'
}).html('<span class="vanipedia-home-icon">' + homeSvg + '</span><span class="vanipedia-home-text">Home</span>');
}
function createCenterBlock() {
var blockStyle = 'position:absolute !important; left:50% !important; top:54% !important; transform:translate(-50%, -50%) !important; display:flex !important; flex-direction:column !important; align-items:center !important; justify-content:center !important; text-align:center !important; white-space:nowrap !important; z-index:10 !important; pointer-events:auto !important;';
var titleStyle = 'position:static !important; transform:none !important; display:block !important; font-family:"Cinzel", Georgia, serif !important; font-size:18px !important; font-weight:700 !important; letter-spacing:2px !important; color:#f5d77f !important; text-decoration:none !important; text-shadow:0 2px 4px rgba(0,0,0,0.9), 0 0 10px rgba(245,215,127,0.3) !important; line-height:1.25 !important; margin:0 0 4px 0 !important; padding:0 !important; user-select:text !important;';
var vanisevaWrapStyle = 'position:static !important; transform:none !important; display:block !important; margin:0 0 4px 0 !important; line-height:1.2 !important;';
var vanisevaLinkStyle = 'color:#fff2c4 !important; font-family:"Noto Serif", Georgia, serif !important; font-size:12.5px !important; font-style:normal !important; font-weight:500 !important; letter-spacing:0.35px !important; text-decoration:none !important; border:1px solid rgba(223,173,62,0.35) !important; background:rgba(245,215,127,0.08) !important; outline:none !important; padding:2px 14px !important; border-radius:12px !important; cursor:pointer !important; display:inline-block !important; transition:all 0.18s ease !important;';
var sisterWrapStyle = 'position:static !important; transform:none !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:14px !important; margin:0 !important; line-height:1.2 !important;';
var sisterLinkStyle = 'color:#f5d77f !important; font-family:"Noto Serif", Georgia, serif !important; font-size:13px !important; font-weight:600 !important; letter-spacing:0.4px !important; text-decoration:none !important; border:none !important; border-bottom:none !important; outline:none !important; padding:2px 8px !important; border-radius:3px !important; display:inline-flex !important; align-items:center !important; cursor:pointer !important; transition:all 0.18s ease !important;';
var sepStyle = 'color:rgba(245,215,127,0.4) !important; font-size:11px !important; line-height:1 !important; user-select:none !important;';
var $block = $('<div>', {
id: 'vanipedia-topbar-center-block',
class: 'vanipedia-topbar-center-block',
style: blockStyle
});
var $title = $('<div>', {
id: 'vanipedia-topbar-title',
class: 'vanipedia-topbar-main-title',
style: titleStyle,
text: titleText
});
var $vaniseva = $('<div>', {
class: 'vanipedia-topbar-vaniseva-title',
style: vanisevaWrapStyle
}).html('<a href="https://vaniseva.org" target="_blank" rel="noopener noreferrer" title="Vaniseva" style="' + vanisevaLinkStyle + '">Collaborate with us to invoke and fully manifest Śrīla Prabhupāda's Vani-presence</a>');
var $sisterLinks = $('<div>', {
class: 'vanipedia-topbar-sister-links',
style: sisterWrapStyle
}).html(
'<a href="https://vanipedia.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vanipedia" style="' + sisterLinkStyle + '">vanipedia.org</a>' +
'<span class="vanipedia-topbar-sister-sep" aria-hidden="true" style="' + sepStyle + '">•</span>' +
'<a href="https://vaniquotes.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vaniquotes" style="' + sisterLinkStyle + '">vaniquotes.org</a>' +
'<span class="vanipedia-topbar-sister-sep" aria-hidden="true" style="' + sepStyle + '">•</span>' +
'<a href="https://vanimedia.org" target="_blank" rel="noopener noreferrer" class="vanipedia-topbar-sister-link" title="Vanimedia" style="' + sisterLinkStyle + '">vanimedia.org</a>'
);
$block.append($title, $vaniseva, $sisterLinks);
return $block;
}
function updateTopBar() {
removeGlobalSiteNotice();
$('#vanipedia-topbar-center-block, #vanipedia-topbar-center-block-mobile, #vanipedia-topbar-title, #vanipedia-topbar-title-mobile, #vanipedia-topbar-title-link, #vanipedia-topbar-center-title, #vanipedia-topbar-home-link, #vanipedia-topbar-sister-links, #vanipedia-topbar-sister-links-mobile, .vanipedia-topbar-sister-links, .vanipedia-topbar-center-block').remove();
$('.vector-header-container').css({
'background': 'transparent',
'background-color': 'transparent',
'border': 'none',
'box-shadow': 'none',
'padding': '0',
'margin': '0',
'min-height': '0',
'height': 'auto',
'width': '100%',
'max-width': '100%'
});
var isMobile = (window.innerWidth <= 999) || $('body').hasClass('skin-minerva') || $('body').hasClass('skin-vector-mobile') || $('.minerva-header').length > 0;
var $header = $('header.mw-header, header.vector-header').not('.minerva-header').first();
if (!$header.length && !$('body').hasClass('skin-minerva') && !$('.minerva-header').length) {
$header = $('#mw-head, header').not('.minerva-header').filter(':visible').first();
}
if ($header.length) {
$header.css({
'min-height': isMobile ? '52px' : '86px',
'height': isMobile ? '52px' : 'auto',
'max-height': isMobile ? '52px' : 'none',
'padding': isMobile ? '0 10px' : '10px 24px',
'background-color': '#526B50',
'border-bottom': '2px solid #b1873d',
'box-shadow': '0 4px 18px rgba(0,0,0,0.35)',
'position': 'relative',
'display': 'flex',
'flex-wrap': 'nowrap',
'align-items': 'center',
'justify-content': 'space-between',
'box-sizing': 'border-box',
'width': '100%',
'max-width': '100%'
});
if (!isMobile) {
$header.append(createCenterBlock());
}
var $search = $header.find('.vector-header-start #p-search, #p-search');
if ($search.length) {
$search.after(createHomeLink());
} else if ($header.find('.vector-header-start').length) {
$header.find('.vector-header-start').append(createHomeLink());
}
}
var $minervaHeader = $('.minerva-header');
if ($minervaHeader.length) {
// 1. Ensure "Vanipedia" Title Link exists with text in the branding box
var $branding = $minervaHeader.find('.branding-box');
if ($branding.length) {
var $brandLink = $branding.find('a');
if ($brandLink.length) {
if (!$brandLink.text().trim()) {
$brandLink.html('<span>Vanisource</span>');
}
} else {
$branding.html('<a href="/wiki/Main_Page"><span>Vanisource</span></a>');
}
} else {
var brandHtml = '<div class="branding-box"><a href="/wiki/Main_Page"><span>Vanisource</span></a></div>';
var $burger = $minervaHeader.find('#mw-mf-main-menu-button, .navigation-drawer.toggle-list').first();
if ($burger.length) {
$burger.after(brandHtml);
} else {
$minervaHeader.prepend(brandHtml);
}
}
// 2. Ensure Home Link is inserted cleanly
var $minervaForm = $minervaHeader.find('.minerva-search-form, #searchform').first();
if ($minervaForm.length && !$minervaHeader.find('#vanipedia-topbar-home-link').length) {
$minervaForm.before(createHomeLink());
} else if (!$minervaHeader.find('#vanipedia-topbar-home-link').length) {
var $minervaUser = $minervaHeader.find('.minerva-user-navigation, #ca-mytalks').first();
if ($minervaUser.length) {
$minervaUser.before(createHomeLink());
} else {
$minervaHeader.append(createHomeLink());
}
}
$minervaHeader.css({
'flex-wrap': 'nowrap',
'height': '52px',
'min-height': '52px',
'max-height': '52px',
'padding': '0 10px',
'display': 'flex',
'align-items': 'center',
'justify-content': 'space-between',
'box-sizing': 'border-box'
});
}
var $stageHeader = $('#vani-stage-header-slot');
if ($stageHeader.length && !$stageHeader.find('.vanipedia-topbar-center-block').length) {
var $stageSearch = $stageHeader.find('#p-search, .search-box, .minerva-search-form').first();
if ($stageSearch.length && !$stageHeader.find('#vanipedia-topbar-home-link').length) {
$stageSearch.after(createHomeLink());
}
if (!isMobile) {
$stageHeader.append(createCenterBlock());
}
}
var $stickyTitle = $('#vector-sticky-header .vector-sticky-header-title, #vector-sticky-header .vector-sticky-header-context-bar .mw-headline');
if ($stickyTitle.length) {
$stickyTitle.html('<a href="' + targetUrl + '" style="color: inherit; text-decoration: none;">' + titleText + '</a>');
}
}
$(function() {
removeGlobalSiteNotice();
});
var topbarResizeTimer;
$(window).on('resize orientationchange', function() {
clearTimeout(topbarResizeTimer);
topbarResizeTimer = setTimeout(updateTopBar, 150);
});
$(document).ready(updateTopBar);
if (window.mw && mw.hook) {
mw.hook('wikipage.content').add(updateTopBar);
}
})();
(function initPermanentBottomBar() {
function isEntryPage() {
return (
document.body.classList.contains('ext-vp3d-fullscreen') ||
!!document.querySelector('.vp-entry3d-container') ||
!!document.querySelector('.vp-entry3d-wrapper') ||
(window.mw && mw.config && (mw.config.get('wgPageName') === 'Entry_Page' || mw.config.get('wgTitle') === 'Entry Page'))
);
}
function setupBottomBar() {
// Never inject on the 3D entry page; remove if already present
if (isEntryPage()) {
var existing = document.getElementById('vh-bottom-bar');
if (existing) existing.remove();
return;
}
if (document.getElementById('vh-bottom-bar')) return;
var bar = document.createElement('nav');
bar.id = 'vh-bottom-bar';
bar.className = 'vh-bottom-bar';
bar.setAttribute('aria-label', 'Vanisource Global Navigation');
bar.innerHTML =
'<div class="vh-bottom-bar-inner" style="display:flex !important; align-items:center !important; width:100% !important; max-width:100% !important; height:100% !important; padding:0 24px !important; box-sizing:border-box !important;">' +
'<div class="vh-bottom-bar-left-space" style="flex:1 1 0 !important; min-width:0 !important;"><div class="vh-bottom-petal-links"><a href="https://vanipedia.org" target="_blank" rel="noopener noreferrer">Vanipedia</a><a href="https://vaniquotes.org" target="_blank" rel="noopener noreferrer">Vaniquotes</a><a href="https://vanimedia.org" target="_blank" rel="noopener noreferrer">Vanimedia</a></div></div>' +
'<div class="vh-bottom-nav-links" style="flex:0 0 auto !important; display:flex !important; align-items:center !important; justify-content:center !important; gap:12px !important; white-space:nowrap !important;">' +
'<a href="https://dev.vanipedia.org/" class="vh-bottom-link vh-bottom-entry">Home</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="/wiki/Main_Page" class="vh-bottom-link vh-bottom-home">Main Page</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="https://vanipedia.org/wiki/Vanipedia_Vision" class="vh-bottom-link">Core Principles</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="https://vaniseva.org" class="vh-bottom-link">Volunteer</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="https://vanipedia.org/wiki/Vanipedia_Community" class="vh-bottom-link">Community</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="https://vanipedia.org/contact.php" target="_blank" rel="noopener noreferrer" class="vh-bottom-link">Contact</a>' +
'<span class="vh-bottom-sep" aria-hidden="true">•</span>' +
'<a href="https://vanipedia.org/wiki/Special:IframePage" class="vh-bottom-link vh-bottom-donate">Donate</a>' +
'</div>' +
'<div class="vh-bottom-bar-right-space" style="flex:1 1 0 !important; min-width:0 !important; display:flex !important; align-items:center !important; justify-content:center !important;">' +
'<div class="vh-bottom-social-links" style="position:static !important; transform:none !important; display:inline-flex !important; align-items:center !important; gap:24px !important;">' +
'<a href="https://www.youtube.com/@VanimediaPrabhupada" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="YouTube" style="display:inline-flex !important;align-items:center !important;">' +
'<img src="https://vanipedia.org/wiki/Special:FilePath/YouTube_Logo_B.png" alt="YouTube" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' +
'</a>' +
'<a href="https://www.facebook.com/vanipedia.org" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Facebook Page" style="display:inline-flex !important;align-items:center !important;">' +
'<img src="https://vanipedia.org/wiki/Special:FilePath/Facebook_Group_Logo.png" alt="Facebook" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' +
'</a>' +
'<a href="https://www.facebook.com/groups/VanipediaGroup" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Facebook Group" style="display:inline-flex !important;align-items:center !important;">' +
'<img src="https://vanipedia.org/wiki/Special:FilePath/Facebook_Logo_2023.png" alt="Facebook Group" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' +
'</a>' +
'<a href="https://www.instagram.com/vanipediaprabhupada/" target="_blank" rel="noopener noreferrer" class="vh-bottom-social-item" title="Instagram" style="display:inline-flex !important;align-items:center !important;">' +
'<img src="https://vanipedia.org/wiki/Special:FilePath/Instagram_Logo.png" alt="Instagram" style="height:20px !important;width:auto !important;vertical-align:middle !important;display:block !important;">' +
'</a>' +
'</div>' +
'</div>' +
'</div>';
var stageSlot = document.getElementById('vani-stage-footer-slot');
if (stageSlot) {
stageSlot.appendChild(bar);
} else {
document.body.appendChild(bar);
}
}
// Remove bar if 3D entry page activates asynchronously
if (window.MutationObserver && document.body) {
var observer = new MutationObserver(function() {
if (isEntryPage()) {
var existing = document.getElementById('vh-bottom-bar');
if (existing) existing.remove();
}
});
observer.observe(document.body, { attributes: true, attributeFilter: ['class'], childList: true });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', setupBottomBar);
} else {
setupBottomBar();
}
})();
(function() {
function initMobileMenuToggle() {
var dropdown = document.getElementById('vector-main-menu-dropdown');
if (!dropdown || dropdown.dataset.vaniMobileInit) return;
dropdown.dataset.vaniMobileInit = 'true';
var label = dropdown.querySelector('.vector-dropdown-label');
var checkbox = document.getElementById('vector-main-menu-dropdown-checkbox');
var content = dropdown.querySelector('.vector-dropdown-content');
if (label && checkbox) {
label.addEventListener('click', function(e) {
setTimeout(function() {
if (content) {
if (checkbox.checked) {
content.classList.add('is-open');
} else {
content.classList.remove('is-open');
}
}
}, 50);
});
}
}
$(document).ready(initMobileMenuToggle);
if (window.mw && mw.hook) {
mw.hook('wikipage.content').add(initMobileMenuToggle);
}
})();
/* ==========================================================================
VANIPEDIA MOBILE JAVASCRIPT (MediaWiki:Mobile.js)
1. User Menu Dropdown: Intercepts #ca-mytalks on mobile to show the regular
user dropdown menu (Talk, Preferences, Contributions, Log out) matching desktop.
2. Self-contained styles injected into <head>.
3. Screen Orientation lock to landscape on Main Page.
========================================================================== */
(function() {
// 1. Inject self-contained dropdown styles immediately into <head>
var styleId = 'vani-mobile-dropdown-styles';
if (!document.getElementById(styleId)) {
var style = document.createElement('style');
style.id = styleId;
style.textContent = [
'#vanipedia-mobile-user-menu {',
' display: none !important;',
' position: fixed !important;',
' top: 52px !important;',
' right: 8px !important;',
' width: 175px !important;',
' background-color: #1f3e45 !important;',
' border: 1.5px solid #b1873d !important;',
' border-radius: 6px !important;',
' box-shadow: 0 8px 24px rgba(0,0,0,0.5) !important;',
' padding: 6px 0 !important;',
' z-index: 999999 !important;',
' box-sizing: border-box !important;',
' flex-direction: column !important;',
'}',
'#vanipedia-mobile-user-menu.is-open {',
' display: flex !important;',
'}',
'#vanipedia-mobile-user-menu a.vani-user-menu-item {',
' color: #f5d77f !important;',
' font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif !important;',
' font-size: 15px !important;',
' font-weight: 500 !important;',
' padding: 10px 18px !important;',
' text-decoration: none !important;',
' display: block !important;',
' line-height: 1.2 !important;',
'}',
'#vanipedia-mobile-user-menu a.vani-user-menu-item:hover,',
'#vanipedia-mobile-user-menu a.vani-user-menu-item:active {',
' background-color: #526B50 !important;',
' color: #ffffff !important;',
'}',
'#vanipedia-mobile-user-menu .vani-user-menu-divider {',
' height: 1px !important;',
' background-color: rgba(177, 135, 61, 0.35) !important;',
' margin: 5px 0 !important;',
'}',
'#vanipedia-mobile-user-menu a.vani-user-menu-logout {',
' color: #fca5a5 !important;',
'}',
'#vanipedia-mobile-user-menu a.vani-user-menu-logout:hover {',
' background-color: rgba(239, 68, 68, 0.2) !important;',
' color: #ffffff !important;',
'}'
].join('\n');
document.head.appendChild(style);
}
// 2. Setup user dropdown click interceptor
function initUserMenuDropdown() {
var $userBtn = $('#ca-mytalks');
if (!mw.config.get('wgUserName')) return;
if (!$userBtn.length || $userBtn.data('vaniMenuInit')) return;
$userBtn.data('vaniMenuInit', true);
// Prevent opening talk page directly
$userBtn.attr('href', 'javascript:void(0)');
// Build the dropdown container attached to body
var $dropdown = $('#vanipedia-mobile-user-menu');
if (!$dropdown.length) {
$dropdown = $('<div>', {
id: 'vanipedia-mobile-user-menu',
class: 'vanipedia-mobile-user-dropdown'
});
var user = (window.mw && mw.config && mw.config.get('wgUserName')) || '';
var talkUrl = '/wiki/User_talk:' + encodeURIComponent(user);
var prefUrl = '/wiki/Special:Preferences';
var contUrl = '/wiki/Special:Contributions/' + encodeURIComponent(user);
var page = (window.mw && mw.config && mw.config.get('wgPageName')) || 'Main_Page';
var logoutUrl = '/w/index.php?title=Special:UserLogout&returnto=' + encodeURIComponent(page) + '';
$dropdown.html(
'<a href="' + talkUrl + '" class="vani-user-menu-item">Talk</a>' +
'<a href="' + prefUrl + '" class="vani-user-menu-item">Preferences</a>' +
'<a href="' + contUrl + '" class="vani-user-menu-item">Contributions</a>' +
'<div class="vani-user-menu-divider"></div>' +
'<a href="' + logoutUrl + '" class="vani-user-menu-item vani-user-menu-logout">Log out</a>'
);
$('body').append($dropdown);
}
// Toggle on click
$userBtn.on('click', function(e) {
e.preventDefault();
e.stopPropagation();
$dropdown.toggleClass('is-open');
});
// Close on clicking outside
$(document).on('click touchstart', function(e) {
if (!$(e.target).closest('#ca-mytalks, #vanipedia-mobile-user-menu').length) {
$dropdown.removeClass('is-open');
}
});
}
// =========================================================================
// 3. Container-Level Auto-Landscape & 2D Fitting (STEP 115)
// Matches the exact architecture of VanipediaEntry3D:
// - Keeps <body> stable without full-page transforms.
// - Wraps #vani-home inside #vani-mobile-stage > #vani-rotated-box.
// - Rotates #vani-rotated-box 90deg in portrait mode.
// - Scales the 1200px desktop layout so all sections (Triad, Timeline,
// 4 Taxonomy Cards, Bottom Bar) fit the phone screen without cropping.
// =========================================================================
/* =========================================================================
3. STEP 117: UNIFIED 3-SLOT ROTATED LANDSCAPE STAGE (TOP BAR + MAIN PAGE + BOTTOM BAR)
- Puts Top Bar, #vani-home, and Bottom Bar together in landscape.
- Rotates 90deg as a single unified screen when held in portrait.
- Stays completely horizontal with zero rotation when held in native landscape.
- Leaves regular wiki pages and desktop view completely untouched.
========================================================================= */
function initMobileMainPageStage() {
if (window._vaniMainPageStageInit) return;
var pageName = (window.mw && mw.config && mw.config.get('wgPageName')) || '';
var isMainPage = pageName === 'Main_Page' || document.body.classList.contains('page-Main_Page');
if (!isMainPage) return;
var $vh = $('#vani-home');
if (!$vh.length) return;
window._vaniMainPageStageInit = true;
var $stage = null;
var $rotatedBox = null;
var $headerSlot = null;
var $contentSlot = null;
var $footerSlot = null;
var $topHeader = null;
var $bottomBar = null;
var $headerParent = null;
var $footerParent = null;
var $vhParent = null;
function ensureStage() {
if (!$('#vani-mobile-stage').length) {
$topHeader = $('.vector-header-container, #mw-head, .mw-header, .header-container, header.header-chrome').filter(':visible').first();
if (!$topHeader.length) {
$topHeader = $('.vector-header-container, #mw-head, .mw-header, .header-container, header.header-chrome').first();
}
$bottomBar = $('#vh-bottom-bar');
if ($topHeader.length) $headerParent = $topHeader.parent();
if ($bottomBar.length) $footerParent = $bottomBar.parent();
$vhParent = $vh.parent();
var stageHtml = [
'<div id="vani-mobile-stage">',
' <div id="vani-rotated-box">',
' <div id="vani-stage-header-slot"></div>',
' <div id="vani-stage-content-slot"></div>',
' <div id="vani-stage-footer-slot"></div>',
' </div>',
'</div>'
].join('');
$('body').append(stageHtml);
document.body.classList.add('has-vani-stage');
$stage = $('#vani-mobile-stage');
$rotatedBox = $('#vani-rotated-box');
$headerSlot = $('#vani-stage-header-slot');
$contentSlot = $('#vani-stage-content-slot');
$footerSlot = $('#vani-stage-footer-slot');
if ($topHeader.length) {
$headerSlot.append($topHeader);
var $menu = $('#vanipedia-mobile-user-menu');
if ($menu.length) $headerSlot.append($menu);
}
$contentSlot.append($vh);
if ($bottomBar.length) {
$footerSlot.append($bottomBar);
}
} else {
$stage = $('#vani-mobile-stage');
$rotatedBox = $('#vani-rotated-box');
$headerSlot = $('#vani-stage-header-slot');
$contentSlot = $('#vani-stage-content-slot');
$footerSlot = $('#vani-stage-footer-slot');
if (!$footerSlot.find('#vh-bottom-bar').length) {
var $b = $('#vh-bottom-bar');
if ($b.length) $footerSlot.append($b);
}
if (!$headerSlot.find('.vector-header-container, #mw-head, .header-container').length) {
var $h = $('.vector-header-container, #mw-head, .mw-header, .header-container').first();
if ($h.length) $headerSlot.append($h);
}
}
if ($headerSlot && !$headerSlot.find('.vanipedia-stage-title-link').length) {
var $st = $('<a class="vanipedia-stage-title-link" href="/wiki/Main_Page">Vanisource</a>');
var $targetNav = $headerSlot.find('.vector-header-start, .minerva-header, .header-container');
if ($targetNav.length) {
$targetNav.first().children().first().after($st);
} else {
$headerSlot.prepend($st);
}
}
}
function updateLayout() {
var screenW = window.innerWidth;
var screenH = window.innerHeight;
var isMobile = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (screenW < 900) || (screenH < 900 && screenH > screenW);
if (!isMobile && screenW >= 1000 && screenW > screenH) {
if ($('#vani-mobile-stage').length) {
if ($topHeader && $topHeader.length && $headerParent) {
$headerParent.prepend($topHeader);
}
if ($vhParent) {
$vhParent.append($vh);
}
if ($bottomBar && $bottomBar.length && $footerParent) {
$footerParent.append($bottomBar);
}
var $m = $('#vanipedia-mobile-user-menu');
if ($m.length) $('body').append($m);
$('#vani-mobile-stage').remove();
document.body.classList.remove('has-vani-stage');
$vh.css({ 'transform': '', 'transform-origin': '', 'width': '' });
}
return;
}
ensureStage();
var isMobilePortrait = (screenH > screenW) && (screenW < 850);
var landscapeW = isMobilePortrait ? screenH : screenW;
var landscapeH = isMobilePortrait ? screenW : screenH;
$rotatedBox.css({
'width': landscapeW + 'px',
'height': landscapeH + 'px'
});
if (isMobilePortrait) {
$rotatedBox.removeClass('is-native-landscape').addClass('is-auto-landscape');
} else {
$rotatedBox.removeClass('is-auto-landscape').addClass('is-native-landscape');
}
var headerH = 50;
var footerH = 36;
var availableContentH = Math.max(120, landscapeH - headerH - footerH);
$contentSlot.css({
'height': availableContentH + 'px'
});
var baseW = 1200;
var baseH = 475;
var scaleW = landscapeW / baseW;
var scaleH = availableContentH / baseH;
var scale = Math.min(scaleW, scaleH);
if (scale > 0.85) scale = 0.85;
// Scale down to fit small screens without horizontal cropping.
var scaledWidth = baseW * scale;
var offsetX = Math.max(0, (landscapeW - scaledWidth) / 2);
$vh.css({
'transform': 'translate(' + offsetX.toFixed(1) + 'px, 0) scale(' + scale.toFixed(4) + ')',
'transform-origin': 'top left',
'width': baseW + 'px'
});
}
var touchStartY = 0;
var touchStartScroll = 0;
window.addEventListener('touchstart', function(e) {
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && e.touches && e.touches.length === 1) {
touchStartY = e.touches[0].clientX;
if ($contentSlot && $contentSlot[0]) {
touchStartScroll = $contentSlot[0].scrollTop || 0;
}
}
}, { passive: true });
window.addEventListener('touchmove', function(e) {
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && e.touches && e.touches.length === 1) {
var delta = e.touches[0].clientX - touchStartY;
if ($contentSlot && $contentSlot[0]) {
$contentSlot[0].scrollTop = touchStartScroll + delta;
}
}
}, { passive: true });
window.addEventListener('wheel', function(e) {
if ($rotatedBox && $rotatedBox.hasClass('is-auto-landscape') && $contentSlot && $contentSlot[0]) {
$contentSlot[0].scrollTop += e.deltaY;
}
}, { passive: true });
window.addEventListener('resize', updateLayout);
window.addEventListener('orientationchange', function() {
setTimeout(updateLayout, 150);
});
updateLayout();
}
$(document).ready(function() {
initUserMenuDropdown();
initMobileMainPageStage();
});
if (window.mw && mw.hook) {
mw.hook('wikipage.content').add(function() {
initUserMenuDropdown();
initMobileMainPageStage();
});
}
})();
/* ==========================================================================
STEP 119: EXACT DESKTOP SIDEBAR INJECTION INTO MOBILE BURGER DRAWER
1. Empties all irrelevant Minerva items (Nearby, Random, Settings, About).
2. Clones or fetches the exact desktop Vector 2022 sidebar (#vector-main-menu).
3. Tags each section with .vanipedia-sidebar-menu for the true desktop accordion.
4. Connects the 102 Languages live search box.
========================================================================== */
(function initExactMobileSidebar() {
function cleanAndInject($drawer, sidebarHtml) {
if ($drawer.data('vaniSidebarCleaned')) return;
$drawer.data('vaniSidebarCleaned', true);
// 1. Remove all default Minerva items (Nearby, Random, Personal, Hlist)
$drawer.find('#p-navigation, #p-personal, ul.hlist, .menu__item--nearby, .menu__item--random').remove();
// 2. Parse and filter desktop sidebar HTML
var $parsed = $('<div>').append($.parseHTML(sidebarHtml));
var $menus = $parsed.find('.vector-menu');
if (!$menus.length) {
$menus = $parsed.find('.portal, [id^="p-"]');
}
var $container = $('<div>', { id: 'vani-mobile-synced-sidebar' });
$menus.each(function(idx) {
var $menu = $(this).clone();
var menuId = $menu.attr('id') || '';
// Ignore personal or search menus if caught
if (menuId === 'p-personal' || menuId === 'p-search' || menuId === 'p-logo') return;
// Apply standard desktop class
$menu.addClass('vanipedia-sidebar-menu');
// Collapse by default, except the first section (Navigation)
if (idx === 0) {
$menu.removeClass('vanipedia-collapsed');
} else {
$menu.addClass('vanipedia-collapsed');
}
$container.append($menu);
});
// 3. Mount cleanly inside mobile drawer
$drawer.empty().append($container);
// 4. Initialize 102 Languages live search box in the cloned menu
initLanguageSearchInDrawer($container);
}
function initLanguageSearchInDrawer($container) {
var $sidebarMenu = $container.find('#p-102_Languages ul, [id*="102_Languages"] ul').first();
if ($sidebarMenu.length === 0) {
$container.find('.vector-menu-heading, .portal h3').each(function() {
if ($(this).text().trim().indexOf('102 Languages') !== -1) {
$sidebarMenu = $(this).closest('.vector-menu, .portal').find('ul').first();
}
});
}
if (!$sidebarMenu || $sidebarMenu.length === 0 || $sidebarMenu.find('#sidebarLanguageSearch').length) return;
var $searchLi = $('<li id="n-language-search" style="margin: 8px 10px; list-style: none;"></li>');
var $searchBox = $('<input type="text" id="sidebarLanguageSearch" placeholder="Search 102 Languages..." autocomplete="off" />');
var $resultsContainer = $('<ul id="sidebarLanguageResults" style="list-style: none; padding: 0; margin: 4px 0 0 0; max-height: 200px; overflow-y: auto; border: 1px solid #2c4c50; background: #ffffff; display: none;"></ul>');
$searchLi.append($searchBox).append($resultsContainer);
$sidebarMenu.prepend($searchLi);
var api = new mw.Api();
var languageList = [];
api.get({
action: 'query',
list: 'categorymembers',
cmtitle: 'Category:Languages_with_Total_Pages',
cmlimit: 'max',
format: 'json'
}).done(function(data) {
if (data.query && data.query.categorymembers) {
languageList = data.query.categorymembers.map(function(member) {
return {
title: member.title,
url: mw.util.getUrl(member.title)
};
});
}
});
$searchBox.on('keyup', function(e) {
e.stopPropagation();
var term = $(this).val().toLowerCase().trim();
$resultsContainer.empty();
if (term.length === 0) {
$resultsContainer.hide();
return;
}
var matches = languageList.filter(function(item) {
return item.title.toLowerCase().indexOf(term) !== -1;
});
if (matches.length > 0) {
matches.slice(0, 15).forEach(function(item) {
var $li = $('<li>', { style: 'padding: 6px 12px; border-bottom: 1px solid #eaeff0;' });
var $a = $('<a>', {
href: item.url,
text: item.title,
style: 'color: #1b3033; text-decoration: none; display: block;'
});
$li.append($a);
$resultsContainer.append($li);
});
$resultsContainer.show();
} else {
$resultsContainer.html('<li style="padding: 6px 12px; color: #888; font-style: italic;">No languages found</li>').show();
}
});
$(document).on('click touchstart', function(e) {
if (!$(e.target).closest('#n-language-search').length) {
$resultsContainer.hide();
}
});
}
function setupMobileDrawer() {
var $drawer = $('#mw-mf-page-left');
if (!$drawer.length) return;
// Check if desktop sidebar is already in DOM
var $desktopSidebar = $('#vector-main-menu, .vector-sidebar-container #mw-panel');
if ($desktopSidebar.length && $desktopSidebar.find('.vector-menu').length) {
cleanAndInject($drawer, $desktopSidebar.html());
return;
}
// Check sessionStorage cache
var cached = null;
try { cached = sessionStorage.getItem('vani_desktop_sidebar_html'); } catch(e) {}
if (cached) {
cleanAndInject($drawer, cached);
return;
}
// Fetch desktop Vector 2022 page to get exact sidebar markup
var fetchUrl = (window.mw && mw.util && mw.util.getUrl('Main_Page', { useskin: 'vector-2022' })) ||
'/wiki/Main_Page?useskin=vector-2022';
$.ajax({
url: fetchUrl,
type: 'GET',
dataType: 'html',
success: function(response) {
try {
var $parsed = $('<div>').append($.parseHTML(response));
var $sidebar = $parsed.find('#vector-main-menu');
if (!$sidebar.length) {
$sidebar = $parsed.find('#mw-panel, .vector-sidebar-container');
}
if ($sidebar.length) {
var html = $sidebar.html();
try { sessionStorage.setItem('vani_desktop_sidebar_html', html); } catch(e) {}
cleanAndInject($drawer, html);
}
} catch(e) {
console.warn('[VANIPEDIA] Error extracting desktop sidebar:', e);
}
}
});
}
$(document).ready(setupMobileDrawer);
if (window.mw && mw.hook) {
mw.hook('wikipage.content').add(setupMobileDrawer);
}
})();
/* Vanisource portrait rotation; preload before swapping; respect reduced motion. */
(function () {
function init() {
var home=document.getElementById('vani-home');
if (!home || home.dataset.vsPortraitReady) return;
home.dataset.vsPortraitReady='1';
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
var a=home.querySelector('.vh-photo-a'), b=home.querySelector('.vh-photo-b'), current=1, active=a;
if(!a || !b)return;
window.setInterval(function(){
if(document.hidden)return;
var next=current%12+1, src='https://vanipedia.org/wiki/Special:Redirect/file/Srila-Prabhupada-Hero-'+String(next).padStart(2,'0')+'.jpg';
var preload=new Image();
preload.onload=function(){var incoming=active===a?b:a;incoming.style.backgroundImage='url("'+src+'")';incoming.style.opacity='1';active.style.opacity='0';active=incoming;current=next;};
preload.src=src;
},10000);
}
$(init); mw.hook('wikipage.content').add(init);
})();
});