MediaWiki:Common.js

Une page de Wikiversité, la communauté pédagogique libre.

Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.
/**
 * Ce script est chargé avec chaque page de la Wikiversité.
 * Avant de le modifier cette page, vous êtes prié de tester vos changements sur votre propre [[Spécial:Ma page/Common.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 !
 *
 * Voir aussi [[MediaWiki:Monobook.js]] · [[MediaWiki:Common.css]] · [[MediaWiki:Monobook.css]]
 */

/**
 * Ajouter une nouvelle fonction à exécuter au chargement de la page.
 */
function addLoadEvent(func) {
   jQuery(document).ready(func);
}

/**
 * Permet de centraliser les codes JavaScript au moyen de la fonction « obtenir » (créée sur fr.wikipedia)
 */
function obtenir(name) {
   importScript('MediaWiki:JSScripts/' + name);
}

/**
 * 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]] !
 */
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).prepend(menu);

    // 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';
  }
}

jQuery(document).ready(addCharSubsetMenu);

/**
 * Boîtes déroulantes
 */

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

  // S'il n'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);
       }
   }

}
jQuery(document).ready(createNavigationBarToggleButton);

/**
 * Réécritrure des titres
 * La fonction cherche une bannière comme celle-là :
 *
 *     <div id="RealTitleBanner">Div cachée
 *     <span id="RealTitle">titre</span>
 *     </div>
 *
 * Un élément avec id=DisableRealTitle désactive la fonction.
 */
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.
  }
}
jQuery(document).ready(rewritePageH1);

/*
 * VraiTitre : Ajout du titre réel d’un article pour lequel MediaWiki n'affiche pas correctement
 */
function realTitle() {
   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 +")"));
}
jQuery(document).ready(realTitle);

/**
 * 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.
 */
function titleIcons() {
  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) {
    // annule display:none par défaut
    icones2[j-1].style.display = "block";
    icones2[j-1].style.borderWidth = "1px";
    icones2[j-1].style.borderStyle = "solid";
    icones2[j-1].style.borderColor = "white";
    // déplacement de l'élément
    h1.insertBefore(icones2[j-1], h1.firstChild);
  }
}
jQuery(document).ready(titleIcons);

/**
 * Lien d'import
 * Changer le lien d'import en lien vers la page [[Aide:Importer un fichier]] (depuis fr.wikipedia)
 */
function LienUpload() {
  uploadLink = document.getElementById("t-upload");
  if (!uploadLink) return;

  a = uploadLink.firstChild;
  a.setAttribute('href', '/wiki/Aide:Importer_un_fichier');
}
jQuery(document).ready(LienUpload);

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

/**
 * @deprecated Use mw.toolbar
 */
function addCustomButton() { }

//Ressemble à la fonction de /w/skins/common/wikibits.js pour insérer un autre lien qu'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 = '//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);
}

$(marque_tab);


/**
 * Suppression du titre sur la page d'accueil
 *
 * Script de suppression du titre sur la page d'accueil (depuis fr.wikipedia)
 */
var mpTitle = "Accueil";
var isMainPage = (/[Aa]ccueil/.test(mw.config.get('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)
        mw.util.addCSS('#lastmod, #siteSub, #contentSub, h1.firstHeading { display: none !important; }');

    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;
       }
    }

    $(document).ready(mainPageTransform);
    $(window).resize(mainPageTransform);
}

/**
 * Page de recherche
 *
 * Amélioration de la page de recherche v3
 * Auteur : Marc Mongenet
 * Sous licence GFDL & GPL
 */
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 (mw.config.get('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);
}
jQuery(document).ready(SpecialSearchEnhanced3);


/**
* 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 (['center', 'mw-halign-center'].some(function(className) { return temp.classList.contains(className); })) { units.push(temp); }
    }
    var wrap;
    for (j = 0 ; j < units.length ; j++) {
      currentimage=units[j];
      wrap = document.createElement('div');
      wrap.id="ImageGroupsGr"+i+"Im"+j;
      currentimage.parentNode.insertBefore(wrap, currentimage);
      wrap.appendChild(currentimage);
      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);
      }
      wrap.insertBefore(imghead,wrap.childNodes[0]);
      if (j != 0) wrap.style.display="none";
    }
  }
}
jQuery(document).ready(imageGroup);



function getElementsByClassName(node,tag,searchClass)
{ return $.makeArray( $(node).find(tag+'.'+searchClass) ); }
 
/**
 * rechercher les éléments de la page dont le paramètre "class" est celui recherché
 * http://developer.mozilla.org/en/docs/DOM:document.getElementsByClassName
 */
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 Nœud 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);
}
if (!String.prototype.trim) {
    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
 */
jQuery(document).ready(function(){
  var cont;
  if(!(mw.config.get('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 (['center', 'mw-halign-center'].some(function(className) { return temp.classList.contains(className); })) { units.push(temp); }
    }
    var wrap;
    for (j = 0 ; j < 2 ; j++) {
      currentvideo=units[j];
      wrap = document.createElement('div');
      wrap.id="VideoSRTGroupsGr"+i+"Im"+j;
      currentvideo.parentNode.insertBefore(wrap, currentvideo);
      wrap.appendChild(currentvideo);
      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);
      }
      wrap.insertBefore(imghead,wrap.childNodes[0]);
      if (j != 0) wrap.style.display="none";
    }
  }
}
jQuery(document).ready(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;
}
jQuery(document).ready(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 //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 nœud et de ses nœuds 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
 */

jQuery(document).ready(function () {

  if (mw.config.get('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(mw.config.get('wgServer'))==-1 && chemin.indexOf("wikimedia.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=" + mw.config.get('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("]"));
      }
    }
  }
}
);
$(".cachelinks").addClass("noprint");

/* 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(mw.config.get('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) {}
}
jQuery(document).ready(Rebours);

/******* DOM création *******/

/**
 * 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
 * importé de Wikilivres
 */
jQuery( function RedirectCommonsFile()
{
    if (mw.config.get('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 && url!=undefined) window.location = url;
} );


/**
 * Quelques modifications dans la barre latérale
 * Auteur : Frigory
 */
function setSidebarTools() {
	// Pages spéciales et import : déjà disponibles dans la section « Outils »
	$('#t-specialpages, #t-upload').hide();

	// Ajout d’un S à « Information »
	$('#t-info a').text('Informations sur la page');

	// Ajout de liens de données de la page : statistiques de visite et sous-pages
	$('#p-tb ul').prepend('<li id="t-pagestatistics"><a rel="nofollow" ' +
			'title="Statistiques de visite de la page" href="https://tools.wmflabs.org/pageviews/?project=fr.wikiversity.org&platform=all-access&agent=user&range=latest-30&pages=' + mw.config.get('wgPageName') + '">Statistiques</a></li>')
		.append('<li id="t-subpages">' +
			'<a title="Liste des sous-pages de cette page" href="/wiki/Sp%C3%A9cial:Index/' + mw.config.get('wgPageName') + '/">Sous-pages</a></li>');

	// Déplacement des liens pour un utilisateur dans une autre section « Utilisateur »
	if ($('#t-contributions').length) {
		$('#p-user ul').append($('#t-contributions, #t-log, #t-blockip, #t-emailuser, #t-userrights'));
		$('#p-user').removeClass('emptyPortlet'); // N'est plus vide désormais
	} else {
		$('#p-user').hide();
	}

	// Déplacement de la section « Imprimer / exporter » en bas
	if ($('#p-coll-print_export').length) {
		$('#p-coll-print_export').insertAfter('#p-tb');
	}
}
$(document).ready(setSidebarTools);

/* {{Projet:JavaScript/Script|specialchars}} */

/*
 Remplacement de certains caractères spéciaux lors de l’édition
 Uniquement sous Firefox.
 Auteur : ThomasV
 Importé depuis la Wikisource
*/

function keycheck() {
   tb = document.getElementById("wpTextbox1");
   if( tb && mw.config.get('wgNamespaceNumber')!=8 ) {
       tb.onkeyup=function(e) {
       var key = (window.event) ? event.keyCode : e.keyCode;
       startPos = tb.selectionStart;
       endPos = tb.selectionEnd;
       if( endPos==startPos && ( (key>=65 && key<=90) || key==222 || key==190) ) {
           m = tb.value.substring(startPos-2, startPos);
           m3 = tb.value.substring(startPos-3, startPos);
           f = tb.value.substring(startPos);
           todo=true; i=2;
           if(m[1]=="'"){
              m = m[0]+"’"; 
              if(m=="’’") m="''"; 
              if(m=="'’") m="''"; 
           } else switch(m) {
              case "^s" : m = "ſ"; break;
              case "`A" : m = "À"; break;
              case "`E" : m = "È"; break;
              case "`U" : m = "Ù"; break;
              case "´E" : m = "É"; break;
              case "*E" : m = "É"; break;
              default : todo = false;
           }
           if(!todo) {
             m=m3; todo=true; i=3;
             switch(m) {
              case "^oe" : m="œ"; break;
              case "^ae" : m = "æ"; break;
              case "^OE" : m = "Œ"; break;
              case "^AE" : m = "Æ"; break;
              case "..." : m = "…"; break;
              default : todo = false;
           }}

           if(todo) {
		var textScroll = tb.scrollTop;
                h = tb.value.substring(0, startPos-i);
                tb.value = h+m+f;
		tb.selectionStart = startPos-i + m.length;
		tb.selectionEnd = tb.selectionStart;
		tb.scrollTop = textScroll;
           }
       }
     }
 }
 
}

if(!(mw.config.get('wgNamespaceNumber')%2==0 && mw.config.get('wgTitle').match(/\.js$/)!=null)) $(keycheck);

// MOOC selon https://fr.wikiversity.org/wiki/Projet:Wikiversit%C3%A9/Autoriser_la_cr%C3%A9ation_de_pages_gadget-MOOC#Toucher_.C3.A0_MediaWiki:Common.js
mw.loader.load("//fr.wikiversity.org/w/index.php?title=MediaWiki:Gadget-MOOC.css\u0026action=raw\u0026ctype=text/css", "text/css");
mw.loader.load("//fr.wikiversity.org/w/index.php?title=MediaWiki:Gadget-MOOC.js\u0026action=raw\u0026ctype=text/javascript");

/**
 * Salle Café
 *
 * Ce Javascript permet de gérer la salle café comme une page de discussion.
 */
function DiscussionCafe() {
  if(  (mw.config.get('wgPageName').search('Wikiversité:La_salle_café') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Réserve') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Administrateur/Candidature') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Bot/Statut') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Bureaucrate/Candidature') != -1)
    || (mw.config.get('wgPageName').search('Projet:Atelier graphique/Demandes à traiter') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Journal des nouveaux arrivants') != -1)
    || (mw.config.get('wgPageName').search('Projet:Laboratoire') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Pages à fusionner') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Pages à supprimer') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Pages soupçonnées de violation de copyright') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Rencontres') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Requêtes aux administrateurs') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Requêtes aux bots') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Requêtes aux contributeurs') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Requêtes de facultés') != -1)
    || (mw.config.get('wgPageName').search('Wikiversité:Requêtes import') != -1)
    || (mw.config.get('wgPageName').search('Projet:Wikiversité') != -1))
    document.body.className = 'cafe';
}
jQuery(document).ready(DiscussionCafe);

/**
 * Application des alinéas demandés par Modèle:Alinéas_début et Modèle:Alinéas_fin
 * Auteur : Frigory
 */
function setIndentOfParagraphs() {
  $('div[data-indent-width]').each(function() {
    $(this).find('p').css('text-indent', $(this).attr('data-indent-width'));
  });
  $('div[data-indent-chars]').each(function() {
    $(this).find('p').attr('data-indent-chars', $(this).attr('data-indent-chars'));
  });
}
$(document).ready(setIndentOfParagraphs);