MediaWiki:Common.js: Difference between revisions

From BoyWiki
No edit summary
No edit summary
Line 169: Line 169:
   //xhr1.send('');
   //xhr1.send('');
   xhr2.open('GET', '/fr/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
   xhr2.open('GET', '/fr/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
   xhr2.onreadystatechange = fuoow_hdlr(xhr2,'fr');
   xhr2.onreadystatechange = function() {fuoow_hdlr(xhr2,'fr');}
   xhr2.send('');
   xhr2.send('');
   //xhr3.open('GET', '/de/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
   //xhr3.open('GET', '/de/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);

Revision as of 20:06, 12 July 2014

/* 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(xhr1,'en');
   //xhr1.send('');
   xhr2.open('GET', '/fr/api.php?action=query&list=imageusage&iutitle='+wgPageName+'&iunamespace=0&iulimit=10&format=xml', true);
   xhr2.onreadystatechange = function() {fuoow_hdlr(xhr2,'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(xhr3,'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(xhr,lg) {
alert(xhr.readyState+'  '+xhr.responseText);
   if (xhr.readyState == 4 && xhr.status == 200) {
      var pages = xhr.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;
   }
}