MediaWiki:Gadget-site.js

/*global mw, $, importScript, jsMsg */

// Add "mainpage" class to the body element if (	mw.config.get( 'wgMainPageTitle' ) === mw.config.get( 'wgPageName' ) &&	mw.config.get( 'wgAction' ) === 'view' ) { $( document ).ready( function {		document.body.className += ' mainpage';	}); }

// Editpage scripts if ( mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit' ) { importScript( 'MediaWiki:Editpage.js' ); }

/* End of extra pages */

/** * Test if an element has a certain class * * Based on script from en.wikipedia.org, 2008-09-15. * Maintainers: User:Mike Dillon, User:R. Koot, User:SG * * @deprecated since 1.17: Use jQuery(element).hasClass instead */ var hasClass = ( function {	var reCache = {};	return function ( element, className ) {		return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );	}; });

/** * Dynamic Navigation Bars * * Based on script from en.wikipedia.org, 2008-09-15. * * Description: See NavFrame. */ ( function {

// Set up the words in your language var collapseCaption = 'hide'; var expandCaption = 'show';

var navigationBarHide = '[' + collapseCaption + ']'; var navigationBarShow = '[' + expandCaption + ']';

/** * Shows and hides content and picture (if available) of navigation bars. * * @param {number} indexNavigationBar The index of navigation bar to be toggled * @param {jQuery.Event} e Event object */ function toggleNavigationBar( indexNavigationBar, e ) { var navChild, navToggle = document.getElementById( 'NavToggle' + indexNavigationBar ), navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );

// Prevent browser from jumping to href "#" e.preventDefault;

if ( !navFrame || !navToggle ) { return false; }

// If shown now if ( navToggle.firstChild.data == navigationBarHide ) { for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { if ( hasClass( navChild, 'NavPic' ) ) { navChild.style.display = 'none'; }			if ( hasClass( navChild, 'NavContent' ) ) { navChild.style.display = 'none'; }		}		navToggle.firstChild.data = navigationBarShow;

// If hidden now } else if ( navToggle.firstChild.data == navigationBarShow ) { for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) { navChild.style.display = 'block'; }		}		navToggle.firstChild.data = navigationBarHide; } }

/** * Adds show/hide-button to navigation bars. * * @param {jQuery} $content */ function createNavigationBarToggleButton { var i, j, navFrame, navToggle, navToggleText, navChild, indexNavigationBar = 0, divs = document.getElementsByTagName( 'div' );

// iterate over all -elements for ( i = 0; (navFrame = divs[i]); i++ ) { // if found a navigation bar if ( $( navFrame ).hasClass( 'NavFrame' ) ) { indexNavigationBar++; navToggle = document.createElement( 'a' ); navToggle.className = 'NavToggle'; navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar ); navToggle.setAttribute( 'href', '#' ); $( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );

navToggleText = document.createTextNode( navigationBarHide ); for ( navChild = navFrame.firstChild; navChild != null; navChild = navChild.nextSibling ) { if ( $( navChild ).hasClass( 'NavPic' ) || $( navChild ).hasClass( 'NavContent' ) ) { if ( navChild.style.display == 'none' ) { navToggleText = document.createTextNode( navigationBarShow ); break; }				}			}

navToggle.appendChild( navToggleText ); // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) for ( j = 0; j < navFrame.childNodes.length; j++ ) { if ( $( navFrame.childNodes[j] ).hasClass( 'NavHead' ) ) { navFrame.childNodes[j].appendChild( navToggle ); }			}			navFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar ); }	} }

mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );

});

/** * Hide prefix in category * * @source: www.mediawiki.org/wiki/Snippets/Hide_prefix_in_category * @rev: 3 * @author Krinkle */ mw.loader.using( 'jquery.mwExtension', function {	var $tplHideCategoryPrefix = $( '#mw-cat-hideprefix' );	if ( $tplHideCategoryPrefix.length ) {		var prefix = $tplHideCategoryPrefix.text;		if ( $.trim( prefix ) === '' ) {			prefix = mw.config.get( 'wgTitle' ) + '/';		}		$( '#mw-pages' ).find( 'a' ).text( function( i, val ){ return val.replace( new RegExp( '^' + $.escapeRE( prefix ) ), '' ); });	} });

/** * Load the CodeReview 'tooltips' gadget on MediaWiki roadmap subpages, * so it's available for the revision reports where it's particularly useful * @author: Happy-melon */ if ( mw.config.get( 'wgPageName' ).match( /^MediaWiki_roadmap/ ) ) { mw.loader.load( 'ext.codereview.tooltips' ); }

/** * Load withJS and withCSS * * @source: www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL#Load_withJS_and_withCSS * @rev: 1 * @author: Krinkle */ /* withJS */ var extraJS = mw.util.getParamValue( 'withJS' ); if ( extraJS ) { // Disallow some characters in file name if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) { importScript( extraJS ); // Don't use alert but the jsMsg system. Run jsMsg only once the DOM is ready. } else { $( document ).ready( function {			jsMsg( extraJS + ' script not allowed to be loaded.', 'error' );		} ); } } /* withCSS */ var extraCSS = mw.util.getParamValue( 'withCSS' ); if ( extraCSS ) { // Disallow some characters in file name if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) { importStylesheet( extraCSS ); // Don't use alert but the jsMsg system. Run jsMsg only once the DOM is ready. } else { $( document ).ready( function {			jsMsg( extraCSS + ' stylesheet not allowed to be loaded.', 'error' );		} ); } }