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

/*
 * Ajoute à chaque titre de section un lien de retour en haut de page
 * Auteur : Marc Mongenet
 * Mise à jour mediawiki 1.19 : Lgd
 * Dernière révision : 25 septembre 2018
 */

/* jshint esversion: 6 */
/* globals mw, $, FlecheHaut_options */

mw.loader.using( 'user', function () {
	'use strict';

	var options = {
		text: '↑',
		title: 'Haut de page',
		animate: false,
		animate_duration: 1000,
	};

	if ( typeof FlecheHaut_options !== 'undefined' ) {
		Object.assign( options, FlecheHaut_options );
	}

	var skin = mw.config.get( 'skin' );

	mw.hook( 'wikipage.content' ).add( function ( $content ) {

		var $pageContent = getPageContent( $content );
		if ( !$pageContent ) {
			return;
		}

		// see: ] and ]

		// regular headings
		$content.find( '.mw-heading' ).each( processRegularHeading );

		// raw headings (<hN> tags in wikicode, also in special pages)
		// (reminder: special pages have structure #mw-content-text > hN)
		// (caution: $pageContent.find( 'h2, h3, h4, h5, h6' ) has terrible performances, it seems to analyze all children)
		for ( var i = 2; i <= 6; ++i ) {
			var $rawHeadings = $pageContent
				.find( 'h' + i )
				.not( ( _, elm ) => elm.parentNode.matches( '.mw-heading' ) );

			// we also have to filter out the TOC heading <h2>...
			if ( i === 2 ) {
				$rawHeadings = $rawHeadings.not( '#mw-toc-heading' );
			}

			$rawHeadings.each( processRawHeading );
		}
	} );

	function getPageContent( $content ) {
		/*
		 * Sélection plus précise de l'élément avec le contenu de page,
		 * pour éviter l'interface de diff, l'interface de modification, le print footer...
		 */
		var $parserOutput = $content.find( '.mw-parser-output' );
		if ( $parserOutput.length ) { // élément avec le contenu de page
			return $parserOutput;
		} else if ( $content.hasClass( 'mw-parser-output' ) ) { // ]
			return $content;
		} else if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) { // on utilise #mw-content-text pour les pages spéciales
			return $content;
		} else { // pas de contenu de page (notamment, pages d'historiques)
			return false;
		}
	}

	function processRegularHeading( _, mwHeading ) {
		var gadgetLink = makeLink();

		if ( skin !== 'minerva' ) {
			var editLink = mwHeading.querySelector( '.mw-editsection' );
			if ( editLink ) {
				editLink.after( gadgetLink );
				return;
			}
		}

		var innerHeading = mwHeading.querySelector( 'h2, h3, h4, h5, h6' );
		if ( innerHeading ) {
			innerHeading.after( gadgetLink );
			return;
		}

		// else:
		// first-level heading (which should not be used, and that we do not process to improve performance),
		// or unsuitable use of "mw-heading" class in wikicode
	}

	function processRawHeading( _, rawHeading ) {
		var gadgetLink = makeLink();

		rawHeading.append( gadgetLink );
	}

	function makeLink() {
		var $link = $( '<a href="#" class="noprint">' )
			.text( options.text )
			.attr( 'title', options.title )
			.css( {
				'margin-inline-start': '0.3em',
				'user-select': 'none' // jQuery se charge d'ajouter un vendor prefix si nécessaire
			} )
			.click( animateCallback );

		return $link;
	}

	function animateCallback( e ) {
		e.preventDefault();
		if ( options.animate ) {
			// c'est bien sur les deux éléments, refs https://stackoverflow.com/a/5580397
			$( 'html, body' ).animate( { scrollTop: 0 }, options.animate_duration );
		} else {
			window.scrollTo( 0, 0 );
		}
	}

} );