MediaWiki:Common.js

De Wikonsult
Sauter à la navigation Sauter à la recherche

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

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac).
  • Google Chrome : appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac).
  • Internet Explorer : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
  • Opera : allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité et sécurité → Effacer les données d’exploration → Images et fichiers en cache.
/*jshint maxerr:600, scripturl:true, laxbreak:true, sub:true, loopfunc:true, forin:false, unused:true*/
/*global mw, $*/
/**
 * 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
 *
 * Note : une ré-écriture de cette page en utilisant jQuery a été commencée sur [[Projet:JavaScript/Refonte Common.js avec jQuery]].
 *
 * <nowiki> /!\ Ne pas retirer cette balise
 */


/**********************************************************************************************************/
/* Fonctions générales MediaWiki (pallient les limitations du logiciel)                                   */
/* Surveiller : https://git.wikimedia.org/history/mediawiki%2Fcore.git/HEAD/skins%2Fcommon%2Fwikibits.js  */
/**********************************************************************************************************/

/**
 * Projet JavaScript
 */
window.obtenir = function ( name ) {
	importScript( 'MediaWiki:Gadget-' + name + '.js' );
};

/**
 * Transformer les pages du Bistro, du BA et les pages spécifiées en page de discussion
 */
function TransformeEnDiscussion( $ ) {
	if (
		/^Wikipédia:(Le_Bistro|Bulletin_des_administrateurs|Questions_techniques)/.test( mw.config.get( 'wgPageName' ) ) ||
		$( '#transformeEnPageDeDiscussion' ).length
	) {
		$( 'body' ).removeClass( 'ns-subject' ).addClass( 'ns-talk' );
	}
}
$( TransformeEnDiscussion );

/**
 * Ajouter un bouton à la fin de la barre d'outils
 */
if ( typeof addCustomButton === 'undefined' ) {
	mw.log.deprecate( window, 'addCustomButton', function ( imageFile, speedTip, tagOpen, tagClose, sampleText, imageId ) {
		if ( mw.toolbar ) {
			mw.toolbar.addButton( {
				imageFile: imageFile,
				speedTip: speedTip,
				tagOpen: tagOpen,
				tagClose: tagClose,
				sampleText: sampleText,
				imageId: imageId
			} );
		}
	}, 'Use mw.toolbar.addButton instead.' );
}


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

/**
 * Tout ce qui concerne la page d'édition
 * Voir MediaWiki:Common.js/edit.js pour ces fonctions
 */
if ( ['edit','submit'].indexOf(mw.config.get('wgAction')) !== -1 ) {
	importScript( 'MediaWiki:Common.js/edit.js' );
}

/**
 * Réécriture des titres
 *
 * Fonction utilisée par [[Modèle:Titre incorrect]]
 *
 * 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
 */
function rewritePageTitle( $ ) {
	var $realTitle, titleText, $h1,
		$realTitleBanner = $( '#RealTitleBanner' );
	if ( $realTitleBanner.length && !$( '#DisableRealTitle' ).length ) {
		$realTitle = $( '#RealTitle' );
		$h1 = $( 'h1:first' );
		if ( $realTitle.length && $h1.length ) {
			titleText = $realTitle.html();
			if ( titleText === '' ) {
				$h1.hide();
			} else {
				$h1.html( titleText );
				if ( mw.config.get('wgAction') === 'view' && $realTitle.children().length === 0 ) {
					document.title = $realTitle.text() + " — Wikipédia";
				}
			}
			$realTitleBanner.hide();
			$( '<p>' ).css( 'font-size', '80%' )
				.html( 'Titre à utiliser pour créer un lien interne : <b>' + mw.config.get('wgPageName').replace( /_/g, ' ' ) + '</b>' )
				.insertAfter( $h1 );
		}
	}
}
$( rewritePageTitle );


/**
 * 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>
 */

function sousTitreH1( $content ) {
	$( '#firstHeading > #sous_titre_h1' ).remove();
	var $span = $content.find( '#sous_titre_h1' );
	if ( $span.length ) {
		$span.prepend( ' ' );
		$( '#firstHeading' ).append( $span );
	}
}
mw.hook( 'wikipage.content' ).add( sousTitreH1 );


/**
 * Boîtes déroulantes
 *
 * Pour [[Modèle:Méta palette de navigation]]
 */

var Palette_Enrouler = '[masquer]';
var Palette_Derouler = '[afficher]';

var Palette_max = 1;

function Palette_toggle( $table ) {
	$table.find( 'tr:not(:first)' ).toggleClass( 'navboxHidden' );
}

function Palette( $content ) {
	if ( !$content ) {
		$content = $( '#mw-content-text' );
	} else if ( !$content.jquery ) {
		$content = $( $content );
	}

	var $tables = $content.find( 'table.collapsible' );
	var groups = {};

	$tables.each( function( _, table ) {
		var group = table.getAttribute('data-autocollapse-group') || '__default__';
		groups[group] = ( groups[group] || 0 ) + 1;
	} );

	$tables.each( function( _, table ) {
		var $table = $( table );

		var group = table.getAttribute('data-autocollapse-group') || '__default__';
		var autoCollapse = groups[group] > Palette_max;
		var collapsed = $table.hasClass( 'collapsed' ) || ( autoCollapse && $table.hasClass( 'autocollapse' ) );

		// le modèle dispose d'une classe "navbox-title",
		// sauf que les palettes "inlinées" (e.g. « {| class="navbox collapsible collapsed" ») n'ont pas cette classe
		$table.find( 'tr:first th:first' ).prepend(
			$( '<span class="navboxToggle">\u00a0</span>' ).append(
				$( '<a href="#">' + (collapsed ? Palette_Derouler : Palette_Enrouler) + '</a>' ).click( function() {
					var $this = $( this );
					if ( $this.text() === Palette_Enrouler ) {
						$this.text( Palette_Derouler );
					} else {
						$this.text( Palette_Enrouler );
					}
					Palette_toggle( $table );
					return false;
				} )
			)
		);
		if ( collapsed ) {
			Palette_toggle( $table );
		}
	} );

	// permet de dérouler/enrouler les palettes en cliquant n'importe où sur l'entête
	// (utilisation de la classe "navbox-title", comme ça seules les vraies palettes utilisant le modèle sont ciblées)
	$content.find( '.navbox-title' )
		.click( function ( e ) {
			if ( $( e.target ).closest( 'a' ).length ) {
				return;
			}
			$( this ).find( '.navboxToggle a' ).click();
		} )
		.css( 'cursor', 'pointer' );
}
mw.hook( 'wikipage.content' ).add( Palette );


/**
 * Pour [[Modèle:Boîte déroulante]]
 */

var BoiteDeroulante_Enrouler = '[masquer]';
var BoiteDeroulante_Derouler = '[afficher]';
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 = [];
	var CaptionSpans = CaptionContainer.getElementsByTagName('span');
	caption[0] = CaptionSpans[0].innerHTML;
	caption[1] = CaptionSpans[1].innerHTML;

	if ( NavToggle.innerHTML === caption[1] ) {
		NavToggle.innerHTML = caption[0];
		$(NavFrame).find('div.NavContent').first().hide();
	} else {
		NavToggle.innerHTML = caption[1];
		$(NavFrame).find('div.NavContent').first().show();
	}
}

function BoiteDeroulante( $content ) {
	if ( !$content ) {
		$content = $( '#mw-content-text' );
	} else if ( !$content.jquery ) {
		$content = $( $content );
	}

	$content.find( '.NavFrame' ).each( function ( _, NavFrame ) {
		var Enrouler, Derouler, CaptionContainer, NavToggle, NavToggleText;
		BoiteDeroulante_index++;

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

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

		NavFrame.insertBefore( NavToggle, NavFrame.firstChild );
		NavFrame.id = 'NavFrame' + BoiteDeroulante_index;

		BoiteDeroulante_toggle(BoiteDeroulante_index);
	} );

	// permet de dérouler/enrouler les boîtes en cliquant n'importe où sur l'entête
	$content.find( '.NavHead' )
		.click( function ( e ) {
			if ( $( e.target ).closest( 'a' ).length ) {
				return;
			}
			var toggle = $( this ).siblings( 'a.NavToggle' )[0];
			if ( toggle ) {
				toggle.click(); // pas du jquery, mais du vanilla js
			}
		} )
		.css( 'cursor', 'pointer' );
}

mw.hook( 'wikipage.content' ).add( BoiteDeroulante );

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

var Diaporama = {};
Diaporama.Params = {};
Diaporama.Fonctions = {};

Diaporama.Params.DiaporamaIndex = 0;
Diaporama.Params.ImageDelay = 1;
Diaporama.Params.Paused = [];
Diaporama.Params.Visible = [];
Diaporama.Params.Length = [];
Diaporama.Params.Delay = [];
Diaporama.Params.Timeout = [];

Diaporama.Fonctions.Init = function(node){
	if (!node) {
		node = document;
	}
	$( node ).find( 'div.diaporama' ).each( function ( _, DiaporamaDiv ) {
		Diaporama.Fonctions.InitDiaporama( DiaporamaDiv );
	} );
};
Diaporama.Fonctions.InitDiaporama = function(DiaporamaDiv){
	var index = Diaporama.Params.DiaporamaIndex;
	Diaporama.Params.DiaporamaIndex++;
	DiaporamaDiv.id = "Diaporama_"+index;
	var DiaporamaFileContainer = $( DiaporamaDiv ).find( 'div.diaporamaFiles' )[0];
	var DiaporamaControl = $( DiaporamaDiv ).find( 'div.diaporamaControl' )[0];
	if (!DiaporamaFileContainer || !DiaporamaControl) {
		return;
	}
	var DiaporamaFiles = $( DiaporamaFileContainer ).find( 'div.ImageFile' ).get();
	var width;
	var firstTumbinner = $( DiaporamaFileContainer ).find( 'div.thumbinner' )[0];
	if (firstTumbinner) { // force la largeur du diaporama (pour IE)
		width = firstTumbinner.style.width.replace("px", "");
	} else {
		if (DiaporamaFileContainer.firstChild.firstChild) {
			width = DiaporamaFileContainer.firstChild.firstChild.offsetWidth;
		}
	}
	if (width) {
		DiaporamaDiv.style.width = (parseInt(width)+30) + "px";
	}
	if (DiaporamaFiles.length<2) {
		return;
	}
	Diaporama.Params.Length[index] = DiaporamaFiles.length;
	DiaporamaFileContainer.id = "DiaporamaFileContainer_"+index;
	DiaporamaControl.id = "DiaporamaControl_"+index;
	Diaporama.Params.Delay[index] = Diaporama.Params.ImageDelay;
	var DiaporamaDivClass = mw.html.escape(DiaporamaDiv.className);
	var ParamDelay = DiaporamaDivClass.match(/Delay([0-9]+[.,]?[0-9]*)/);
	if (ParamDelay !== null) {
		ParamDelay = parseFloat(ParamDelay[1].replace(",", "."));
		if (ParamDelay && ParamDelay>0) {
			Diaporama.Params.Delay[index] = ParamDelay;
		}
	}
	Diaporama.Fonctions.ShowThisDiapo(index, 0);
	var ControlLinks = DiaporamaControl.getElementsByTagName("a");
	ControlLinks[0].firstChild.id = "DiaporamaPlay"+index;
	ControlLinks[0].href = "javascript:Diaporama.Fonctions.Play("+index+");";
	ControlLinks[1].firstChild.id = "DiaporamaPause"+index;
	ControlLinks[1].href = "javascript:Diaporama.Fonctions.Pause("+index+");";
	ControlLinks[2].firstChild.id = "DiaporamaStop"+index;
	ControlLinks[2].href = "javascript:Diaporama.Fonctions.Stop("+index+");";
	ControlLinks[3].firstChild.id = "DiaporamaLast"+index;
	ControlLinks[3].href = "javascript:Diaporama.Fonctions.ToggleDiapo("+index+",-1);";
	ControlLinks[4].firstChild.id = "DiaporamaNext"+index;
	ControlLinks[4].href = "javascript:Diaporama.Fonctions.ToggleDiapo("+index+", 1);";
	ControlLinks[5].parentNode.appendChild(Diaporama.Fonctions.CreateSelect(index, ControlLinks[5].title));
	ControlLinks[5].parentNode.removeChild(ControlLinks[5]);
	for (var e=0, t=ControlLinks.length; e<t; e++) {
		ControlLinks[e].onmousedown = function(){Diaporama.Fonctions.Onclick(this);};
		ControlLinks[e].onmouseup = function(){Diaporama.Fonctions.Offclick(this, index);};
		ControlLinks[e].firstChild.style.backgroundColor = "white";
		ControlLinks[e].onmouseover = function(){ this.focus(); };
	}
	DiaporamaControl.style.display = "block";
	Diaporama.Fonctions.Pause(index);
};

Diaporama.Fonctions.Play = function(index){
	if (Diaporama.Params.Paused[index] === false) {
		return;
	}
	Diaporama.Params.Paused[index] = false;
	clearTimeout(Diaporama.Params.Timeout[index]);
	Diaporama.Params.Timeout[index] = setTimeout("Diaporama.Fonctions.ToggleDiapo("+index+",1);", Diaporama.Params.Delay[index]*1000);
	var ButtonPlay = document.getElementById("DiaporamaPlay"+index);
	ButtonPlay.style.backgroundColor = "silver";
	var ButtonPause = document.getElementById("DiaporamaPause"+index);
	ButtonPause.style.backgroundColor = "white";
	var ButtonStop = document.getElementById("DiaporamaStop"+index);
	ButtonStop.style.backgroundColor = "white";
};

Diaporama.Fonctions.Pause = function(index){
	Diaporama.Params.Paused[index] = true;
	clearTimeout(Diaporama.Params.Timeout[index]);
	var ButtonPlay = document.getElementById("DiaporamaPlay"+index);
	ButtonPlay.style.backgroundColor = "white";
	var ButtonPause = document.getElementById("DiaporamaPause"+index);
	ButtonPause.style.backgroundColor = "silver";
	var ButtonStop = document.getElementById("DiaporamaStop"+index);
	ButtonStop.style.backgroundColor = "white";
};

Diaporama.Fonctions.Stop = function(index){
	Diaporama.Params.Paused[index] = true;
	clearTimeout(Diaporama.Params.Timeout[index]);
	Diaporama.Fonctions.ShowThisDiapo(index, 0);
	var ButtonPlay = document.getElementById("DiaporamaPlay"+index);
	ButtonPlay.style.backgroundColor = "white";
	var ButtonPause = document.getElementById("DiaporamaPause"+index);
	ButtonPause.style.backgroundColor = "white";
	var ButtonStop = document.getElementById("DiaporamaStop"+index);
	ButtonStop.style.backgroundColor = "silver";
};

Diaporama.Fonctions.ToggleDiapo = function(index, diff){
	clearTimeout(Diaporama.Params.Timeout[index]);
	var DiaporamaFileContainer = document.getElementById("DiaporamaFileContainer_"+index);
	var DiaporamaFiles = $( DiaporamaFileContainer ).find( 'div.ImageFile' ).get();
	var VisibleIndex = Diaporama.Params.Visible[index];
	var NextDiaporamaIndex = (VisibleIndex+diff);
	if (NextDiaporamaIndex === DiaporamaFiles.length || NextDiaporamaIndex < 0) {
			var DiaporamaDiv = document.getElementById("Diaporama_"+index);
			if ( diff < 0 || ! $( DiaporamaDiv ).hasClass( 'AutoLoop' ) ) {
				return;
			}
			NextDiaporamaIndex = 0;
	}
	Diaporama.Fonctions.ShowThisDiapo(index, NextDiaporamaIndex);
};

Diaporama.Fonctions.ShowThisDiapo = function(index, Value){
	clearTimeout(Diaporama.Params.Timeout[index]);
	var DiaporamaFileContainer = document.getElementById("DiaporamaFileContainer_"+index);
	var DiaporamaFiles = $( DiaporamaFileContainer ).find( 'div.ImageFile' ).get();
	for (var x=0, z=DiaporamaFiles.length; x<z; x++) {
		if (x !== Value) {
			DiaporamaFiles[x].style.display = "none";
		} else {
			DiaporamaFiles[x].style.display = "block";
		}
	}
	Diaporama.Params.Visible[index] = Value;
	Diaporama.Fonctions.UpdateBar(index);
	Diaporama.Fonctions.UpdateSelect(index);
	if (!Diaporama.Params.Paused[index]) {
		var multipl = 1;
		if (Value === (Diaporama.Params.Length[index]-1)) {
			multipl = 3;
		}
		Diaporama.Params.Timeout[index] = setTimeout("Diaporama.Fonctions.ToggleDiapo("+index+",1);", Diaporama.Params.Delay[index]*1000*multipl);
	}
};

Diaporama.Fonctions.CreateSelect = function(index, Title) {
	var s, Opt;
	var Total = Diaporama.Params.Length[index];
	var Select = document.createElement('select');
	Select.id = "DiaporamaSelect"+index;
	Select.title = Title;
	for ( s=0; s<Total; s++ ) {
			Opt = document.createElement('option');
			if (s === 0) {
				Opt.selected = "selected";
			}
			Opt.text = (s+1)+"/"+Total;
			Opt.innerHTML = (s+1)+"/"+Total;
			Opt.value = s;
			Select.appendChild(Opt);
	}
	Select.onchange = function(){ Diaporama.Fonctions.SelectDiapo(Diaporama.Fonctions.getIndex(this)); };
	Select.onmouseover = function(){ this.focus(); };
	return Select;
};

Diaporama.Fonctions.SelectDiapo = function(index){
	var Select = document.getElementById("DiaporamaSelect"+index);
	if (!Select) {
		return;
	}
	var Opts = Select.getElementsByTagName('option');
	for (var o=0, p=Opts.length; o<p; o++) {
		if (Opts[o].selected) {
			var Value = parseInt(Opts[o].value);
			return Diaporama.Fonctions.ShowThisDiapo(index, Value);
		}
	}
};

Diaporama.Fonctions.UpdateSelect = function(index){
	var Select = document.getElementById("DiaporamaSelect"+index);
	if (!Select) {
		return;
	}
	var Opts = Select.getElementsByTagName('option');
	for (var o=0, p=Opts.length; o<p; o++){
		if (o === Diaporama.Params.Visible[index]) {
			Opts[o].selected = "selected";
		} else {
			Opts[o].selected = false;
		}
	}
};

Diaporama.Fonctions.UpdateBar = function(index){
	var Percent = (100/(Diaporama.Params.Length[index]-1)) * Diaporama.Params.Visible[index];
	if (Percent>100) {
		Percent = 100;
	}
	var DiaporamaControl = document.getElementById("DiaporamaControl_"+index);
	var DiaporamaScrollBar = $( DiaporamaControl ).find( 'div.ScrollBar' )[0];
	DiaporamaScrollBar.style.width = Percent + "%";
};

Diaporama.Fonctions.Onclick = function(Link){
	var Image = Link.getElementsByTagName('img')[0];
	Image.style.backgroundColor = "gray";
};

Diaporama.Fonctions.Offclick = function(Link, index){
	var Span = Link.parentNode;
	var Image = Link.getElementsByTagName('img')[0];
	var DiapoState = Diaporama.Params.Paused[index];
	if ( ( $( Span ).hasClass( 'Play' ) && DiapoState === false ) || ( ( $( Span ).hasClass( 'Pause' ) || $( Span ).hasClass( 'Stop' ) ) && DiapoState === true ) ){
		Image.style.backgroundColor = "silver";
	} else {
		Image.style.backgroundColor = "white";
	}
};

Diaporama.Fonctions.getIndex = function(Element){
	return parseInt(Element.id.replace(/[^0-9]/g, ""));
};

$( function () {
	Diaporama.Fonctions.Init();
} );

/**
 * 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;
	}
	var cl = document.getElementById('catlinks');
	if (!cl) {
		return;
	}
	var $hc = $('#mw-hidden-catlinks');
	if ( !$hc.length ) {
		return;
	}
	if ( $hc.hasClass('mw-hidden-cats-user-shown') ) {
		return;
	}
	if ( $hc.hasClass('mw-hidden-cats-ns-shown') ) {
		$hc.addClass('mw-hidden-cats-hidden');
	}
	var nc = document.getElementById('mw-normal-catlinks');
	if ( !nc ) {
		var catline = document.createElement('div');
		catline.id = 'mw-normal-catlinks';
		var a = document.createElement('a');
		a.href = '/wiki/Catégorie:Accueil';
		a.title = 'Catégorie:Accueil';
		a.appendChild(document.createTextNode('Catégories'));
		catline.appendChild(a);
		catline.appendChild(document.createTextNode(' : '));
		nc = cl.insertBefore(catline, cl.firstChild);
	}
	var lnk = document.createElement('a');
	lnk.id = 'mw-hidden-cats-link';
	lnk.title = 'Cet article contient des catégories cachées';
	lnk.style.cursor = 'pointer';
	lnk.style.color = 'black';
	lnk.style.marginLeft = '0.3em';
	$(lnk).click(toggleHiddenCats);
	lnk.appendChild(document.createTextNode('[+]'));
	nc.appendChild(lnk);
}

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

mw.loader.using('mediawiki.util', function () {
	$( hiddencat );
});

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

function GeoBox_Init(Element){
	if (!Element) {
		Element = document.body;
	}
	$( Element ).find( 'div.img_toogle' ).each( function ( i, Container ) {
		Container.id = 'img_toogle_' + i;
		var Boxes = $( Container ).find( '.geobox' );
		var ToggleLinksDiv = document.createElement('ul');
		ToggleLinksDiv.id = 'geoboxToggleLinks_' + i;
		Boxes.each( function ( a, ThisBox ) {
			ThisBox.id = 'geobox_' + i + "_" + a;
			ThisBox.style.borderTop='0';
			var ThisAlt = ThisBox.getElementsByTagName('img')[0].alt;
			var toggle = document.createElement('a');
			toggle.id = 'geoboxToggle_' + i + "_" + a;
			toggle.appendChild(document.createTextNode(ThisAlt));
			toggle.href='javascript:;';
			toggle.onclick = function(){
				GeoBox_Toggle(this);
				return false;
			};
			var Li = document.createElement('li');
			Li.appendChild(toggle);
			ToggleLinksDiv.appendChild(Li);
			if (a === (Boxes.length - 1)) {
				Li.style.display = "none";
			} else {
				ThisBox.style.display = "none";
			}
		} );
		Container.appendChild(ToggleLinksDiv);
	} );
}

function GeoBox_Toggle(link){
	var ImgToggleIndex = link.id.replace('geoboxToggle_', '').replace(/_.*/g, "");
	var GeoBoxIndex = link.id.replace(/.*_/g, "");
	var ImageToggle = document.getElementById('img_toogle_' + ImgToggleIndex);
	var Links = document.getElementById('geoboxToggleLinks_' + ImgToggleIndex);
	var Geobox = document.getElementById('geobox_' + ImgToggleIndex + "_" + GeoBoxIndex);
	var Link = document.getElementById('geoboxToggle_' + ImgToggleIndex + "_" + GeoBoxIndex);
	if ( (!ImageToggle) || (!Links) || (!Geobox) || (!Link) ) {
		return;
	}
	$( ImageToggle ).find( '.geobox' ).each( function ( _, ThisgeoBox ) {
		if (ThisgeoBox.id === Geobox.id) {
			ThisgeoBox.style.display = "";
		} else {
			ThisgeoBox.style.display = "none";
		}
	} );
	$( Links ).find( 'a' ).each( function ( _, thisToggleLink ) {
		if (thisToggleLink.id === Link.id){
			thisToggleLink.parentNode.style.display = "none";
		} else {
			thisToggleLink.parentNode.style.display = "";
		}
	} );
}

if ( ['view','submit'].indexOf(mw.config.get('wgAction')) !==  -1) {
	$( function() {
		GeoBox_Init();
	} );
}

/**
 * permet d'ajouter un petit lien (par exemple d'aide) à la fin du titre d'une page.
 * utilisé par [[Modèle:Aide contextuelle]]
 * known bug : conflit avec le changement de titre classique.
 * Pour les commentaires, merci de contacter [[user:Plyd|Plyd]].
 */
function rewritePageH1bis() {
	var helpPage = document.getElementById("helpPage");
	if (helpPage) {
		var h1 = document.getElementById('firstHeading');
		if (h1) {
			h1.innerHTML += '<span id="h1-helpPage">' + helpPage.innerHTML + '</span>';
		}
	}
}
$( rewritePageH1bis );

/**
 * Configuration du tri des diacritique dans les tables de class "sortable"
 */
mw.config.set( 'tableSorterCollation', {'à':'a', 'â':'a', 'æ':'ae', 'é':'e', 'è':'e', 'ê':'e', 'î':'i', 'ï':'i', 'ô':'o', 'œ':'oe', 'û':'u', 'ç':'c',  } );

/**
 * Direct imagelinks to Commons
 *
 * Required modules: mediawiki.RegExp, mediawiki.util
 *
 * @source www.mediawiki.org/wiki/Snippets/Direct_imagelinks_to_Commons
 * @author Krinkle
 * @version 2015-06-23
 * Ajouté le 'uselang' ce 18 janvier 2015 — Ltrlg
 */
if ( mw.config.get( 'wgNamespaceNumber' ) >= 0 ) {
	mw.loader.using( [ 'mediawiki.RegExp', 'mediawiki.util', 'user.options' ] ).done(function(){
		mw.hook( 'wikipage.content' ).add( function ( $content ) {
			var
				uploadBase = '//upload.wikimedia.org/wikipedia/commons/',
	
				fileNamespace = mw.config.get( 'wgFormattedNamespaces' )['6'],
				localBasePath = new RegExp( '^' + mw.RegExp.escape( mw.util.getUrl( fileNamespace + ':' ) ) ),
				localBaseScript = new RegExp( '^' + mw.RegExp.escape( mw.util.wikiScript() + '?title=' + mw.util.wikiUrlencode( fileNamespace + ':' ) ) ),
	
				commonsBasePath = '//commons.wikimedia.org/wiki/File:',
				commonsBaseScript = '//commons.wikimedia.org/w/index.php?title=File:',
	
				lang = mw.user.options.get( 'language' );
	
			$content.find( 'a.image' ).attr( 'href', function ( i, currVal ) {
				if ( $( this ).find( 'img' ).attr( 'src' ).indexOf( uploadBase ) === 0 ) {
					if ( localBasePath.test( currVal ) ) {
						return currVal.replace( localBasePath, commonsBasePath ) + '?uselang=' + lang;
					} else if ( localBaseScript.test( currVal ) ) {
						return currVal.replace( localBaseScript, commonsBaseScript ) + '&uselang=' + lang;
					} else {
						return currVal;
					}
				}
			} );
		} );
	} );
}

/**
 * Ajout d'un lien « ajouter une section » en bas de page
 */
if ( mw.config.get( 'wgAction' ) === 'view' ) {
	$( function( $ ) {
		var $newSectionLink = $( '#ca-addsection' ).find( 'a' );
		if ( $newSectionLink.length ) {
			$( '#mw-content-text' ).append(
				'<div style="text-align:right; font-size:0.9em; margin:1em 0 -0.5em">'
				+ '<a href="' + $newSectionLink.attr( 'href' ) + '" title="Commencer une nouvelle section">Ajouter un sujet</a>'
				+ '</div>'
			);
		}
	} );
}

/**
 * Repositionnement de la page sur l'ancre avec laquelle elle a été appelée
 * après le repli des boîtes déroulantes, entre autres.
 */
if (window.location.hash) {
    $(function ($) {
        var currentTarget = document.getElementById(window.location.hash.substring(1));
        if (currentTarget) {
            setTimeout(function () {
                currentTarget.scrollIntoView();
            }, 1);
        }
    });
}

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

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

/**
 * Ajoute le namespace aux filtres personnalisés sur [[Spécial:Pages liées]]
 * Voir aussi [[MediaWiki:Linkshere]]
 */
if (mw.config.get('wgCanonicalSpecialPageName') === 'Whatlinkshere') {

    mw.loader.using('mediawiki.Uri', function () {
        $(function ($) {

            var query = (new mw.Uri(null, {overrideKeys: true})).query;

            var append = (query.namespace ? '&namespace=' + encodeURIComponent( query.namespace ) : '')
                + (query.invert ? '&invert=' + encodeURIComponent( query.invert ) : '');

            if (append !== '') {
                $('#whatlinkshere-customfilters').find('a').each(function () {
                    this.href += append;
                });
            }
        });
    });
}

/**
 * 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 ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Upload' ) {
	importScript( 'MediaWiki:Onlyifuploading.js' );
}

/**
 * Supprime de la liste des balises disponibles et de la liste des balises supprimables
 * certaines balises réservées à des outils automatiques
 */
if ( mw.config.get('wgCanonicalSpecialPageName') === 'EditTags' ) {
	importScript( 'MediaWiki:Common.js/EditTags.js' );
}

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


// ESPACE DE NOM 'UTILISATEUR'
if ( mw.config.get( 'wgNamespaceNumber' ) === 2 ) {

/*
 * Fonctionnement du [[Modèle:Cadre à onglets]]
 * Voir aussi [[MediaWiki:Gadget-CadreOnglets.js]]
 */
$( function ( $ ) {
	if ( document.getElementsByClassName( 'classeur' ).length ) {
		mw.loader.load( 'ext.gadget.CadreOnglets' );
	}
} );

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


// ESPACE DE NOM 'RÉFÉRENCE'
if ( mw.config.get( '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 !
 */

// select subsection of special characters
var chooseBibSubset = function (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';
		}
	}
};

var addBibSubsetMenu = function () {
	var specialBib = document.getElementById('specialBib');
	if (!specialBib) {
		return;
	}

	specialBib.style.display = 'block';
	var 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);
};

$( addBibSubsetMenu );
} // Fin du code concernant l'espace de nom 'Référence'

// TOUS LES ESPACES DE NOMS SAUF L'ESPACE PRINCIPAL

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

// Personnalisation des liens dans les pages d'aide selon un paramètre de l'URL.
// Utilisé par Modèle:Brouillon.
function ReplaceSourcePageInLinks() {
	var match = window.location.search.match( /[?&]sourcepage=([^&]*)/ );
	if ( !match ) {
		return;
	}
	var page = decodeURIComponent( match[1] );
	$( '.sourcepage-subst a' ).each( function() {
		if ( /^(https?:)?\/\/[^/]+\.wikipedia\.org\//.test( this.href ) ) {
			this.href = this.href.replace( 'TITRE-A-REMPLACER', encodeURIComponent( page ) );
		}
	} );
}

if ( mw.config.get( 'wgNamespaceNumber' ) !== 0 ) {
	$( Rebours );
	$( ReplaceSourcePageInLinks );
}

/**
 * Ajoute la date de dernière modification sur le bandeau événement récent
 */
function LastModCopy( $ ) {
	var lastmodcopy = $( '.lastmodcopy' );
	if ( lastmodcopy.length ) {
		// L'id change entre Vector d'une part, Monobook et Modern d'autre part ; Cologneblue non supporté
		var html = $( '#footer-info-lastmod' ).html() || $( '#lastmod' ).html();
		if ( html ) {
			lastmodcopy.html( html );
		}
	}
}
$( LastModCopy );