Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
//
// Gadget obsolète depuis la résolution de https://phabricator.wikimedia.org/T7984
//

/*
***************************************************************************
** iRef - Affiche les références lors de la prévisualisation même si elles
** ne sont pas présentes dans la section éditée
** Compatibilité : MediaWiki, testé avec monobook et vector
** Support : Discussion Projet:JavaScript/Rapport de bug
** Auteurs : Arkanosis, Od1n & The RedBurn
** Licence : MIT
**
** <!--{{Catégorisation JS|IRef}}-->
*/

/*global mw, $, iRef, qPreview */
/*jslint browser: true, vars: true, plusplus: true */

if ((mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') && typeof iRef === 'undefined') {

    window.iRef = (function () {
        'use strict';

        var textBox;
        var earlyDone;

        function cleanMark() {
            var position = textBox.scrollTop;
            textBox.value = textBox.value
                .replace(/\r\n/g, '\n') // IE 6-8
                .replace(/\n<!--\[iRef\]-->[\s\S]*<!--\[\/iRef\]-->\n/, '');
            textBox.scrollTop = position;
        }

        function getGroups(source) {
            /*jslint regexp: true, continue: true */
            var refs = source.match(/<ref [^>]+>/g);
            if (!refs) {
                return [];
            }
            var groups = [];
            var i, l, attrib;
            for (i = 0, l = refs.length; i < l; i++) {
                // valeur d'attribut entre double quotes
                attrib = /group *= *"([^"]+)"/.exec(refs[i]);
                if (attrib && $.inArray(attrib[1], groups) === -1) {
                    groups.push(attrib[1]);
                    continue;
                }
                // valeur d'attribut non encadrée de quotes
                attrib = /group *= *([^" >]+)/.exec(refs[i]);
                if (attrib && $.inArray(attrib[1], groups) === -1) {
                    groups.push(attrib[1]);
                }
            }
            return groups;
        }

        function buildMark(groups) {
            var mark = '\n<!--[iRef]-->== <span style="color:red">Références automatiques</span> ==\n<references />';
            var i, l;
            for (i = 0, l = groups.length; i < l; i++) {
                mark += "\n'''groupe « " + groups[i] + " » :'''\n<references group=\"" + groups[i] + '" />';
            }
            mark += '<!--[/iRef]-->\n';
            return mark;
        }

        function iRefPreview() {
            var source = textBox.value;
            if (source.indexOf('<ref') === -1) {
                return;
            }
            // Firefox réinitialise la position quand un textarea.value est modifié
            var position = textBox.scrollTop;
            source = source.replace(/\r\n/g, '\n').replace(/\n+$/, '') + '\n';
            textBox.value = source + buildMark(getGroups(source));
            textBox.scrollTop = position;
        }

        function earlyClean() {
            textBox = document.getElementById('wpTextbox1');
            if (textBox) {
                cleanMark();
                earlyDone = true;
            }
        }

        function init($) {
            if (!earlyDone) {
                textBox = document.getElementById('wpTextbox1');
                cleanMark(); // il faut toujours purger au chargement, pour le mode non ajax
            }

            // compatibilité avec l'aperçu rapide : https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/resources%2Fsrc%2Fmediawiki.action%2Fmediawiki.action.edit.preview.js
            if (mw.user.options.get('uselivepreview')) {
                // pour déclarer (et donc exécuter) notre 3. après le 2. du preview.js
                mw.loader.using('mediawiki.action.edit.preview', function () {
                    // 1. est toujours exécuté en premier car plus ciblé que les $(document.body).on('click'...)
                    $('#wpPreview').click(iRefPreview);
                    // 2. déclenchement aperçu rapide
                    // dans le preview.js : $(document.body).on('click'... doLivePreview)
                    // 3. nettoyage immédiat, sans même attendre le résultat ajax
                    $(document.body).on('click', '#wpPreview', cleanMark);
                });
            } else {
                $('#wpPreview').click(iRefPreview);
            }

            // compatibilité avec [[MediaWiki:Gadget-QPreview.js]]
            // conçu pour fonctionner même si QPreview est chargé plus tard
            $('#editform div.editButtons').one('focus', '#btnQPreview', function () {
                $(this)
                    .removeAttr('onclick')
                    .click(function () {
                        iRefPreview();
                        qPreview();
                        cleanMark();
                    });
            });

            // Firefox remet le marqueur iRef lorsque l'on fait "page précédente" après un aperçu non-ajax
            // dans ce cas de figure, le javascript n'est pas exécuté à nouveau
            // on supprime le marqueur lors de l'enregistrement, à défaut de pouvoir le supprimer du textarea
            if (!mw.user.options.get('uselivepreview')) {
                $('#wpSave').click(cleanMark);
            }
        }

        return {
            earlyClean: earlyClean,
            init: init
        };
    })();

    iRef.earlyClean();
    $(document).ready(iRef.init);
}