/**
 * Accès immédiat au contenu des références et notes en bas de page
 * dans une fenêtre contextuelle.
 * auteur : https://fr.wikipedia.orghttps://wiki95.com/fr/Utilisateur:Lgd
 * licence : MIT
 *
 * Utilise : https://fr.wikipedia.orghttps://wiki95.com/fr/MediaWiki:Gadget-tooltipRef.css
 *
 * Paramétrage: ajouter window.tooltipRefHover = true; dans le common.js personnel
 * pour utiliser au survol plutôt qu'au clic
 *
 * {{Catégorisation JS|TooltipRef}}
 */

window.tooltipRefEnabled = true;

// pour ne pas charger en addition à ]
if ( typeof referenceTooltipsEnabled === 'undefined' ) {

    mw.loader.using( 'user', function () {

        // si l'état est null, cela signifie que ce gadget n'est plus listé dans les définitions (ou a été renommé en oubliant de mettre à jour le nom ici)
        // si l'état est resté sur registered, cela signifie que l'utilisateur charge ce gadget autrement que par le ResourceLoader (importScript(), etc.)
        var state = mw.loader.getState( 'ext.gadget.tooltipRef' );
        if ( !state || state === 'registered' ) {
            importStylesheet( 'MediaWiki:Gadget-tooltipRef.css' );
        }

        var firstRun = true;

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

            var backClass = '.mw-cite-backlink';
            var msg_err1 = 'Erreur : note ou référence non trouvée.';
            var msg_err2 = 'Erreur : entrée non trouvée dans la bibliographie.';
            var msg_close = 'Fermer';
            var msg_go1 = 'Aller';
            var msg_go1title = 'Aller à cette référence en fin de page';
            var msg_go2 = 'Aller à la bibliographie';
            var tooltipRefTimer = false;

            function fixId( myid ) { // replaces special characters in id name
                return '#' + $.escapeSelector( myid.substr( 1 ) );
            }
            function closeNote() {
                $content.find( '.hasnote' ).removeClass( 'hasnote' );
                $( '.tooltipRef' ).remove(); // ne se trouve pas dans le #mw-content-text, mais à la fin du <body>
            }
            function closeNoteAfterDelay() {
                tooltipRefTimer = setTimeout( closeNote, 400 );
            }
            function cancelDelayedNoteClosure() {
                clearTimeout( tooltipRefTimer );
            }

            function openNote( $ref ) {
                closeNote();
                var id = $ref.attr( 'href' );
                var $note;
                var $fallback;
                var idfix = fixId( id );
                if ( $( idfix ).length !== 0 ) {
                    $note = $( idfix ).clone();
                    // copy computed styles to clone as inline styles
                    var $links1 = $( idfix ).find( 'a.external' );
                    var $links2 = $note.find( 'a.external' );
                    $links1.each( function ( i, elm ) {
                        var computed = $( elm ).css(  );
                        $links2.eq( i ).css( computed );
                    } );
                    $note.removeAttr( 'id' ).addClass( 'tooltipRef' );
                    $note.find( backClass ).remove();
                    $note.find( '' ).click( function () {
                        if ( $( this ).is( '.open' ) ) {
                            $note.find( '.subnote' ).remove();
                            $( this ).removeClass( 'open' );
                            return false;
                        }
                        $note.find( '.subnote' ).remove();
                        $note.find( '.open' ).removeClass( 'open' );
                        var id2 = $( this ).attr( 'href' );
                        var $more = $( '<a href="' + mw.html.escape( id2 ) + '">' + msg_go2 + '</a>' );
                        $more.click( closeNote );
                        var $note2;
                        id2 = fixId( id2 );
                        if ( $( id2 ).length !== 0) {
                            $note2 = $( id2 ).clone().addClass( 'subnote' ).removeAttr( 'id' );
                            var $morep = $( '<p class="more"></p>' );
                            $morep.append( $more );
                            $note2.append( $morep );
                        } else {
                            $note2 = $( '<span class="subnote">' + msg_err2 + '</span>' );
                        }
                        $note.append( $note2 );
                        $( this ).addClass( 'open' );
                        return false;
                    } );
                    $fallback = $( '<a href="' + mw.html.escape( id ) + '" class="go" title="' + msg_go1title + '">' + msg_go1 + '</a>&nbsp;' );
                    $fallback.click( closeNote );
                } else {
                    $note = $( '<li class="tooltipRef">' + msg_err1 + '</li>' );
                }
                var $link = $( '<a href="#" class="close" title="' + msg_close + '">X</a>' );
                $link.click( function () {
                    closeNote();
                    return false;
                } );
                var $span = $( '<span class="actions">&nbsp;</span>' );
                $span.prepend( $fallback ).append( $link );
                $note.prepend( $span );
                if ( typeof tooltipRefHover !== 'undefined' && tooltipRefHover ) {
                    $note.mouseover( cancelDelayedNoteClosure );
                    $note.mouseout( closeNoteAfterDelay );
                }
                $( 'body' ).append( $note );
                var offset = $ref.offset();
                $note.offset( {
                    top : offset.top + $ref.height(),
                    left: offset.left > 500 ? offset.left - $note.outerWidth() : offset.left
                } );
                $ref.addClass( 'hasnote' );
                return false;
            }

            // en cas de rechargement dynamique du contenu de la page (fonctionnalité d'aperçu rapide)
            if ( !firstRun ) {
                $( '.tooltipRef' ).remove();
            }
            firstRun = false;

            if ( typeof tooltipRefHover !== 'undefined' && tooltipRefHover ) {
                $content.find( 'sup.reference > a' ).mouseenter( function () {
                    openNote( $ ( this ) );
                } );
                $content.find( 'sup.reference' ).mouseover( cancelDelayedNoteClosure );
                $content.find( 'sup.reference' ).mouseout( closeNoteAfterDelay );
                $content.find( 'sup.reference > a' ).click( function () {
                    return false;
                } );
            } else {
                $content.find( 'sup.reference > a' ).click( function () {
                    if ( $( this ).is( '.hasnote' ) ) {
                        closeNote();
                        return false;
                    }
                    openNote( $( this ) );
                    return false;
                } );
            }
        } );
    } );
}