Aller au contenu

« MediaWiki:Common.js » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
mAucun résumé des modifications
pour réparer hotcats, voire plus
(Une version intermédiaire par le même utilisateur non affichée)
Ligne 104 : Ligne 104 :
}
}




/**
* Fonctions de traitement de chaînes
*/
String.prototype.ucFirst = function ()
{
return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
}
function hasClass(node, classe) {
var s=" "+node.className+" ";
return s.indexOf(" "+classe+" ") >= 0;
}

function equalsAa(str1, str2) {
return str1.toUpperCase() == str2.toUpperCase();
}
function startsWithAa(string, prefix) {
return equalsAa(string.substring(0, prefix.length), prefix);
}
function substractPrefixAa(string, prefix) {
return startsWithAa(string, prefix) ? string.substring(prefix.length) : string;
}
function endsWithAa(string, prefix) {
return (string.length>=prefix.length) &&
equalsAa(string.substring(string.length-prefix.length), prefix);
}
function substractSuffixAa(string, prefix) {
return endsWithAa(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
function startsWith(string, prefix) {
return string.substring(0, prefix.length) == prefix;
}
function substractPrefix(string, prefix) {
return startsWith(string, prefix) ? string.substring(prefix.length) : string;
}
function endsWith(string, prefix) {
return (string.length>=prefix.length) &&
(string.substring(string.length-prefix.length) == prefix);
}
function substractSuffix(string, prefix) {
return endsWith(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
// Extension de la classe String :
String.prototype.trimLeft = function() { return this.replace(/^\s\s*/, ''); }
String.prototype.trimRight = function() {
var str = this,
ws = /\s/,
i = str.length;
while (ws.test(str.charAt(--i)));
return str.slice(0, i + 1);
}
String.prototype.trim = function() { return this.trimLeft().trimRight(); }
String.prototype.equalAa = function(other) { return equalsAa(this,other); };
String.prototype.startsAa = function(prefix) { return startsWithAa(this,prefix); };
String.prototype.endsAa = function(prefix) { return endsWithAa(this,prefix); };
String.prototype.popAa = function(prefix,suffix) {
var s = this;
if (prefix) s=substractPrefixAa(s,prefix);
if (suffix) s=substractSuffixAa(s,suffix);
return s;
};
String.prototype.starts = function(prefix) { return startsWith(this,prefix); };
String.prototype.ends = function(prefix) { return endsWith(this,prefix); };
String.prototype.pop = function(prefix,suffix) {
var s = this;
if (prefix) s=substractPrefix(s,prefix);
if (suffix) s=substractSuffix(s,suffix);
return s;
};
/*</source>
/*</source>


Ligne 1 296 : Ligne 1 375 :
}
}
addOnloadHook(RedirectCommonsFile);
addOnloadHook(RedirectCommonsFile);


/*</source>
/*</source>

Version du 8 octobre 2011 à 18:25

/*
</source>
N'importe quel JavaScript ici sera chargé pour n'importe quel utilisateur et pour chaque page accédée.

<div style="background:#FFE4E1;">[[Fichier:Nuvola apps important.svg|30px]] Avant de modifier cette page, veuillez '''tester vos changements avec votre propre [[Spécial:Mypage/monobook.js|monobook.js]]'''. Une erreur sur cette page peut faire bugger le site entier (et gêner l'ensemble des visiteurs), même plusieurs heures après la modification !</div>

Voir aussi [[Mediawiki:Monobook.js]] · [[Mediawiki:Common.css]] · [[Mediawiki:Monobook.css]]

__FORCETOC__
== Infobulles et touches d’accès ==
Ce Javascript permet l'affichage des infobulles et des touches de raccourci
<source lang="javascript">*/
var ta = new Object();
ta['pt-userpage'] = new Array('.','Ma page utilisateur');
ta['pt-anonuserpage'] = new Array('.','La page utilisateur de l’IP avec laquelle vous contribuez');
ta['pt-mytalk'] = new Array('n','Ma page de discussion');
ta['pt-anontalk'] = new Array('n','Discussion à propos des modifications depuis cette adresse IP');
ta['pt-preferences'] = new Array('','Mes préférences');
ta['pt-watchlist'] = new Array('l','liste des pages dont vous suivez les modifications.');
ta['pt-mycontris'] = new Array('y','Liste de mes contributions');
ta['pt-login'] = new Array('o','Vous êtes invité à vous identifier, mais ce n’est pas obligatoire.');
ta['pt-anonlogin'] = new Array('o','Vous êtes invité à vous identifier, mais ce n’est pas obligatoire.');
ta['pt-logout'] = new Array('o','Se déconnecter');
ta['ca-talk'] = new Array('t','Discussion à propos de l’article');
ta['ca-edit'] = new Array('e','Vous pouvez modifier cette page. Merci d’utiliser le bouton de prévisualisation avant de sauvegarder.');
ta['ca-addsection'] = new Array('+','Ajouter un commentaire à cette discussion.');
ta['ca-viewsource'] = new Array('e','Cette page est protégée. Vous pouvez voir sa source.');
ta['ca-history'] = new Array('h','Anciennes versions de cette page.');
ta['ca-protect'] = new Array('=','Protéger cette page');
ta['ca-delete'] = new Array('d','Supprimer cette page');
ta['ca-undelete'] = new Array('d','Restaurer les modifications effectuées sur cette page avant sa suppression');
ta['ca-move'] = new Array('m','Renommer cette page');
ta['ca-watch'] = new Array('w','Ajouter cette page à votre liste de suivi');
ta['ca-unwatch'] = new Array('w','Retirer cette page de votre liste de suivi');
ta['search'] = new Array('f','Chercher dans ce wiki');
ta['p-logo'] = new Array('','Page principale');
ta['n-mainpage'] = new Array('z','Visitez la page principale');
ta['n-portal'] = new Array('','À propos de ce projet, ce que vous pouvez faire, où trouver les choses');
ta['n-currentevents'] = new Array('','Trouver des informations sur les évènements actuels');
ta['n-recentchanges'] = new Array('r','Liste des changements récents sur le wiki');
ta['n-randompage'] = new Array('x','Charger une page aléatoire');
ta['n-help'] = new Array('','Aide');
ta['n-sitesupport'] = new Array('','Aidez-nous');
ta['t-whatlinkshere'] = new Array('j','Liste de tous les wikis qui lient vers cette page');
ta['t-recentchangeslinked'] = new Array('k','Changements récents dans les pages qui lient vers cette page');
ta['feed-rss'] = new Array('','Flux RSS pour cette page');
ta['feed-atom'] = new Array('','Flux Atom pour cette page');
ta['t-contributions'] = new Array('','Voir la liste de contributions de cet utilisateur');
ta['t-emailuser'] = new Array('','Envoyer un courriel à cet utilisateur');
ta['t-upload'] = new Array('u','Télécharger une image ou des fichiers');
ta['t-specialpages'] = new Array('q','Liste de toutes les pages spéciales');
ta['ca-nstab-main'] = new Array('c','Voir l’article');
ta['ca-nstab-user'] = new Array('c','Voir la page utilisateur');
ta['ca-nstab-media'] = new Array('c','Voir la page du média');
ta['ca-nstab-special'] = new Array('','Ceci est une page spéciale, vous ne pouvez la modifier.');
ta['ca-nstab-project'] = new Array('a','Voir la page du projet');
ta['ca-nstab-image'] = new Array('c','Voir la page de l’image');
ta['ca-nstab-mediawiki'] = new Array('c','Voir le message système');
ta['ca-nstab-template'] = new Array('c','Voir le modèle');
ta['ca-nstab-help'] = new Array('c','Voir la page d’aide');
ta['ca-nstab-category'] = new Array('c','Voir la page de la catégorie');

/*</source>
== Fonctions de base pour monobook ==
Cette partie contient les fonctions Javascript de base de Wikiversité.

Pour installer une nouvelle fonction :
<code>aOnloadFunctions[aOnloadFunctions.length] = nom_de_la_fonction; // (sans parenthèses)</code>
<source lang="javascript">*/
if (!window.aOnloadFunctions) { 
  var aOnloadFunctions = new Array(); 
}

window.onload = function() 
{
  if (window.aOnloadFunctions) {
    for (var _i=0; _i<aOnloadFunctions.length; _i++) {
      aOnloadFunctions[_i]();
    }
  }
}


/**
 * Ajouter une nouvelle fonction à exécuter au chargement de la page.
 */ 
function addLoadEvent(func) 
{
  if (window.addEventListener) 
    window.addEventListener("load", func, false);
  else if (window.attachEvent)
    window.attachEvent("onload", func);
}

/**
 * Permet de centraliser les codes javascript au moyen de la fonction "obtenir" (crée sur fr.wikipedia)
 */

function obtenir(name)
{
 document.write('<script type="text/javascript" src="' +
                'http://fr.wikiversity.org/w/index.php?title=MediaWiki:JSScripts/' + name +
                '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
}



/**
 * Fonctions de traitement de chaînes
 */
String.prototype.ucFirst = function ()
{
  return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
}
function hasClass(node, classe) {
    var s=" "+node.className+" ";
    return s.indexOf(" "+classe+" ") >= 0;
}

function equalsAa(str1, str2) {
    return str1.toUpperCase() == str2.toUpperCase();
}
 
function startsWithAa(string, prefix) {
    return equalsAa(string.substring(0, prefix.length), prefix);
}
 
function substractPrefixAa(string, prefix) {
    return startsWithAa(string, prefix) ? string.substring(prefix.length) : string;
}
 
function endsWithAa(string, prefix) {
    return (string.length>=prefix.length) &&
        equalsAa(string.substring(string.length-prefix.length), prefix);
}
 
function substractSuffixAa(string, prefix) {
    return endsWithAa(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
 
function startsWith(string, prefix) {
    return string.substring(0, prefix.length) == prefix;
}
 
function substractPrefix(string, prefix) {
    return startsWith(string, prefix) ? string.substring(prefix.length) : string;
}
 
function endsWith(string, prefix) {
    return (string.length>=prefix.length) &&
        (string.substring(string.length-prefix.length) == prefix);
}
 
function substractSuffix(string, prefix) {
    return endsWith(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
 
// Extension de la classe String :
String.prototype.trimLeft = function() { return this.replace(/^\s\s*/, ''); }
String.prototype.trimRight = function() {
    var str = this,
        ws = /\s/,
        i = str.length;
    while (ws.test(str.charAt(--i)));
    return str.slice(0, i + 1);
}
String.prototype.trim = function() { return this.trimLeft().trimRight(); }
String.prototype.equalAa = function(other) { return equalsAa(this,other); };
String.prototype.startsAa = function(prefix) { return startsWithAa(this,prefix); };
String.prototype.endsAa = function(prefix) { return endsWithAa(this,prefix); };
String.prototype.popAa = function(prefix,suffix) {
    var s = this;
    if (prefix) s=substractPrefixAa(s,prefix);
    if (suffix) s=substractSuffixAa(s,suffix);
    return s;
};
String.prototype.starts = function(prefix) { return startsWith(this,prefix); };
String.prototype.ends = function(prefix) { return endsWith(this,prefix); };
String.prototype.pop = function(prefix,suffix) {
    var s = this;
    if (prefix) s=substractPrefix(s,prefix);
    if (suffix) s=substractSuffix(s,suffix);
    return s;
};
/*</source>

== Liste des caractères spéciaux ==
Ajoutez le menu pour choisir des sous-ensembles de caractères spéciaux
Note : L'ordre de cette liste doit correspondre a celui de [[MediaWiki:Edittools]] !
<source lang="javascript">*/
function addCharSubsetMenu() {
  var specialchars = document.getElementById('specialchars');

  if (specialchars) {
    var menu = "<select style=\"display:inline\" onChange=\"chooseCharSubset(selectedIndex)\">";
    menu += "<option>Wiki</option>";
    menu += "<option>Mathématiques</option>";
    menu += "<option>API</option>";
    menu += "<option>Latin/Romain</option>";
    menu += "<option>Grec</option>";
    menu += "<option>Cyrillique</option>";
    menu += "<option>Devanāgarī</option>";
    menu += "<option>AHD</option>";
    menu += "<option>Allemand</option>";
    menu += "<option>Arabe</option>";
    menu += "<option>Catalan</option>";
    menu += "<option>Croate</option>";
    menu += "<option>Espagnol</option>";
    menu += "<option>Espéranto</option>";
    menu += "<option>Estonien</option>";
    menu += "<option>Gallois</option>";
    menu += "<option>Hawaien</option>";
    menu += "<option>Hébreu</option>";
    menu += "<option>Hiéroglyphe</option>";
    menu += "<option>Hollandais</option>";
    menu += "<option>Hongrois</option>";
    menu += "<option>Indo-européen</option>";
    menu += "<option>Irlandais</option>";
    menu += "<option>Islandais</option>";
    menu += "<option>Italien</option>";
    menu += "<option>Letton</option>";
    menu += "<option>Lituanien</option>";
    menu += "<option>Maltais</option>";
    menu += "<option>Navajo & Apache</option>";
    menu += "<option>Pinyin</option>";
    menu += "<option>Polonais</option>";
    menu += "<option>Portugais</option>";
    menu += "<option>Rōmaji</option>";
    menu += "<option>Roumain</option>";
    menu += "<option>Scandinave</option>";
    menu += "<option>Serbe</option>";
    menu += "<option>Tchèque</option>";
    menu += "<option>Turc</option>";
    menu += "<option>Vieil anglais</option>";
    menu += "<option>Vietnamien</option>";
    menu += "<option>Yiddish</option>";
    menu += "</select>";
    specialchars.innerHTML = menu + specialchars.innerHTML;

    /* default subset - try to use a cookie some day */
    chooseCharSubset(0);
  }
}

/* select subsection of special characters */
function chooseCharSubset(s) {
  var l = document.getElementById('specialchars').getElementsByTagName('p');
  for (var i = 0; i < l.length ; i++) {
    l[i].style.display = i == s ? 'inline' : 'none';
    l[i].style.visibility = i == s ? 'visible' : 'hidden';
  }
}

addOnloadHook(addCharSubsetMenu);

/*</source>
== Boîtes déroulantes ==
<source lang="javascript">*/
 
// BEGIN Dynamic Navigation Bars (experimental)
 
 var NavigationBarHide = '[ Enrouler ]';
 var NavigationBarShow = '[ Dérouler ]';
 
 var NavigationBarShowDefault = 0;
 
 // shows and hides content and picture (if available) of navigation bars
 // affiche ou masque une NavBar donnée
 // Parameters:
 //     indexNavigationBar: the index of navigation bar to be toggled
 //     indexNavigationBar : numéro de la barre concernée
 
 function toggleNavigationBar(indexNavigationBar)
{
   var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);
   var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
 
  // si y'a pas de NavFrame/NavToggle, on oublie
   if (!NavFrame || !NavToggle) { return false;   }
 
   // ajout par Dake
   // permet de créer un titre en lieu et place du "Dérouler" grâce
   // à l'attribut "title" du tag.
 
   // Bidouillage : 
   // 1. Permet de modifier « Enrouler » et « Dérouler »
   //         Utilisation : title = "dérouler/enrouler"
   //         Si non supporté, laisse le texte par défaut
   // 2. Permet de décider si la boîte est affichée au départ ou pas
   //         Par défaut, le contenu est caché
   //         Pour l'afficher, il suffit d'ajouter style="display:block" au NavContent
 
   var ShowText;
   var HideText;
   var Texts;
 
    ShowText = NavigationBarShow;
    HideText = NavigationBarHide;
 
   if (NavFrame.title == undefined || NavFrame.title.length == 0 ) 
   {
   } else {
       // Cette astuce permet de passer deux arguments dans « titre »
       Texts=NavFrame.title.split("/");
       if (Texts[0].length==0) {} else { ShowText=Texts[0] }
       if (Texts[1].length==0 || Texts[1] == undefined) {} else { HideText=Texts[1] }
   }
 
   if (NavToggle.firstChild.data == ShowText || NavToggle.firstChild.data == NavigationBarShow) {
       for (
               var NavChild = NavFrame.firstChild;
               NavChild != null;
               NavChild = NavChild.nextSibling
           ) {
           if (NavChild.className == 'NavPic') {
               NavChild.style.display = 'block';
           }
           if (NavChild.className == 'NavContent') {
               NavChild.style.display = 'block';
           }
           if (NavChild.className == 'NavToggle') {
               NavChild.firstChild.data = HideText;
           }
       }
   } else {
       for (
               var NavChild = NavFrame.firstChild;
               NavChild != null;
               NavChild = NavChild.nextSibling
           ) {
           if (NavChild.className == 'NavPic') {
               NavChild.style.display = 'none';
           }
           if (NavChild.className == 'NavContent') {
               NavChild.style.display = 'none';
           }
           if (NavChild.className == 'NavToggle') {
               NavChild.firstChild.data = ShowText;
           }
       }
   } 
}
 
// adds show/hide-button to navigation bars
function createNavigationBarToggleButton()
{
   var indexNavigationBar = 0;
   // iterate over all < div >-elements
   for(
           var i=0;
           NavFrame = document.getElementsByTagName("div")[i];
           i++
       ) {
       // if found a navigation bar
       if (NavFrame.className == "NavFrame") {
 
           indexNavigationBar++;
           var NavToggle = document.createElement("a");
           NavToggle.className = 'NavToggle';
           NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
           NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
           // Par défaut, la boîte est fermée 
           var NavToggleText = document.createTextNode(NavigationBarHide);
 
            // Vérifie si l'un des enfants est affiché, alors la boîte s'ouvre
            for (var NavChild = NavFrame.firstChild;NavChild != null;NavChild = NavChild.nextSibling)
            {
                if (NavChild.style!=undefined) {
                    if (NavChild.style.display!=undefined) {
                        if (NavChild.style.display=="block") { NavToggleText = document.createTextNode(NavigationBarShow);}
                    }
                }
             }
 
           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);
 
/*</source>
== Réécritrure des titres ==
La fonction cherche une bannière comme celle-là :

<nowiki><div id="RealTitleBanner">Div cachée
  <span id="RealTitle">titre</span>
</div></nowiki>

Un élément avec id=DisableRealTitle désactive la fonction.
<source lang="javascript">
*/
rewritePageH1 = function() {
	try {
		var realTitleBanner = document.getElementById("RealTitleBanner");
		if (realTitleBanner) {
			if (!document.getElementById("DisableRealTitle")) {
				var realTitle = document.getElementById("RealTitle");
				var h1 = document.getElementsByTagName("h1")[0];
				if (realTitle && h1) {
					h1.innerHTML = realTitle.innerHTML;
					realTitleBanner.style.display = "none";
				}
			}
		}
	} catch (e) {
		/* Something went wrong. */
	}
}
addOnloadHook(rewritePageH1);

 /*
 * VraiTitre : Ajout du titre réel d'un article pour lequel MediaWiki n'affiche pas correctement
 */

function VraiTitre() 
{
   var balise = document.getElementById("vrai_titre");
   if (!balise) return;
   vrai_titre = balise.childNodes[0].nodeValue;
   var titre = document.getElementsByTagName("H1")[0];
   rectificatif = titre.appendChild(document.createElement("span"));
   rectificatif.setAttribute ("style","color:#AAAAAA; font-size:0.7em; font-style:italic; display:inline;");
   rectificatif.appendChild(document.createTextNode(" ("+ vrai_titre +")"));
}
addOnloadHook(VraiTitre);
/*</source>

== Icônes de titre ==
* Cherche les icônes de titre (class="icone de titre") et les déplace à droite du titre de la page.
* Doit être exécuté après une éventuelle correction de titre.
<source lang="javascript">*/
function IconesDeTitre() {
  var h1 = document.getElementsByTagName("h1")[0];
  var icones = document.getElementsByTagName("div");
  var icones2 = new Array();
  var j = 0;
  for (var i = 0; i < icones.length; ++i) {
    if (icones[i].className == "icone de titre") {
      icones2[j++] = icones[i];
    }
  }
  for (; j > 0; --j) {
    icones2[j-1].style.display = "block"; /* annule display:none par défaut */
    icones2[j-1].style.borderWidth = "1px";
    icones2[j-1].style.borderStyle = "solid";
    icones2[j-1].style.borderColor = "white";
    h1.insertBefore(icones2[j-1], h1.firstChild); /* déplacement de l'élément */
  }
}
addOnloadHook(IconesDeTitre);
/*</source>
== Lien d'import ==
Changer le lien d'import en lien vers la page [[Aide:Importer un fichier]] (depuis fr.wikipedia)
<source lang="javascript">*/
function LienUpload() 
{
  uploadLink = document.getElementById("t-upload");
  if (!uploadLink) return;
  
  a = uploadLink.firstChild;
  a.setAttribute('href', '/wiki/Aide:Importer_un_fichier');
} 
addOnloadHook(LienUpload);
/*</source>

== Barre d'outil ==
=== Générateur de tableaux ===
Génère un tableau en utilisant la syntaxe MediaWiki
@author: fr:user:dake
@version: 0.1
<source lang="javascript">*/
function generateTableau(nbCol, nbRow, border, styleHeader, styleLine)
{
        var code = "\n";
        if (styleHeader==1) {
                code += '{{entête tableau charte}}\n';
        } else {
                code += '{| border="' + border + '"\n';
                code += '|+ Titre du tableau\n';
        }
        
        for (var i=0; i<nbCol; i++) code += '! en-tête ' + i + '\n';
        
        for (var j=0; j<nbRow; j++) {
                if ((j+1)%2==0 && styleLine==1) {
                        code += '|-{'+'{ligne grise}'+'}\n';
                } else {                
                        code += '|-----\n';
                }
                
                for (var i=0; i<nbCol; i++) code += '| élément\n';
        }
        
        code += '|}';
        insertTags('','', code);
}

/**
 * Ouvre une popup avec paramètres pour générer un tableau
 * Le nombre de lignes et de colonnes peut être modifié. Des
 * paramètres supplémentaires sont liés aux modèles disponibles sur :fr
 *
 * @author: fr:user:dake
 * @version: 0.1
 */
 
function popupTableau()
{
  var popup = window.open('','name','height=400,width=500');
  
  javaCode =  '<script type="text\/javascript">function insertCode(){';
  javaCode += 'var row = parseInt(document.paramForm.inputRow.value); ';
  javaCode += 'var col = parseInt(document.paramForm.inputCol.value); ';
  javaCode += 'var bord = parseInt(document.paramForm.inputBorder.value); ';
  javaCode += 'var styleHeader = document.paramForm.inputHeader.checked; ';
  javaCode += 'var styleLine = document.paramForm.inputLine.checked; ';
  javaCode += 'window.opener.generateTableau(col,row,bord,styleHeader,styleLine); ';
  javaCode += '}<\/script>';
  
  popup.document.write('<html><head><title>Paramètres du tableau</title>');
  popup.document.write('<script type="text\/javascript" src="\/skins-1.5\/common\/wikibits.js"><!-- wikibits js --><\/script>');
  popup.document.write('<style type="text\/css" media="screen,projection">/*<![CDATA[*/ @import "\/skins-1.5\/monobook\/main.css?5"; /*]]>*/<\/style>');
  popup.document.write(javaCode); 
  popup.document.write('</head><body>');
  popup.document.write('<p>Veuillez entrer les paramètres du tableau : </p>');
  popup.document.write('<form name="paramForm">');
  popup.document.write('Nombre de lignes : <input type="text" name="inputRow" value="3" ><p>');
  popup.document.write('Nombre de colonnes : <input type="text" name="inputCol" value="3" ><p>');
  popup.document.write('Largeur de la bordure : <input type="text" name="inputBorder" value="1" ><p>');
  popup.document.write('En-tête en gris (style « charte graphique ») : <input type="checkbox" name="inputHeader" checked="1" ><p>');
  popup.document.write('Lignes grises alternées (style « charte graphique ») : <input type="checkbox" name="inputLine" checked="1" ><p>');
  popup.document.write('</form">');
  popup.document.write('<p><a href="javascript:insertCode()"> Insérer le code dans la fenêtre d\'édition</a></p>');
  popup.document.write('<p><a href="javascript:self.close()"> Fermer</a></p>');
  popup.document.write('</body></html>');
  popup.document.close();
}
/*</source>

=== Insertion de nouveaux boutons dans la barre d'outil ===
Remplit la variable mwCustomEditButtons (voir /skins-1.5/commons/wikibits.js) pour ajouter des boutons à la barre d'outils
<source lang="javascript">*/
function addCustomButton(imageFile, speedTip, tagOpen, tagClose, sampleText)
{
 mwCustomEditButtons[mwCustomEditButtons.length] =
 {"imageFile": imageFile,
  "speedTip": speedTip,
  "tagOpen": tagOpen,
  "tagClose": tagClose,
  "sampleText": sampleText};
}

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/3/30/Btn_toolbar_rayer.png','Rayer',"<s>","</s>",'');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/8/88/Btn_toolbar_enum.png','Énumération',"\n# élément 1\n# élément 2\n# élément 3","",'');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/1/11/Btn_toolbar_liste.png','Liste',"\n* élément A\n* élément B\n* élément C","",'');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/9/9e/Btn_toolbar_gallery.png','Galerie d\'images',"\n<gallery>\nFichier:Image1.jpg|[[Titre1]]\nFichier:Image2.jpg|[[Image2]]\nFichier:Image3.jpg|Le [[titre3]]\n</gallery>","",'');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/3/37/Btn_toolbar_commentaire.png','Commentaire',"<!--","-->",'');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/c/c8/Button_redirect.png','Redirection',"#REDIRECT [[","]]",'nom de la destination');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/e/ea/Button_easy_cite.png','Références','\n==Références==\n<references/>\n','','');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/b/b4/Button_category03.png','Catégorie',"[[Catégorie:","]]",'nom de la catégorie');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/b/b8/Bouton_Faut_sourcer.png','Leçon','\{\{Leçon\n  \| idfaculté   = \n  \| département = \n  \| 1           = ','\n  \| exo1        = \n  \| fiche1      = \n  \| annexe1     = \n  \| niveau      = \n  \| titre       = \n  \| cours       =\n  \| autres projets = oui\n  | w           =\n  | wikt        =\n\}\}','entrez le nom de la première leçon');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/7/77/Button_Nuvola_apps_edu_phi.png','Chapitre','\{\{Chapitre\n\|titre=\n\|titre_leçon=\n\|idfaculté=','\n\|leçon=\n\|numéro=\n\|précédent=\n\|suivant=\n\|niveau=\n\}\}','entrez le nom de la faculté');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/b/bd/Btn_plus.png','Bas de page','\{\{Bas de page\n\|idfaculté=mathématiques\n\|leçon=[[../]]\n\|précédent=[[../|sommaire]]','\n\|suivant=[[..//]]\n\}\}');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/0/0c/Blue-question-mark.jpg','Quiz','<quiz>\n\{ Entrer ici la question :<br />\n\| type="\{\}" \}\n\{ réponse 1 \| réponse 2 ignorant les majuscules (i) _10 \}\n</quiz>');
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/e/e9/Button_copy_edit.png','Ouvrage','\{\{Ouvrage\n\|éditeur=','\n\|collection=\n\|série=\n\|titre=\n\|titre vo=\n\|ref=\n\|volume=\n\|titre volume=\n\|auteur=\n\|prénom=\n\|nom=\n\|auteurs=\n\|trad=\n\|langue=\n\|lien langue=\n\|lieu=\n\|année=\n\|mois=\n\|jour=\n\|publi=\n\|pages=\n\|format=\n\|isbn=\n\|issn=\n\|présentation en ligne=\n\|lire en ligne=\n\|partie=\n\|numéro=\n\|chap=\n\|passage=\n\|commentaire=\n\}\}');

//Ressemble à la fonction de /skins-1.5/commons/wikibits.js pour insérer un autre lien que insertTags
function marque_tab()
{
 var toolbar = document.getElementById('toolbar');
 if (!toolbar) return false;
 
 var textbox = document.getElementById('wpTextbox1');
 if (!textbox) return false;
 
 if (!document.selection && textbox.selectionStart == null)
 return false;
 
 var image = document.createElement("img");
 image.width = 23;
 image.height = 22;
 image.src = 'http://upload.wikimedia.org/wikipedia/commons/0/04/Button_array.png';
 image.border = 0;
 image.alt = 'Tableau';
 image.title = 'Tableau';
 image.style.cursor = "pointer";
 image.onclick = function() {
   popupTableau();
   return false;
 }
 toolbar.appendChild(image);
}

addOnloadHook(marque_tab);


/*</source>

== Suppression du titre sur la page d'accueil ==
Script de suppression du titre sur la page d'accueil (depuis fr.wikipedia)
<source lang="javascript">*/
var mpTitle = "Accueil";
var isMainPage = (/[Aa]ccueil/.test(wgTitle));
var isMainPageFront = (document.title.substr(0, document.title.lastIndexOf(" - ")) == mpTitle);
var isDiff = (document.location.search && (document.location.search.indexOf("diff=") != -1 || document.location.search.indexOf("oldid=") != -1));

if (isMainPage) 
{
    if (isMainPageFront && !isDiff)
        document.write('<style type="text/css">/*<![CDATA[*/ #lastmod, #siteSub, #contentSub, h1.firstHeading { display: none !important; } /*]]>*/</style>');

    var mpSmallEnabled;
    var mpMinWidth = 700;

    function mainPageTransform()
    {
       $('#ca-nstab-main a').text('Accueil');
       if (((isMainPageFront && !isDiff) || /[\/=:]Main_Page/.test(document.location)) && document.getElementById('ca-nstab-main'))
       var mpContentEl = document.getElementById("bodyContent");
       var mpBrowseEl = document.getElementById("EnWpMpBrowse");
       var mpContainEl = document.getElementById("EnWpMpBrowseContainer");
       var mpMarginEl = document.getElementById("EnWpMpMargin");
       var mpEl = document.getElementById("EnWpMainPage");

       if (!mpContentEl || !mpBrowseEl || !mpContainEl || !mpMarginEl || !mpEl)
           return;

       if (!mpSmallEnabled && mpContentEl.offsetWidth < mpMinWidth)
       {
           mpContainEl.insertBefore(mpBrowseEl, mpContainEl.firstChild);
           mpBrowseEl.className = "EnWpMpBrowseBottom";
           mpMarginEl.style.marginRight = 0;
           mpSmallEnabled = true;
       }
       else if (mpSmallEnabled && mpContentEl.offsetWidth > mpMinWidth)
       {
           mpEl.insertBefore(mpBrowseEl, mpEl.firstChild);
           mpBrowseEl.className = "EnWpMpBrowseRight";
           mpMarginEl.style.marginRight = "13.8em";
           mpSmallEnabled = false;
       }
    }

    var onloadFuncts = [ mainPageTransform ];
    addFuncEvent("resize", mainPageTransform);
}
/*</source>

== Page de recherche ==
* Amélioration de la page de recherche v3
* Auteur : Marc Mongenet
* Sous licence GFDL & GPL
<source lang="javascript">*/
function SpecialSearchEnhanced3() 
{

 function SearchForm(search_action_url, engine_url, engine_name, logo_url,
                     search_field_name, search_field_value, site_field_name, site_field_value)
 {
   var span = document.createElement("div");
   span.style.marginRight = "1em";
   span.style.width="100%";
   span.style.whiteSpace = "nowrap";

   var form = document.createElement("form");
   form.method = "get";
   form.action = search_action_url;
   form.style.display = "inline";
   span.appendChild(form);

   var input = document.createElement("input");
   input.type = "hidden";
   input.name = search_field_name;
   form.appendChild(input);

   var site = document.createElement("input");
   site.type = "hidden";
   site.name = site_field_name;
   site.value = site_field_value;
   form.appendChild(site);

   var submit = document.createElement("input");
   submit.type = "submit";
   submit.value = "Recherche";
   form.appendChild(submit);

   form.onsubmit = function() {
     input.value = document.getElementById("lsearchbox").value;
   }

   var a = document.createElement("a");
   a.href = engine_url;
   span.appendChild(a);

   var img = document.createElement("img");
   img.src = logo_url;
   img.alt = engine_name;
   img.style.borderWidth = "0";
   img.style.padding = "5px";
   a.appendChild(img);

   return span;
 }

 if (typeof SpecialSearchEnhanced3Disabled != 'undefined') return;
 if (wgPageName != "Special:Search") return;

 var mainNode = document.getElementsByTagName("form");
 if (!mainNode) return;
 mainNode = mainNode[0];
 mainNode.appendChild(document.createElement("center"));
 mainNode = mainNode.lastChild;

 var searchValue = document.getElementById("lsearchbox").value;
 var engine;
 engine = SearchForm("http://partner.exalead.fr/search", "http://www.exalead.fr/", "Exalead",
                     "http://www.wikipedia.fr/exalead.gif", "q", searchValue,
                     "site", "fr.wikiversity.org");
 mainNode.appendChild(engine);
 engine = SearchForm("http://www.google.fr/search", "http://www.google.fr/", "Google",
                     "http://www.google.com/logos/Logo_25wht.gif", "q", searchValue,
                     "as_sitesearch", "fr.wikiversity.org");
 mainNode.appendChild(engine);
 engine = SearchForm("http://search.live.com/results.aspx", "http://search.live.com/", "Live",
                     "http://search.live.com/s/affillogoLive.gif", "q", searchValue,
                     "q1", "site:http://fr.wikiversity.org");
 mainNode.appendChild(engine);
 engine = SearchForm("http://fr.search.yahoo.com/search", "http://fr.search.yahoo.com/", "Yahoo!",
                     "http://us.yimg.com/i/yahootogo/y88red2.gif", "p", searchValue,
                     "vs", "fr.wikiversity.org");
 mainNode.appendChild(engine);
}
addOnloadHook(SpecialSearchEnhanced3);
/*</source>
== Salle Café ==
Ce Javascript permet de gérer la salle café comme une page de discussion.
<source lang="javascript">*/
function DiscussionCafe()
{
  if(  (wgPageName.search('Wikiversité:La_salle_café') != -1)
    || (wgPageName.search('Wikiversité:Réserve') != -1))
    document.body.className = 'cafe';
}
addOnloadHook(DiscussionCafe);
/*</source>

== LookupHover ==
Ce Javascript permet d'afficher la définition du Wiktionnaire d'un mot lorsqu'on double-clique dessus.
<source lang="javascript">*/
importScriptURI('http://en.wikinews.org/w/index.php?title=MediaWiki:Gadget-dictionaryLookupHover.js&action=raw&ctype=text/javascript');

/*</source>*/

/**
* Utilisation du modèle Modèle:Images
*/
function toggleImage(group, remindex, shwindex) {
  document.getElementById("ImageGroupsGr"+group+"Im"+remindex).style.display="none";
  document.getElementById("ImageGroupsGr"+group+"Im"+shwindex).style.display="inline";
}
 
function imageGroup(){
  if (document.URL.match(/printable/g)) return;
  var bc=document.getElementById("bodyContent");
  if( !bc ) bc = document.getElementById("mw_contentholder");
  if( !bc ) return;
  var divs=bc.getElementsByTagName("div");
  var i = 0, j = 0;
  var units, search;
  var currentimage;
  var UnitNode;
  for (i = 0; i < divs.length ; i++) {
    if (divs[i].className != "ImageGroup") continue;
    UnitNode=undefined;
    search=divs[i].getElementsByTagName("div");
    for (j = 0; j < search.length ; j++) {
      if (search[j].className != "ImageGroupUnits") continue;
      UnitNode=search[j];
      break;
    }
    if (UnitNode==undefined) continue;
    units=Array();
    for (j = 0 ; j < UnitNode.childNodes.length ; j++ ) {
      var temp = UnitNode.childNodes[j];
      if (temp.className=="center") units.push(temp);
    }
    for (j = 0 ; j < units.length ; j++) {
      currentimage=units[j];
      currentimage.id="ImageGroupsGr"+i+"Im"+j;
      var imghead = document.createElement("div");
      var leftlink;
      var rightlink;
      if (j != 0) {
        leftlink = document.createElement("a");
        leftlink.href = "javascript:toggleImage("+i+","+j+","+(j-1)+");";
        leftlink.innerHTML="◀";
      } else {
        leftlink = document.createElement("span");
        leftlink.innerHTML=" ";
      }
      if (j != units.length - 1) {
        rightlink = document.createElement("a");
        rightlink.href = "javascript:toggleImage("+i+","+j+","+(j+1)+");";
        rightlink.innerHTML="▶";
      } else {
        rightlink = document.createElement("span");
        rightlink.innerHTML=" ";
      }
      var comment = document.createElement("tt");
      comment.innerHTML = "("+ (j+1) + "/" + units.length + ")";
      with(imghead) {
        style.fontSize="110%";
        style.fontweight="bold";
        appendChild(leftlink);
        appendChild(comment);
        appendChild(rightlink);
      }
      currentimage.insertBefore(imghead,currentimage.childNodes[0]);
      if (j != 0) currentimage.style.display="none";
    }
  }
}
addOnloadHook(imageGroup);

/**
 * 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);
}


/**
 * Recherche d'un élément contenu dans base
 * dont le nom est name
 * @param base Nœud contenant l'élément recherché
 * @param name Nom de l'élément recherché
 */
function getFirstElement(base,name)
{
    if (!base) return null;
    return getNextElement(base.firstChild, name, true);
}
 
/**
 * Recherche du prochain élément après base
 * dont le nom est name
 * @param base Noeud précédemment trouvé
 * @param name Nom de l'élément recherché
 * @param testbase (optionnel) true pour tester le nœud donné.
 */
function getNextElement(base,name,testbase)
{
    while (base!=null)
    {
        if (testbase && (base.nodeType==1) && equalsAa(base.nodeName,name)) return base;
        testbase=true;
        base=base.nextSibling;
    }
    return null;
}
 
/**
 * Fonctions de traitement de chaînes
 */
function equalsAa(str1, str2) {
    return str1.toUpperCase() == str2.toUpperCase();
}
 
function startsWithAa(string, prefix) {
    return equalsAa(string.substring(0, prefix.length), prefix);
}
 
function substractPrefixAa(string, prefix) {
    return startsWithAa(string, prefix) ? string.substring(prefix.length) : string;
}
 
function endsWithAa(string, prefix) {
    return (string.length>=prefix.length) &&
        equalsAa(string.substring(string.length-prefix.length), prefix);
}
 
function substractSuffixAa(string, prefix) {
    return endsWithAa(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
 
function startsWith(string, prefix) {
    return string.substring(0, prefix.length) == prefix;
}
 
function substractPrefix(string, prefix) {
    return startsWith(string, prefix) ? string.substring(prefix.length) : string;
}
 
function endsWith(string, prefix) {
    return (string.length>=prefix.length) &&
        (string.substring(string.length-prefix.length) == prefix);
}
 
function substractSuffix(string, prefix) {
    return endsWith(string, prefix) ? string.substring(0,string.length-prefix.length) : string;
}
 
// Extension de la classe String :
String.prototype.trimLeft = function() { return this.replace(/^\s\s*/, ''); }
String.prototype.trimRight = function() {
    var str = this,
        ws = /\s/,
        i = str.length;
    while (ws.test(str.charAt(--i)));
    return str.slice(0, i + 1);
}
String.prototype.trim = function() { return this.trimLeft().trimRight(); }
String.prototype.equalAa = function(other) { return equalsAa(this,other); };
String.prototype.startsAa = function(prefix) { return startsWithAa(this,prefix); };
String.prototype.endsAa = function(prefix) { return endsWithAa(this,prefix); };
String.prototype.popAa = function(prefix,suffix) {
    var s = this;
    if (prefix) s=substractPrefixAa(s,prefix);
    if (suffix) s=substractSuffixAa(s,suffix);
    return s;
};
String.prototype.starts = function(prefix) { return startsWith(this,prefix); };
String.prototype.ends = function(prefix) { return endsWith(this,prefix); };
String.prototype.pop = function(prefix,suffix) {
    var s = this;
    if (prefix) s=substractPrefix(s,prefix);
    if (suffix) s=substractSuffix(s,suffix);
    return s;
};

/**
 * Script pour alterner entre deux cartes de géolocalisation
 */
addOnloadHook(function(){ 
  var cont;
  if(!(wgAction=="view")) return

  cont=getElementsByClass('img_toogle', document.getElementById('bodyContent'), 'div');
  if(cont.length==0) return

  for (var i = 0; i < cont.length ; i++) {
    cont.box = getElementsByClass('geobox',cont[i]);
    cont.box[0].style.display='none';
    cont.box[1].style.borderTop='0';
    var toogle = document.createElement('a');
    toogle.appendChild(document.createTextNode(cont.box[0].getElementsByTagName('img')[0].alt));
    toogle.href='#';
    toogle.className='a_toogle';
    toogle.status = 1;
    toogle.onclick = function() {
      this.removeChild(this.firstChild);
      div0 = getElementsByClass('geobox',this.parentNode)[0];
      div1 = getElementsByClass('geobox',this.parentNode)[1];
      alt0 = div0.getElementsByTagName('img')[0].alt;
      alt1 = div1.getElementsByTagName('img')[0].alt;
      if(this.status==0) {
        div0.style.display='none';
        div1.style.display='';
        this.status=1;
        this.appendChild(document.createTextNode(alt0));
      } else {
        div0.style.display='';
        div1.style.display='none';
        this.status=0;
        this.appendChild(document.createTextNode(alt1));
      }
      return false;
    }
  cont[i].insertBefore(toogle, cont.box[1].nextSibling);
  }
});

/**
* Utilisation du modèle Modèle:VideoSRT
*/

function toggleVideo(group, remindex, shwindex) {
  document.getElementById("VideoSRTGroupsGr"+group+"Im"+remindex).style.display="none";
  document.getElementById("VideoSRTGroupsGr"+group+"Im"+shwindex).style.display="inline";
}

function videoGroup(){
  if (document.URL.match(/printable/g)) return;
  var bc=document.getElementById("bodyContent");
  if( !bc ) bc = document.getElementById("mw_contentholder");
  if( !bc ) return;
  var divs=bc.getElementsByTagName("div");
  var i = 0, j = 0, k = 0;
  var units, search;
  var currentvideo;
  var UnitNode;
  for (i = 0; i < divs.length ; i++) {
    if (divs[i].className != "VideoSRTGroup") continue;
    UnitNode=undefined;
    search=divs[i].getElementsByTagName("div");
    for (j = 0; j < search.length ; j++) {
      if (search[j].className != "VideoSRTGroupUnits") continue;
      UnitNode=search[j];
      break;
    }
    if (UnitNode==undefined) continue;
    units=Array();
    for (j = 0 ; j < UnitNode.childNodes.length ; j++ ) {
      var temp = UnitNode.childNodes[j];
      if (temp.className=="center") units.push(temp);
    }
    for (j = 0 ; j < 2 ; j++) {
      currentvideo=units[j];
      currentvideo.id="VideoSRTGroupsGr"+i+"Im"+j;
      var imghead = document.createElement("div");
      var link;
      if (j != 0) {
        link = document.createElement("a");
        link.href = "javascript:toggleVideo("+i+","+j+","+(j-1)+");";
        link.innerHTML="Version sans sous-titres";
      } else {
        link = document.createElement("a");
        link.href = "javascript:toggleVideo("+i+","+j+","+(j+1)+");";
        link.innerHTML="Version avec sous-titres";
      }
      var comment = document.createElement("tt");
      comment.innerHTML = "("+ (j+1) + "/" + 2 + ")";

      with(imghead) {
        style.fontSize="110%";
        style.fontweight="bold";
        appendChild(link);
      }
      currentvideo.insertBefore(imghead,currentvideo.childNodes[0]);
      if (j != 0) currentvideo.style.display="none";
    }
  }
}
addOnloadHook(videoGroup);


/* DÉBUT DU CODE JAVASCRIPT DE "CADRE À ONGLETS"
    Fonctionnement du [[Modèle:Cadre à onglets]]
    Modèle implanté par User:Peleguer de http://ca.wikipedia.org
    Actualisé par User:Joanjoc de http://ca.wikipedia.org
    Traduction et adaptation User:Antaya de http://fr.wikipedia.org
    Importation sur le Wiktionnaire puis la Wikiversité par JackPotte
*/
function CadreOngletInit(){
  var i=0       
  for (i=0;i<=9;i++){
     var vMb = document.getElementById("mb"+i);
     if (!vMb) break;
 
     var j=1    
     var vOgIni = 0  
     for (j=1;j<=9;j++){
        var vBt = document.getElementById("mb"+i+"bt"+j);
        if (!vBt) break;
        vBt.onclick = CadreOngletVoirOnglet;          
        if (vBt.className=="mbBoutonSel") vOgIni=j;  
     }
 
     if (vOgIni == 0) { 
         vOgIni = 1+Math.floor((j-1)*Math.random()) ;
         document.getElementById("mb"+i+"og"+vOgIni).style.display = "block";
         document.getElementById("mb"+i+"og"+vOgIni).style.visibility = "visible";
         document.getElementById("mb"+i+"bt"+vOgIni).className="mbBoutonSel";
     } 
  }
 }
 
 function CadreOngletVoirOnglet(){
  var vMbNom = this.id.substr(0,3); 
  var vIndex = this.id.substr(5,1); 
 
  var i=1
  for (i=1;i<=9;i++){        
        var vOgElem = document.getElementById(vMbNom+"og"+i);
        if (!vOgElem) break;
        if (vIndex==i){ 
                vOgElem.style.display = "block";
                vOgElem.style.visibility = "visible";
                document.getElementById(vMbNom+"bt"+i).className="mbBoutonSel";
        } else {             
                vOgElem.style.display = "none";
                vOgElem.style.visibility = "hidden";
                document.getElementById(vMbNom+"bt"+i).className="mbBouton";
        }
  }
  return false; 
}
addOnloadHook(CadreOngletInit);
/*FIN DU CODE JAVASCRIPT DE "CADRE À ONGLETS"*/




/**
 * 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) {
  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);
}
 


// 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 (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;
}
 
// FIN Fonctions JavaScript


/**
 * insertAfter : insérer un élément dans une page
 */
function insertAfter(parent, node, referenceNode) {
  parent.insertBefore(node, referenceNode.nextSibling); 
}


/**
 * application de [[w:Wikipédia:Prise de décision/Système de cache]], puis [[Wikiversité:La_salle_café/33_2010]]
 * un <span class="noarchive"> autour du lien l'empêche d'être pris en compte
 * pour celui-ci uniquement
 * un no_external_cache=true dans un monobook personnel désactive le script
 */
 
addOnloadHook(function () {
 
  if (wgNamespaceNumber == 0) {
    if ((typeof no_external_cache != "undefined") && (no_external_cache)) return;
    addcache();
  }
 
  function addcache() {
    var external_links;
    if (document.getElementsByClassName) {
      external_links = document.getElementsByClassName('external');
    } else {
      external_links = getElementsByClass('external',document.getElementById("bodyContent"),'a');
    }
 
    for( i = 0;i < external_links.length;i++) 
    {
      var chemin = external_links[i].href;
 
      if(chemin.indexOf("http://wikiwix.com/cache/")==-1 && chemin.indexOf("http://web.archive.org/web/*/")==-1 && chemin.indexOf(wgServer)==-1 && chemin.indexOf("wikimedia.org")==-1 && chemin.indexOf("stable.toolserver.org")==-1)
      {
      var li = external_links[i].parentNode;
      if (li.className == "noarchive") continue;
      var depth = 0;
      while ((depth < 3) && (li.tagName != "OL") && (li.parentNode != null)) {
        li = li.parentNode;
        depth++;
      }
 
      if (li.tagName != "OL" || !(hasClass(li, 'references')) ) continue;
      var titre = getTextContent(external_links[i]); 
      var last = document.createElement("small");
      last.setAttribute("class", "cachelinks");
      last.style.color = "#3366BB";
      last.appendChild(document.createTextNode("\u00a0["));
      insertAfter(external_links[i].parentNode, last, external_links[i]);
 
      var link = document.createElement("a");
      link.setAttribute("href", "http://wikiwix.com/cache/?org=" + wgServer + "&url=" + chemin.replace(/%/g, "%25").replace(/&/g, "%26") + "&title=" + encodeURIComponent(titre));
      link.setAttribute("title", "archive de "+ titre);
      link.appendChild(document.createTextNode("archive"));
      link.style.color = "#3366BB";
      last.appendChild(link);
      last.appendChild(document.createTextNode("]"));
      }
    }
  }
}
);

/* Permet d'afficher un compte à rebours sur une page avec le modèle [[Modèle:Compte à rebours]] */
/* Plyd - 3 février 2009 */
function Rebours() {
  if(wgNamespaceNumber==0) return;
  try {
   if (document.getElementById("rebours")) {
      destime = document.getElementById("rebours").title.split(";;");
      Maintenant = (new Date).getTime();
      Future = new Date(Date.UTC(destime[0], (destime[1]-1), destime[2], destime[3], destime[4], destime[5])).getTime();
      Diff = (Future-Maintenant);
      if (Diff < 0) {Diff = 0}
      TempsRestantJ = Math.floor(Diff/(24*3600*1000));
      TempsRestantH = Math.floor(Diff/(3600*1000)) % 24;
      TempsRestantM = Math.floor(Diff/(60*1000)) % 60;
      TempsRestantS = Math.floor(Diff/1000) % 60;
      TempsRestant = "" + destime[6] + " ";
      if (TempsRestantJ == 1) {
         TempsRestant = TempsRestant + TempsRestantJ + " jour ";
      } else if (TempsRestantJ > 1) {
         TempsRestant = TempsRestant + TempsRestantJ + " jours ";
      }
      TempsRestant = TempsRestant + TempsRestantH + " h " + TempsRestantM  + " min " + TempsRestantS + " s";
      document.getElementById("rebours").innerHTML = TempsRestant;
      setTimeout("Rebours()", 1000)
    }
  } catch (e) {}
}
addOnloadHook(Rebours);

/*
=== DOM création ===
<source lang="javascript">*/
/**
 * Create a new DOM node for the current document.
 *    Basic usage:  var mySpan = newNode('span', "Hello World!")
 *    Supports attributes and event handlers*: var mySpan = newNode('span', {style:"color: red", focus: function(){alert(this)}, id:"hello"}, "World, Hello!")
 *    Also allows nesting to create trees: var myPar = newNode('p', newNode('b',{style:"color: blue"},"Hello"), mySpan)
 *
 * *event handlers, there are some issues with IE6 not registering event handlers on some nodes that are not yet attached to the DOM,
 * it may be safer to add event handlers later manually.
**/
function newNode(tagname){

  var node = document.createElement(tagname);
  
  for( var i=1;i<arguments.length;i++ ){
    
    if(typeof arguments[i] == 'string'){ //Text
      node.appendChild( document.createTextNode(arguments[i]) );
      
    }else if(typeof arguments[i] == 'object'){ 
      
      if(arguments[i].nodeName){ //If it is a DOM Node
        node.appendChild(arguments[i]);
        
      }else{ //Attributes (hopefully)
        for(var j in arguments[i]){
          if(j == 'class'){ //Classname different because...
            node.className = arguments[i][j];
            
          }else if(j == 'style'){ //Style is special
            node.style.cssText = arguments[i][j];
            
          }else if(typeof arguments[i][j] == 'function'){ //Basic event handlers
            try{ node.addEventListener(j,arguments[i][j],false); //W3C
            }catch(e){try{ node.attachEvent('on'+j,arguments[i][j],"Language"); //MSIE
            }catch(e){ node['on'+j]=arguments[i][j]; }}; //Legacy
          
          }else{
            node.setAttribute(j,arguments[i][j]); //Normal attributes

          }
        }
      }
    }
  }
  
  return node;
}

/**
 * retourne la valeur d'un attribut html, sinon une valeur par défaut
 */
function getAttr(node, name, defvalue) {
    if (!node.attributes) return defvalue;
    var v=node.attributes.getNamedItem(name);
    return (v&&v.nodeValue.length)?v.nodeValue:defvalue;
}

/**
 * Redirection automatique des page décrivant un fichier Commons
 * vers la page de description sur Commons pour éviter des erreurs.
 */
function RedirectCommonsFile()
{
    if (wgNamespaceNumber!=6) return;
    // Search for link to commons
    // - search div with sharedUploadNotice class
    var shared_link = getElementsByClass("sharedUploadNotice");
    if ((!shared_link)||(shared_link.length<1)) return; // No sharedUploadNotice div
    shared_link = shared_link[0];
    // - external link within the div
    var links = getElementsByClass("external", shared_link, "a");
    if ((!links)||(links.length<1)) links = getElementsByClass("external", shared_link, "A");
    if ((!links)||(links.length<1)) return; // No external link
    // Get URL and redirect
    var url = getAttr(links[0], "href", null);
    if (url!=null) window.location = url;
}
addOnloadHook(RedirectCommonsFile);


/*</source>