MediaWiki:Common.js

De Descuadrando

Nota: después de guardar, quizás necesites refrescar la caché de tu navegador para ver los cambios.

  • Firefox / Safari: Mantén presionada Mayús mientras pulsas el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
  • Google Chrome: presiona Ctrl+Shift+R (⌘+Mayús+R en Mac)
  • Internet Explorer: mantén presionada Ctrl mientras pulsas Actualizar, o presiona Ctrl+F5
  • Konqueror: pulsa Recargar o presiona F5
  • Opera: vacía la caché en Herramientas → Preferencias
//Alias
(function ( $, mw ) {
/**
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
 * loaded for all users on every wiki page. If possible create a gadget that is
 * enabled by default instead of adding it here (since gadgets are fully
 * optimized ResourceLoader modules with possibility to add dependencies etc.)
 *
 * Since common.js isn't a gadget, there is no place to declare its
 * dependencies, so we have to lazy load them with mw.loader.using on demand and
 * then execute the rest in the callback. In most cases these dependencies will
 * be loaded (or loading) already and the callback will not be delayed. In case a
 * dependency hasn't arrived yet it'll make sure those are loaded before this.
 */
mw.loader.using( 'mediawiki.util', function() {
/* Begin of mw.loader.using callback */

//Compatibilidad

/* Scripts specific to Internet Explorer */
if ($.client.profile().name == 'msie') {
    /** 
     *  Description: Fixes IE horizontal scrollbar bug
     *  Maintainers: [[User:Tom-]]?
     */
    var oldWidth;
    var docEl = document.documentElement;

    var doFixIEScroll = function () {
            docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
    };

    var fixIEScroll = function () {
            if (!oldWidth || docEl.clientWidth > oldWidth) {
                doFixIEScroll();
            } else {
                setTimeout(doFixIEScroll, 1);
            }

            oldWidth = docEl.clientWidth;
    };

    document.attachEvent("onreadystatechange", fixIEScroll);
    document.attachEvent("onresize", fixIEScroll);

    // In print IE (7?) does not like line-height
    mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; }}');

    // IE overflow bug
    mw.util.addCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }');

    // IE zoomfix
    // Use to fix right floating div/table inside tables
    mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1;}');

    /* Helper script for .hlist class in common.css
     * Maintainer: [[User:Edokter]]
     */
    /* Add pseudo-selector class to last child list items in IE 8 */
    if ( $.client.profile().versionBase == '8' ) {
        $( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
          .addClass( 'hlist-last-child' );
    }
    /* Generate interpuncts and parens for IE < 8 */
    if ( $.client.profile().versionBase < '8' ) {
        $( '.hlist' ).find( 'dt + dd, dt + dt' ).prev()
          .append( '<b>:</b> ' );
        $( '.hlist' ).find( 'dd + dd, dd + dt, li + li' ).prev()
          .append( '<b>·</b> ' );
        $( '.hlist' ).find( 'dl dl, ol ol, ul ul' )
          .prepend( '( ' ).append( ') ' );
    }
}

/* Fixes for Windows font rendering */
if ($.client.profile().platform == 'win') {
    mw.util.addCSS('.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }');
}

// Funcionalidad

/**
 * Redirect User:Name/skin.js and skin.css to the current skin's pages
 * (unless the 'skin' page really exists)
 * @source: //www.mediawiki.org/wiki/Snippets/Redirect_skin.js
 * @rev: 3
 */
if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) === 2 ) {
    var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
    // Make sure there was a part before and after the slash
    // And that the latter is 'skin.js' or 'skin.css'
    if ( titleParts.length == 2 ) {
        var userSkinPage = titleParts[0] + '/' + mw.config.get( 'skin' );
        if ( titleParts[1] === 'skin.js' ) {
            window.location.href = mw.util.wikiGetlink( userSkinPage + '.js' );
        } else if ( titleParts[1] === 'skin.css' ) {
            window.location.href = mw.util.wikiGetlink( userSkinPage + '.css' );
        }
    }
}

/** &withCSS= and &withJS= URL parameters *******
 * Allow to try custom scripts from MediaWiki space 
 * without editing personal .css or .js files
 */
var extraCSS = mw.util.getParamValue("withCSS");
if (extraCSS && extraCSS.match(/^MediaWiki:[^&<>=%]*\.css$/)) {
    importStylesheet(extraCSS);
}
var extraJS = mw.util.getParamValue("withJS");
if (extraJS && extraJS.match(/^MediaWiki:[^&<>=%]*\.js$/)) {
    importScript(extraJS);
}

//Edición
if ( $.inArray(mw.config.get('wgAction'), ['edit', 'submit'] ) > -1) {
    /** Fix edit summary prompt for undo  ******************************************
     *  Fixes the fact that the undo function combined with the "no edit summary prompter"
     *  causes problems if leaving the edit summary unchanged.
     *  Added by [[User:Deskana]], code by [[User:Tra]].
     *  See also [[bugzilla:8912]].
     */
    $(document).ready( function () {
        if (document.location.search.indexOf("undo=") != -1 && document.getElementsByName('wpAutoSummary')[0]) {
            document.getElementsByName('wpAutoSummary')[0].value = '1';
        }
    });

    /**
     * Caracteres especiales (edittools)
     * Crea (y coloca) el ''combobox'' que permite seleccionar un conjunto determinado de
     * caracteres especiales bajo la caja de edición.
     * Funciona en conjunto con [[MediaWiki:Edittools]] y [[MediaWiki:Edittools.js]].
     * Basado en [[commons:MediaWiki:Edittools.js]].
     */
     importScript('MediaWiki:Edittools.javascript');

    //Seguimiento
} else if (mw.config.get('wgPageName') == 'Especial:Seguimiento') {
    mw.loader.load( mw.config.get('wgServer') + mw.config.get('wgScript') +
        '?title=MediaWiki:Common.js/seguimiento.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
}

//Wikibugs
importScript('MediaWiki:Wikibugs.js');

/** WikiMiniAtlas *******************************************************
 *
 *  Description: WikiMiniAtlas is a popup click and drag world map.
 *               This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
 *               The script itself is located on meta because it is used by many projects.
 *               See [[Meta:WikiMiniAtlas]] for more information. 
 *  Maintainers: [[User:Dschwen]]
 */
window.wma_settings = {
    buttonImage: "//upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Erioll_world.svg/15px-Erioll_world.svg.png"
};

mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');

/* OpenStreetMap */
window.osm_proj_map = 'mapa'; //"map" in project language
window.osm_proj_lang = 'es'; //project language

mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:OSM.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');

/** Mejoras de diseño de la Portada
 *
 *  Descripción: Varias mejoras de diseño para la portada, incluyendo un
 *                      enlace adicional a la lista completa de idiomas disponibles.
 *  Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]
 *  Adaptado de [[en:MediaWiki:Common.js]]
 */
if ($.inArray(mw.config.get('wgPageName'), ['Wikipedia:Portada', 'Wikipedia Discusión:Portada']) > -1) {
    $(document).ready(function () {
        mw.util.addPortletLink('p-lang', '//es.wikipedia.org/wiki/Anexo:Wikipedias',
            'Lista completa', 'interwiki-completelist', 'Lista completa de Wikipedias');
    });
}

// Oculta los resumenes de edición para ciertas páginas
var paginasSinRE = [
    "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Plantillas/Fusión_de_historiales/precarga",
    "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Plantillas/Permisos/precarga",
    "Wikipedia:Bot/Solicitudes/Precarga"
];
if ( $.inArray(mw.util.getParamValue('preload'), paginasSinRE ) > -1) {
    $(document).ready(function () {
        $('#wpSummary').hide();
        $('#wpSummaryLabel').hide();
    });
}

/*
== Búsqueda especial extendida (specialsearch) ==
Añade a la página [[Special:Search]] enlaces a buscadores externos como Yahoo, Google, MSN Live y Exalead.
Basado en [[w:fr:MediaWiki:Monobook.js]].
*/
if (mw.config.get('wgCanonicalSpecialPageName') == "Search") {

    /**
     * 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>
     */
    var searchEngines = {
        mediawiki: {
            ShortName: "Búsqueda interna",
            Template: mw.config.get('wgScript') + "?search={searchTerms}"
        },
        exalead: {
            ShortName: "Exalead",
            Template: "http://www.exalead.com/search/wikipedia/results/?q={searchTerms}&language=es"
        },
        google: {
            ShortName: "Google",
            Template: "http://www.google.es/search?as_sitesearch=es.wikipedia.org&hl={language}&q={searchTerms}"
        },
        wikiwix: {
            ShortName: "Wikiwix",
            Template: "http://es.wikiwix.com/index.php?action={searchTerms}&lang={language}"
        },
        wlive: {
            ShortName: "Bing",
            Template: "http://www.bing.com/search?q={searchTerms}&q1=site:http://es.wikipedia.org"
        },
        yahoo: {
            ShortName: "Yahoo!",
            Template: "http://es.search.yahoo.com/search?p={searchTerms}&vs=es.wikipedia.org"
        },
        globalwpsearch: {
            ShortName: "Global WP",
            Template: "http://vs.aka-online.de/cgi-bin/globalwpsearch.pl?timeout=120&search={searchTerms}"
        }
    };

    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("&"),
            idx;
        for (idx = 0; idx < l.length; idx++) {
            var p2 = l[idx].split("=");
            var pValue = p2[1];

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

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

                input2.name = p2[0];
                input2.value = pValue;
            }
        }
    }

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

        var mainNode = document.getElementById("powersearch");
        if (!mainNode) {
            mainNode = document.getElementById("search");
        }
        if (!mainNode) {
            return;
        }

        var beforeNode = document.getElementById("mw-search-top-table");
        if (!beforeNode) {
            return;
        }
        beforeNode = beforeNode.nextSibling;
        if (!beforeNode) {
            return;
        }

        var firstEngine = "mediawiki";

        var choices = document.createElement("div");
        choices.setAttribute("id", "searchengineChoices");
        choices.style.textAlign = "center";

        var lsearchbox = document.getElementById("searchText");
        if (!lsearchbox) {
            return;
        }
        var initValue = lsearchbox.value;

        var space = "",
            id;

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

                var attr = {
                    type: "radio",
                    name: "searchengineselect",
                    value: id,
                    onFocus: "changeSearchEngine(this.value)",
                    id: "searchengineRadio-" + id
                };

                var html = "<input",
                    a;
                for (a in attr) {
                    html += " " + a + "='" + attr[a] + "'";
                }
                html += " />";
                var span = document.createElement("span");
                span.innerHTML = html;

                choices.appendChild(span);
                var label = document.createElement("label");
                label.htmlFor = "searchengineRadio-" + id;
                if (engine.Template.indexOf('http') == 0) {
                    var lienMoteur = document.createElement("a");
                    lienMoteur.href = engine.Template.replace("{searchTerms}", initValue).replace("{language}", "es");
                    lienMoteur.appendChild(document.createTextNode(engine.ShortName));
                    label.appendChild(lienMoteur);
                } else {
                    label.appendChild(document.createTextNode(engine.ShortName));
                }

                choices.appendChild(label);
            }
        }
        mainNode.insertBefore(choices, beforeNode);

        var input = document.createElement("input");
        input.id = "searchengineextraparam";
        input.type = "hidden";

        mainNode.insertBefore(input, beforeNode);

        changeSearchEngine(firstEngine, initValue);
    }

    $(document).ready(externalSearchEngines);
}

/*
 * Cerrar mensajes
 * Ver ejemplo en [[Usuario:Chabacano/Fírmalo]], por [[Usuario:Platonides]].
 */
if (document.getElementById("cierraPadre")) {
    $(document).ready(function () {
        document.getElementById("cierraPadre").childNodes[0].onclick = function () {
            document.getElementById("cierraPadre").style.cursor = 'pointer';
            document.getElementById("cierraPadre").parentNode.style.display = 'none';
            return false; /*no seguir el href*/
        };
    });
}

/** Collapsible tables *********************************************************
 *
 *  Description: Allows tables to be collapsed, showing only the header. See
 *               [[Wikipedia:NavFrame]].
 *  Maintainers: [[User:R. Koot]]
 */

var autoCollapse = 2;
var collapseCaption = "ocultar";
var expandCaption = "mostrar";

window.collapseTable = function (tableIndex) {
    var Button = document.getElementById("collapseButton" + tableIndex),
        Table = document.getElementById("collapsibleTable" + tableIndex),
        i;

    if (!Table || !Button) {
        return false;
    }

    var Rows = Table.rows;

    if (Button.firstChild.data == collapseCaption) {
        for (i = 1; i < Rows.length; i++) {
            Rows[i].style.display = "none";
        }
        Button.firstChild.data = expandCaption;
    } else {
        for (i = 1; i < Rows.length; i++) {
            Rows[i].style.display = Rows[0].style.display;
        }
        Button.firstChild.data = collapseCaption;
    }
};

function createCollapseButtons() {
    var tableIndex = 0,
        NavigationBoxes = {},
        Tables = document.getElementsByTagName("table"),
        i;

    for (i = 0; i < Tables.length; i++) {
        if ( $(Tables[i]).hasClass( 'collapsible' ) ) {

            /* only add button and increment count if there is a header row to work with */
            var HeaderRow = Tables[i].getElementsByTagName("tr")[0];
            if (!HeaderRow) {
                continue;
            }
            var Header = HeaderRow.getElementsByTagName("th")[0];
            if (!Header) {
                continue;
            }

            NavigationBoxes[tableIndex] = Tables[i];
            Tables[i].setAttribute("id", "collapsibleTable" + tableIndex);

            var Button = document.createElement("span");
            var ButtonLink = document.createElement("a");
            var ButtonText = document.createTextNode(collapseCaption);

            Button.className = "collapseButton"; //Styles are declared in Common.css
            ButtonLink.style.color = Header.style.color;
            ButtonLink.setAttribute("id", "collapseButton" + tableIndex);
            ButtonLink.setAttribute("href", "#");
            addHandler(ButtonLink, "click", new Function("evt", "collapseTable(" + tableIndex + " ); return killEvt( evt );"));
            ButtonLink.appendChild(ButtonText);

            Button.appendChild(document.createTextNode("["));
            Button.appendChild(ButtonLink);
            Button.appendChild(document.createTextNode("]"));

            Header.insertBefore(Button, Header.firstChild);
            tableIndex++;
        }
    }

    for (i = 0; i < tableIndex; i++) {
        if ( $(NavigationBoxes[i]).hasClass( 'collapsed' ) || (tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass( 'autocollapse' ) ) ) {
            window.collapseTable(i);
        } else if ( $(NavigationBoxes[i]).hasClass( 'innercollapse' ) ) {
            var element = NavigationBoxes[i];
            while (element = element.parentNode) {
                if ( $(element).hasClass( 'outercollapse' ) ) {
                    window.collapseTable(i);
                    break;
                }
            }
        }
    }
}

$(document).ready(createCollapseButtons);

// == Código del plegado/desplegado de plantillas ==
var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';

var NavigationBarShowDefault = 0;

// shows and hides content and picture (if available) of navigation bars
// Parameters:
//     indexNavigationBar: the index of navigation bar to be toggled
window.toggleNavigationBar = function (indexNavigationBar) {
    var NavToggle = document.getElementById("NavToggle" + indexNavigationBar),
        NavFrame = document.getElementById("NavFrame" + indexNavigationBar),
        NavChild;

    if (!NavFrame || !NavToggle) {
        return false;
    }

    // if shown now
    if (NavToggle.firstChild.data == NavigationBarHide) {
        for (NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            if ( $(NavChild).hasClass( 'NavContent' ) || $(NavChild).hasClass( 'NavPic' ) ) {
                NavChild.style.display = 'none';
            }
        }
        NavToggle.firstChild.data = NavigationBarShow;

        // if hidden now
    } else if (NavToggle.firstChild.data == NavigationBarShow) {
        for (NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
            if ( $(NavChild).hasClass( 'NavContent' ) || $(NavChild).hasClass( 'NavPic' ) ) {
                NavChild.style.display = 'block';
            }
        }
        NavToggle.firstChild.data = NavigationBarHide;
    }
};

// adds show/hide-button to navigation bars
function createNavigationBarToggleButton() {
    var indexNavigationBar = 0,
    // iterate over all < div >-elements 
        divs = document.getElementsByTagName("div"),
        NavFrame,
        NavChild,
        i;
    for (i = 0; NavFrame = divs[i]; i++) {
        // if found a navigation bar
        if ( $(NavFrame).hasClass( 'NavFrame' ) ) {

            indexNavigationBar++;
            var NavToggle = document.createElement("a");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');

            var isCollapsed = $(NavFrame).hasClass( 'collapsed' );
            /*
             * Check if any children are already hidden.  This loop is here for backwards compatibility:
             * the old way of making NavFrames start out collapsed was to manually add style="display:none"
             * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
             * the content visible without JavaScript support), the new recommended way is to add the class
             * "collapsed" to the NavFrame itself, just like with collapsible tables.
             */
            for (NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
                if ( $(NavChild).hasClass( 'NavPic' ) || $(NavChild).hasClass( 'NavContent' ) ) {
                    if (NavChild.style.display == 'none') {
                        isCollapsed = true;
                    }
                }
            }
            if (isCollapsed) {
                for (NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
                    if ( $(NavChild).hasClass( 'NavPic' ) || $(NavChild).hasClass( 'NavContent' ) ) {
                        NavChild.style.display = 'none';
                    }
                }
            }
            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide),
                j;
            NavToggle.appendChild(NavToggleText);

            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
            for (j = 0; j < NavFrame.childNodes.length; j++) {
                if ( $(NavFrame.childNodes[j]).hasClass( 'NavHead' ) ) {
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
                    NavFrame.childNodes[j].appendChild(NavToggle);
                }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
}

$(document).ready(createNavigationBarToggleButton);

/** Interwiki links to featured articles ***************************************
 *
 *  Description: Highlights interwiki links to featured articles (or
 *               equivalents) by changing the bullet before the interwiki link
 *               into a star.
 *  Maintainers: [[User:R. Koot]]
 */

function LinkFA() {
    if (document.getElementById("p-lang")) {
        var InterwikiLinks = document.getElementById("p-lang").getElementsByTagName("li"),
            InterwikiLinksLargo = InterwikiLinks.length,
            i;

        for (i = 0; i < InterwikiLinksLargo; i++) {
            if (document.getElementById(InterwikiLinks[i].className + "-fa")) {
                InterwikiLinks[i].className += " destacado";
                InterwikiLinks[i].title = "Este es un artículo destacado en esta Wikipedia.";
            } else if (document.getElementById(InterwikiLinks[i].className + "-ga")) {
                InterwikiLinks[i].className += " bueno";
                InterwikiLinks[i].title = "Este es un artículo bueno en esta Wikipedia.";
            }
        }
    }
}

$(document).ready(LinkFA);

/*
// == Interproyectos en un recuadro a la izquierda ==
 Funcionan con la plantilla {{tl|commons}} y en otras
 [[:Categoría:Wikipedia:Plantillas_de_enlace_entre_proyectos|plantillas de enlace entre proyectos]]
*/

function iProject() {
    var elementos = [],
        i;

    if (document.getElementsByClassName) {
        elementos = document.getElementsByClassName("interProject");
    } else {
        var els = document.getElementsByTagName("span"),
            elsLen = els.length,
            j;
        for (i = 0, j = 0; i < elsLen; i++) {
            if ("interProject" == els[i].className) {
                elementos[j] = els[i];
                j++;
            }
        }
    }
    if (elementos.length > 0) {
        mw.util.addCSS('#interProject {display: none; speak: none;} #p-tb .pBody {padding-right: 0;}');
        var portal = document.createElement('div');
        portal.setAttribute("class", "portlet portal"); /* portlet en monobook, portal en vector */

        var tit = document.createElement('h5');
        tit.setAttribute("lang", "es");
        tit.appendChild(document.createTextNode('Otros proyectos'));
        portal.appendChild(tit);

        var IPY = document.createElement('div');
        IPY.setAttribute('class', "pBody body");
        var ul = document.createElement('ul');
        IPY.appendChild(ul);

        for (i = 0; i < elementos.length; i++) {
            var li = document.createElement('li');
            li.innerHTML = elementos[i].innerHTML;
            ul.appendChild(li);
        }
        portal.appendChild(IPY);

        if (document.getElementById("p-tb").nextSibling) {
            document.getElementById("p-tb").parentNode.insertBefore(portal, document.getElementById("p-tb").nextSibling);
        }
        else {
            document.getElementById("p-tb").parentNode.appendChild(portal);
        }
    }
}
$(document).ready(iProject);

/* End of mw.loader.using callback */
});

/**
 * Ordenación de tablas para seguir la convención de la RAE, SI y el Manual de Estilo
 * aún así se permite que el antigua sistema mantenga su comportamiento para no dañar
 * las miles de tablas sortable existentes de Wikipedia.
 * El script detecta si se usa la ordenación antigua (punto como separador de millares, y coma como separador de decimales)
 * o la nueva ordenación (espacio como separador de millares, y punto o coma como separador de decimales)
 * Aun así esto debería estar en mediaWiki y no aquí
 * Algo relacionado pero que no afecta las sortable directamente bug 34977
 * 
 * Personaliza la ordenación de fechas
 * Se ordenan según "dd de mm de yy" o "dd de mm de yyyy"
 * También reconoce dd-mm-yy, dd-mm-yyyy (y otras variaciones usando / , .)
 */
mw.loader.using( 'jquery.tablesorter', function () {
    var ts = $.tablesorter,
        i,
        j;

    ts.formatDigit = function( s ) {
        var i = parseFloat( s.replace( /[. ]/g, '' ).replace( /,/g, '.' ).replace( "\u2212", '-' ) );
        return ( isNaN(i)) ? 0 : i;
    };

    ts.formatDigitSI = function( s ) {
        var i = parseFloat( s.replace( /[\u00a0\u202f ]/g, '' ).replace( /,/g, '.' ).replace( "\u2212", '-' ) );
        return ( isNaN(i)) ? 0 : i;
    };

    ts.numberRegexCustom   = new RegExp( "^[-+\u2212]?" +
                                             "(?:" +
                                                 "([0-9]{1,3}[\\.])+?[0-9]{1,3}" +
                                             "|" +
                                                 "[0-9]{1,4}" +
                                             ")([\\,][0-9]+)?[\\s\\xa0]*%?$", "i" );
    ts.numberRegexCustomSI = new RegExp( "^[-+\u2212]?" +
                                             "(?:" +
                                                 "([0-9]{1,3}[\u00a0\u202f ])+?[0-9]{1,3}" +
                                             "|" +
                                                 "[0-9]{1,4}" +
                                             ")([\\.\\,][0-9]+)?[\\s\\xa0]*%?$", "i" );

    var regex = [];
    ts.monthNames = [
        [],
        []
    ];

    for ( i = 1; i < 13; i++ ) {
        ts.monthNames[0][i] = mw.config.get( 'wgMonthNames' )[i].toLowerCase();
        ts.monthNames[1][i] = mw.config.get( 'wgMonthNamesShort' )[i].toLowerCase().replace( '.', '' );
        regex.push( $.escapeRE( ts.monthNames[0][i] ) );
        regex.push( $.escapeRE( ts.monthNames[1][i] ) );
    }
    regex = regex.join( '|' );

    ts.fechaRegexCustom = [];
    ts.fechaRegexCustom[0] = new RegExp( "^\\d\\d?\\sde\\s(" + regex + ")\\sde\\s\\d{2,4}$" );
    ts.fechaRegexCustom[1] = new RegExp( "^(\\d\\d[\\/\\.\\-]\\d\\d[\\/\\.\\-]\\d\\d\\d\\d|\\d\\d[\\/\\.\\-]\\d\\d[\\/\\.\\-]\\d\\d)$" );

    $.tablesorter.addParser( {
        id: 'numberSI',
        is: function ( s, table ) {
            return $.tablesorter.numberRegexCustomSI.test( $.trim( s ) );
        },
        format: function ( s ) {
            return $.tablesorter.formatDigitSI( s );
        },
        type: 'numeric'
    });

    $.tablesorter.addParser( {
        id: 'numberCustom',
        is: function ( s, table ) {
            return $.tablesorter.numberRegexCustom.test( $.trim( s ) );
        },
        format: function ( s ) {
            return $.tablesorter.formatDigit( s );
        },
        type: 'numeric'
    });

    ts.addParser( {
        id: 'fecha',
        is: function( s ) {
            return ( ts.fechaRegexCustom[0].test(s) || ts.fechaRegexCustom[1].test(s) );
        },
        format: function( s, table ) {
            s = $.trim( s.toLowerCase() );

            for ( i = 1, j = 0; i < 13 && j < 2; i++ ) {
                s = s.replace( ts.monthNames[j][i], i );
                if ( i == 12 ) {
                    j++;
                    i = 0;
                }
            }

            s = s.replace( /( de |[\-\.\,' ])/g, '/' );

            // Replace double slashes
            s = s.replace( /\/\//g, '/' );
            s = s.replace( /\/\//g, '/' );
            s = s.split( '/' );

            // Pad Month and Day
            if ( s[0] && s[0].length == 1 ) {
                s[0] = '0' + s[0];
            }
            if ( s[1] && s[1].length == 1 ) {
                s[1] = '0' + s[1];
            }
            var y;

            if ( !s[2] ) {
                // Fix yearless dates
                s[2] = 2000;
            } else if ( ( y = parseInt( s[2], 10) ) < 100 ) {
                // Guestimate years without centuries
                if ( y < 30 ) {
                    s[2] = 2000 + y;
                } else {
                    s[2] = 1900 + y;
                }
            }
            // Resort array depending on preferences
            var d = s.shift();
            s.push( s.shift() );
            s.push(d);
            return parseInt( s.join( '' ), 10 );
        },
        type: 'numeric'
    } );
/* End of mw.loader.using callback */
});

/* Fin de alias */
})( jQuery, mediaWiki );
Herramientas personales
Espacios de nombres

Variantes
Acciones