MediaWiki:Common.js : Différence entre versions

De Casio Universal Wiki
Aller à : navigation, rechercher
(nom d'utilisateur retiré)
Ligne 1 : Ligne 1 :
 +
/**
 +
* insertAfter : insérer un élément dans une page
 +
*/
 +
function insertAfter(parent, node, referenceNode) {
 +
  parent.insertBefore(node, referenceNode.nextSibling);
 +
}
 +
 +
/**
 +
* getElementsByClass : rechercher les éléments de la page dont le paramètre "class" est celui recherché
 +
*/
 +
function getElementsByClass(searchClass, node, tag) {
 +
  if (node == null) node = document;
 +
  if (tag == null) tag = '*';
 +
  return getElementsByClassName(node, tag, searchClass);
 +
}
 +
 +
/**
 +
* Diverses fonctions manipulant les classes
 +
* Utilise des expressions régulières et un cache pour de meilleures perfs
 +
* 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) {
 +
    var haystack = node.className;
 +
    if(!haystack) return false;
 +
    if (className === haystack) {
 +
        return true;
 +
    }
 +
    return (" " + haystack + " ").indexOf(" " + className + " ") > -1;
 +
}
 +
 +
function addClass(node, className) {
 +
    if (hasClass(node, className)) {
 +
        return false;
 +
    }
 +
    var cache = node.className;
 +
    if (cache) {
 +
        node.className = cache + ' ' + className;
 +
    } else {
 +
        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);
 +
}
 +
 +
 +
/**
 +
* Récupère la valeur du cookie
 +
*/
 +
function getCookieVal(name) {
 +
  var cookiePos = document.cookie.indexOf(name + "=");
 +
  var cookieValue = false;
 +
  if (cookiePos > -1) {
 +
    cookiePos += name.length + 1;
 +
    var endPos = document.cookie.indexOf(";", cookiePos);
 +
    if (endPos > -1)
 +
      cookieValue = document.cookie.substring(cookiePos, endPos);
 +
    else
 +
      cookieValue = document.cookie.substring(cookiePos);
 +
  }
 +
  return cookieValue;
 +
}
 +
 +
// Récupère proprement le contenu textuel d'un noeud et de ses noeuds descendants
 +
// Copyright Harmen Christophe, http://openweb.eu.org/articles/validation_avancee, CC
 +
function getTextContent(oNode) {
 +
  if(!oNode) return null;
 +
  if (typeof(oNode.textContent)!="undefined") {return oNode.textContent;}
 +
  switch (oNode.nodeType) {
 +
    case 3: // TEXT_NODE
 +
    case 4: // CDATA_SECTION_NODE
 +
      return oNode.nodeValue;
 +
      break;
 +
    case 7: // PROCESSING_INSTRUCTION_NODE
 +
    case 8: // COMMENT_NODE
 +
      if (getTextContent.caller!=getTextContent) {
 +
        return oNode.nodeValue;
 +
      }
 +
      break;
 +
    case 9: // DOCUMENT_NODE
 +
    case 10: // DOCUMENT_TYPE_NODE
 +
    case 12: // NOTATION_NODE
 +
      return null;
 +
      break;
 +
  }
 +
  var _textContent = "";
 +
  oNode = oNode.firstChild;
 +
  while (oNode) {
 +
    _textContent += getTextContent(oNode);
 +
    oNode = oNode.nextSibling;
 +
  }
 +
  return _textContent;
 +
}
 +
 +
// Array.indexOf : recherche un élément dans un tableau
 +
 +
if (!Array.prototype.indexOf) {
 +
Array.prototype.indexOf = function(obj) {
 +
for (var i=0; i<this.length; i++) {
 +
if (this[i] == obj){
 +
return i;
 +
}
 +
}
 +
return -1;
 +
}
 +
}
 +
 +
if(!String.prototype.HTMLize){
 +
  String.prototype.HTMLize = function() {
 +
    var chars = new Array('&','<','>','"');
 +
    var entities = new Array('amp','lt','gt','quot');
 +
    var string = this;
 +
    for (var i=0; i<chars.length; i++) {
 +
      var regex = new RegExp(chars[i], "g");
 +
      string = string.replace(regex, '&' + entities[i] + ';');
 +
    }
 +
    return string;
 +
  }
 +
}
 +
 +
 +
/**********************************************************************************************************/
 +
/* Fonctions générales MediaWiki (pallient les limitations du logiciel)                                  */
 +
/* Surveiller : http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js?view=log  */
 +
/**********************************************************************************************************/
 +
 +
/*
 +
* Fonction générales de lancement de fonctions ou de script
 +
* DÉPRÉCIÉ : utiliser addOnloadHook simplement
 +
*/
 +
function addLoadEvent(func) {
 +
  addOnloadHook(func);
 +
}
 +
 +
/**
 +
* Insérer un JavaScript d'une page particulière, idée de Mickachu
 +
* DÉPRÉCIÉ : utiliser importScript qui fait partie du logiciel
 +
*/
 +
function loadJs(page) {
 +
  importScript(page);
 +
}
 +
 +
/**
 +
* Projet JavaScript
 +
*/
 +
function obtenir(name) {
 +
  importScript('MediaWiki:Gadget-' + name + '.js');
 +
}
 +
 +
/**
 +
* Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
 +
*/
 +
function TransformeEnDiscussion() {
 +
  if(  (wgPageName.search('Wikipédia:Le_Bistro') != -1)
 +
    || (wgPageName.search('Wikipédia:Bulletin_des_administrateurs') != -1)
 +
    || document.getElementById('transformeEnPageDeDiscussion')) {
 +
    removeClass(document.body, 'ns-subject');
 +
    addClass(document.body, 'ns-talk');
 +
  }
 +
}
 +
addOnloadHook(TransformeEnDiscussion);
 +
 +
/**
 +
* Transformer certaines pages en pseudo-article
 +
* c'est raisonnable ? --Tavernier
 +
*/
 +
function TransformeEnArticle() {
 +
  var transformeEnA = document.getElementById("transformeEnArticle");
 +
  if(transformeEnA) document.body.className = "ns-0";
 +
}
 +
addOnloadHook(TransformeEnArticle);
 +
 +
/**
 +
* Ajouter un bouton à la fin de la barre d'outils
 +
*/
 +
function addCustomButton(imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
 +
  mwCustomEditButtons[mwCustomEditButtons.length] =
 +
    {"imageId": imageId,
 +
    "imageFile": imageFile,
 +
    "speedTip": speedTip,
 +
    "tagOpen": tagOpen,
 +
    "tagClose": tagClose,
 +
    "sampleText": sampleText};
 +
}
 +
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Any JavaScript here will be loaded for all users on every page load. */
 
/**  
 
/**  

Version du 20 juin 2012 à 16:39

/**
 * insertAfter : insérer un élément dans une page
 */
function insertAfter(parent, node, referenceNode) {
  parent.insertBefore(node, referenceNode.nextSibling); 
}
 
/**
 * getElementsByClass : rechercher les éléments de la page dont le paramètre "class" est celui recherché
 */
function getElementsByClass(searchClass, node, tag) {
  if (node == null) node = document;
  if (tag == null) tag = '*';
  return getElementsByClassName(node, tag, searchClass);
}
 
/**
 * Diverses fonctions manipulant les classes
 * Utilise des expressions régulières et un cache pour de meilleures perfs
 * 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) {
    var haystack = node.className;
    if(!haystack) return false;
    if (className === haystack) {
        return true;
    }
    return (" " + haystack + " ").indexOf(" " + className + " ") > -1;
}
 
function addClass(node, className) {
    if (hasClass(node, className)) {
        return false;
    }
    var cache = node.className;
    if (cache) {
        node.className = cache + ' ' + className;
    } else {
        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);
}
 
 
/**
 * Récupère la valeur du cookie
 */
function getCookieVal(name) {
  var cookiePos = document.cookie.indexOf(name + "=");
  var cookieValue = false;
  if (cookiePos > -1) {
    cookiePos += name.length + 1;
    var endPos = document.cookie.indexOf(";", cookiePos);
    if (endPos > -1)
      cookieValue = document.cookie.substring(cookiePos, endPos);
    else
      cookieValue = document.cookie.substring(cookiePos);
  }
  return cookieValue;
}
 
// Récupère proprement le contenu textuel d'un noeud et de ses noeuds descendants
// Copyright Harmen Christophe, http://openweb.eu.org/articles/validation_avancee, CC
function getTextContent(oNode) {
  if(!oNode) return null;
  if (typeof(oNode.textContent)!="undefined") {return oNode.textContent;}
  switch (oNode.nodeType) {
    case 3: // TEXT_NODE
    case 4: // CDATA_SECTION_NODE
      return oNode.nodeValue;
      break;
    case 7: // PROCESSING_INSTRUCTION_NODE
    case 8: // COMMENT_NODE
      if (getTextContent.caller!=getTextContent) {
        return oNode.nodeValue;
      }
      break;
    case 9: // DOCUMENT_NODE
    case 10: // DOCUMENT_TYPE_NODE
    case 12: // NOTATION_NODE
      return null;
      break;
  }
  var _textContent = "";
  oNode = oNode.firstChild;
  while (oNode) {
    _textContent += getTextContent(oNode);
    oNode = oNode.nextSibling;
  }
  return _textContent;
}
 
// Array.indexOf : recherche un élément dans un tableau
 
if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function(obj) {
		for (var i=0; i<this.length; i++) {
			if (this[i] == obj){
				return i;
			}
		}
		return -1;
	}
}
 
if(!String.prototype.HTMLize){
  String.prototype.HTMLize = function() {
    var chars = new Array('&','<','>','"');
    var entities = new Array('amp','lt','gt','quot');
    var string = this;
    for (var i=0; i<chars.length; i++) {
      var regex = new RegExp(chars[i], "g");
      string = string.replace(regex, '&' + entities[i] + ';');
    }
    return string;
  }
}
 
 
/**********************************************************************************************************/
/* Fonctions générales MediaWiki (pallient les limitations du logiciel)                                   */
/* Surveiller : http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js?view=log  */
/**********************************************************************************************************/
 
/*
 * Fonction générales de lancement de fonctions ou de script
 * DÉPRÉCIÉ : utiliser addOnloadHook simplement
 */
function addLoadEvent(func) {
  addOnloadHook(func);
}
 
/**
 * Insérer un JavaScript d'une page particulière, idée de Mickachu
 * DÉPRÉCIÉ : utiliser importScript qui fait partie du logiciel
 */
function loadJs(page) {
  importScript(page);
}
 
/**
 * Projet JavaScript
 */
function obtenir(name) {
  importScript('MediaWiki:Gadget-' + name + '.js');
}
 
/**
 * Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
 */
function TransformeEnDiscussion() {
  if(  (wgPageName.search('Wikipédia:Le_Bistro') != -1)
    || (wgPageName.search('Wikipédia:Bulletin_des_administrateurs') != -1)
    || document.getElementById('transformeEnPageDeDiscussion')) {
    removeClass(document.body, 'ns-subject');
    addClass(document.body, 'ns-talk');
  }
}
addOnloadHook(TransformeEnDiscussion);
 
/**
 * Transformer certaines pages en pseudo-article
 * c'est raisonnable ? --Tavernier
 */
function TransformeEnArticle() {
   var transformeEnA = document.getElementById("transformeEnArticle");
   if(transformeEnA) document.body.className = "ns-0";
}
addOnloadHook(TransformeEnArticle);
 
/**
 * Ajouter un bouton à la fin de la barre d'outils
 */
function addCustomButton(imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
  mwCustomEditButtons[mwCustomEditButtons.length] =
    {"imageId": imageId,
     "imageFile": imageFile,
     "speedTip": speedTip,
     "tagOpen": tagOpen,
     "tagClose": tagClose,
     "sampleText": sampleText};
}
 
/* Any JavaScript here will be loaded for all users on every page load. */
/** 
 * Boîtes déroulantes
 *
 * Pour [[Modèle:Méta palette de navigation]]
 */
 
var Palette_Enrouler = '[masquer]';
var Palette_Derouler  = '[afficher]';
 
var Palette_max = 1; 
var Palette_index = -1;
 
function Palette_toggle(indexPalette){
  var Button = document.getElementById( "collapseButton" + indexPalette);
  var Table = document.getElementById( "collapsibleTable" + indexPalette);
  if (!Table || !Button) return false;
 
  var Rows = Table.rows;
  var RowDisplay = "none";
  if (Button.firstChild.data == Palette_Derouler) {
    Button.firstChild.data = Palette_Enrouler;
    RowDisplay = Rows[0].style.display;
  } else {
    Button.firstChild.data = Palette_Derouler;
  }
  for (var i = 1; i < Rows.length; i++) {
    Rows[i].style.display = RowDisplay
  }
}
 
function Palette(Element){
  if(!Element) Element = document;
  var TableIndex = 0;
  var TableIndexes = new Array();
  var Tables = Element.getElementsByTagName( "table" ); 
  for ( var i = 0; i < Tables.length; i++ ) {
    if ( hasClass( Tables[i], "collapsible" ) ) {
      var Table = Tables[i];
      var Header = Table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
      /* only add button and increment count if there is a header row to work with */
      if (Header) {
        TableIndex++
        Palette_index++;
        TableIndexes[Palette_index] = Table;
        Table.setAttribute( "id", "collapsibleTable" + Palette_index ); 
        var Button     = document.createElement( "span" );
        var ButtonLink = document.createElement( "a" );
        var ButtonText = document.createTextNode( Palette_Enrouler ); 
        Button.className = "navboxToggle";
        ButtonLink.setAttribute( "id", "collapseButton" + Palette_index );
        ButtonLink.setAttribute( "href", "javascript:;" );
        addHandler( ButtonLink,  "click", new Function( "evt", "Palette_toggle(" + Palette_index + " ); return killEvt( evt );") );
        ButtonLink.appendChild( ButtonText ); 
        Button.appendChild( document.createTextNode("\u00a0"));  //ajout d'un espace insécable pour décoller ce bouton du texte de la celulle
        Button.appendChild( ButtonLink ); 
        Header.insertBefore( Button, Header.childNodes[0] ); 
      }
    }
  } 
  for(var index in TableIndexes){
    var Table = TableIndexes[index];
    if(hasClass(Table,"collapsed")||(TableIndex>Palette_max && hasClass(Table,"autocollapse")))
    Palette_toggle(index); 
  }
}
addOnloadHook(Palette);
 
 
/**
 * Pour [[Modèle:Boîte déroulante]] 
 */
 
var BoiteDeroulante_Enrouler = '[masquer]';
var BoiteDeroulante_Derouler  = '[afficher]'; 
var BoiteDeroulante_max = 0; 
var BoiteDeroulante_index = -1;
 
function BoiteDeroulante_toggle(indexBoiteDeroulante){
      var NavFrame = document.getElementById("NavFrame" + indexBoiteDeroulante);
      var NavToggle = document.getElementById("NavToggle" + indexBoiteDeroulante);
      var CaptionContainer = document.getElementById("NavCaption" + indexBoiteDeroulante);
      if (!NavFrame || !NavToggle || !CaptionContainer) return; 
      var caption = new Array();
      var CaptionSpans = CaptionContainer.getElementsByTagName('span');
      caption[0] = CaptionSpans[0].innerHTML;
      caption[1] = CaptionSpans[1].innerHTML;
 
      var Contents = NavFrame.getElementsByTagName('div');  
      if (NavToggle.innerHTML == caption[1]) {
            NavToggle.innerHTML = caption[0];
            for(var a=0,m=Contents.length;a<m;a++){
                  if(hasClass(Contents[a], "NavContent")){
                        Contents[a].style.display = 'none';
                        return;
                  }
            }
      }else{
            NavToggle.innerHTML = caption[1];
            for(var a=0,m=Contents.length;a<m;a++){
                  if(hasClass(Contents[a], "NavContent")){
                        Contents[a].style.display = 'block';
                        return;
                  }
            }
      }
}
 
function BoiteDeroulante(Element){
      if(!Element) Element = document;
      var NavFrameCount = -1;
      var NavFrames = Element.getElementsByTagName("div");
      for(var i=0,l=NavFrames.length;i<l;i++){
            if(hasClass(NavFrames[i], "NavFrame")){
                  var NavFrame = NavFrames[i];
                  NavFrameCount++;
                  BoiteDeroulante_index++;
 
                  if (NavFrame.title && NavFrame.title.indexOf("/")!=-1) {
                        var Enrouler = NavFrame.title.HTMLize().split("/")[1];
                        var Derouler = NavFrame.title.HTMLize().split("/")[0];
                  }else{
                        var Enrouler = BoiteDeroulante_Enrouler;
                        var Derouler = BoiteDeroulante_Derouler;    
                  }
                  NavFrame.title='';
                  var CaptionContainer = document.createElement('span');
                  CaptionContainer.id = 'NavCaption' + BoiteDeroulante_index;
                  CaptionContainer.style.display = "none";
                  CaptionContainer.innerHTML = '<span>' + Derouler + '</span><span>' + Enrouler + '</span>';
                  NavFrame.appendChild(CaptionContainer);
 
                  var NavToggle = document.createElement("a");
                  NavToggle.className = 'NavToggle';
                  NavToggle.id = 'NavToggle' + BoiteDeroulante_index;
                  NavToggle.href = 'javascript:BoiteDeroulante_toggle(' + BoiteDeroulante_index + ');';
                  var NavToggleText = document.createTextNode(Enrouler);
                  NavToggle.appendChild(NavToggleText);
 
                  NavFrame.insertBefore( NavToggle, NavFrame.firstChild );
                  NavFrame.id = 'NavFrame' + BoiteDeroulante_index;
                  if (BoiteDeroulante_max <= NavFrameCount) {
                        BoiteDeroulante_toggle(BoiteDeroulante_index);
                  }
            }
      }
 
}
addOnloadHook(BoiteDeroulante);