MediaWiki:Common.js

Замечание: Чтобы после сохранения вступили в силу изменения стилей, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=styles&skin=common&*, если используете скин Common.

Чтобы вступили в силу изменения скриптов, перезагрузите файл //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=vector&*, если используете скин Vector, или //traditio.wiki/w/load.php?debug=false&lang=ru&modules=site&only=scripts&skin=common&*, если используете скин Common.

Гаджеты и импортируемые скрипты загружаются отдельными файлами.

/******************************************************************************************
 *
 *  Сворачивающиеся блоки для шаблонов {{Навигационная таблица}}, {{Навигационная полоса}}
 *  и для таблиц class="collapsible" (см. на [[Справка:Оформление таблиц]] пример).
 *
 *  Код полностью переписал Mithgol the Webmaster на основе jQuery в начале августа 2009 г.
 *  Доработано Александром Машиным 2 июля 2014 года.
 *   
 ******************************************************************************************
*/

var autoCollapse = 2;
var collapseCaption = 'скрыть';
var expandCaption = 'показать';

var expandDuration = 1000;
var collapseDuration = 1700;

function getTableRows ($toggle) {
	return $toggle.closest('tr').parent().children().filter('tr').not(':first');
}
// Скрытие:
function collapseTable ($toggle){
	var $tableRows = getTableRows ($toggle);
	if ($tableRows.length === 0) return;
	
	$tableRows.fadeOut (collapseDuration);
	$toggle.text(expandCaption);
}
// Показ:
function expandTable ($toggle){
	var $tableRows = getTableRows ($toggle);
	if ($tableRows.length === 0) return;
	
	var timePerRow = expandDuration / $tableRows.length;
	$tableRows.fadeIn (expandDuration);
	$toggle.text(collapseCaption);
}
// Переключение состояния:
function toggleTable(linkObject){
	var $toggle = $(linkObject);

	if ($toggle.text() === collapseCaption) {
		collapseTable ($toggle);
	} else {
		expandTable ($toggle);
	}
}

$(function(){
	var allTables = $('#content table.collapsible');

	allTables.each(function(tblIdx){
		var HRow = $('tr:first', this);
		if (HRow.length === 0){
			$(this).addClass('wontCollapse'); // no rows
			return true; // continue next iteration of each()
      	}
		if (HRow.parent().children().filter('tr').not(':first').length === 0){
			$(this).addClass('wontCollapse'); // no rows after the first
			return true; // continue next iteration of each()
		}

		var Header = $('th:last', HRow);
		if (Header.length === 0){
			$(this).addClass('wontCollapse'); // no TH in the first row
			return true; // continue next iteration of each()
		}

		$(this).data('collapseIndex', tblIdx);
		Header.prepend(
			'<span style="float: right; font-weight: normal;">'+
			'[<a id="collapseButton' + tblIdx + '" href="#" onClick="toggleTable(this); return false;">'+
			collapseCaption + '</a>]</span>');
	});

	var processedTables = allTables.not('.wontCollapse');
	// Скрытие таблиц, допускающих его, если таблиц слишком много:
	if (processedTables.length > autoCollapse){
		processedTables.filter('.autocollapse').each(function(i){
			var linkIDX = $(this).data('collapseIndex');
			collapseTable($('a#collapseButton' + linkIDX, this));
		});
	}
	// Безусловное скрытие таблиц:
	processedTables.filter('.collapsed').each(function(i){
		var linkIDX = $(this).data('collapseIndex');
		collapseTable($('a#collapseButton' + linkIDX, this));
	});
});

var NavigationBarHide = '[' + collapseCaption + ']';
var NavigationBarShow = '[' + expandCaption + ']';
var NavigationBarShowDefault = autoCollapse;

// Переключение состояния:
function toggleDiv (toggleObject){
	var $toggle = $(toggleObject);
	if ($toggle.text() === NavigationBarHide) {
		collapseDiv ($toggle);
	} else {
		expandDiv ($toggle);
	}
}
function getFrame ($toggle) {
	return $toggle.closest('div.NavFrame');
}
// Скрытие:
function collapseDiv($toggle){ // accepts both raw and jQuery-wrapped objects
	var $frame  = getFrame ($toggle);
	if ($frame.length === 0) return false;

	$frame.children().filter('.NavPic, .NavContent').slideUp(expandDuration);
	$toggle.text(NavigationBarShow);
}
// Показ:
function expandDiv($toggle){ // accepts both raw and jQuery-wrapped objects
	var $frame  = $toggle.closest('div.NavFrame');
	if ($frame.length === 0) return false;

	$frame.children().filter('.NavPic, .NavContent').slideDown(collapseDuration, 'easeOutElastic');
	$toggle.text(NavigationBarHide);
}

// Установка начального состояния всех тегов <div>:
$(function(){
   var $navFrameList = $('#content div.NavFrame');
   $navFrameList.each(function(navIdx){
      var $navHead = $('.NavHead:first', this);
      if ($navHead.length === 0) {
         $(this).addClass('wontCollapse'); // no NavHead inside!
         return true;      // continue next iteration of each()
      }
      $(this).data('NavFrameIndex', navIdx);
      $navHead.prepend('<a class="NavToggle" '+
         'id="NavToggle' + navIdx + '" href="#" '+
         'onClick="toggleDiv(this); return false;">'+
         NavigationBarHide + '</a>'
      );
   });
   var $processedDivs = $navFrameList.not('.wontCollapse');
   // Скрытие <div>'ов, не объявленных .expanded, если их больше минимума:
   if ($processedDivs.length > NavigationBarShowDefault){
      $processedDivs.not('.collapsed').not('.expanded').each(function(i){
         var linkIDX = $(this).data('NavFrameIndex');
         collapseDiv($('#NavToggle' + linkIDX, this));
      });
   }
   // Скрытие <div>'ов, объявленных .collapsed:
   $processedDivs.filter('.collapsed').each(function(i){
      var linkIDX = $(this).data('NavFrameIndex');
      collapseDiv($('#NavToggle' + linkIDX, this));
   });
});

/*  Замена свёртывания и развёртывания метаданных по трём причинам:
 *  1) http://traditio.wiki/w/skins/common/metadata.js чего-то не действует в Firefox 4
 *  2) уместнее манипулировать DOM только после того, как код страницы весь пришёл
 *  3) эффекты jQuery выглядят круче, чем мгновенное переключение видимости
*/
attachMetadataToggle = function(){}; // старая функция устранена, вот новая:
$(function(){
   var $tbody = $('#mw_metadata tbody');
   $tbody.append(
      '<tr><td colspan="2"><a href="javascript:" id="toggleMetadata">'+
      '<span id="hideMetadata">Скрыть метаданные</span>'+
      '<span id="showMetadata">Показать метаданные</span>'+
      '</a></td></tr>'
   );
   $tbody.children('tr').not(':last').hide();
   $('#hideMetadata').hide();
 
   $('#toggleMetadata').click(function(){
      $(this).blur();
      $('#hideMetadata').toggle();
      $('#showMetadata').toggle();
      $('#mw_metadata tbody tr').not(':last').fadeToggle(expandDuration);
   });
});

/*  Замена гиперссылки на кнопке «+» (например, наверху обсуждений) на другой адрес,
 *  если на странице был поставлен шаблон {{modifynewsectionlink}}.
*/
$(function(){
   var customLink = $('#add-custom-section a:first');
   if (customLink.length !== 0) { // используем customLink:
      $('#ca-addsection a:first').attr('href', customLink.attr('href'));
   }
});


/* ***  Отрисовка геокарт [[WikiLeaflet]]  *** */
var LeafletRoot = '/js/leaflet/';
var ImageRoot = '/files/';
var wlclass = '.wikileaf';
var dqclass = '.smw-deferred-query';
var dqevent = 'smw.deferred.query';

$(function () {
	if ($(document.body).find(wlclass).length > 0) {
		var WikiLeafletURL = mw.config.get ('wgScriptPath') + '/index.php?title=' +
        	escape( 'MediaWiki:WikiLeaflet.js' ) +
        	'&action=raw&ctype=text/javascript&dontcountme=s&v=1.0';
		mw.loader.load (LeafletRoot + 'leaflet.css', 'text/css');
		$.ajax ({
			url: LeafletRoot + 'leaflet.js',
			dataType: 'script',
			cache: true,
			success: function() {
				$.ajax ({
					url: WikiLeafletURL,
					dataType: 'script',
					cache: true,
					success: function () {
						$(wlclass + ':not(:has(' + dqclass + '))').each (function (i) {
							wlRender (this);
						});	// -- $(wlclass + ':not(:has(' + dqclass + '))').each (function (i)
						mw.hook (dqevent).add (function ($context) {
							var $leaflet = $context.parents (wlclass);
							if ($leaflet && $leaflet [0]) {
								wlRender ($leaflet [0]);
							}
						});	// -- mw.hook (dqevent).add (function ($context)
					},	// -- success: function ()
					fail: function (jqXHR, textStatus) {
						alert ('Request to ' + WikiLeafletURL + ' failed: ' + textStatus);
					}
				});	//	-- $.ajax
			},	// -- success: function()
			fail: function (jqXHR, textStatus) {
				alert ('Request to ' + LeafletRoot + 'leaflet.js' + ' failed: ' + textStatus);
			}
		}); // -- $.ajax (...)
	}	// -- if ($(document.body).find(wlclass).length > 0)
}); // -- $(function ()

// A more explicit invitation to participate:
$(function () {
	if ((mw.config.get ('wgNamespaceNumber') === 0
	 || mw.config.get ('wgNamespaceNumber') === 198)
	 && mw.config.get ('wgAction') === 'view'
	 && mw.config.get ('wgArticleId') !== 13047
	 && mw.config.get ('wgRestrictionEdit').length === 0
	) {
	    $('#siteSub').append ('<span class="noprint">. Вы можете <a href="' + $('link[rel="edit"]').attr('href') + '">дополнить или исправить</a> его.</span>');
	}
});