Difference between revisions of "MediaWiki:Common.js"

From NeoDex
Jump to navigation Jump to search
(yeah, thought it wouldn't work like that xP)
(Updated Common.js from 1.22 version to 1.37.2 upon upgrading. AddOnloadHooks was depreciated and throwing errors)
 
(4 intermediate revisions by one other user not shown)
Line 3: Line 3:
/*The following was retrieved from http://www.mediawiki.org/wiki/Manual:Collapsible_tables --[[User:Macbeth|Macbeth]] 07:31, 30 November 2010 (CST)*/
/*The following was retrieved from http://www.mediawiki.org/wiki/Manual:Collapsible_tables --[[User:Macbeth|Macbeth]] 07:31, 30 November 2010 (CST)*/


/** Collapsible tables *********************************************************
/*The following was retrieved from https://meta.wikimedia.org/wiki/MediaWiki:Common.js --[[User:Blue|Blue]] 19:35, 19 May 2022 (PST) upon upgrading Wiki to 1.37.2 - AddOnloadHook was depreciated... */
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/**
* Collapsible tables
  *
  *
  * Description: Allows tables to be collapsed, showing only the header. See
  * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
*   http://www.mediawiki.org/wiki/Manual:Collapsible_tables.
  * @maintainer [[User:R. Koot]] (on Wikipedia)
  * Maintainers: mw:User:R. Koot
  */
  */
 
var autoCollapse = 2;
var autoCollapse = 2;
var collapseCaption = "<b>collapse</b>";
var collapseCaption = 'hide';
var expandCaption = "<b>expand</b>";
var expandCaption = 'show';
 
function hasClass( element, className ) {
var Classes = ( element && element.className && element.className.split( " " ) ) || [];
for ( var i = 0; i < Classes.length; i++ ) {
if ( Classes[i] == className ) {
return true;
}
}
return false;
}
 
function collapseTable( tableIndex ) {
function collapseTable( tableIndex ) {
var i;
var Button = document.getElementById( 'collapseButton' + tableIndex );
var Button = document.getElementById( 'collapseButton' + tableIndex );
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
if ( !Table || !Button ) {
if ( !Table || !Button ) {
return false;
return false;
}
}
 
var Rows = Table.rows;
var Rows = Table.getElementsByTagName( 'tr' );
 
if ( Button.firstChild.data == collapseCaption ) {
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
for ( i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = 'none';
Rows[i].style.display = 'none';
}
}
Button.firstChild.data = expandCaption;
Button.firstChild.data = expandCaption;
} else {
} else {
for ( var i = 1; i < Rows.length; i++ ) {
for ( i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
Rows[i].style.display = Rows[0].style.display;
}
}
Line 36: Line 51:
}
}
}
}
 
function createCollapseButtons() {
function createCollapseButtons() {
var i;
var tableIndex = 0;
var tableIndex = 0;
var NavigationBoxes = new Object();
var NavigationBoxes = {};
var Tables = document.getElementsByTagName( 'table' );
var Tables = document.getElementsByTagName( 'table' );
 
for ( var i = 0; i < Tables.length; i++ ) {
for ( i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], 'collapsible' ) ) {
if ( hasClass( Tables[i], 'collapsible' ) ) {
NavigationBoxes[ tableIndex ] = Tables[i];
/* only add button and increment count if there is a header row to work with */
var HeaderRow = Tables[i].getElementsByTagName( 'tr' )[0];
if ( !HeaderRow ) {
continue;
}
var Header = HeaderRow.getElementsByTagName( 'th' )[0];
if ( !Header ) {
continue;
}
NavigationBoxes[tableIndex] = Tables[i];
Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );
 
var Button = document.createElement( 'span' );
var Button = document.createElement( 'span' );
var ButtonLink = document.createElement( 'a' );
var ButtonLink = document.createElement( 'a' );
var ButtonText = document.createTextNode( collapseCaption );
var ButtonText = document.createTextNode( collapseCaption );
 
Button.className = 'collapseButton'; // Styles are declared in [[MediaWiki:Common.css]]
Button.style.styleFloat = 'right';
Button.style.cssFloat = 'right';
ButtonLink.style.color = Header.style.color;
Button.style.fontWeight = 'normal';
Button.style.textAlign = 'right';
Button.style.width = '6em';
 
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
ButtonLink.setAttribute( 'href', '#' );
ButtonLink.setAttribute( 'href', 'javascript:collapseTable(' + tableIndex + ');' );
addHandler( ButtonLink, 'click', new Function( 'evt', 'collapseTable(' + tableIndex + ' ); return killEvt( evt );' ) );
ButtonLink.appendChild( ButtonText );
ButtonLink.appendChild( ButtonText );
 
Button.appendChild( document.createTextNode( '[' ) );
Button.appendChild( document.createTextNode( '[' ) );
Button.appendChild( ButtonLink );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( ']' ) );
Button.appendChild( document.createTextNode( ']' ) );
 
Header.insertBefore( Button, Header.childNodes[0] );
var Header = Tables[i].getElementsByTagName( 'tr' )[0].getElementsByTagName( 'th' )[0];
tableIndex++;
/* only add button and increment count if there is a header row to work with */
if (Header) {
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
}
}
}
 
for ( var i = 0; i < tableIndex; i++ ) {
for ( i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
collapseTable( i );
collapseTable( i );
} else if ( hasClass( NavigationBoxes[i], 'innercollapse' ) ) {
}
var element = NavigationBoxes[i];
}
while ( element = element.parentNode ) {
}
if ( hasClass( element, 'outercollapse' ) ) {
 
collapseTable( i );
$( createCollapseButtons );
break;
 
 
/**
* Dynamic Navigation Bars (experimental)
*
*  See [[Wikipedia:NavFrame]].
*/
 
// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
 
// shows and hides content and picture (if available) of navigation bars
// Parameters:
// indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar) {
var NavChild;
var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar);
var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar);
 
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 (hasClass(NavChild, 'NavPic')) {
NavChild.style.display = 'block';
}
if (hasClass(NavChild, 'NavContent')) {
NavChild.style.display = 'block';
}
}
NavToggle.firstChild.data = NavigationBarHide;
}
}
 
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton(){
var indexNavigationBar = 0;
// iterate over all < div >-elements
var divs = document.getElementsByTagName( 'div' );
for (var i = 0; NavFrame = divs[i]; i++) {
// if found a navigation bar
if ( hasClass(NavFrame, 'NavFrame' )) {
 
indexNavigationBar++;
var NavToggle = document.createElement('a');
NavToggle.className = 'NavToggle';
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
var NavToggleText = document.createTextNode(NavigationBarHide);
for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, '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(var j=0; j < NavFrame.childNodes.length; j++) {
if (hasClass(NavFrame.childNodes[j], 'NavHead')) {
NavFrame.childNodes[j].appendChild(NavToggle);
}
}
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
}
}
}
$( createNavigationBarToggleButton );
// Shuffle for election candidates
function dshuf() {
var shufsets = {};
var rx = new RegExp('dshuf' + '\\s+(dshufset\\d+)', 'i');
var divs = document.getElementsByTagName('div');
var i = divs.length;
while (i--) {
if (rx.test(divs[i].className)) {
if (typeof shufsets[RegExp.$1] === 'undefined') {
shufsets[RegExp.$1] = {};
shufsets[RegExp.$1].inner = [];
shufsets[RegExp.$1].member = [];
}
shufsets[RegExp.$1].inner.push({
key: Math.random(),
html: divs[i].innerHTML
});
shufsets[RegExp.$1].member.push(divs[i]);
}
}
for (shufset in shufsets) {
shufsets[shufset].inner.sort(function(a, b) {
return a.key - b.key;
});
i = shufsets[shufset].member.length;
while (i--) {
shufsets[shufset].member[i].innerHTML = shufsets[shufset].inner[i].html;
shufsets[shufset].member[i].style.display = 'block';
}
}
}
}
}
}
$(dshuf);
addOnloadHook( createCollapseButtons );
 
/**
/** Test if an element has a certain class **************************************
* JSconfig
*
* Global configuration options to enable/disable and configure
* specific script features from [[MediaWiki:Common.js]] and
* [[MediaWiki:Monobook.js]]
* This framework adds config options (saved as cookies) to [[Special:Preferences]]
* For a more permanent change you can override the default settings in your
* [[Special:Mypage/monobook.js]]
* for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
  *
  *
  * Description: Uses regular expressions and caching for better performance.
  * Maintainer: [[User:Dschwen]]
* Maintainers: User:Mike Dillon, User:R. Koot, User:SG
  */
  */
   
 
var hasClass = ( function() {
var JSconfig =
var reCache = {};
{
return function( element, className ) {
prefix : 'jsconfig_',
return ( reCache[className] ? reCache[className] : ( reCache[className] = new RegExp( "(?:\\s|^)" + className + "(?:\\s|$)" ) ) ).test( element.className );
keys : {},
};
meta : {},
})();
 
//
// Register a new configuration item
//  * name          : String, internal name
//  * default_value : String or Boolean (type determines configuration widget)
//  * description  : String, text appearing next to the widget in the preferences
//  * prefpage      : Integer (optional), section in the preferences to insert the widget:
//                    0 : User profile
//                    1 : Skin
//                    2 : Math
//                    3 : Files
//                    4 : Date and time
//                    5 : Editing
//                    6 : Recent changes
//                    7 : Watchlist
//                    8 : Search
//                    9 : Misc
//
// Access keys through JSconfig.keys[name]
//
registerKey : function( name, default_value, description, prefpage )
{
  if( typeof(JSconfig.keys[name]) === 'undefined' )
  JSconfig.keys[name] = default_value;
  else {
 
  // all cookies are read as strings,
  // convert to the type of the default value
  switch( typeof(default_value) )
  {
    case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
    case 'number' : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
  }
 
  }
 
  JSconfig.meta[name] = { 'description' : description, 'page' : prefpage || 0, 'default_value' : default_value };
},
 
readCookies : function()
{
  var cookies = document.cookie.split("; ");
  var p =JSconfig.prefix.length;
  var i;
 
  for( var key in cookies )
  {
  if( cookies[key].substring(0,p) == JSconfig.prefix )
  {
    i = cookies[key].indexOf('=');
    //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
    JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
  }
  }
},
 
writeCookies : function()
{
  for( var key in JSconfig.keys )
  document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC';
},
 
evaluateForm : function()
{
  var w_ctrl,wt;
  //alert('about to save JSconfig');
  for( var key in JSconfig.meta ) {
  w_ctrl = document.getElementById( JSconfig.prefix + key );
  if( w_ctrl )
  {
    wt = typeof( JSconfig.meta[key].default_value );
    switch( wt ) {
    case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
    case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
    }
  }
  }
 
  JSconfig.writeCookies();
  return true;
},
 
setUpForm : function()
{
  var key;
  var prefChild = document.getElementById('preferences');
  if( !prefChild ) return;
  prefChild = prefChild.childNodes;
 
  //
  // make a list of all preferences sections
  //
  var tabs = [];
  var len = prefChild.length;
  for( key = 0; key < len; key++ ) {
  if( prefChild[key].tagName &&
      prefChild[key].tagName.toLowerCase() == 'fieldset' )
    tabs.push(prefChild[key]);
  }
 
  //
  // Create Widgets for all registered config keys
  //
  var w_div, w_label, w_ctrl, wt;
  for( key in JSconfig.meta ) {
  w_div = document.createElement( 'div' );
 
  w_label = document.createElement( 'LABEL' );
  w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) );
  w_label.htmlFor = JSconfig.prefix + key;
 
  wt = typeof( JSconfig.meta[key].default_value );
 
  w_ctrl = document.createElement( 'input' );
  w_ctrl.id = JSconfig.prefix + key;
 
  // before insertion into the DOM tree
  switch( wt ) {
    case 'boolean' : w_ctrl.type = 'checkbox'; break;
    case 'string'  : w_ctrl.type = 'text'; break;
  }
 
  w_div.appendChild( w_label );
  w_div.appendChild( w_ctrl );
  tabs[JSconfig.meta[key].page].appendChild( w_div );
 
  // after insertion into the DOM tree
  switch( wt ) {
    case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
    case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
  }
 
  }
  $('#preferences').parent().on( 'submit', JSconfig.evaluateForm );
}
};
 
JSconfig.readCookies();
$(JSconfig.setUpForm);
 
if(location.href.indexOf('rtl=1') !== -1) {
mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Gadget-rtl.css&action=raw&ctype=text/css', 'text/css');
}
 
// Import local or interwiki page as script
// @deprecated since MediaWiki 1.17: Use mw.loader.load(url) or $.getScript(url, callback) instead.
function importScript(page, lang) {
var query = '?title=' + encodeURIComponent(page.replace(' ','_')) + '&action=raw&ctype=text/javascript';
if (lang) {
mw.loader.load('//' + lang + '.wikipedia.org/w/index.php' + query);
} else {
mw.loader.load('//meta.wikimedia.org' + mw.config.get( 'wgScript' ) + query);
}
}
 
( function () {
var conf = mw.config.get( [
'wgCanonicalSpecialPageName',
'wgUserGroups',
'wgPageName',
'wgUserName'
] );
 
// Multilingual description.js from commons
mw.loader.load('//commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-LanguageSelect.js&action=raw&ctype=text/javascript');
 
// Tabs
mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Tabs.js&action=raw&ctype=text/javascript');
 
// Handle template:InterProject
mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:InterProject.js&action=raw&ctype=text/javascript');
 
// Help:Diff
if ( conf.wgPageName === 'Help:Diff' ) {
    mw.loader.load( 'mediawiki.action.history.diff' );
}
 
/**
* IE fixes as required
* (includes hlist fixup for IE)
*/
mw.loader.using( 'jquery.client', function() {
    if ( $.client.profile().name === 'msie' ) {
        mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Common.js/IEFixes.js&action=raw&ctype=text/javascript' );
    }
} );
 
}() );
 
mw.loader.using( ['mediawiki.util'] ).done( function () {
/**
* @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
* @rev 6
*/
var extraCSS = mw.util.getParamValue( 'withCSS' ),
    extraJS = mw.util.getParamValue( 'withJS' );
if ( extraCSS ) {
    if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {
        mw.loader.load( '/w/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css' );
    } else {
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );
    }
}
if ( extraJS ) {
    if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {
        mw.loader.load( '/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript' );
    } else {
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
    }
}
});

Latest revision as of 02:38, 20 May 2022

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

/*The following was retrieved from http://www.mediawiki.org/wiki/Manual:Collapsible_tables --[[User:Macbeth|Macbeth]] 07:31, 30 November 2010 (CST)*/

/*The following was retrieved from https://meta.wikimedia.org/wiki/MediaWiki:Common.js --[[User:Blue|Blue]] 19:35, 19 May 2022 (PST) upon upgrading Wiki to 1.37.2 - AddOnloadHook was depreciated... */

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

/**
 * Collapsible tables
 *
 * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
 * @maintainer [[User:R. Koot]] (on Wikipedia)
 */

var autoCollapse = 2;
var collapseCaption = 'hide';
var expandCaption = 'show';

function hasClass( element, className ) {
	var Classes = ( element && element.className && element.className.split( " " ) ) || [];
	for ( var i = 0; i < Classes.length; i++ ) {
		if ( Classes[i] == className ) {
			return true;
		}
	}
	return false;
}

function collapseTable( tableIndex ) {
	var i;
	var Button = document.getElementById( 'collapseButton' + tableIndex );
	var Table = document.getElementById( 'collapsibleTable' + tableIndex );

	if ( !Table || !Button ) {
		return false;
	}

	var Rows = Table.getElementsByTagName( 'tr' );

	if ( Button.firstChild.data == collapseCaption ) {
		for ( i = 1; i < Rows.length; i++ ) {
			Rows[i].style.display = 'none';
		}
		Button.firstChild.data = expandCaption;
	} else {
		for ( i = 1; i < Rows.length; i++ ) {
			Rows[i].style.display = Rows[0].style.display;
		}
		Button.firstChild.data = collapseCaption;
	}
}

function createCollapseButtons() {
	var i;
	var tableIndex = 0;
	var NavigationBoxes = {};
	var Tables = document.getElementsByTagName( 'table' );

	for ( i = 0; i < Tables.length; i++ ) {
		if ( hasClass( Tables[i], 'collapsible' ) ) {
			NavigationBoxes[ tableIndex ] = Tables[i];
			Tables[i].setAttribute( 'id', 'collapsibleTable' + tableIndex );

			var Button = document.createElement( 'span' );
			var ButtonLink = document.createElement( 'a' );
			var ButtonText = document.createTextNode( collapseCaption );

			Button.style.styleFloat = 'right';
			Button.style.cssFloat = 'right';
			Button.style.fontWeight = 'normal';
			Button.style.textAlign = 'right';
			Button.style.width = '6em';

			ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );
			ButtonLink.setAttribute( 'href', 'javascript:collapseTable(' + tableIndex + ');' );
			ButtonLink.appendChild( ButtonText );

			Button.appendChild( document.createTextNode( '[' ) );
			Button.appendChild( ButtonLink );
			Button.appendChild( document.createTextNode( ']' ) );

			var Header = Tables[i].getElementsByTagName( 'tr' )[0].getElementsByTagName( 'th' )[0];
			/* only add button and increment count if there is a header row to work with */
			if (Header) {
				Header.insertBefore( Button, Header.childNodes[0] );
				tableIndex++;
			}
		}
	}

	for ( i = 0; i < tableIndex; i++ ) {
		if ( hasClass( NavigationBoxes[i], 'collapsed' ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], 'autocollapse' ) ) ) {
			collapseTable( i );
		}
	}
}

$( createCollapseButtons );


/**
 * Dynamic Navigation Bars (experimental)
 *
 *  See [[Wikipedia:NavFrame]].
 */

// set up the words in your language
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';

// shows and hides content and picture (if available) of navigation bars
// Parameters:
// indexNavigationBar: the index of navigation bar to be toggled
function toggleNavigationBar(indexNavigationBar) {
	var NavChild;
	var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar);
	var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar);

	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 (hasClass(NavChild, 'NavPic')) {
				 NavChild.style.display = 'block';
			 }
			 if (hasClass(NavChild, 'NavContent')) {
				 NavChild.style.display = 'block';
			 }
		 }
		 NavToggle.firstChild.data = NavigationBarHide;
	}
}

// adds show/hide-button to navigation bars
function createNavigationBarToggleButton(){
	var indexNavigationBar = 0;
	// iterate over all < div >-elements
	var divs = document.getElementsByTagName( 'div' );
	for (var i = 0; NavFrame = divs[i]; i++) {
		// if found a navigation bar
		if ( hasClass(NavFrame, 'NavFrame' )) {

			indexNavigationBar++;
			var NavToggle = document.createElement('a');
			NavToggle.className = 'NavToggle';
			NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
			NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

			var NavToggleText = document.createTextNode(NavigationBarHide);
			for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
				if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, '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(var j=0; j < NavFrame.childNodes.length; j++) {
				if (hasClass(NavFrame.childNodes[j], 'NavHead')) {
					NavFrame.childNodes[j].appendChild(NavToggle);
				}
			}
			NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
		}
	}
}

$( createNavigationBarToggleButton );


// Shuffle for election candidates
function dshuf() {
	var shufsets = {};
	var rx = new RegExp('dshuf' + '\\s+(dshufset\\d+)', 'i');
	var divs = document.getElementsByTagName('div');
	var i = divs.length;
	while (i--) {
		if (rx.test(divs[i].className)) {
			if (typeof shufsets[RegExp.$1] === 'undefined') {
				shufsets[RegExp.$1] = {};
				shufsets[RegExp.$1].inner = [];
				shufsets[RegExp.$1].member = [];
			}
			shufsets[RegExp.$1].inner.push({
				key: Math.random(),
				html: divs[i].innerHTML
			});
			shufsets[RegExp.$1].member.push(divs[i]);
		}
	}
	for (shufset in shufsets) {
		shufsets[shufset].inner.sort(function(a, b) {
			return a.key - b.key;
		});
		i = shufsets[shufset].member.length;
		while (i--) {
			shufsets[shufset].member[i].innerHTML = shufsets[shufset].inner[i].html;
			shufsets[shufset].member[i].style.display = 'block';
		}
	}
}
$(dshuf);

/**
 * JSconfig
 *
 * Global configuration options to enable/disable and configure
 * specific script features from [[MediaWiki:Common.js]] and
 * [[MediaWiki:Monobook.js]]
 * This framework adds config options (saved as cookies) to [[Special:Preferences]]
 * For a more permanent change you can override the default settings in your
 * [[Special:Mypage/monobook.js]]
 * for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
 *
 * Maintainer: [[User:Dschwen]]
 */

var JSconfig =
{
prefix : 'jsconfig_',
keys : {},
meta : {},

//
// Register a new configuration item
//  * name          : String, internal name
//  * default_value : String or Boolean (type determines configuration widget)
//  * description   : String, text appearing next to the widget in the preferences
//  * prefpage      : Integer (optional), section in the preferences to insert the widget:
//                     0 : User profile
//                     1 : Skin
//                     2 : Math
//                     3 : Files
//                     4 : Date and time
//                     5 : Editing
//                     6 : Recent changes
//                     7 : Watchlist
//                     8 : Search
//                     9 : Misc
//
// Access keys through JSconfig.keys[name]
//
registerKey : function( name, default_value, description, prefpage )
{
  if( typeof(JSconfig.keys[name]) === 'undefined' )
   JSconfig.keys[name] = default_value;
  else {

   // all cookies are read as strings,
   // convert to the type of the default value
   switch( typeof(default_value) )
   {
    case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
    case 'number'  : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
   }

  }

  JSconfig.meta[name] = { 'description' : description, 'page' : prefpage || 0, 'default_value' : default_value };
},

readCookies : function()
{
  var cookies = document.cookie.split("; ");
  var p =JSconfig.prefix.length;
  var i;

  for( var key in cookies )
  {
   if( cookies[key].substring(0,p) == JSconfig.prefix )
   {
    i = cookies[key].indexOf('=');
    //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
    JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
   }
  }
},

writeCookies : function()
{
  for( var key in JSconfig.keys )
   document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC';
},

evaluateForm : function()
{
  var w_ctrl,wt;
  //alert('about to save JSconfig');
  for( var key in JSconfig.meta ) {
   w_ctrl = document.getElementById( JSconfig.prefix + key );
   if( w_ctrl )
   {
    wt = typeof( JSconfig.meta[key].default_value );
    switch( wt ) {
     case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
     case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
    }
   }
  }

  JSconfig.writeCookies();
  return true;
},

setUpForm : function()
{
  var key;
  var prefChild = document.getElementById('preferences');
  if( !prefChild ) return;
  prefChild = prefChild.childNodes;

  //
  // make a list of all preferences sections
  //
  var tabs = [];
  var len = prefChild.length;
  for( key = 0; key < len; key++ ) {
   if( prefChild[key].tagName &&
       prefChild[key].tagName.toLowerCase() == 'fieldset' )
    tabs.push(prefChild[key]);
  }

  //
  // Create Widgets for all registered config keys
  //
  var w_div, w_label, w_ctrl, wt;
  for( key in JSconfig.meta ) {
   w_div = document.createElement( 'div' );

   w_label = document.createElement( 'LABEL' );
   w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) );
   w_label.htmlFor = JSconfig.prefix + key;

   wt = typeof( JSconfig.meta[key].default_value );

   w_ctrl = document.createElement( 'input' );
   w_ctrl.id = JSconfig.prefix + key;

   // before insertion into the DOM tree
   switch( wt ) {
    case 'boolean' : w_ctrl.type = 'checkbox'; break;
    case 'string'  : w_ctrl.type = 'text'; break;
   }

   w_div.appendChild( w_label );
   w_div.appendChild( w_ctrl );
   tabs[JSconfig.meta[key].page].appendChild( w_div );

   // after insertion into the DOM tree
   switch( wt ) {
    case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
    case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
   }

  }
  $('#preferences').parent().on( 'submit', JSconfig.evaluateForm );
}
};

JSconfig.readCookies();
$(JSconfig.setUpForm);

if(location.href.indexOf('rtl=1') !== -1) {
	mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Gadget-rtl.css&action=raw&ctype=text/css', 'text/css');
}

// Import local or interwiki page as script
// @deprecated since MediaWiki 1.17: Use mw.loader.load(url) or $.getScript(url, callback) instead.
function importScript(page, lang) {
	var query = '?title=' + encodeURIComponent(page.replace(' ','_')) + '&action=raw&ctype=text/javascript';
	if (lang) {
		mw.loader.load('//' + lang + '.wikipedia.org/w/index.php' + query);
	} else {
		mw.loader.load('//meta.wikimedia.org' + mw.config.get( 'wgScript' ) + query);
	}
}

( function () {
	var conf = mw.config.get( [
		'wgCanonicalSpecialPageName',
		'wgUserGroups',
		'wgPageName',
		'wgUserName'
	] );

	// Multilingual description.js from commons
	mw.loader.load('//commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-LanguageSelect.js&action=raw&ctype=text/javascript');

	// Tabs
	mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Tabs.js&action=raw&ctype=text/javascript');

	// Handle template:InterProject
	mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:InterProject.js&action=raw&ctype=text/javascript');

	// Help:Diff
	if ( conf.wgPageName === 'Help:Diff' ) {
	    mw.loader.load( 'mediawiki.action.history.diff' );
	}

	/**
	 * IE fixes as required
	 * (includes hlist fixup for IE)
	 */
	mw.loader.using( 'jquery.client', function() {
	    if ( $.client.profile().name === 'msie' ) {
	        mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Common.js/IEFixes.js&action=raw&ctype=text/javascript' );
	    }
	} );

}() );

mw.loader.using( ['mediawiki.util'] ).done( function () {
	/**
	 * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
	 * @rev 6
	 */
	var extraCSS = mw.util.getParamValue( 'withCSS' ),
	    extraJS = mw.util.getParamValue( 'withJS' );
	
	if ( extraCSS ) {
	    if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {
	        mw.loader.load( '/w/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css' );
	    } else {
	        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );
	    }
	}
	
	if ( extraJS ) {
	    if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {
	        mw.loader.load( '/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript' );
	    } else {
	        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
	    }
	}
});