Aller au contenu

Projet:Scripts et gadgets/Refonte Common.js avec jQuery

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 8 mai 2017 à 04:27 et modifiée en dernier par Od1n (discuter | contributions) (utiliser à la place mw.html.escape (en plus, il n'y a pas de dépendance à ajouter)). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
/**
 * N'importe quel JavaScript ici sera chargé pour n'importe quel utilisateur et pour chaque page accédée.
 * 
 * ATTENTION : Avant de modifier cette page, veuillez tester vos changements avec votre propre
 * vector.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 !
 * 
 * Prière de ranger les nouvelles fonctions dans les sections adaptées :
 * - Fonctions JavaScript
 * - Fonctions spécifiques pour MediaWiki
 * - Applications spécifiques à la fenêtre d'édition
 * - Applications qui peuvent être utilisées sur toute page
 * - Applications spécifiques à un espace de nom ou une page
 * 
 * <nowiki> /!\ Ne pas retirer cette balise
 */



/*************************************************************************************/
/* Fonctions JavaScript : pallient les limites de JavaScript                         */
/* Utiliser de préférence jQuery, qui est compatible avec la plupart des navigateurs */
/*************************************************************************************/

/**
 * insertAfter : insérer un élément dans une page
 * DÉPRÉCIÉ : utiliser jQuery http://api.jquery.com/after/
 * 
 * Historique :
 * - introduit par ?? le ??
 * - jquerifié par Seb35 le 02/03/2011
 */
function insertAfter( parent, node, referenceNode ) {
	$( referenceNode, parent ).after( $( node ) );
}

/**
 * getElementsByClass : rechercher les éléments de la page dont le paramètre "class" est celui recherché
 * DÉPRÉCIÉ : utiliser jQuery http://api.jquery.com/class-selector/
 * 
 * Historique :
 * - introduit par ?? le ??
 * - jquerifié par Seb35 le 02/03/2011
 */
function getElementsByClass( searchClass, node, tag ) {
	return $( (tag?tag:'') + '.' + searchClass, node?node:document ).toArray();
}

/**
 * Diverses fonctions manipulant les classes
 * 
 * Surveiller l'implémentation de .classList http://www.w3.org/TR/2008/WD-html5-diff-20080122/#htmlelement-extensions
 */

/**
 * hasClass : l'élément donné a-t-il la classe donnée ?
 * DÉPRÉCIÉ : utiliser jQuery http://api.jquery.com/hasClass/
 * 
 * Historique :
 * - introduit par ?? le ?? (source : http://drupal.org.in/doc/misc/drupal.js.source.html)
 * - jquerifié par Seb35 le 02/03/2011
 */
function hasClass( node, className ) {
	return $( node ).hasClass( className );
}

/**
 * addClass : ajouter la classe donnée à l'élément donné
 * DÉPRÉCIÉ : utiliser jQuery http://api.jquery.com/addClass/
 * 
 * Historique :
 * - introduit par ?? le ?? (source : http://drupal.org.in/doc/misc/drupal.js.source.html)
 * - jquerifié par Seb35 le 02/03/2011
 */
function addClass( node, className ) {
	if ( $( node ).hasClass( className ) ) return false;
	$( node ).addClass( className );
	return true;
}

/**
 * removeClass : retirer la classe donnée à l'élément donné
 * DÉPRÉCIÉ : utiliser jQuery http://api.jquery.com/removeClass/
 * 
 * Historique :
 * - introduit par ?? le ?? (source : http://drupal.org.in/doc/misc/drupal.js.source.html)
 * - jquerifié par Seb35 le 02/03/2011
 */
function removeClass( node, className ) {
	if ( !$( node ).hasClass( className ) ) return false;
	$( node ).removeClass( className );
	return true;
}


/**********************************************************************************************************/
/* Fonctions générales MediaWiki (pallient les limitations du logiciel)                                   */
/* Surveiller : http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js?view=log  */
/**********************************************************************************************************/

/*
 * Fonction générales de lancement de fonctions ou de script
 * DÉPRÉCIÉ : utiliser jQuery
 * 
 * Historique :
 * - introduit par ?? le ??
 */
function addLoadEvent( func ) {
	$( func );
}

/**
 * Insérer un JavaScript d'une page particulière
 * DÉPRÉCIÉ (ou pas) : utiliser importScript qui fait partie du logiciel (importScript semble déprécié depuis 1.17 puisque dans l'ancien wikibits.js, mais n'a pas de remplaçant, à part la ligne ci-dessous)
 * 
 * Historique :
 * - introduit par Seb35 le ?? sur une idée de Mickachu
 * - jquerifié par Seb35 le 02/03/2011
 */
function loadJs( page ) {
	mw.loader.load( mw.config.get( 'wgScript' ) + '?title=' + mw.util.wikiUrlencode( page ) + '&action=raw&ctype=text/javascript', 'text/javascript' );
}

/**
 * Projet JavaScript
 * 
 * Historique :
 * - introduit par Seb35 le ?? après discussion sur le Projet:JavaScript
 * - jquerifié par Seb35 le 02/03/2011
 */
function obtenir( name ) {
	mw.loader.load( mw.config.get( 'wgScript' ) + '?title=' + mw.util.wikiUrlencode( 'MediaWiki:Gadget-' + name + '.js' ) + '&action=raw&ctype=text/javascript', 'text/javascript' );
}













/**
 * Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
 * 
 * Historique :
 * - introduit par ?? le ??
 * -jquerifié par Seb35 le 02/03/2011
 */
function TransformeEnDiscussion() {
	if( mw.config.get('wgPageName').search( 'Wikipédia:Le_Bistro' ) != -1
		|| mw.config.get('wgPageName').search( 'Wikipédia:Bulletin_des_administrateurs' ) != -1
		|| $( '#transformeEnPageDeDiscussion' ).length > 0 ) {
		$( 'body' ).addClass( 'ns-subject' ).removeClass( 'ns-talk' );
	}
}
$(TransformeEnDiscussion);

/**
 * Transformer certaines pages en pseudo-article
 * c'est raisonnable ? --Tavernier
 */
function TransformeEnArticle() {
	if( $( '#transformeEnArticle' ).length > 0 ) $( 'body' ).removeClass( 'ns--2 ns--1 ns-0 ns-1 ns-2 ns-3 ns-4 ns-5 ns-6 ns-7 ns-8 ns-9 ns-10 ns-11 ns-12 ns-13 ns-14 ns-15 ns-100 ns-101 ns-102 ns-103 ns-104 ns-105' ).addClass( 'ns-0' );
}
$(TransformeEnArticle);

/**
 * Insert Vector Buttons
 * Created on April 6th, 2010
 *
 * version: 0.4.0-beta
 * url: http://meta.wikimedia.org/wiki/User:Krinkle/Scripts/insertVectorButtons
 *
 * Insert Vector Buttons by Krinkle [1] is released in the public domain
 *
 * [1] <http://meta.wikimedia.org/wiki/User:Krinkle>
 */
jQuery(document).ready(function($){
if ( typeof $.fn.wikiEditor != 'undefined' && typeof kCustomMainInsertButton == 'undefined' && wgAction == 'edit') {
	window.kCustomMainInsertButton = function(imageId,imageFile,speedTip,tagOpen,tagClose,sampleText,callbackFunc){
		// Reason for the a[b]-method instead of the much shorter a.b-method
		// is to dynamicly set the object name imageId
		var wikiOptions = {'section': 'main', 'group': 'insert', 'tools': {}};
		wikiOptions.tools[imageId] = {
			label: speedTip,
			type: 'button',
			icon: imageFile,
			action: {
				type: 'callback',
				execute: function() {
					$( '#wpTextbox1' ).textSelection('encapsulateSelection',{
						pre: tagOpen,
						peri: sampleText,
						post: tagClose
					});
					if(typeof callbackFunc == 'function'){ callbackFunc(); }
				}
			}
		};
		$('#wpTextbox1').wikiEditor('addToToolbar', wikiOptions);
	};
	if ( $.isFunction(kCustomMainInsertButton_config) ) {
		kCustomMainInsertButton_config();
	}
} else {
	window.kCustomMainInsertButton = function(){
	};
}

});
/**
 * Ajouter un bouton à la fin de la barre d'outils
 */
function addCustomButton( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) {
	kCustomMainInsertButton( imageId, imageFile, speedTip, tagOpen, tagClose, sampleText );
}



/****************************************/
/* Applications pour l'ensemble du site */
/****************************************/

/**
 * Tout ce qui concerne la page d'édition
 * Voir MediaWiki:Common.js/edit.js pour ces fonctions
 */
if( mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit' ) {
	mw.loader.load( mw.config.get( 'wgScript' ) + '?title=MediaWiki:Common.js/edit.js&action=raw&ctype=text/javascript', 'text/javascript' );
}

/**
 * Liens d'accès directs pour la navigation au clavier
 */
function showSkipLinks() {
    
    if( $('#jump-to-nav').length == 0 ) return;
    $( '#jump-to-nav a:first' ).addClass( 'hidden' ).focus( function() {
        
        $(this).removeClass( 'hidden' );
    });
}
$(showSkipLinks);

/**
 * Modifications autour du titre
 * 
 * - Réécriture des titres
 * - Icônes de titres
 * - Déplacement des coordonnées
 * - Ajout d'un sous-titre
 * - Lien d'aide
 */
$(function() {
    
    var h1 = $('#firstHeading');
    if( h1.length == 0 ) h1 = $('h1:first');
    if( h1.length == 0 ) return;
    
    /**
     * Réécriture des titres
     * 
     * La fonction cherche un bandeau de la forme
     * <div id="RealTitleBanner">
     *   <span id="RealTitle">titre</span>
     * </div>
     *
     * Un élément comportant id="DisableRealTitle" désactive la fonction
     */
    var realTitle = $('#RealTitle');
    if( $('#RealTitleBanner').length > 0 && $('#DisableRealTitle').length == 0 && realTitle.length > 0 && realTitle.text() != '' ) {
        
        h1.html( realTitle.html() );
        $('#RealTitleBanner').remove();
        
        if ( mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10 ) {
            
            h1.after( '<p style="font-size:90%">Titre à utiliser pour créer un lien interne : <b>'+mw.config.get('wgPageName').replace('_',' ')+'</b></p>' );
        }
    }
    
    
    /**
     * 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.
     */
    var icones = $( 'div.icone_de_titre' );
    if( mw.config.get('skin') == 'modern' || mw.config.get('skin') == 'vector' ) icones.css( 'marginTop', '0em' );
    for( var j = icones.length; j > 0; --j ) {
        
        h1.before( icones.eq(j-1) );
    }
    // (ou)
    $('div.icone_de_titre').each( function(i,elem) { // pas sûr qu'on puisse inverser l'ordre de parcours, auquel cas cette version serait fausse
        
        if( mw.config.get('skin') == 'modern' || mw.config.get('skin') == 'vector' ) elem.css( 'marginTop', '0em' );
        h1.before( elem );
    });
    
    
    /**
     * Déplacement de coordonnées qui apparaissent en haut de la page 
     */
    h1.before( $('#coordinates').attr('id','coordinates-title') );
    
    
    /**
     * Ajout d'un sous-titre
     *
     * Fonction utilisée par [[Modèle:Sous-titre]]
     * 
     * La fonction cherche un élément de la forme
     * <span id="sous_titre_h1">Sous-titre</span>
     *
     * Doit être exécutée après les fonctions d'icônes de titre
     */
    var span = $('#sous_titre_h1');
    if( span.length > 0 ) {
        
        h1.append(' ').append( span );
    }
    
    
    /**
     * permet d'ajouter un petit lien (par exemple d'aide) à la fin du titre d'une page.
     * known bug : conflit avec le changement de titre classique.
     * Pour les commentaires, merci de contacter [[user:Plyd|Plyd]].
     */
    if( $('#helpPage').length > 0 && $('#helpPageURL').length > 0 ) {
        
        h1.append( '<span id="h1-helpPage">' + $('#helpPageURL').html() + '</span>' );
        $('#helpPage').remove();
    }
});

// Verwendung von OpenStreetMap in Wikipedia.
// (c) 2008 by Magnus Manske
// Released under GPL
// Modifié pour marcher après moveCoord() ci-dessus

if(typeof(MoveResizeAbsolute_AddMoveArea)!="function") obtenir('MoveResizeAbsolute');

function openStreetMap_Init () {
	var coordinatestitle = $( '#coordinates-title' );
	if( coordinatestitle.length == 0 ) return;
	
	var geohack = false;
	coordinatestitle.find( 'a' ).each( function(i,elem) {
		var h = $(this).attr( 'href' );
		if ( h.indexOf('geohack') != -1 ) {
			geohack = true;
			return false;
		}
	});
	if ( !geohack ) return ;
	
	var na = $( '<a>carte</a>', { title:'Afficher/Masquer la carte', click:openStreetMap_Toggle, style:'cursor:hand' } );
	c.append( ' (', na, ')   ' );
}

function openStreetMap_Toggle () {
  var coordinatestitle = $( '#coordinates-title' );
  if( coordinatestitle.length == 0 ) return;
  var osm = $( '#OpenStreetMap' );

  if (osm.length > 0) {
    if ( osm.css( 'display' ) == 'none' ) {
      osm.css( 'display', 'block' );
    } else {
      osm.css( 'display', 'none' );
    }
    return;
  }

  var found_link = false, h;
  coordinatestitle.find( 'a' ).each( function(i,elem) {
		h = $(this).attr( 'href' );
		if ( h.indexOf('geohack') != -1 ) {
			found_link = true;
			return false;
		}
	});
	if ( !found_link ) return ; // No geohack link found

  h = h.split('params=')[1] ;

  var LargeurEcran = MoveResizeAbsolute_GetScreenWidth();
  var HauteurEcran = MoveResizeAbsolute_GetScreenHeight();

  var OSMDiv = $( '<div/>', { id:'OpenStreetMap', style: { position:'absolute', 'z-index':5000, top:HauteurEcran*10/100, left:LargeurEcran*15/100, width:'70%', heigth:HauteurEcran*80/100, border:'2px solid black', 'background-color':'white', overflow:'hidden' } } );
  
  var MoveArea = $( '<div/>', { title:'Cliquer et glisser pour déplacer la carte' , style: { position:'relative', top:0, width:'100%', height:50 } } );
  
  var CloseLink = $( '<a>Masquer</a>', { title:'Cliquer pour masquer la carte', style: { cursor:'hand', 'float':'right', margin:10 }, click:openStreetMap_Toggle } );
  MoveArea.append( CloseLink );

  var url = 'http://toolserver.org/~kolossos/openlayers/kml-on-ol.php?lang=' + mw.config.get( 'wgUserLanguage' ) + '&params=' + h ;
  var iFrame = $( '<iframe/>', { src:url, style: { width:'100%', height:HauteurEcran*80/100)-100, clear:'both' } } ) ;
  
  var ResizeArea = $( '<div/>', { title:'Cliquer et glisser pour redimensionner la carte', style: { position:'relative', top:0, width:'100%', height:50 } } );
  
  OSMDiv.append(MoveArea);
  OSMDiv.append(iFrame);
  OSMDiv.append(ResizeArea);

  $( 'body' ).append( OSMDiv );
  
  var ElementsToMove = new Array(OSMDiv[0]);
  var ElementsToResize = new Array(OSMDiv[0], iFrame[0]);
  var ElementsMinWidth = new Array(150, 150);
  var ElementsMinHeights = new Array(200, 100);

  MoveResizeAbsolute_AddMoveArea(MoveArea[0], ElementsToMove);
  MoveResizeAbsolute_AddResizeArea(ResizeArea[0], ElementsToResize, ElementsMinWidth, ElementsMinHeights);
}

$(openStreetMap_Init);

/**
 * Déplacement des [modifier]
 *
 * Correction des titres qui s'affichent mal en raison de limitations dues à MediaWiki.
 * Ce script devrait pouvoir être supprimé lorsque le [[bugzilla:11555]] sera résolu (comportement équivalent)
 *
 * Copyright 2006, Marc Mongenet. Licence GPL et GFDL.
 *
 * The function looks for <span class="editsection">, and move them
 * at the end of their parent and display them inline in small font.
 * var oldEditsectionLinks=true disables the function.
 */
function setModifySectionStyle( element ) {
	
	if( !oldEditsectionLinks ) return;
	
	$( ':header', element ).addClass( 'modifiedSectionTitle' ).each( function(i,elem) {
		
		elem.append( elem.find( '.editsection' ) );
	});
}

$(setModifySectionStyle);


/** 
 * Boîtes déroulantes
 *
 * Pour [[Modèle:Méta palette de navigation]]
 * 
 * jQuery: il doit être possible d'utiliser le paquet mw-collapsable (pas encore disponible sur les sites wikimedia)
 * attendre un peu, il y a des problèmes avec IE8
 */

var Palette_Enrouler = '[enrouler]';
var Palette_Derouler  = '[dérouler]';

var Palette_max = 1; 
var Palette_index = -1;

function Palette_toggle(indexPalette){
  var Button = document.getElementById( "collapseButton" + indexPalette );
  var Table = document.getElementById( "collapsibleTable" + indexPalette );
  if ( !Table || !Button ) return false; 
  var FirstRow = Table.getElementsByTagName("tr")[0];
  var RowDisplay; 
  if ( Button.firstChild.data == Palette_Enrouler ) {
    RowDisplay = "none"
    Button.firstChild.data = Palette_Derouler;
  }else{
    RowDisplay = FirstRow.style.display;
    Button.firstChild.data = Palette_Enrouler;
  } 
  var Row = FirstRow.nextSibling;
  while(Row){
    if(Row.tagName && Row.tagName.toLowerCase() === "tr"){
      Row.style.display = RowDisplay;
    }
    Row = Row.nextSibling;
  }
} 

function Palette(Element){
  if(!Element) Element = document;
  var TableIndex = 0;
  var TableIndexes = new Array();
  var Tables = Element.getElementsByTagName( "table" ); 
  for ( var i = 0; i < Tables.length; i++ ) {
    if ( hasClass( Tables[i], "collapsible" ) ) {
      var Table = Tables[i];
      var Header = Table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
      /* only add button and increment count if there is a header row to work with */
      if (Header) {
        TableIndex++
        Palette_index++;
        TableIndexes[Palette_index] = Table;
        Table.setAttribute( "id", "collapsibleTable" + Palette_index ); 
        var Button     = document.createElement( "span" );
        var ButtonLink = document.createElement( "a" );
        var ButtonText = document.createTextNode( Palette_Enrouler ); 
        Button.className = "navboxToggle";
        ButtonLink.setAttribute( "id", "collapseButton" + Palette_index );
        ButtonLink.setAttribute( "href", "javascript:Palette_toggle(" + Palette_index + ");" );
        ButtonLink.appendChild( ButtonText ); 
        Button.appendChild( ButtonLink ); 
        Header.insertBefore( Button, Header.childNodes[0] ); 
      }
    }
  } 
  for(var index in TableIndexes){
    var Table = TableIndexes[index];
    if(hasClass(Table,"collapsed")||(TableIndex>Palette_max && hasClass(Table,"autocollapse")))
    Palette_toggle(index); 
  }
}
addOnloadHook(Palette);


/**
 * Pour [[Modèle:Boîte déroulante]] 
 * 
 * jQuery: il doit être possible d'utiliser le paquet mw-collapsable (pas encore disponible sur les sites wikimedia)
 */

var BoiteDeroulante_Enrouler = '[enrouler]';
var BoiteDeroulante_Derouler  = '[dérouler]'; 
var BoiteDeroulante_max = 0; 
var BoiteDeroulante_index = -1;

function BoiteDeroulante_toggle(indexBoiteDeroulante){
      var NavFrame = document.getElementById("NavFrame" + indexBoiteDeroulante);
      var NavToggle = document.getElementById("NavToggle" + indexBoiteDeroulante);
      var CaptionContainer = document.getElementById("NavCaption" + indexBoiteDeroulante);
      if (!NavFrame || !NavToggle || !CaptionContainer) return; 
      var caption = new Array();
      var CaptionSpans = CaptionContainer.getElementsByTagName('span');
      caption[0] = CaptionSpans[0].innerHTML;
      caption[1] = CaptionSpans[1].innerHTML;

      var Contents = NavFrame.getElementsByTagName('div');  
      if (NavToggle.innerHTML == caption[1]) {
            NavToggle.innerHTML = caption[0];
            for(var a=0,m=Contents.length;a<m;a++){
                  if(hasClass(Contents[a], "NavContent")){
                        Contents[a].style.display = 'none';
                        return;
                  }
            }
      }else{
            NavToggle.innerHTML = caption[1];
            for(var a=0,m=Contents.length;a<m;a++){
                  if(hasClass(Contents[a], "NavContent")){
                        Contents[a].style.display = 'block';
                        return;
                  }
            }
      }
}
  
function BoiteDeroulante(Element){
      if(!Element) Element = document;
      var NavFrameCount = -1;
      var NavFrames = Element.getElementsByTagName("div");
      for(var i=0,l=NavFrames.length;i<l;i++){
            if(hasClass(NavFrames[i], "NavFrame")){
                  var NavFrame = NavFrames[i];
                  NavFrameCount++;
                  BoiteDeroulante_index++;

                  if (NavFrame.title && NavFrame.title.indexOf("/")!=-1) {
                        var Enrouler = NavFrame.title.HTMLize().split("/")[1];
                        var Derouler = NavFrame.title.HTMLize().split("/")[0];
                  }else{
                        var Enrouler = BoiteDeroulante_Enrouler;
                        var Derouler = BoiteDeroulante_Derouler;    
                  }
                  NavFrame.title='';
                  var CaptionContainer = document.createElement('span');
                  CaptionContainer.id = 'NavCaption' + BoiteDeroulante_index;
                  CaptionContainer.style.display = "none";
                  CaptionContainer.innerHTML = '<span>' + Derouler + '</span><span>' + Enrouler + '</span>';
                  NavFrame.appendChild(CaptionContainer);

                  var NavToggle = document.createElement("a");
                  NavToggle.className = 'NavToggle';
                  NavToggle.id = 'NavToggle' + BoiteDeroulante_index;
                  NavToggle.href = 'javascript:BoiteDeroulante_toggle(' + BoiteDeroulante_index + ');';
                  var NavToggleText = document.createTextNode(Enrouler);
                  NavToggle.appendChild(NavToggleText);

                  NavFrame.insertBefore( NavToggle, NavFrame.firstChild );
                  NavFrame.id = 'NavFrame' + BoiteDeroulante_index;
                  if (BoiteDeroulante_max <= NavFrameCount) {
                        BoiteDeroulante_toggle(BoiteDeroulante_index);
                  }
            }
      }

}
addOnloadHook(BoiteDeroulante);

/**
 * WikiMiniAtlas
 *
 * voir WP:WMA 
 */
var metaBase = "//meta.wikimedia.org";
mw.loader.load( metaBase + '/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400', 'text/javascript' );

var wma_settings = { 
  buttonImage: '/media/wikipedia/commons/thumb/e/e9/Geographylogo.svg/18px-Geographylogo.svg.png'
}

/**
 * Utilisation du modèle Modèle:Images
 */
function toggleImage( event ) {
    $( '#ImageGroupsGr' + event.data.group + 'Im' + event.data.remindex ).css( 'display', 'none' );
    $( '#ImageGroupsGr' + event.data.group + 'Im' + event.data.shwindex ).css( 'display', 'inline' );
}

function imageGroup(bc){
    
    if ( mw.util.getParamValue('printable') == 'yes' ) return;
    
    // Pour chaque modèle
    mw.util.$content.find( 'div.ImageGroup div.ImageGroupUnits:first' ).each( function( i, modele ) {
        
        // Pour chaque image de chaque modèle
        var units = modele.children('.center');
        units.each( function( j, currentimage ) {
            
            if ( j != 0 ) currentimage.css( 'display', 'none' );
            
            var div = $( '<div/>', { style: { 'font-size':'110%', 'font-weight':'bold' } );
            
            var leftlink = ( j != 0 ) ? $( '<a>◀</a>', { 'class':'image_prev' title:'Image précédente', click( toggleImage, {group:group,remindex:remindex,shwindex:shwindex-1} } ) : $( '<span>&nbsp</span>' );
            div.append( leftlink );
            
            var comment = $( '<tt>(' + (j+1) + '/' + units.length + ')</tt>' );
            div.append( comment );
            
            var rightlink = ( j != units.length - 1 ) ? $( '<a>▶</a>', { 'class':'image_next', title:'Image suivante', click( toggleImage, {group:group,remindex:remindex,shwindex:shwindex+1} } ) : $( '<span>&nbsp</span>' );
            div.append( rightlink );
            
            currentimage.attr( 'id', 'ImageGroupsGr'+i+'Im'+j );
            currentimage.prepend( div );
        });
    });
}
$(imageGroup);

/**
 * Ajout d'un style particulier aux liens interlangues vers un bon article ou
 * un article de qualité
 */
function lienAdQouBAouPdQ() {
    
    if( $('#p-lang').length == 0 ) return;
    
    $('.AdQ').each( function(i,elem) { $( '#p-lang li.' + elem.attr('id').substr(4) ).addClass('AdQ').attr('title','Lien vers un article de qualité.'); });
    
    $('.BA').each( function(i,elem) { $( '#p-lang li.' + elem.attr('id').substr(3) ).addClass('BA').attr('title','Lien vers un bon article.'); });
    
    $('.PdQ').each( function(i,elem) { $( '#p-lang li.' + elem.attr('id').substr(4) ).addClass('PdQ').attr('title','Lien vers un portail de qualité.'); });
}
$(lienAdQouBAouPdQ);


/**
 * Déplace les liens portails vers la boite de catégorie
 * 
 * Copyright 2007, fr:user:Aoineko. Licence GFDL et GPL.
 */
var gUseMovePortalToCategoryBox = 1;

function movePortalToCategoryBox() {
    if( !gUseMovePortalToCategoryBox ) return;
    
    var div_portal = $('#portallinks');
    if( div_portal.length == 0 || !div_portal.hasClass( 'movable' ) ) return;
    
    if( $( '#catlinks' ).length == 0 ) $( 'div.printfooter:last' ).before( $( '<div/>', { id:'catlinks' } ) );
    
    $( '#catlinks' ).prepend( div_portal, $( '<hr/>' ) );
}
$(movePortalToCategoryBox);

/**
 * Permet d'afficher les catégories cachées pour les contributeurs enregistrés, en ajoutant un (+) à la manière des boîtes déroulantes
 */
function hiddencat() {
    
    if( mw.util.getParamValue( 'printable' ) == 'yes' ) return;
    
    if( $('#catlinks').length == 0 || $('#mw-hidden-catlinks').length == 0 ) return;
    if( $('#mw-hidden-catlinks').hasClass('mw-hidden-cats-user-shown') ) return;
    
    if( $('#mw-hidden-catlinks').hasClass('mw-hidden-cats-ns-shown') ) $('#mw-hidden-catlinks').addClass('mw-hidden-cats-hidden');
    
    if( $('#mw-normal-catlinks').length == 0 )
        
        $('#catlinks').prepend( '<div id="mw-normal-catlinks"><a href="/wiki/Catégorie:Accueil" title="Catégorie:Accueil">Catégories</a> : </div>' );
    
    else $('#mw-normal-catlinks').append(' | ');
    
    $('#mw-normal-catlinks').append('<a id="mw-hidden-cats-link" title="Cet article contient des catégories cachées" style="cursor:pointer;color:black;">[+]</a>');
    $('#mw-hidden-cats-link').click(toggleHiddenCats);
}

function toggleHiddenCats() {
    
    if( $('#mw-hidden-catlinks').hasClass('mw-hidden-cats-hidden') ) {
        
        $('#mw-hidden-catlinks').removeClass('mw-hidden-cats-hidden').addClass('mw-hidden-cat-user-shown');
        $('#mw-hidden-cats-link').text('[–]');
    } else {
        
        $('#mw-hidden-catlinks').removeClass('mw-hidden-cat-user-shown').addClass('mw-hidden-cats-hidden');
        $('#mw-hidden-cats-link').text('[+]');
    }
}
$(hiddencat);

/**
 * Script pour alterner entre plusieurs cartes de géolocalisation
 */

if( mw.config.get( 'wgAction' ) == 'view' || mw.config.get( 'wgAction' ) == 'purge' || mw.config.get( 'wgAction' ) == 'submit' ) $(GeoBox_Init);

function GeoBox_Init( Element ) { 
	var cont = $( 'div.img_toogle', Element );
	if( cont.length == 0 ) return;
	cont.each( function(i,elem) {
		elem.attr( 'id', 'img_toogle_' + i );
		var Boxes = elem.find( '.geobox' );
		var ToggleLinksDiv = $( '<ul/>', { id:'geoboxToggleLinks_' + i } );
		Boxes.each( function(j,ThisBox) {
			ThisBox.attr( { id:'geobox_' + i + '_' + j, style: { 'border-top':0 } } );
			var ThisAlt = ThisBox.find('img:first').attr( 'alt' );
			var toggle = $( '<a>' + ThisAlt + '</a>', { id:'geoboxToggle_' + i + '_' + j, style: { cursor:'hand' }, click:function() { GeoBox_Toggle(this); return false; } } );
			var Li = $( '<li/>' ).append( toggle );
			ToggleLinksDiv.append( Li );
			if( j == Boxes.length-1 ) Li.css( 'display', 'none' );
			else ThisBox.css( 'display', 'none' );
		});
		elem.append( ToggleLinksDiv );
	});
}

function GeoBox_Toggle( link ){
	var ImgToggleIndex = $(link).attr('id').split( 'geoboxToggle_' ).join( '' ).replace( /_.*/g, '' );
	var GeoBoxIndex = $(link).attr('id').replace( /.*_/g, '' );
	var ImageToggle = $( '#img_toogle_' + ImgToggleIndex );
	var Links = $( '#geoboxToggleLinks_' + ImgToggleIndex );
	var Geobox = $( '#geobox_' + ImgToggleIndex + '_' + GeoBoxIndex );
	var Link = $( '#geoboxToggle_' + ImgToggleIndex + '_' + GeoBoxIndex );
	if( ImageToggle.length == 0 || Links.length == 0 || Geobox.length == 0 || Link.length == 0 ) return;
	var AllGeoboxes = ImageToggle.find( '.geobox' );
	AllGeobox.each( function(i,elem) {
		if( elem == Geobox ) elem.css( 'display', '' );
		else elem.css( 'display', 'none' );
	});
	var AllToggleLinks = Links.find( 'a' );
	AllToggleLinks.each( function(i,elem) {
		if( elem == Link ) elem.css( 'display', 'none' );
		else elem.css( 'display', '' );
	});
}

/**
 * application de [[Wikipédia:Prise de décision/Système de cache]]
 * 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
 */

function addcache( element ) {
	
	if( no_external_cache ) return;
	
	$( 'ol.references a.external', element ).each( function(i,lien_en_cours) {
		var chemin = lien_en_cours.attr( 'href' );
		if( chemin.indexOf( 'http://wikiwix.com/cache/' ) != -1 || chemin.indexOf( 'http://web.archive.org/web/' ) != -1 || chemin.indexOf( 'wikipedia.org' ) != -1 || chemin.indexOf( 'wikimedia.org' ) != -1 || chemin.indexOf( 'stable.toolserver.org' ) != -1 ) return;
		if( lien_en_cours.parent().hasClass( 'noarchive' ) ) return;
		var titre = lien_en_cours.text();
		var last = $( '<small>\u00a0[</small>', { 'class':'cachelinks' } );
        last.append( $( '<a>archive</a>', { title:'archive de ' + titre, href:'http://wikiwix.com/cache/?url=' + chemin.replace(/%/g, '%25').replace(/&/g, '%26') + '&title=' + encodeURIComponent(titre) } ) );
        last.append( ']' );
        lien_en_cours.before( last );
	});
}

if( mw.config.get( 'wgNamespaceNumber' ) == 0 ) {
	$( addcache );
}


/**
 * Application de [[Wikipédia:Prise de décision/Lien interprojet]]
 * Copie les liens interprojets du modèle {{Autres projets}}
 * dans le menu en colonne de gauche.
 * remove_other_projects = true; dans le monobook personnel pour activer
 * en plus la suppression du modèle {{Autres projets}} en bas des articles.
 * no_other_projects = true; dans le monobook personnel pour désactiver
 * entièrement le script et l'ajout dans la colonne de gauche.
 */

function autresProjets() {
	if( no_other_projects ) return;
	if( mw.config.get( 'wgNamespaceNumber' ) != 0 ) return;
	if( mw.config.get( 'wgAction' != 'view' ) return;
	var div = $( '#autres_projets' );
	if( div.length == 0 ) return;
	
	if( mw.config.get( 'skin' ) == 'monobook' || mw.config.get( 'skin' ) == 'myskin' || mw.config.get( 'skin' ) == 'simple' ) {
		var Portlet_ClassName = 'portlet';
		var PBody_ClassName = 'pBody';
	} else if( mw.config.get( 'skin' ) == 'modern' ) {
		var Portlet_ClassName = 'portlet';
		var PBody_ClassName = 'pBody';
	} else if( mw.config.get( 'skin' ) == 'vector' ) {
		var Portlet_ClassName = 'portal';
		var PBody_ClassName = 'body';
	} else {
		var Portlet_ClassName = false;
	}
	if( !Portlet_ClassName ) return;
	
	var list = div.find( 'li' );
	var newlist = $( '<ul/>' );
	list.each( function(i,elem) {
		var a = elem.find( 'a:first' );
		var newlistitem = $( '<li/>' );
		var newlink = $( '<a>' + a.find( 'span:first' ).text() + '</a>', { title:a.text(), href:a.attr( 'href' ) } );
		newlistitem.append( newlink );
		newlist.append( newlistitem );
	});
	
	var interProject = $( '<div/>', { 'class':Portlet_ClassName, id:'p-project' } ).append( $( '<h5>Autres projets</h5>' ), $( '<div/>', { 'class':PBody_ClassName } ).append( '<ul>' + newlist.html() + '</ul>' ) );
	$( '#p-tb' ).after( interProject );
	if( remove_other_projects ) div.remove();
}
$( autresProjets );

/**
 * Classe sur les lignes de tableaux 
 * pour permettre l'alternance des couleurs de ligne
 * (compatible avec les tableaux triables)
 */

$(function(){
	$('#content table.alternance tr:nth-child(odd)').addClass('odd');
	$('#content table.sortable.alternance th a.sortheader').click(function(){
		$('#content table.sortable.alternance tr').removeClass('odd');
		$('#content table.sortable.alternance tr:nth-child(odd)').addClass('odd');
	});
});



/************************************************************/
/* Function Strictement spécifiques à un espace de nom ou à une page */
/************************************************************/

// PAGE D'ACCUEIL
if( mw.util.isMainPage() ) {

/**
 * Suppression du titre sur la page d'accueil, 
 * changement de l'onglet et lien vers la liste complète des Wikipédias depuis l'accueil
 */
function mainPageTransform(){
  //retiré le test, car le if encadrant la fonction est déjà plus restrictif - darkoneko 05/12/09
  $('#ca-nstab-project a').text('Accueil');
  mw.util.addPortletLink( 'p-lang', 'http://www.wikipedia.org/', 'Liste complète', 'interwiki-listecomplete', 'Liste complète des Wikipédias' );
}
$(mainPageTransform);

} // FIN DU IF page d'accueil






// ESPACE DE NOM 'SPECIAL'
if( mw.config.get('wgNamespaceNumber') == -1 ) {

/**
 * Afficher une explication au nombre d'octets dans la liste de suivi
 */
function toolTipPlusMinus() {
  if( mw.config.get('wgCanonicalSpecialPageName') != "Watchlist" ) return;
  var tt = "Nombre d'octets d'écart entre les deux dernières versions de la page";
  $( 'span.mw-plusminus-pos, span.mw-plusminus-neg, span.mw-plusminus-null' ).attr( 'title', tt );
}
$(toolTipPlusMinus);




/**
 * Modifie Special:Search pour pouvoir utiliser différents moteurs de recherche,
 * disponibles dans une boîte déroulante.
 * Auteurs : Jakob Voss, Guillaume, importé depuis la Wiki allemande
 * <pre><nowiki>
 */

function externalSearchEngines() {
  if (typeof SpecialSearchEnhanced2Disabled != 'undefined') return;
  if (wgCanonicalSpecialPageName != 'Search') return;

  var beforeNode = $('#mw-search-top-table').next();
  if (beforeNode.length == 0) return;

  var firstEngine = 'mediawiki';

  var choices = $('<div></div>');
  choices.attr('id', 'searchengineChoices');
  choices.css('text-align', 'center');

  var lsearchbox = document.getElementById('searchText');
  var initValue = lsearchbox.value;

  var space = '';

  for (var id in searchEngines) {
    var engine = searchEngines[id];
    if(engine.ShortName) {
      if (space) choices.appendChild(space);
      space = document.createTextNode(' ');

      var input = $('<input />');
      input.attr({ 
        type: 'radio', 
        name: 'searchengineselect',
        value: id,
        onFocus: 'changeSearchEngine(this.value)',
        id: 'searchengineRadio-'+id
      });
      
      var span = $('<span></span>');
      span.append(input);
      choices.append(span);
      
      var label = $('<label />');
      label.attr('for', 'searchengineRadio-' + id);
       
      if (engine.Template.indexOf('http') == 0) {
        var lienMoteur = $('<a></a>');
        lienMoteur.attr('href', engine.Template.replace('{searchTerms}', initValue).replace('{language}', 'fr'));
        lienMoteur.text(engine.ShortName);
        label.append(lienMoteur);
      } else {
        label.text(engine.ShortName);
      }

      choices.append(label);
    }
  }
  
  beforeNode.before(choices);

  var input = $('<input />');
  input.attr('id', 'searchengineextraparam');
  input.attr('type', 'hidden');

  beforeNode.before(input);

  changeSearchEngine(firstEngine, initValue);
}

function changeSearchEngine(selectedId, searchTerms) {

  var currentId = document.getElementById("searchengineChoices").currentChoice;
  if (selectedId == currentId) return;

  document.getElementById("searchengineChoices").currentChoice = selectedId;
  var radio = document.getElementById('searchengineRadio-'  + selectedId);
  radio.checked = "checked";

  var engine = searchEngines[selectedId];
  var p = engine.Template.indexOf('?');
  var params = engine.Template.substr(p+1);

  var form;
  if (document.forms["search"]) {
    form = document.forms["search"];
  } else {
    form = document.getElementById("powersearch");
  }
  form.setAttribute("action", engine.Template.substr(0,p));

  var l = ("" + params).split("&");
  for (var idx = 0;idx < l.length;idx++) {
    var p = l[idx].split("=");
    var pValue = p[1];

    if (pValue == "{language}") {
    } else if (pValue == "{searchTerms}") {
      var input;
      input = document.getElementById("searchText");

      input.name = p[0];
    } else {
      var input = document.getElementById("searchengineextraparam");

      input.name = p[0];
      input.value = pValue;
    }
  }
}



if (wgCanonicalSpecialPageName == "Search") {
var searchEngines = {
  mediawiki: {
    ShortName: "Recherche interne",
    Template: wgScript + "?search={searchTerms}"
  },
  exalead: {
    ShortName: "Exalead",
    Template: "http://www.exalead.com/search/wikipedia/results/?q={searchTerms}&language=fr"
  },
  google: {
    ShortName: "Google",
    Template: "http://www.google.fr/search?as_sitesearch=fr.wikipedia.org&hl={language}&q={searchTerms}"
  },
  wikiwix: {
    ShortName: "Wikiwix",
    Template: "http://fr.wikiwix.com/index.php?action={searchTerms}&lang={language}"
  },

  wlive: {
    ShortName: "Bing",
    Template: "http://www.bing.com/search?q={searchTerms}&q1=site:http://fr.wikipedia.org"
  },
  yahoo: {
    ShortName: "Yahoo!",
    Template: "http://fr.search.yahoo.com/search?p={searchTerms}&vs=fr.wikipedia.org"
  },
globalwpsearch: {
    ShortName: "Global WP",
    Template: "http://vs.aka-online.de/cgi-bin/globalwpsearch.pl?timeout=120&search={searchTerms}"
  }
};
addOnloadHook(externalSearchEngines);
}



/**
 * Affiche un modèle Information sur la page de téléchargement de fichiers [[Spécial:Téléchargement]]
 * Voir aussi [[MediaWiki:Onlyifuploading.js]]
 */
if( wgCanonicalSpecialPageName == "Upload" ) {
	mw.loader.load( mw.config.get( 'wgScript' ) + '?title=MediaWiki:Onlyifuploading.js&action=raw&ctype=text/javascript', 'text/javascript' );
}

} // Fin du code concernant l'espace de nom 'Special'


// ESPACE DE NOM 'UTILISATEUR'
if( wgNamespaceNumber == 2 ) {

/* En phase de test */
/* 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
*/
function CadreOngletInit(){
 // retour si ailleurs que sur l'espace utilisateur, 
 // sachant que c'est une horreur au niveau de l'accessibilité
 // et qu'il est impossible de "récupérer" ou de recycler ce script
 // (celui-ci fonctionnant par inclusion de sous pages)
 if (wgCanonicalNamespace != 'User') return;  
  var i=0       
  for (i=0;i<=9;i++){
     var vMb = $( '#mb'+i );
     if( vMb.length == 0 ) break;

     var j=1    
     var vOgIni = 0  
     for (j=1;j<=9;j++){
        var vBt = $( '#mb'+i+'bt'+j );
        if( vBt.length == 0 ) break;
        vBt.click( CadreOngletVoirOnglet );
        if( vBt.hasClass( 'mbBoutonSel' ) ) vOgIni=j;
     }

     if (vOgIni == 0) { 
         vOgIni = 1+Math.floor((j-1)*Math.random()) ;
         $( '#mb'+i+'og'+vOgIni ).css( 'display', 'block' );
         $( 'mb'+i+'og'+vOgIni ).css( 'visibility', 'visible' );
         $( 'mb'+i+'bt'+vOgIni ).addClass( '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 = $( '#'+vMbNom+'og'+i );
        if( vOgElem == 0 ) break;
        if (vIndex==i){ 
                vOgElem.css( 'display', 'block' );
                vOgElem.css( 'visibility', 'visible' );
                $( '#'+vMbNom+'bt'+i ).addClass( 'mbBoutonSel' );
        } else {             
                vOgElem.css( 'display', 'none' );
                vOgElem.css( 'visibility', 'hidden' );
                $( '#'+vMbNom+'bt'+i ).addClass( 'mbBouton' );
        }
  }
  return false; 
}
$(CadreOngletInit);
/*FIN DU CODE JAVASCRIPT DE "CADRE À ONGLETS"*/
} // Fin du code concernant l'espace de nom 'Utilisateur'


// ESPACE DE NOM 'RÉFÉRENCE'
if( wgNamespaceNumber == 104 ) {

/*
 * Choix du mode d'affichage des références
 * Devraient en principe se trouver côté serveur
 * @note L'ordre de cette liste doit correspondre a celui de Modèle:Édition !
 */

function addBibSubsetMenu() {
	$('#specialBib').append('<select style="display:inline;" onChange="chooseBibSubset(selectedIndex)">'
		+ '<option>Liste</option>'
		+ '<option>WikiNorme</option>'
		+ '<option>BibTeX</option>'
		+ '<option>ISBD</option>'
		+ '<option>ISO690</option>'
		+ '</select>').css( 'display', 'block');
	
	/* default subset - try to use a cookie some day */
	chooseBibSubset(0);
}

// select subsection of special characters
function chooseBibSubset(s) {
	var listeNormes = [ 'div.BibList', 'div.WikiNorme', 'div.BibTeX', 'div.ISBD', 'div.ISO690' ];
	$( listeNormes.join( ',') ).css( 'display', 'none');
	$( listeNormes[s] ).css( 'display', 'block' );
}
$(addBibSubsetMenu);
} // Fin du code concernant l'espace de nom 'Référence'


/* 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;
	var rebours = $( '#rebours' );
	if( rebours.length == 0 ) return;
	var destime = rebours.attr( 'title' ).split( ';;' );
	var Maintenant = (new Date).getTime();
	var Future = new Date(Date.UTC(destime[0], (destime[1]-1), destime[2], destime[3], destime[4], destime[5])).getTime();
	var Diff = (Future-Maintenant);
	if (Diff < 0) {Diff = 0}
	var TempsRestantJ = Math.floor(Diff/(24*3600*1000));
	var TempsRestantH = Math.floor(Diff/(3600*1000)) % 24;
	var TempsRestantM = Math.floor(Diff/(60*1000)) % 60;
	var TempsRestantS = Math.floor(Diff/1000) % 60;
	var 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";
	rebours.html( TempsRestant );
	setTimeout( Rebours, 1000 );
}
$(Rebours);


/* Ajoute la date de dernière modification sur le bandeau événement récent */
/* Plyd - 12 juin 2009, jquerizée par Seb35 */
function LastModCopy() {
  
  var LastModSpan = $('#lastmod');                                 // Monobook et affiliés, Modern
  if( LastModSpan.length == 0) LastModSpan = $('#footer-info-lastmod'); // Vector
  var LastModBandeau = $("#lastmodcopy");
  if( LastModSpan.length == 0 || LastModBandeau.length == 0 ) return;
  LastModBandeau.html(LastModSpan.html());
}
$(LastModCopy);


/*********************************/
/* Autres fonctions non classées */
/*********************************/

/*
* Fonction
*
* Retourne une chaîne de caractères de la date courante selon dans un certain format
* @param format Format de la date "j" pour le jour, "m" pour le mois et "a" pour l'année. Ainsi si l'on est le 21 novembre 2007 et l'on passe en paramètre cette chaîne "a_m_d", la chaîne retournée sera "2007_novembre_21"
* Auteur : Sanao
* Dernière révision : 21 novembre 2007
*/
function getStrDateToday( format ) {
  var str_mois = [ 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre' ];
  var today = new Date();
  var day = today.getDate();
  var year = today.getYear();
  if (year < 2000)
  {
    year = year + 1900;
  }
  var str_date = format;
  
  //Création de la chaîne
  var regex = /j/gi;
  str_date = str_date.replace(regex, day.toString());
  regex = /a/gi;
  str_date = str_date.replace(regex, year.toString());
  regex = /m/gi;
  str_date = str_date.replace(regex, str_mois[today.getMonth()]);

  return (str_date);
}

/*
   Outil pour permettre l'affichage immédiat d'un javascript pour tous les utilisateurs en même temps.
   Même s'ils ne rechargent pas Wikipédia avec CTRL+R.
   Utile initialement pour prévoir une bonne réactivité et un lancement général du [[Projet:Impression]].
   Plyd - 12 octobre 2008
   tag urgentsynchronejs inclus (pas encore) dans [[MediaWiki:Copyright]]
*/
function urgentSynchroneJsLoad() {
	var urgentsynchronejs = $( '#urgentsynchronejs' );
	if( urgentsynchronejs.length == 0 ) return;
	importScript( 'MediaWiki:Common.js/' + urgentsynchronejs.attr( 'title' );
}
$(urgentSynchroneJsLoad);


/* WikiForm pour la génération facilité de modèles */
/* Plyd - 10/02/2008 */
if (document.getElementById("WikiForm")) {
   importScript("MediaWiki:Gadget-WikiForm.js");
}


/* /petites fonctions pratiques */

/** For sysops and accountcreators *****************************************
 * Repris depuis Common.js @ enwiki - Crée le common.js réservé aux admins.
 *
 *  Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]],
 *               and accountcreator-specific CSS at [[MediaWiki:Accountcreator.css]].
 */
if ( wgUserGroups ) {
  for ( var g = 0; g < wgUserGroups.length; ++g ) {
    if ( wgUserGroups[g] == "sysop" ) {
      importStylesheet("MediaWiki:Sysop.css");
      addOnloadHook( function() {
        if ( !window.disableSysopJS ) {
          importScript("MediaWiki:Sysop.js");
        }
      } );
    } 
  }
}

////////////////////////////////////////////////////////////////////////////////
// MediaWiki:Common.js/edit.js /////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

/**
 * Applications spécifiques à la page d'édition
 * <nowiki>
 */
/* todo : migrer celles qui ne sont pas vitales dans les gadgets */

var IsEdit = ( mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit' );


/**
 * Désactiver le bouton Sauvegarder à la première édition
 * English : Force IP to preview before saving changes.
 * Copyright Marc Mongenet, 2006
 * Plyd 05/2007: add "after preview" in the button to prevent misunderstanding from beginners
 */
function forcePreview() {
	if( mw.config.get( 'wgUserName' ) != null && mw.config.get( 'wgAction' ) != 'edit' ) return;
	var saveButton = $( '#wpSave' );
	if( saveButton.length == 0 ) return;
	saveButton.attr( 'disabled', 'disabled' ).val( 'Publier (après prévisualisation)' ).css( 'font-weight', 'normal' );
	$( '#wpPreview' ).css( 'font-weight', 'bold' );
}
$( forcePreview );

/**
 * Fonctions de remplissage automatique
 */

function InitPDDvide(page_name) {
  return "";
}

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

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

function InitArbReq( page_name ) {
  return "<!-- Ne pas indexer la page par les robots -->\n" +
         "__NOINDEX__ \n" +
         "<!-- Publier la page pour l'initialiser puis suivre les instructions -->\n" +
         "{{subst:Wikipédia:Comité d'arbitrage/Arbitrage/Modèle}}\n" +
         "<!-- N'oubliez pas d'ajouter un lien vers cette page sur [[Wikipédia:Comité d'arbitrage/Arbitrage]] -->";
}

function InitDiscArbReq( page_name ) {
  return "<!-- Ne pas indexer la page par les robots -->\n" +
         "__NOINDEX__ \n" +
         "<!-- Publier la page pour l'initialiser -->\n" +
         "{{subst:Discussion Wikipédia:Comité d'arbitrage/Arbitrage/Modèle}}";
}

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

function InitPL( page_name ) {
  return "<!-- Remplir les paramètres mois et année à la sous page correspondante, et créer les liens rouges -->\n" +
         "{{Portail:Littérature/Invitation à la lecture/Sélection/Modèle \n" +
         "| mois = \n" +
         "| année = \n" +
         "}} \n" +
         "<noinclude>{{Portail:Littérature/Invitation à la lecture/Sélection/Modèle inclusion \n" +
         "| mois = \n" +
         "| année = \n" +
         "}} \n" +
         "</noinclude>";
}

var init_if_empty = {
'Discussion_Wikipédia:Images_à_supprimer/': InitPDDvide,
'Wikipédia:Images_à_supprimer/': InitIaS,
'Discussion_Wikipédia:Comité_d\'arbitrage/Arbitrage/': InitDiscArbReq,
'Wikipédia:Comité_d\'arbitrage/Arbitrage/': InitArbReq,
'Discussion_Wikipédia:Comité_de_lecture/': InitPDDvide,
'Wikipédia:Comité_de_lecture/': InitCdl,
'Discussion_Portail:Littérature/Invitation_à_la_lecture/Sélection/': InitPDDvide,
'Portail:Littérature/Invitation_à_la_lecture/Sélection/': InitPL
};

/**
 * 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.
	var text_area = $( '#wpTextbox1' );
	if( text_area.length == 0 ) return;
	for( var page_match in init_if_empty ) {
		var index = mw.config.get( 'wgPageName' ).indexOf( page_match );
		if( index == 0 ) {
			var page_name = mw.config.get( 'wgPageName' ).slice( page_match.length ).replace( /_/g, ' ' );
			text_area.val( init_if_empty[ page_match ]( page_name ) );
			break;
		}
	}
}
$( InitPage );

/**
 * Caractères spéciaux
 *
 * Ajouter un menu pour choisir des sous-ensembles de caractères spéciaux.
 * Ecrit par Zelda, voir sur [[Utilisateur:Zelda/Edittools.js]].
 * Remplace l'ancienne fonction par une variante plus rapide.
 */

/**
 * Ajoute un menu déroulant permettant de choisir un jeu de caractères spéciaux
 * Les caractères spéciaux sont définis dans Mediawiki:Edittools
 */
/* UPDATE 1.17 : plus utile, à moins que monobook l'utilise encore (?) */
/* UPDATE 1.17 : plus utile, à moins que monobook l'utilise encore (?)
   Encore utilisé dans quelques scripts utilisateur. − Marin */
function addCharSubsetMenu() {
  var specialchars = $('#specialcharsets');
  if (!specialchars) return;
 
  // Construction du menu de selection
  var charSubsetSelect = $('<select />');
  charSubsetSelect.css('display', 'inline');
  charSubsetSelect.change(function () { chooseCharSubset(this.selectedIndex) });
 
  // Ajout des options au menu
  var p = $('#specialcharsets p');
  
  for (var i = 0; i < p.length ; i++) {
    var opt = $("<option></option>");
    opt.text($(p[i]).attr('title'));
    charSubsetSelect.append(opt);
  }
 
  $(specialchars.children()[0]).before(charSubsetSelect);
 
  /* default subset - try to use a cookie some day */
  chooseCharSubset(0);
}
 
/**
 * Affichage du jeu de caractères sélectionné
 */
function chooseCharSubset(index) {
  var p = $('#specialcharsets p');
  for (var i = 0; i < p.length ; i++) {
    // Initialisation du jeu de caractères sélectionné
    if (i == index) {
        initializeCharSubset(p[i]);
    }
    // Affichage du jeu sélectionné, masquage des autres
    $(p[i]).css('display', i == index ? 'inline' : 'none');
    $(p[i]).css('visibility', i == index ? 'visible' : 'hidden');
  }
}

/**
 * Initialisation du jeu de caractères sélectionné
 * Paramètre : paragraphe contenant le jeu à initialiser. Initialise tous les
 * caractères contenus dans les sous-spans du paragraphe
 */
function initializeCharSubset(p) {
  // recherche des sous-elements de type span à traiter
  var spans = p.getElementsByTagName("span");
  if (!spans) return;

  // regexp pour echapper les caractères JS spéciaux : \ et '
  var re = new RegExp("(\\\\|')", "g");
  // gestion du caractère d'échappement '\'
  var escapeRe = new RegExp("[^\\\\](\\\\\\\\)*\\\\$", "g");
  var unescapeRe = new RegExp("\\\\\\\\", "g");

  // traitement des spans du paragraphe
  for (var j = 0; j < spans.length; j++) {
    // span deja traité
    if (spans[j].childNodes.length == 0 || spans[j].childNodes[0].nodeType != 3) continue;

    // On parse le contenu du span
    var chars = spans[j].childNodes[0].nodeValue.split(" ");
    for (var k = 0; k < chars.length; k++) {
      var a = document.createElement("a");
      var tags = chars[k];
      tags = tags.replace(/%27/g, "'").replace(/%5C/g, "\\");

      // regroupement des mots se terminant par un espace protégé par un \
      while (k < chars.length && chars[k].match(escapeRe)) {
      	k++;
	tags = tags.substr(0, tags.length - 1) + " " + chars[k];
      }

      // création du lien insertTag(tagBegin, tagEnd, defaultValue) en protegeant les caractères JS \ et '
      tags = (tags.replace(unescapeRe, "\\")).split("+");
      var tagBegin = tags[0].replace(re, "\\$1");
      var tagEnd = tags.length > 1 ? tags[1].replace(re, "\\$1") : "";
      var defaultValue = tags.length > 2 ? tags[2].replace(re, "\\$1") : "";
      a.href = "javascript:insertTags('" + tagBegin + "','" + tagEnd + "', '" + defaultValue + "')";
      //a.href="#";
      //eval("a.onclick = function() { insertTags('" + tagBegin + "','" + tagEnd + "', '" + defaultValue + "'); return false; }");

      a.appendChild(document.createTextNode((tagBegin + tagEnd).replace(unescapeRe, "\\")));
      spans[j].appendChild(a);
      spans[j].appendChild(document.createTextNode(" "));
    }
    // suppression de l'ancien contenu
    spans[j].removeChild(spans[j].firstChild);
  }
}
if(IsEdit) addOnloadHook(addCharSubsetMenu);

/**
 * Permet d'ajouter d'un jeu de caractères spéciaux dans le menu déroulant
 * paramètres :
 * - nom du jeu de caractères
 * - contenu HTML. Les caractères spéciaux doivent être dans des spans
 *   exemple : "caractères : <span>â ê î ô û</span>"
 */
function addSpecialCharsetHTML(title, charsHTML) {
  var specialchars = document.getElementById('specialcharsets');
  if (!specialchars) return;

  // Ajout des caractères spéciaux. Les liens seront initialisé par initializeCharSubset()
  // lors de la sélection
  var specialcharsets = document.getElementById('specialcharsets');
  var p = document.createElement("p");
  p.style.display = "none";
  p.title = title;
  p.innerHTML = charsHTML;
  specialcharsets.appendChild(p);
}

/**
 * Permet d'ajouter d'un jeu de caractères spéciaux dans le menu déroulant
 * paramètres :
 * - nom du jeu de caractères
 * - caractères spéciaux
 * exemple d'utilisation : addSpecialCharset("Français", "â ê î ô û");
 */
function addSpecialCharset(title, chars) {
  addSpecialCharsetHTML(title, "<span>" + chars + "</span>");
}

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

function generateTableau(nbCol, nbRow, styleHeader, styleLine) {
  var code = "\n{| " +
    ((styleHeader==1) ? 'class="wikitable"' : '')+
    '\n|+ 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);
}

/**
 * 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 styleHeader = document.paramForm.inputHeader.checked; ';
  javaCode += 'var styleLine = document.paramForm.inputLine.checked; ';
  javaCode += 'window.opener.generateTableau(col,row,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">/*<![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('<label for="popuptableau-inputrow">Nombre de lignes :</label> <input type="text" name="inputRow" value="3" id="popuptableau-inputrow"><p>');
  popup.document.write('<label for="popuptableau-inputcol">Nombre de colonnes :</label> <input type="text" name="inputCol" value="3" id="popuptableau-inputcol"><p>');
  popup.document.write('<label for="popuptableau-inputheader">Mise en forme (wikitable) :</label> <input type="checkbox" name="inputHeader" checked="1" id="popuptableau-inputheader"><p>');
  popup.document.write('<label for="popuptableau-inputline">Lignes grises alternées :</label> <input type="checkbox" name="inputLine" checked="0" id="popuptableau-inputline"><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
 */

addCustomButton('/media/wikipedia/commons/0/04/Button_array.png',
                'Tableau',
                '{|\n|-\n|\n|\n|}',
                '',
                '',
                'mw-editbutton-array');

addCustomButton('/media/wikipedia/commons/c/c9/Button_strike.png',
                'Rayer',
                '<s>',
                '</s>',
                '',
                'mw-editbutton-strike');

addCustomButton('/media/wikipedia/commons/8/88/Btn_toolbar_enum.png',
                'Énumération',
                '\n# élément 1\n# élément 2\n# élément 3',
                '',
                '',
                'mw-editbutton-enum');

addCustomButton('/media/wikipedia/commons/1/11/Btn_toolbar_liste.png',
                'Liste',
                '\n* élément A\n* élément B\n* élément C',
                '',
                '',
                'mw-editbutton-liste');

addCustomButton('/media/wikipedia/commons/9/9e/Btn_toolbar_gallery.png',
                'Galerie d\'images',
                '\n<gallery>\nFichier:Exemple.jpg|[[Tournesol]]\nFichier:Exemple1.jpg|[[La Joconde]]\nFichier:Exemple2.jpg|Un [[hamster]]\n</gallery>\n{{message galerie}}',
                '',
                '',
                'mw-editbutton-gallery');

addCustomButton('/media/wikipedia/commons/3/37/Btn_toolbar_commentaire.png',
                'Commentaire',
                '<!--',
                '-->',
                '',
                'mw-editbutton-comment');

addCustomButton('/media/wikipedia/commons/4/47/Button_redir.png',
                'Redirection',
                '#REDIRECTION[[',
                ']]',
                'nom de la destination',
                'mw-editbutton-redir');

addCustomButton('/media/wikipedia/commons/b/b4/Button_category03.png',
                'Catégorie',
                '[[Catégorie:',
                ']]',
                'nom de la catégorie',
                'mw-editbutton-category');

addCustomButton('/media/wikipedia/commons/3/3b/Button_template_alt.png',
                'Modèle',
                '{{',
                '}}',
                'modèle ou page à inclure',
                'mw-editbutton-template');

addCustomButton('/media/wikipedia/commons/c/c4/Button_ref.png',
                'Référence',
                '<ref>',
                '</ref>',
                'référence, citation ou lien',
                'mw-editbutton-ref');

addCustomButton('/media/wikipedia/commons/6/64/Buttonrefvs8.png',
                'Index des références',
                '== Notes et références ==\n{{Références}}',
                '',
                '',
                'mw-editbutton-references');

var voirAussi = '== Notes et références ==\n'
 + '{{Références}}\n\n'
 + '== Annexes ==\n'
 + '=== Articles connexes ===\n'
 + '* [[À remplacer]]\n\n'
 + '=== Liens externes ===\n'
 + '*\n\n'
 + '=== Bibliographie ===\n'
 + '* [[À remplacer]]\n\n'
 
addCustomButton('/media/wikipedia/commons/b/bb/Seealso.png',
                'Section Annexes',
                voirAussi,
                '',
                '',
                'mw-editbutton-voiraussi');

/**
 * Changer le lien du bouton de création de tableau et supprime le bouton signature sur les articles
 */
function changButtons() {
  $('#mw-editbutton-array').click(popupTableau);
  $('#mw-editbutton-signature').hide();
}

if(IsEdit) $(changButtons);

//</nowiki>