Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* <nowiki> */
/* Bharat Mitra: loader and menu */
( function () {
	'use strict';
	if ( !mw.config.get( 'wgUserName' ) ) { return; }
	var BM = window.BharatMitra = window.BharatMitra || { modules: {}, loaded: {} };
	if ( BM.menuInit ) { return; }
	BM.menuInit = true;

	function targetUser() {
		var u = mw.config.get( 'wgRelevantUserName' );
		if ( u ) { return u; }
		var ns = mw.config.get( 'wgNamespaceNumber' );
		if ( ns === 2 || ns === 3 ) { return mw.config.get( 'wgTitle' ).split( '/' )[ 0 ]; }
		return null;
	}
	function isRootUserPage() {
		var ns = mw.config.get( 'wgNamespaceNumber' );
		return ns === 3 || ( ns === 2 && mw.config.get( 'wgTitle' ).indexOf( '/' ) === -1 );
	}
	function isSysop() {
		return ( mw.config.get( 'wgUserGroups' ) || [] ).indexOf( 'sysop' ) !== -1;
	}
	function contentPage() {
		var ns = mw.config.get( 'wgNamespaceNumber' );
		if ( [ 0, 6, 10, 14 ].indexOf( ns ) !== -1 ) { return true; }
		return !!mw.config.get( 'wgIsRedirect' ) && ns >= 0 && ns % 2 === 0 && ns !== 2 && ns !== 8;
	}
	var ITEMS = [
		{ name: 'welcome', label: 'Welcome', show: function () { return !!targetUser() && isRootUserPage(); } },
		{ name: 'warn', label: 'Warn', show: function () { return !!targetUser() && isRootUserPage(); } },
		{ name: 'revert', label: 'Revert / Undo', show: function () {
			return mw.config.get( 'wgNamespaceNumber' ) >= 0 && !!mw.config.get( 'wgCurRevisionId' );
		} },
		{ name: 'speedy', label: 'Nominate for speedy deletion', show: contentPage },
		{ name: 'xfd', label: 'Put in deletion discussion', show: contentPage },
		{ name: 'protect', label: 'Request protection', show: function () {
			return mw.config.get( 'wgNamespaceNumber' ) >= 0;
		} },
		{ name: 'report', label: 'Report to administrators\' noticeboard', show: function () {
			return mw.config.get( 'wgNamespaceNumber' ) >= 0;
		} },
		{ name: 'redirect', label: 'Redirect tools', show: function () {
			return mw.config.get( 'wgNamespaceNumber' ) >= 0;
		} },
		{ name: 'block', label: 'Block (admin)', show: function () {
			return isSysop() && !!targetUser() && isRootUserPage();
		} },
		{ name: 'batch', label: 'Batch delete (admin)', show: function () { return isSysop(); } },
		{ name: 'config', label: 'Settings', show: function () { return true; } }
	];

	function loadModule( name ) {
		if ( BM.loaded[ name ] && BM.modules[ name ] ) {
			return $.Deferred().resolve().promise();
		}
		return mw.loader.using( [ 'ext.gadget.BharatMitra-core', 'ext.gadget.BharatMitra-' + name ] )
			.then( function () { BM.loaded[ name ] = true; } );
	}
	BM.loadModule = loadModule;

	var menu = null;
	function closeMenu() { if ( menu ) { menu.hide(); } }
	function buildMenu( anchor ) {
		if ( !menu ) {
			menu = $( '<div>' ).attr( 'id', 'bm-menu' ).hide();
			$( document.body ).append( menu );
			$( document ).on( 'click', function ( e ) {
				if ( menu.is( ':visible' ) && !$( e.target ).closest( '#bm-menu, #ca-bharatmitra, .bm-float' ).length ) {
					closeMenu();
				}
			} );
			$( document ).on( 'keydown', function ( e ) { if ( e.key === 'Escape' ) { closeMenu(); } } );
		}
		menu.empty();
		ITEMS.forEach( function ( item ) {
			if ( !item.show() ) { return; }
			var b = $( '<button>' ).attr( 'type', 'button' ).addClass( 'bm-menu-item' ).text( item.label );
			b.on( 'click', function () {
				closeMenu();
				loadModule( item.name ).then( function () {
					if ( BM.modules[ item.name ] ) { BM.modules[ item.name ].open(); }
					else { mw.notify( 'This part could not be loaded.', { type: 'error' } ); }
				} ).catch( function () {
					mw.notify( 'This part could not be loaded.', { type: 'error' } );
				} );
			} );
			menu.append( b );
		} );
		var help = $( '<a>' ).addClass( 'bm-menu-item bm-menu-link' )
			.attr( 'href', mw.util.getUrl( 'Bharatpedia:Bharat Mitra' ) ).text( 'Bharat Mitra help' );
		menu.append( help );
		var rect = anchor.getBoundingClientRect();
		menu.css( {
			top: ( rect.bottom + window.scrollY + 4 ) + 'px',
			left: Math.max( 8, Math.min( rect.left + window.scrollX, window.innerWidth - 292 ) ) + 'px'
		} );
		menu.toggle();
	}
	$( function () {
		/* BharatpediaNeo skin: put the entry in the skin's own three-dot (more) menu.
		   The skin settles its menu late, so keep trying for a while and
		   also add the entry at the moment the menu button is clicked. */
		function placeNeoItem() {
			var neoMenu = document.querySelector( '.bpneo-title-actions .bpneo-action-menu' );
			var neoBtn = document.querySelector( '.bpneo-title-actions .bpneo-menu-btn' );
			if ( !neoMenu || !neoBtn ) { return false; }
			if ( neoMenu.querySelector( '#ca-bharatmitra' ) ) { return true; }
			var neoItem = document.createElement( 'a' );
			neoItem.href = '#';
			neoItem.id = 'ca-bharatmitra';
			neoItem.textContent = '\u2605 Bharat Mitra';
			neoItem.addEventListener( 'click', function ( e ) {
				e.preventDefault();
				neoMenu.style.display = 'none';
				buildMenu( neoBtn );
			} );
			var printSection = null;
			var sections = neoMenu.querySelectorAll( '.bpneo-menu-section' );
			for ( var s = 0; s < sections.length; s++ ) {
				if ( /print/i.test( sections[ s ].textContent ) ) { printSection = sections[ s ]; break; }
			}
			if ( printSection ) { neoMenu.insertBefore( neoItem, printSection ); }
			else { neoMenu.appendChild( neoItem ); }
			return true;
		}
		function placeNormal() {
			var placed = null, placedPortlet = '';
			[ 'p-views', 'p-cactions', 'p-actions', 'p-personal' ].forEach( function ( portlet ) {
				if ( placed ) { return; }
				try {
					var li = mw.util.addPortletLink( portlet, '#', '\u2605 Bharat Mitra', 'ca-bharatmitra', 'Open the Bharat Mitra tools' );
					if ( li ) { placed = $( li ).find( 'a' ).first(); placedPortlet = portlet; }
				} catch ( e ) { /* next portlet */ }
			} );
			if ( placed && placed.length ) {
				if ( placedPortlet !== 'p-personal' ) { placed.addClass( 'bm-star-link' ); }
				placed.on( 'click', function ( e ) { e.preventDefault(); buildMenu( this ); } );
			} else {
				var btn = $( '<button>' ).attr( 'type', 'button' ).addClass( 'bm-float' ).text( '\u2605 Bharat Mitra' );
				btn.on( 'click', function () { buildMenu( this ); } );
				$( document.body ).append( btn );
			}
		}
		var isNeo = mw.config.get( 'wgSkin' ) === 'bharatpedianeo' || ( document.body && document.body.classList.contains( 'skin-bharatpedianeo' ) );
		if ( isNeo ) {
			if ( !placeNeoItem() ) {
				var neoTries = 0;
				var neoTimer = setInterval( function () {
					neoTries++;
					if ( placeNeoItem() || neoTries > 60 ) {
						clearInterval( neoTimer );
						if ( !document.getElementById( 'ca-bharatmitra' ) ) { placeNormal(); }
					}
				}, 250 );
			}
			document.addEventListener( 'click', function ( e ) {
				if ( e.target.closest && e.target.closest( '.bpneo-menu-btn' ) ) { placeNeoItem(); }
			}, true );
		} else {
			placeNormal();
		}
		/* If an old revision or a diff is being viewed, show the restore bar */
		var oldid = 0;
		var cur = mw.config.get( 'wgCurRevisionId' );
		if ( mw.config.get( 'wgDiffOldId' ) ) { oldid = mw.config.get( 'wgDiffOldId' ); }
		else if ( mw.config.get( 'wgRevisionId' ) && cur && mw.config.get( 'wgRevisionId' ) < cur ) {
			oldid = mw.config.get( 'wgRevisionId' );
		}
		if ( oldid && cur && oldid !== cur && mw.config.get( 'wgNamespaceNumber' ) >= 0 ) {
			loadModule( 'revert' ).then( function () {
				if ( BM.modules.revert && BM.modules.revert.addRestoreLink ) {
					BM.modules.revert.addRestoreLink( oldid );
				}
			} ).catch( function () { /* silent */ } );
		}
	} );
}() );
/* </nowiki> */