MediaWiki:Common.js

From Kiwix
Revision as of 15:57, 18 April 2015 by Kelson (talk | contribs)
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* N'importe quel JavaScript ici sera chargé pour n'importe quel utilisateur et pour chaque page accédée.

== Fonctions générales ==

<pre><nowiki>
 * Fonctions générales de lancement de fonctions ou de script
 */

/**
 * Installation d'une nouvelle fonction de cette façon :
 * addOnloadHook(nom_de_la_fonction); (sans parenthèses)
 * La procédure suivante ne doit plus être utilisée
 */
if (!window.aOnloadFunctions) { 
  var aOnloadFunctions = new Array(); 
}

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

function addLoadEvent(func) {
        hookEvent('load', func);
}

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

/**
 * Insérer un javascript d'une page particulière, idée de Mickachu
 */
function loadJs(page)
{
 document.write('<script type="text/javascript" src="' +
                'http://fr.wikipedia.org/w/index.php?title=' + page +
                '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
}

/**
 * Projet JavaScript
 */
function obtenir(name)
{
  loadJs('MediaWiki:JSScripts/' + name);
}

/* Fin des fonctions générales</nowiki></pre>

== Fonctions de remplissage automatique ==

<pre><nowiki>
 * Fonctions de remplissage automatique
 */

function InitPaS(page_name)
{
    var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    var c2 = "<!-- N'oubliez pas d'ajouter le lien vers cette page dans la page principale des Pages à supprimer -->";
    var tpl = '{{subst:' + 'Initialiser PàS|' + page_name 
      + '|~~~~|jour={{subst:CURRENTDAY}}|mois={{subst:CURRENTMONTH}}}}';
    return c1 + '
' + tpl + '
' + c2;
}

function InitLANN(page_name)
{
    var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    var c2 = "<!-- N'oubliez pas d'ajouter le lien vers cette page dans la page principale des articles non neutres -->";
    var tpl = '{{subst:' + 'Initialiser LANN|' + page_name + '|~~~~}}';
    return c1 + '
' + tpl + '
' + c2;
}

function InitIaS(page_name)
{
    var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    var c2 = "<!-- N'oubliez pas d'ajouter le lien vers cette page dans la page principale des Images à supprimer -->";
    var tpl = '{{subst:' + 'Préchargement Image à Supprimer|' + page_name + '|~~~~|jour={{subst:CURRENTDAY}}|mois={{subst:CURRENTMONTH}}}}';
    return c1 + '
' + tpl + '
' + c2;
}

function InitPAdQ(page_name)
{
    var c1 = "<!--
     À la création de la page, suivez les consignes ci-dessous pour proposer l'article.

     ATTENTION : Veuillez ne rien effacer !
-->";
    var tpl = '{{subst:' + 'Initialiser PAdQ|' + page_name 
      + '|~~~~|jour={{subst:CURRENTDAY}}|mois={{subst:CURRENTMONTH}}';
    var c2 = "| 1. Indiquez sur la ligne ci-dessous la raison pour laquelle vous proposez cet article. Vous n'avez pas besoin de signer/dater, ni de voter par la suite : votre proposition tient lieu de vote 'Pour'. |";
    var tpl2 = "Je propose cet article car... (votre motivation)";
    var c3 = "| 2. Sauvegardez cette page et créez un lien vers elle dans Wikipédia:Proposition articles de qualité.";
    var c4 = "Pour cela, choisissez une thématique dans la page, modifiez-la et ajoutez un lien sous la forme :";
    var c5 = "** [[/" + page_name + "]] proposé le ~~~~~ ";
    var c6 = "Vous devez créer cette référence dans la section 'Phase I' de la thématique choisie (suivez les autres exemples).";
    return c1 + '

' + tpl + '
' + c2 + '
' + tpl2 + '

' + c3 + '

' + c4 + '
' + c5  + '
' + c6 + '}}
';
}

function InitIaA(page_name)
{
    var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    return c1 + '
{{subst:Amélioration image}}';
}

function InitPCP(page_name)
{
    var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    var c2 = "<!-- N'oubliez pas d'ajouter le lien vers cette page dans la page principale des articles soupçonnées de violation de copyright -->";
    var tpl = '{{subst:' + 'Initialiser PCP|' + page_name + '|~~~~}}';
    return c1 + '
' + tpl + '
' + c2;
}

function InitArbReq(page_name)
{
   var c1 = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
   var c2 = "<!-- N'oubliez pas d'ajouter un lien vers cette page sur [[Wikipédia:Comité d'arbitrage/Arbitrage]] -->";
   var tpl = '{{subst:' + 'Wikipédia:Comité d\'arbitrage/Arbitrage/Modèle}}'
   return c1 + '
' + tpl + '
' + c2;
}

function InitCdl(page_name)
{
    var c1   = "<!-- Sauvegarder la page pour l'initialiser puis suivre les instructions -->";
    var c2   = "<!-- N'oubliez pas d'ajouter le lien vers cette page dans la page principale du comité de lecture -->";
    var tpl  = '{{subst:' + 'Initialiser Comité de lecture|' + page_name + '|~~~~}}';
    var tpl2 = '<noinclude' + '>{{subst:' + 'Initialiser Comité de lecture2' + '}}<' + '/noinclude>';
    return c1 + '
' + c2 + '
' + '
' + tpl2 + '
' + tpl;
}

function InitProjetTraduction(page_name)
{
 var mustSkip=wgPageName.indexOf('Projet:Traduction/*/');
 if (mustSkip == -1) {
    var c1 = "{{subst:Initialiser la page de traduction|" + "{{subst:SUBPAGENAME}}" + "|~~~~|
";
    c1 += "<!--  À la création de la page, suivez les consignes ci-dessous pour proposer l'article.    
";
    c1 += "      ATTENTION : Veuillez ne rien effacer !                                             -->
";
    c1 += "1. Indiquez ci-dessous la langue de l'article à traduire (ex: en de es it pt...)
";
    c1 += "|en|
";
    c1 += "2. Indiquez ci-dessous le nom de l'article original (ex: Frankreich)
";
    c1 += "|Nom original ici| 
";
    c1 += "3. Indiquez ci-dessous en une phrase l'intérêt de la traduction
";
    c1 += "|article très bien|
"; 
    c1 += "4. Ajoutez éventuellement un court commentaire 
"; 
    c1 += "|commentaire très intéressant ici|
"; 
    c1 += "| 5. C'est fini, vous pouvez désormais sauvegarder cette page.
"; 
    c1 += "}}"; 
    return c1;
 }
 else {
    return '';
 }
}

function InitPBA(page_name)
{
var c1 = "<!--
     À la création de la page, suivez les consignes ci-dessous pour proposer l'article.

     ATTENTION : Veuillez ne rien effacer !
-->";
var tpl = '{{subst:' + 'Initialiser PBA|' + page_name 
      + '|~~~~|jour={{subst:CURRENTDAY}}|mois={{subst:CURRENTMONTH}}';
var c2 = "| 1. Indiquez sur la ligne ci-dessous la raison pour laquelle vous proposez cet article. Vous n'avez pas besoin de signer/dater, ni de voter par la suite : votre proposition tient lieu de vote 'Pour'. |";
var tpl2 = "Je propose cet article car... (votre motivation)";
var c3 = "| 2. Sauvegardez cette page et créez un lien vers elle dans Wikipédia:Proposition bons articles.";
var c4 = "Pour cela, choisissez une thématique dans la page, modifiez-la et ajoutez un lien sous la forme :";
var c5 = "** [[/" + page_name + "]] proposé le ~~~~~ ";
var c6 = "Vous devez créer cette référence dans la section 'Phase I' de la thématique choisie (suivez les autres exemples).";
return c1 + '

' + tpl + '
' + c2 + '
' + tpl2 + '

' + c3 + '

' + c4 + '
' + c5  + '
' + c6 + '}}
';
}

var init_if_empty = new Array(
   new Array('Wikipédia:Pages_à_supprimer/', InitPaS),
   new Array('Wikipédia:Liste_des_articles_non_neutres/', InitLANN),
   new Array('Wikipédia:Images_à_supprimer/', InitIaS),
   new Array('Wikipédia:Proposition_articles_de_qualité/', InitPAdQ),
   new Array('Wikipédia:Pages_soupçonnées_de_violation_de_copyright/', InitPCP),
   new Array('Wikipédia:Comité_d\'arbitrage/Arbitrage/', InitArbReq),
   new Array('Wikipédia:Comité_de_lecture/', InitCdl),
   new Array('Projet:Traduction/', InitProjetTraduction),
   new Array('Wikipédia:Proposition_bons_articles/', InitPBA)
);

/**
 * Remplit la zone d'édition si elle est vide avec le texte retourné par
 * un pointeur de fonction sélectionné par le nom de la page.
 */
function InitPage()
{
   // Tester si editform et wpTextbox1 existe sinon il y a une erreur lorsqu'on
   // ouvre l'historique d'une page qui match un des noms de init_if_empty[],
   // tester seulement le nom de la page n'est pas suffisant.
   if (document.editform == undefined ||
       document.editform.wpTextbox1 == undefined)
     return;
   var text_area = document.editform.wpTextbox1;
   if (text_area.value.length != 0)
     return;

   for (var i = 0; i < init_if_empty.length; ++i) {
     var page_match = init_if_empty[i][0];
     var index = wgPageName.indexOf(page_match);
     if (index != -1) {
        page_name = wgPageName.slice(page_match.length);
        page_name = page_name.replace(/_/g, ' ');
	text_area.value = init_if_empty[i][1](page_name);
        break;
     }
   }
}
addOnloadHook(InitPage);


/* Fin des fonctions de remplissage automatique</nowiki></pre>

== Caractères spéciaux ==

<pre><nowiki>
 * Ajouter un 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) return;

  var charSubsetSelect = document.createElement("select");
  charSubsetSelect.setAttribute("style", "display:inline");
  // hard to find something that works both on IE and Fx...
  charSubsetSelect.onchange = function () { chooseCharSubset(this.selectedIndex); };

  var options = [
   "Wiki",
   "Mathématiques",
   "API",
   "Latin/Romain",
   "Grec",
   "Cyrillique",
   "AHD",
   "Diacritiques",
   "Allemand",
   "Arabe",
   "Berbère",
   "Catalan",
   "Croate",
   "Espagnol",
   "Espéranto",
   "Estonien",
   "Gallois",
   "Hawaïen",
   "Hébreu",
   "Hiéroglyphe",
   "Hongrois",
   "Indo-européen",
   "Irlandais",
   "Islandais",
   "Italien",
   "Letton",
   "Lituanien",
   "Maltais",
   "Navajo & Apache",
   "Néerlandais",
   "Pinyin",
   "Polonais",
   "Portugais",
   "Rōmaji",
   "Roumain",
   "Scandinave",
   "Serbe",
   "Tchèque",
   "Turc",
   "Vieil anglais",
   "Vietnamien",
   "Yiddish" ];
  
  for (var i in options) {
    var opt = document.createElement("option");
    var txt = document.createTextNode(options[i]);
    opt.appendChild(txt);
    charSubsetSelect.appendChild(opt);
  }

  specialchars.insertBefore(charSubsetSelect, specialchars.childNodes[0]);

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

/* choisir la section de caractères spéciaux */
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);

/* Fin des caractères spéciaux</nowiki></pre>

== Espace Référence ==

<pre><nowiki>
 * Choix du mode d'affichage des références
 * @note L'ordre de cette liste doit correspondre a celui de Modèle:Édition !
 */

function addBibSubsetMenu()
{
  var specialBib = document.getElementById('specialBib');
  if (!specialBib) return;
  
  specialBib.style.display = 'block';
  menu = '<select style="display:inline;" onChange="chooseBibSubset(selectedIndex)">'
   + '<option>Liste</option>'
   + '<option>WikiNorme</option>'
   + '<option>BibTeX</option>'
   + '<option>ISBD</option>'
   + '<option>ISO690</option>'
   + '</select>';
  specialBib.innerHTML = specialBib.innerHTML + menu;
  
  /* default subset - try to use a cookie some day */
  chooseBibSubset(0);
}

// select subsection of special characters
function chooseBibSubset(s) 
{
  var l = document.getElementsByTagName('div');
  for (var i = 0; i < l.length ; i++) 
  {
    if(l[i].className == 'BibList')   l[i].style.display = s == 0 ? 'block' : 'none';
    else if(l[i].className == 'WikiNorme') l[i].style.display = s == 1 ? 'block' : 'none';
    else if(l[i].className == 'BibTeX')    l[i].style.display = s == 2 ? 'block' : 'none';
    else if(l[i].className == 'ISBD')      l[i].style.display = s == 3 ? 'block' : 'none';
    else if(l[i].className == 'ISO690')    l[i].style.display = s == 4 ? 'block' : 'none';
  }
}
addOnloadHook(addBibSubsetMenu);

/* Fin de l'espace Référence</nowiki></pre>

== Barre d'outil ==

<pre><nowiki>
 * Ajout de boutons à la barre d'outils 
 */

/**
 * Générateur de tableaux
 * English: Generate an array using Mediawiki syntax
 *
 * @author: fr:user:dake
 * @version: 0.1<nowiki>
 */

function generateTableau(nbCol, nbRow, border, styleHeader, styleLine)
{
     var code = "
";
     if (styleHeader==1) {
           code += '{{entête';
           code += ' tableau charte}}
';
     } else {
           code += '{| border="' + border + '"
';
           code += '|+ Titre du tableau
';
     }
     
     for (var i=0; i<nbCol; i++) code += '! en-tête ' + i + '
';
     
     for (var j=0; j<nbRow; j++) {
           if ((j+1)%2==0 && styleLine==1) {
                 code += '|-{'+'{ligne grise}'+'}
';
           } else {		
                 code += '|-----
';
           }
           
           for (var i=0; i<nbCol; i++) code += '| élément
';
     }
     
     code += '|}';
     insertTags('','', code);
}

/**
 *
 * English: Open a popup with parameters to generate an array. 
 * The number of rows/columns can be modified. Some additional
 * parameters are related to templates available on :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();
}

/**
 * Insertion de nouveaux boutons dans la barre d'outil
 */

function addCustomButton(imageFile, speedTip, tagOpen, tagClose, sampleText, imageId) {
   mwCustomEditButtons[mwCustomEditButtons.length] =
    {"imageId": imageId,
     "imageFile": imageFile,
     "speedTip": speedTip,
     "tagOpen": tagOpen,
     "tagClose": tagClose,
     "sampleText": sampleText};
}

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/0/04/Button_array.png','Tableau','{|
|-
|
|
|}','','','mw-editbutton-array');

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','
# élément 1
# élément 2
# élément 3','','');

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/1/11/Btn_toolbar_liste.png','Liste','
* élément A
* élément B
* élément C','','');

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/9/9e/Btn_toolbar_gallery.png','Galerie d\'images','
<gallery>
Image:Exemple.jpg|[[Tournesol]]
Image:Exemple1.jpg|[[La Joconde]]
Image:Exemple2.jpg|Un [[hamster]]
</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/b/b4/Button_category03.png','Catégorie','[[Catégorie:',']]','nom de la catégorie');

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png','Référence','<ref>','</ref>','référence, citation ou lien');

addCustomButton('http://upload.wikimedia.org/wikipedia/commons/3/3b/Button_template_alt.png','Index des références','== Notes et références ==
<references /> <!-- aide : http://fr.wikipedia.org/wiki/Aide:Notes et références -->','','');

var voirAussi = '<!-- Suggestion de présentation des annexes. Aide : http://fr.wikipedia.org/wiki/Aide:Notes et références -->
'
 + '== Notes et références de l\'article ==
'
 + '<references/>
'
 + '== Voir aussi ==
'
 + '=== Articles connexes ===
'
 + '* [[À remplacer]]
'
 + '*
'
 + '=== Liens et documents externes ===
'
 + '*
';
addCustomButton('http://upload.wikimedia.org/wikipedia/commons/b/bb/Seealso.png','Section Voir aussi',voirAussi,'','');

// Changer le lien du bouton de création de tableau
function button_tab()
{
 toolbarArray = document.getElementById('mw-editbutton-array');
 if (!toolbarArray) return false;
 
 toolbarArray.onclick = function() {
   popupTableau();
   return false;
 }
}
hookEvent('load', button_tab);

/* Fin de la barre d'outils</nowiki></pre>

== Page de recherche ==

<pre><nowiki>
 * Amélioration de la page de recherche v3
 * Auteur : Marc Mongenet
 * Sous licence GFDL & GPL<nowiki>
 */
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.wikipedia.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.wikipedia.org");
 mainNode.appendChild(engine);
 engine = SearchForm("http://www.wikipediasearch.net/index.php", "http://www.wikipediasearch.net", "Wikipedia Search",
                     "http://www.wikipediasearch.net/logo_mini.png", "action", searchValue,
                     "lang", "fr");
 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.wikipedia.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.wikipedia.org");
 mainNode.appendChild(engine);
}
addOnloadHook(SpecialSearchEnhanced3);
/* Fin de la page de recherche</nowiki></pre>

== Désactiver le bouton Sauvegarder à la première édition ==

<pre><nowiki>
 * Force IP to preview before saving changes.
 * Copyright Marc Mongenet, 2006
 */
function forcePreview()
{
     if (wgUserName != null) return;
     saveButton = document.getElementById("wpSave");
     if (!saveButton) return;
     if (location.search.search(/&action=edit/) == -1) return;
     saveButton.disabled = true;
     saveButton.style.fontWeight = "normal";
     document.getElementById("wpPreview").style.fontWeight = "bold";
}
addLoadEvent(forcePreview);

/* Fin du forcePreview</nowiki></pre>

== Fonctions de mise en page ==

<pre><nowiki>
 * Transformer les pages du Bistro en page de discussion
 */
function DiscussionBistro()
{
  if(  (wgPageName.search('Wikipédia:Le_Bistro') != -1)
    || (wgPageName.search('Wikipédia:Bulletin_des_administrateurs') != -1))
    document.body.className = 'ns-1';
}
addOnloadHook(DiscussionBistro);

/**
 * Transformer certaines pages en page de discussion avec le modèle {&#123;page de discussion}}
 */
function TransformeEnDiscussion()
{
   transformeEnPDD = document.getElementById("transformeEnPageDeDiscussion");
   if(transformeEnPDD)
     document.body.className = "ns-1";
}
addOnloadHook(TransformeEnDiscussion);

/**
 * Afficher une explication au nombre de caractères dans la liste de suivi
 */
function toolTipPlusMinus() {
       var tt = "Nombre de caractères d'écart entre les deux dernières versions de la page";
       var elmts = document.getElementsByTagName("span");
       for(var cpt = 0; cpt < elmts.length; cpt++) {
               if (/mw-plusminus-pos|mw-plusminus-neg|mw-plusminus-null/.test(elmts[cpt].className) || /mw-plusminus-pos|mw-plusminus-neg|mw-plusminus-null/.test(elmts[cpt].getAttribute("class")))
                       elmts[cpt].title = tt;
       }
}
addLoadEvent(toolTipPlusMinus);

/* Fin des fonctions de mise en page</nowiki></pre>

/**
 * Réécriture des titres
 *
 * Fonction utilisée par [[Modèle:Titre incorrect]]
 *
 * La fonction cherche un bandeau de la forme
 * <span id="RealTitle">titre</span>
 *
 * Un élément comportant id="DisableRealTitle" désactive la fonction
 */
function rewritePageH1() {
      var realTitle = document.getElementById('RealTitle');
      var h1 = document.getElementById('firstHeading');
      if(!h1) { h1 = document.getElementsByTagName('h1')[0]; }
      if (realTitle && h1) {
        var titleText = realTitle.innerHTML;
        if (titleText == '') { h1.style.display = 'none'; }
        else { h1.innerHTML = titleText; }
      }
}
addOnloadHook(rewritePageH1);

/* Fin de l'aide sur page spéciales</nowiki></pre>

== Redirect vers wikibooks etc. ==

<pre><nowiki>
*/
var redirected_from_article_datas = new Array(
   new Array('Wikipédia:Redirect_vers_Wikibooks', 'wikibooks'),
   new Array('Wikipédia:Redirect_vers_Wikisource', 'wikisource'),
   new Array('Wikipédia:Redirect_vers_Wikiversité', 'wikiversity'),
   new Array('Wikipédia:Redirect_vers_Wikiquote', 'wikiquote'),
   new Array('Wikipédia:Redirect_vers_Wikinews', 'wikinews')
);

function redirected_from_article()
{
   if (wgIsArticle == false)
       return;
   for (var i = 0; i < redirected_from_article_datas.length; ++i) {
     var page_match = redirected_from_article_datas[i];
     var index = wgPageName.indexOf(page_match[0]);
     if (index == 0) {
        var div = document.getElementById('contentSub');
        var span = document.getElementById('redirected_from');
        // real target is always encoded in the anchor.
        target = window.location.hash;
        if (!div || !span || target == '')
            break;

        target = target.slice(1);
        target = target.split('.23');
        target[0] = target[0].replace(/.([0-9A-Z][0-9A-Z])/g, '%$1');
        if (target.length > 1)
            target = target[0] + '#' + target[1]
        else
            target = target[0];
        target = target.replace(/%2F/g, '/');
        quoted_target = target;
        target = target.replace(/.([0-9A-Z][0-9A-Z])/g, '%$1');
        target = decodeURI(target);

        // special case for self-referrer
        if (target == page_match[0])
            break;
        target = target.replace(/_/g, ' ');

        var e = document.createElement('A');
        e.href = 'http://fr.' + page_match[1] + '.org/wiki/' + quoted_target;
        e.innerHTML = target;
        span.replaceChild(e, span.firstChild);
        break;
     }
   }
}
addLoadEvent(redirected_from_article);
// Fin Redirect vers wikibooks etc.</nowiki></pre>


/* Smartbanner */
/*!
 * jQuery Smart Banner
 * Copyright (c) 2012 Arnold Daniels <arnold@jasny.net>
 * Based on 'jQuery Smart Web App Banner' by Kurt Zenisek @ kzeni.com
 */
!function ($) {
    var SmartBanner = function (options) {
        this.origHtmlMargin = parseFloat($('html').css('margin-top')) // Get the original margin-top of the HTML element so we can take that into account
        this.options = $.extend({}, $.smartbanner.defaults, options)

        var standalone = navigator.standalone // Check if it's already a standalone web app or running within a webui view of an app (not mobile safari)
          , UA = navigator.userAgent

        // Detect banner type (iOS or Android)
        if (this.options.force) {
            this.type = this.options.force
        } else if (UA.match(/Windows Phone 8/i) != null && UA.match(/Touch/i) !== null) {
            this.type = 'windows'
        } else if (UA.match(/iPhone|iPod/i) != null || (UA.match(/iPad/) && this.options.iOSUniversalApp)) {
            if (UA.match(/Safari/i) != null &&
               (UA.match(/CriOS/i) != null ||
               window.Number(UA.substr(UA.indexOf('OS ') + 3, 3).replace('_', '.')) < 6)) this.type = 'ios' // Check webview and native smart banner support (iOS 6+)
        } else if (UA.match(/Silk/(.*Mobile Safari)?/) || UA.match(/KFw/) || UA.match('Kindle Fire')) {
            this.type = 'kindle'
        } else if (UA.match(/Android/i) != null) {
            this.type = 'android'
        }

        // Don't show banner if device isn't iOS or Android, website is loaded in app or user dismissed banner
        if (!this.type || standalone || this.getCookie('sb-closed') || this.getCookie('sb-installed')) {
            return
        }

        // Calculate scale
        this.scale = this.options.scale == 'auto' ? $(window).width() / window.screen.width : this.options.scale
        if (this.scale < 1) this.scale = 1

        // Get info from meta data
        var meta = $(this.type == 'android' ? 'meta[name="google-play-app"]' :
            this.type == 'ios' ? 'meta[name="apple-itunes-app"]' :
            this.type == 'kindle' ? 'meta[name="kindle-fire-app"]' : 'meta[name="msApplication-ID"]');
        if (meta.length == 0) return

        // For Windows Store apps, get the PackageFamilyName for protocol launch
        if (this.type == 'windows') {
            this.appId = $('meta[name="msApplication-PackageFamilyName"]').attr('content');
        } else {
            // Try to pull the appId out of the meta tag and store the result
            var parsedMetaContent = /app-id=([^s,]+)/.exec(meta.attr('content'));

            if(parsedMetaContent) {
              this.appId = parsedMetaContent[1];
            } else {
              return;
            }
        }

        this.title = this.options.title ? this.options.title : meta.data('title') || $('title').text().replace(/s*[|-·].*$/, '')
        this.author = this.options.author ? this.options.author : meta.data('author') || ($('meta[name="author"]').length ? $('meta[name="author"]').attr('content') : window.location.hostname)
        this.iconUrl = meta.data('icon-url');
        this.price = meta.data('price');

        // Create banner
        this.create()
        this.show()
        this.listen()
    }

    SmartBanner.prototype = {

        constructor: SmartBanner

      , create: function() {
            var iconURL
              , link=(this.options.url ? this.options.url : (this.type == 'windows' ? 'ms-windows-store:navigate?appid=' : (this.type == 'android' ? 'market://details?id=' : (this.type == 'kindle' ? 'amzn://apps/android?asin=' : 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id'))) + this.appId)
              , price = this.price || this.options.price
              , inStore=price ? price + ' - ' + (this.type == 'android' ? this.options.inGooglePlay : this.type == 'kindle' ? this.options.inAmazonAppStore : this.type == 'ios' ? this.options.inAppStore : this.options.inWindowsStore) : ''
              , gloss=this.options.iconGloss === null ? (this.type=='ios') : this.options.iconGloss

            if (this.type == 'android' && this.options.GooglePlayParams) {
              link = link + '&referrer=' + this.options.GooglePlayParams;
            }

            var banner = '<div id="smartbanner" class="'+this.type+'"><div class="sb-container"><a href="#" class="sb-close">&times;</a><span class="sb-icon"></span><div class="sb-info"><strong>'+this.title+'</strong><span>'+this.author+'</span><span>'+inStore+'</span></div><a href="'+link+'" class="sb-button"><span>'+this.options.button+'</span></a></div></div>';
            (this.options.layer) ? $(this.options.appendToSelector).append(banner) : $(this.options.appendToSelector).prepend(banner);

            if (this.options.icon) {
                iconURL = this.options.icon
            } else if(this.iconUrl) {
                iconURL = this.iconUrl;
            } else if ($('link[rel="apple-touch-icon-precomposed"]').length > 0) {
                iconURL = $('link[rel="apple-touch-icon-precomposed"]').attr('href')
                if (this.options.iconGloss === null) gloss = false
            } else if ($('link[rel="apple-touch-icon"]').length > 0) {
                iconURL = $('link[rel="apple-touch-icon"]').attr('href')
            } else if ($('meta[name="msApplication-TileImage"]').length > 0) {
              iconURL = $('meta[name="msApplication-TileImage"]').attr('content')
            } else if ($('meta[name="msapplication-TileImage"]').length > 0) { /* redundant because ms docs show two case usages */
              iconURL = $('meta[name="msapplication-TileImage"]').attr('content')
            }

            if (iconURL) {
                $('#smartbanner .sb-icon').css('background-image','url('+iconURL+')')
                if (gloss) $('#smartbanner .sb-icon').addClass('gloss')
            } else{
                $('#smartbanner').addClass('no-icon')
            }

            this.bannerHeight = $('#smartbanner').outerHeight() + 2

            if (this.scale > 1) {
                $('#smartbanner')
                    .css('top', parseFloat($('#smartbanner').css('top')) * this.scale)
                    .css('height', parseFloat($('#smartbanner').css('height')) * this.scale)
                    .hide()
                $('#smartbanner .sb-container')
                    .css('-webkit-transform', 'scale('+this.scale+')')
                    .css('-msie-transform', 'scale('+this.scale+')')
                    .css('-moz-transform', 'scale('+this.scale+')')
                    .css('width', $(window).width() / this.scale)
            }
            $('#smartbanner').css('position', (this.options.layer) ? 'absolute' : 'static')
        }

      , listen: function () {
            $('#smartbanner .sb-close').on('click',$.proxy(this.close, this))
            $('#smartbanner .sb-button').on('click',$.proxy(this.install, this))
        }

      , show: function(callback) {
            var banner = $('#smartbanner');
            banner.stop();

            if (this.options.layer) {
                banner.animate({top: 0, display: 'block'}, this.options.speedIn).addClass('shown').show();
                $(this.pushSelector).animate({paddingTop: this.origHtmlMargin + (this.bannerHeight * this.scale)}, this.options.speedIn, 'swing', callback);
            } else {
                if ($.support.transition) {
                    banner.animate({top:0},this.options.speedIn).addClass('shown');
                    var transitionCallback = function() {
                        $('html').removeClass('sb-animation');
                        if (callback) {
                            callback();
                        }
                    };
                    $(this.pushSelector).addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedIn).css('margin-top', this.origHtmlMargin+(this.bannerHeight*this.scale));
                } else {
                    banner.slideDown(this.options.speedIn).addClass('shown');
                }
            }
        }

      , hide: function(callback) {
            var banner = $('#smartbanner');
            banner.stop();

            if (this.options.layer) {
                banner.animate({top: -1 * this.bannerHeight * this.scale, display: 'block'}, this.options.speedIn).removeClass('shown');
                $(this.pushSelector).animate({paddingTop: this.origHtmlMargin}, this.options.speedIn, 'swing', callback);
            } else {
                if ($.support.transition) {
                    if ( this.type !== 'android' )
                      banner.css('top', -1*this.bannerHeight*this.scale).removeClass('shown');
                    else
                      banner.css({display:'none'}).removeClass('shown');
                    var transitionCallback = function() {
                        $('html').removeClass('sb-animation');
                        if (callback) {
                            callback();
                        }
                    };
                    $(this.pushSelector).addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedOut).css('margin-top', this.origHtmlMargin);
                } else {
                    banner.slideUp(this.options.speedOut).removeClass('shown');
                }
            }
        }

      , close: function(e) {
            e.preventDefault()
            this.hide()
            this.setCookie('sb-closed','true',this.options.daysHidden);
        }

      , install: function(e) {
			if (this.options.hideOnInstall) {
				this.hide()
			}
            this.setCookie('sb-installed','true',this.options.daysReminder)
        }

      , setCookie: function(name, value, exdays) {
            var exdate = new Date()
            exdate.setDate(exdate.getDate()+exdays)
            value=encodeURI(value)+((exdays==null)?'':'; expires='+exdate.toUTCString())
            document.cookie=name+'='+value+'; path=/;'
        }

      , getCookie: function(name) {
            var i,x,y,ARRcookies = document.cookie.split(";")
            for(i=0;i<ARRcookies.length;i++) {
                x = ARRcookies[i].substr(0,ARRcookies[i].indexOf("="))
                y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1)
                x = x.replace(/^s+|s+$/g,"")
                if (x==name) {
                    return decodeURI(y)
                }
            }
            return null
        }

      // Demo only
      , switchType: function() {
          var that = this

          this.hide(function () {
              that.type = that.type == 'android' ? 'ios' : 'android'
              var meta = $(that.type == 'android' ? 'meta[name="google-play-app"]' : 'meta[name="apple-itunes-app"]').attr('content')
              that.appId = /app-id=([^s,]+)/.exec(meta)[1]

              $('#smartbanner').detach()
              that.create()
              that.show()
          })
      }
    }

    $.smartbanner = function (option) {
        var $window = $(window)
        , data = $window.data('smartbanner')
        , options = typeof option == 'object' && option
        if (!data) $window.data('smartbanner', (data = new SmartBanner(options)))
        if (typeof option == 'string') data[option]()
    }

    // override these globally if you like (they are all optional)
    $.smartbanner.defaults = {
        title: null, // What the title of the app should be in the banner (defaults to <title>)
        author: null, // What the author of the app should be in the banner (defaults to <meta name="author"> or hostname)
        price: 'FREE', // Price of the app
        appStoreLanguage: 'us', // Language code for App Store
        inAppStore: 'On the App Store', // Text of price for iOS
        inGooglePlay: 'In Google Play', // Text of price for Android
        inAmazonAppStore: 'In the Amazon Appstore',
        inWindowsStore: 'In the Windows Store', //Text of price for Windows
        GooglePlayParams: null, // Aditional parameters for the market
        icon: null, // The URL of the icon (defaults to <meta name="apple-touch-icon">)
        iconGloss: null, // Force gloss effect for iOS even for precomposed
        button: 'VIEW', // Text for the install button
        url: null, // The URL for the button. Keep null if you want the button to link to the app store.
        scale: 'auto', // Scale based on viewport size (set to 1 to disable)
        speedIn: 300, // Show animation speed of the banner
        speedOut: 400, // Close animation speed of the banner
        daysHidden: 15, // Duration to hide the banner after being closed (0 = always show banner)
        daysReminder: 90, // Duration to hide the banner after "VIEW" is clicked *separate from when the close button is clicked* (0 = always show banner)
        force: null, // Choose 'ios', 'android' or 'windows'. Don't do a browser check, just always show this banner
        hideOnInstall: true, // Hide the banner after "VIEW" is clicked.
        layer: false, // Display as overlay layer or slide down the page
        iOSUniversalApp: true, // If the iOS App is a universal app for both iPad and iPhone, display Smart Banner to iPad users, too.
        appendToSelector: 'body', //Append the banner to a specific selector
		pushSelector: 'html' // What element is going to push the site content down; this is where the banner append animation will start.
    }

    $.smartbanner.Constructor = SmartBanner;


    // ============================================================
    // Bootstrap transition
    // Copyright 2011-2014 Twitter, Inc.
    // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)

    function transitionEnd() {
        var el = document.createElement('smartbanner')

        var transEndEventNames = {
            WebkitTransition: 'webkitTransitionEnd',
            MozTransition: 'transitionend',
            OTransition: 'oTransitionEnd otransitionend',
            transition: 'transitionend'
        }

        for (var name in transEndEventNames) {
            if (el.style[name] !== undefined) {
                return {end: transEndEventNames[name]}
            }
        }

        return false // explicit for ie8 (  ._.)
    }

    if ($.support.transition !== undefined)
        return  // Prevent conflict with Twitter Bootstrap

    // http://blog.alexmaccaw.com/css-transitions
    $.fn.emulateTransitionEnd = function(duration) {
        var called = false, $el = this
        $(this).one($.support.transition.end, function() {
            called = true
        })
        var callback = function() {
            if (!called) $($el).trigger($.support.transition.end)
        }
        setTimeout(callback, duration)
        return this
    }

    $(function() {
        $.support.transition = transitionEnd()
    })
    // ============================================================

}(window.jQuery);

if (navigator.userAgent.toLowerCase().indexOf("android") > -1) {
	if (!$.cookie("smartBanner")) {
    	if (confirm("Install Kiwix on your device?")) {
        	window.location.href= "market://details?id=org.kiwix.kiwixmobile";
    	}
    	$.cookie("smartBanner", true, { expires : 60 });
	}
}