MediaWiki:Common.js
From BoyWiki
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. */
/**
* Diverses fonctions manipulant les classes (utilisées par les boîtes déroulantes)
* isClass et whichClass depuis http://fr.wikibooks.org/w/index.php?title=MediaWiki:Common.js&oldid=140211
* hasClass, addClass, removeClass et eregReplace depuis http://drupal.org.in/doc/misc/drupal.js.source.html
* surveiller l'implémentation de .classList http://www.w3.org/TR/2008/WD-html5-diff-20080122/#htmlelement-extensions
*/
function isClass(element, classe) {
return hasClass(element, classe);
}
function whichClass(element, classes) {
var s=" "+element.className+" ";
for(var i=0;i<classes.length;i++)
if (s.indexOf(" "+classes[i]+" ")>=0) return i;
return -1;
}
function hasClass(node, className) {
if (node.className == className) {
return true;
}
var reg = new RegExp('(^| )'+ className +'($| )')
if (reg.test(node.className)) {
return true;
}
return false;
}
function addClass(node, className) {
if (hasClass(node, className)) {
return false;
}
node.className += ' '+ className;
return true;
}
function removeClass(node, className) {
if (!hasClass(node, className)) {
return false;
}
node.className = eregReplace('(^|\\s+)'+ className +'($|\\s+)', ' ', node.className);
return true;
}
function eregReplace(search, replace, subject) {
return subject.replace(new RegExp(search,'g'), replace);
}
/**
* Drop-down box [[Template:DD-box]]
*/
var NavigationBarShowDefault = 0;
var collapseCaption = ' ⇧ ';
var expandCaption = ' ⇩ ';
function toggleNavigationBar(indexNavigationBar) {
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
if (!NavFrame || !NavToggle) return;
// overload labels show/hide with title attribute
// exemple : title="[down]:[up]"
var caption = [expandCaption, collapseCaption];
if (NavFrame.title && NavFrame.title.length > 0) {
caption = NavFrame.title.split(":");
if (caption.length < 2) caption.push(collapseCaption);
}
// if shown now
if (NavToggle.firstChild.data == caption[1]) {
for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'none';
if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[0];
if (hasClass(NavChild, 'NavContent')) {
NavChild.style.maxHeight = '0px';
NavChild.style.overflow = 'hidden';
NavChild.style.opacity = '0';
}
}
// if hidden now
} else if (NavToggle.firstChild.data == caption[0]) {
for ( var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {
if (hasClass(NavChild, 'NavPic')) NavChild.style.display = 'block';
if (hasClass(NavChild, 'NavToggle')) NavChild.firstChild.data = caption[1];
if (hasClass(NavChild, 'NavContent')) {
NavChild.style.maxHeight = '300px';
NavChild.style.overflow = 'auto';
NavChild.style.opacity = '1';
}
}
}
}
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton() {
var indexNavigationBar = 0;
var NavFrame;
// iterate over all < div >-elements
for( var i=0; NavFrame = document.getElementsByTagName("div")[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 + ');');
// surcharge des libellés dérouler/enrouler grâce a l'attribut title
var caption = collapseCaption;
if (NavFrame.title && NavFrame.title.indexOf(":") > 0) {
caption = NavFrame.title.split(":")[1];
}
var NavToggleText = document.createTextNode(caption);
NavToggle.appendChild(NavToggleText);
// add NavToggle-Button as first div-element
// in <div class="NavFrame">
NavFrame.insertBefore( NavToggle, NavFrame.firstChild );
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
}
}
// if more Navigation Bars found than Default: hide all
if (NavigationBarShowDefault < indexNavigationBar) {
for( var i=1; i<=indexNavigationBar; i++ ) {
toggleNavigationBar(i);
}
}
}
addOnloadHook(createNavigationBarToggleButton);
/************************************************************/
/* Create XHR object for http req */
function createxhrobject() {
if (window.XMLHttpRequest) { // all browsers
return new XMLHttpRequest();
}
else if (window.ActiveXObject) { // IE < 7
return new ActiveXObject("Msxml2.XMLHTTP");
}
else return null;
}
/************************************************************/
/* File usage on other wikis - Search image usage */
function fuoow() {
if (wgAction != "view" || wgNamespaceNumber != 6) return;
var xhr1 = createxhrobject();
if (xhr1 == null) return;
var xhr2 = createxhrobject();
if (xhr2 == null) return;
var xhr3 = createxhrobject();
if (xhr3 == null) return;
xhr1.open('GET', '/en/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
xhr1.onreadystatechange = fuoow_hdlr('en');
xhr1.send('');
xhr2.open('GET', '/fr/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
xhr2.onreadystatechange = fuoow_hdlr('fr');
xhr2.send('');
xhr3.open('GET', '/de/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
xhr3.onreadystatechange = fuoow_hdlr('de');
xhr3.send('');
var h2 = document.createElement('h2');
h2.id = 'globalusage';
var h2txt = document.createTextNode('File usage on other wikis');
h2.appendChild(h2txt);
var locat = document.getElementById('mw-imagepage-section-linkstoimage') || document.getElementById('mw-imagepage-nolinkstoimage');
locat.parentNode.insertBefore(h2, locat.nextSibling);
var ul = document.createElement('ul');
ul.id = 'imagepage-section-globalusage';
locat.parentNode.insertBefore(ul, locat.nextSibling.nextSibling);
}
addOnloadHook(fuoow);
/* Request handler and display */
function fuoow_hdlr(lg) {
if (this.readyState != 4 || this.status != 200) return;
var pages = this.responseXML.documentElement;
var pglst = pages.getElementsByTagName('imageusage')[0].childNodes;
var pgs = '';
for (var i = 0; i < pglst.length ; i++) {
pgs += '<li><a href="/'+lg+'/'+pglst[i].getAttribute('title')+'">'+pglst[i].getAttribute('title')+'</a></li>';
}
if (pgs.length) document.getElementById('imagepage-section-globalusage').innerHTML += pgs;
}