MediaWiki:Common.js
Jump to navigation
Jump to search
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)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
/**
* JS Tab System, jacked and hacked from the jsprefs in wikibits.js
*
* Original code by Dantman
* Refactored a bit by Jack Phoenix on 11 April 2014
* @note No doubt that this could be greatly simplified by converting this to jQuery,
* but I think it's nice to have this JS thingy fully reusable.
*/
{{Help page}}
/**
* JS Tab System, jacked and hacked from the jsprefs in wikibits.js
*
* Original code by Dantman
* Refactored a bit by Jack Phoenix on 11 April 2014
* @note No doubt that this could be greatly simplified by converting this to jQuery,
* but I think it's nice to have this JS thingy fully reusable.
*/
var TabSystem = {
/**
* @property {boolean}
* Is the user's browser a KHTML-based one (usually, but not always, Konqueror)?
*/
isKHTML: ( navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ) ),
/**
* @property {boolean}
* Is the user's browser Opera?
*/
isOpera: navigator.userAgent.toLowerCase().indexOf( 'opera' ) != -1,
/*
Written by Jonathan Snook, http://www.snook.ca/jonathan
Add-ons by Robert Nyman, http://www.robertnyman.com
Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
*/
getElementsByClassName: function( oElm, strTagName, oClassNames ) {
var arrReturnElements = [];
if ( typeof oElm.getElementsByClassName == 'function' ) {
/* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
if ( strTagName == '*' ) {
return arrNativeReturn;
}
for ( var h = 0; h < arrNativeReturn.length; h++ ) {
if ( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) {
arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
}
}
return arrReturnElements;
}
var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
var arrRegExpClassNames = [];
if ( typeof oClassNames == 'object' ) {
for ( var i = 0; i < oClassNames.length; i++ ) {
arrRegExpClassNames[arrRegExpClassNames.length] =
new RegExp( "(^|\\s)" + oClassNames[i].replace( /\-/g, "\\-" ) + "(\\s|$)" );
}
} else {
arrRegExpClassNames[arrRegExpClassNames.length] =
new RegExp( "(^|\\s)" + oClassNames.replace( /\-/g, "\\-" ) + "(\\s|$)" );
}
var oElement;
var bMatchesAll;
for ( var j = 0; j < arrElements.length; j++ ) {
oElement = arrElements[j];
bMatchesAll = true;
for ( var k = 0; k < arrRegExpClassNames.length; k++ ) {
if ( !arrRegExpClassNames[k].test( oElement.className ) ) {
bMatchesAll = false;
break;
}
}
if ( bMatchesAll ) {
arrReturnElements[arrReturnElements.length] = oElement;
}
}
return arrReturnElements;
},
/**
* Main function that performs all the magic on all div elements that have
* class="tab" and are inside a div that has class="tabcontainer".
*/
main: function() {
var tabcontainers = TabSystem.getElementsByClassName( document, 'div', 'tabcontainer' );
for ( var tc = 0; tc < tabcontainers.length; tc++ ) {
if ( !tabcontainers[tc] || !document.createElement ) {
return;
}
if ( tabcontainers[tc].nodeName.toLowerCase() == 'a' ) {
return; // Occasional IE problem
}
tabcontainers[tc].className += ' jstabs';
var sections = [];
var children = tabcontainers[tc].childNodes;
var seci = 0;
for ( var i = 0; i < children.length; i++ ) {
if ( children[i].className && children[i].className.match( /tab/i ) ) {
children[i].id = 'tabsection-' + seci + '-' + tc;
children[i].className += ' tabsection';
// Opera and KHTML-based browsers get a special class
if ( TabSystem.isOpera || TabSystem.isKHTML ) {
children[i].className += ' tabsection operatabsection';
}
var legends = TabSystem.getElementsByClassName( children[i], 'div', 'tab' );
sections[seci] = {};
legends[0].className = 'mainTab';
if ( legends[0] && legends[0].firstChild.nodeValue ) {
sections[seci].text = legends[0].firstChild.nodeValue;
} else {
sections[seci].text = '# ' + seci;
}
sections[seci].secid = children[i].id;
seci++;
if ( sections.length != 1 ) {
children[i].style.display = 'none';
} else {
var selectedid = children[i].id;
}
}
}
var toc = document.createElement( 'ul' );
toc.className = 'tabtoc';
toc.id = 'tabtoc-' + tc;
toc.selectedid = selectedid;
for ( i = 0; i < sections.length; i++ ) {
var li = document.createElement( 'li' );
if ( i === 0 ) {
li.className = 'selected';
}
var a = document.createElement( 'a' );
a.href = '#' + sections[i].secid;
a.onmousedown = a.onclick = TabSystem.uncoverTabSection;
a.appendChild( document.createTextNode( sections[i].text ) );
a.tc = tc;
a.secid = sections[i].secid;
li.appendChild( a );
toc.appendChild( li );
}
tabcontainers[tc].parentNode.insertBefore( toc, tabcontainers[tc] );
}
},
/**
* Show the contents of a tab section when the user clicks on the tab.
*
* @return {boolean} Always false
*/
uncoverTabSection: function() {
var oldsecid = this.parentNode.parentNode.selectedid;
var newsec = document.getElementById( this.secid );
if ( oldsecid != this.secid ) {
var ul = document.getElementById( 'tabtoc-' + this.tc );
document.getElementById( oldsecid ).style.display = 'none';
newsec.style.display = 'block';
ul.selectedid = this.secid;
var lis = ul.getElementsByTagName( 'li' );
for ( var i = 0; i < lis.length; i++ ) {
lis[i].className = '';
}
this.parentNode.className = 'selected';
}
return false;
}
};
// Attach the onload handler. This is the only not-so-self-contained part of
// this script: we use either jQuery or the older standard MediaWiki onload
// mechanism to run the script on page load. If you're going to use this little
// script on a non-MediaWiki-based site, you'll want to
if ( typeof $ === 'function' ) {
$( document ).ready( function() {
TabSystem.main();
} );
} else if ( typeof addOnloadHook === 'function' ) {
addOnloadHook( TabSystem.main );
}
//function to open link in new tab
function ExtLinks() {
var extlinks = getElementsByClassName('extlink');
for (var i=0, il=extlinks.length; i<il; i++) {
extlinks[i].setAttribute('target','_blank');
};
};
addOnloadHook(ExtLinks);
/**
* @source https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
* @revision 2017-05-16
*/
mw.loader.using( ['mediawiki.util', 'mediawiki.notify'], function () {
var extraCSS = mw.util.getParamValue( 'withCSS' ),
extraJS = mw.util.getParamValue( 'withJS' );
if ( extraCSS ) {
// DONT REMOVE THIS IF (unless you are OK with CSRF attacks)
if ( /^MediaWiki:[^&<>=%#]*\.css$/.test( extraCSS ) ) {
mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( 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 ) {
// DONT REMOVE THIS IF (unless you are OK with XSS & CSRF attacks)
if ( /^MediaWiki:[^&<>=%#]*\.js$/.test( extraJS ) ) {
mw.loader.load( '/wiki/index.php?title=' + encodeURIComponent( extraJS ) + '&action=raw&ctype=text/javascript' );
} else {
mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );
}
}
});
document.getElementById("collapse-global").addEventListener("click", function(event){
event.classList.remove("mw-collapsible-toggle-collapsed");
});