MediaWiki:Common.js

Na Galipedia, a Wikipedia en galego.
/**
 * 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.
 */
/* global mw, $ */
/* jshint strict:false, browser:true */

mw.loader.using( ['mediawiki.user', 'mediawiki.util', 'jquery.client'] ).done( function () {
/* Begin of mw.loader.using callback */

/**
 * Arranxos na Portada
 *
 * Descrición: Engade unha ligazón adicional cara á lista completa de linguas dispoñibles.
 * Traído de [[en:MediaWiki:Common.js]]. Mantido por [[en:User:AzaToth]], [[en:User:R. Koot]] e [[en:User:Alex Smotrov]]
 */
if ( mw.config.get( 'wgPageName' ) === 'Portada' || mw.config.get( 'wgPageName' ) === 'Conversa:Portada' ) {
    $( document ).ready( function () {
        mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias/gl',
            'Lista completa', 'interwiki-completelist', 'Lista completa de wikipedias' );
    } );
}

/**
 * Map addPortletLink to mw.util
 * @deprecated: Use mw.util.addPortletLink instead.
 */
mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Use mw.util.addPortletLink instead' );

/**
 * Extract a URL parameter from the current URL
 * @deprecated: Use mw.util.getParamValue with proper escaping
 */
mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Use mw.util.getParamValue instead' );

/**
 * Proba se un elemento ten unha certa clase
 * @deprecated:  Use $(element).hasClass() instead.
 */
mw.log.deprecate( window, 'hasClass', function ( element, className ) {
    return $( element ).hasClass( className );
}, 'Use jQuery.hasClass() instead' );

/**
 * Caixa de Descrición en páxina de carga de ficheiros
 *
 * Descrición: Chama a [[Mediawiki:Upload.js]] para engadir o texto predefinido 
 * para o [[Modelo:Information]] na caixa de texto de "Descrición" na 
 * páxina de carga de ficheiros [[Especial:Subir]]
 * 
 * Traído de [[nl:MediaWiki:Common.js]].
 */
if (mw.config.get('wgPageName') === 'Especial:Subir') {
		importScript('MediaWiki:Upload.js');
	}

/**
 * Redirixir Usuario:Nome/skin.js e skin.css ás páxinas de aparencia actuais
 * (agás que a subpáxina "skin" exista)
 * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
 * @rev: 2
 */
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.shift() + '/' + mw.config.get( 'skin' );
        if ( titleParts.slice( -1 ) == 'skin.js' ) {
            window.location.href = mw.util.getUrl( userSkinPage + '.js' );
        } else if ( titleParts.slice( -1 ) == 'skin.css' ) {
            window.location.href = mw.util.getUrl( userSkinPage + '.css' );
        }
    }
}

/**
 * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 * @rev 6
 */
var extraCSS = mw.util.getParamValue( 'withCSS' ),
    extraJS = mw.util.getParamValue( 'withJS' );

if ( extraCSS ) {
    if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {
        mw.loader.load( '/w/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css' );
    } else {
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Valor withCSS non válido' } );
    }
}

if ( extraJS ) {
    if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {
        mw.loader.load( '/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript' );
    } else {
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Valor withJS non válido' } );
    }
}

/**
 * Arranxo para a renderización de fontes Unicode en Windows XP
 */
if ( navigator.appVersion.search(/windows nt 5/i) !== -1 ) {
    mw.util.addCSS( '.IPA { font-family: "Lucida Sans Unicode", "Arial Unicode MS"; } ' + 
                '.Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; } ' );
}
/**
 * WikiMiniAtlas
 *
 * Descrición: WikiMiniAtlas é un mapa mundial nunha ventá emerxente.
 *             Este script provoca que todas as ligazóns de coordenadas mostren o botón de WikiMiniAtlas.
 *             O script en si está localizado en Meta-Wiki porque moitos proxectos fan uso del.
 *             Véxase [[meta:WikiMiniAtlas]] para obter máis información. 
 * Traído de [[en:MediaWiki:Common.js]]. Mantido por [[en: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');

/* OpenStreetMap */
mw.config.set( 'osm_proj_map', 'mapa' ); //"map" in project language
mw.config.set( 'osm_proj_lang', 'gl' ); //project language

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

/**
 * Collapsible tables; reimplemented with mw-collapsible
 * Styling is also in place to avoid FOUC
 * 
 * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].
 * @version 3.0.0 (2018-05-20)
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js
 * @author [[User:R. Koot]]
 * @author [[User:Krinkle]]
 * @author [[User:TheDJ]]
 * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which
 * is supported in MediaWiki core. Shimmable since MediaWiki 1.32
 */
function makeCollapsibleMwCollapsible( $content ) {
	var $tables = $content
		.find( 'table.collapsible:not(.mw-collapsible)' )
		.addClass( 'mw-collapsible' );

	$.each( $tables, function( index, table ) {
		// mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.');
		if( $( table ).hasClass( 'collapsed') ) {
			$( table ).addClass( 'mw-collapsed' );
			// mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.');
		}
	} );
	if( $tables.length > 0 ) {
		mw.loader.using( 'jquery.makeCollapsible' ).then( function() {
			$tables.makeCollapsible();
		} );
	}
}
mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible );

/**
 * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse
 *
 * Maintainers: TheDJ
 */
function mwCollapsibleSetup( $collapsibleContent ) {
	var $element,
		$toggle,
		autoCollapseThreshold = 2;
	$.each( $collapsibleContent, function (index, element) {
		$element = $( element );
		if ( $element.hasClass( 'collapsible' ) ) {
			$element.find('tr:first > th:first').prepend( $element.find('tr:first > * > .mw-collapsible-toggle'));
		}
		if ( $collapsibleContent.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {
			$element.data( 'mw-collapsible' ).collapse();
		} else if ( $element.hasClass( 'innercollapse' ) ) {
			if ( $element.parents( '.outercollapse' ).length > 0 ) {
				$element.data( 'mw-collapsible' ).collapse();
			}
		}
		// because of colored backgrounds, style the link in the text color
		// to ensure accessible contrast
		$toggle = $element.find( '.mw-collapsible-toggle' );
		if ( $toggle.length ) {
			// Make the toggle inherit text color
			if( $toggle.parent()[0].style.color ) {
				$toggle.find( 'a' ).css( 'color', 'inherit' );
			}
		}
	} );
}

mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );

/**
 * Dynamic Navigation Bars (experimental)
 *
 * Description: See [[Wikipedia:NavFrame]].
 * Maintainers: UNMAINTAINED
 */
 
var collapseCaption = 'agochar';
var expandCaption = 'amosar';

// Set up the words in your language
var navigationBarHide = '[' + collapseCaption + ']';
var navigationBarShow = '[' + expandCaption + ']';

/**
 * Shows and hides content and picture (if available) of navigation bars.
 *
 * @param {number} indexNavigationBar The index of navigation bar to be toggled
 * @param {jQuery.Event} event Event object
 */
function toggleNavigationBar( indexNavigationBar, event ) {
	var navToggle = document.getElementById( 'NavToggle' + indexNavigationBar );
	var navFrame = document.getElementById( 'NavFrame' + indexNavigationBar );
	var 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.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.style.display = 'block';
			}
		}
		navToggle.firstChild.data = navigationBarHide;
	}

	event.preventDefault();
}

/**
 * Adds show/hide-button to navigation bars.
 *
 * @param {jQuery} $content
 */
function createNavigationBarToggleButton( $content ) {
	var i, j, navChild, navToggle, navToggleText, isCollapsed,
		indexNavigationBar = 0;
	// Iterate over all < div >-elements
	var $divs = $content.find( 'div.NavFrame:not(.mw-collapsible)' );
	$divs.each( function ( i, navFrame ) {
		indexNavigationBar++;
		navToggle = document.createElement( 'a' );
		navToggle.className = 'NavToggle';
		navToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );
		navToggle.setAttribute( 'href', '#' );
		$( navToggle ).on( 'click', $.proxy( toggleNavigationBar, null, indexNavigationBar ) );

		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';
				}
			}
		}
		navToggleText = document.createTextNode( isCollapsed ? navigationBarShow : navigationBarHide );
		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 );
	} );
}

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

/**
 * Descrición: Desactivar o botón "Gardar a páxina" aos usuarios anónimos
 *             que non usen antes o botón "Mostrar a vista previa".
 *             Véxase [[mw:Manual:Force preview]].
 * Traído de [[fr:MediaWiki:Common.js/edit.js]]. Author: Marc Mongenet, 2006 (fr.wikipedia.org)
 */
function forcePreview() {
  if (mw.config.get('wgUserName') != null || mw.config.get('wgAction') != "edit") return;
  var saveButton = document.getElementById("wpSave");
  if (!saveButton) return;
  saveButton.disabled = true;
  saveButton.value = "Gardar (use antes a vista previa!)";
  saveButton.style.fontWeight = "normal";
  document.getElementById("wpPreview").style.fontWeight = "bold";
}
$(forcePreview);
 
function eregReplace(search, replace, subject) {
    return subject.replace(new RegExp(search,'g'), replace);
}

/**
 * Descrición: Mostra as categorías ocultas aos usuarios rexistrados,
 *             engadindo a función "[amosar]".
 * Traído de [[fr:MediaWiki:Common.js]].
 */
function hiddencat(){
 if(typeof(DesactiveHiddenCat)!="undefined" && DesactiveHiddenCat) return;
 if(document.URL.indexOf("printable=yes")!=-1) return;
 var cl = document.getElementById('catlinks'); if(!cl) return;
 if( !(hc = document.getElementById('mw-hidden-catlinks')) ) 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/Categoría:Índice';
  a.title = 'Categoría:Índice';
  a.appendChild(document.createTextNode('Categorías'));
  catline.appendChild(a);
  catline.appendChild(document.createTextNode(' : '));
  nc = cl.insertBefore(catline, cl.firstChild);
 }
 else nc.appendChild(document.createTextNode(' | '));
 var lnk = document.createElement('a');
 lnk.id = 'mw-hidden-cats-link';
 lnk.title = 'Este artigo contén categorías ocultas';
 lnk.style.cursor = 'pointer';
 lnk.style.color = 'black';
 lnk.onclick = toggleHiddenCats;
 lnk.appendChild(document.createTextNode('[amosar]'));
 hclink = nc.appendChild(lnk);
}
function toggleHiddenCats(){
 if( $(hc).hasClass( 'mw-hidden-cats-hidden') ) {
  $(hc).removeClass( 'mw-hidden-cats-hidden');
  $(hc).addClass( 'mw-hidden-cat-user-shown');
  $(hclink).text('[agochar]');
 } else {
  $(hc).removeClass( 'mw-hidden-cat-user-shown');
  $(hc).addClass( 'mw-hidden-cats-hidden');
  $(hclink).text('[amosar]');
 }
}
$(hiddencat);

/**
 * Ticker: ver [[Modelo:ticker]]
 * Adaptado de https://en.wikinews.org/w/index.php?title=MediaWiki:Ticker2.js&oldid=1384515
 */
 $(function () {if ((window.disable_ticker2 !== true) && (document.getElementById("singleTickerForPage") || document.getElementById('enableTickers'))) 
mw.loader.load('//en.wikinews.org/w/index.php?title=MediaWiki:ticker2.js&action=raw&ctype=text/javascript');});

/**
 * Código para cambiar entre varias imaxes usada en {{switcher2}}
 * procendencia: [[:fr:special:permalink/165756873]] o 2020-07-26
 */

function GeoBox_Init($content) {
    $content.find( 'div.img_toogle' ).each( function ( i, Container ) {
        Container.id = 'img_toogle_' + i;
        var Boxes = $( Container ).find( '.geobox' );
        if (Boxes.length < 2) {
            return;
        }
        var ToggleLinksDiv = document.createElement('ul');
        ToggleLinksDiv.id = 'geoboxToggleLinks_' + i;
        Boxes.each( function ( a, ThisBox ) {
            ThisBox.id = 'geobox_' + i + '_' + a;
            var ThisAlt = ThisBox.getElementsByTagName('img')[0].alt;
            var toggle = document.createElement('a');
            toggle.id = 'geoboxToggle_' + i + '_' + a;
            toggle.textContent = ThisAlt;
            toggle.href = 'javascript:';
            toggle.onclick = function (e) {
                e.preventDefault();
                GeoBox_Toggle(this);
            };
            var Li = document.createElement('li');
            Li.appendChild(toggle);
            ToggleLinksDiv.appendChild(Li);
            if (a === (Boxes.length - 1)) {
                toggle.style.color = '#888';
                toggle.style.pointerEvents = '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.style.color = '#888';
            thisToggleLink.style.pointerEvents = 'none';
        } else {
            thisToggleLink.style.color = '';
            thisToggleLink.style.pointerEvents = '';
        }
    } );
}

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

/* Fin da chamada de retorno ao mw.loader.using */
} );

/* NON ENGADAS NINGÚN CÓDIGO POR DEBAIXO DESTA LIÑA */