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]]  *** */
LeafletRoot = '/js/leaflet/';
ImageRoot = '/files/';
$(function () {
	// Регистрация функции для карт, подкачивающихся по CSI:
	if ($('.cs-include').length > 0) {
		window.csiPostprocessors = window.csiPostprocessors || [];
		window.csiPostprocessors.push (wlLeafletIni);
	}
	// Инициация обычных карт:
	wlLeafletIni ($(document.body));
}); // -- $(function ()

function wlLeafletIni ($obj) {
	if ($obj.find ('.wikileaf').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';
		importStylesheetURI(LeafletRoot + 'leaflet.css');
		$.ajax ({
			url: LeafletRoot + 'leaflet.js',
			dataType: 'script',
			cache: true,
			success: function() {
				$.ajax ({
					url: WikiLeafletURL,
					dataType: 'script',
					cache: true,
					success: function () {
						wlRender ($obj);
					},
					fail: function (jqXHR, textStatus) {
						alert ('Request to ' + WikiLeafletURL + ' failed: ' + textStatus);
					}
				});
			},
			fail: function (jqXHR, textStatus) {
				alert ('Request to ' + LeafletRoot + 'leaflet.js' + ' failed: ' + textStatus);
			}
		}); // -- $.ajax (...)
	} // -- if ($obj.find ('.wikileaf').length !== 0)
} // -- function wlLeafletIni ($obj)

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

// Add custom footer icons by Javascript rather than inject them into the HTML on server side.
//     This will reduce apparent page load time:
$(function () {
    if (mw.user.options.get ('gadget-DisableExternalCounters') === '1') return; // [[MediaWiki:Gadget-DisableExternalCounters.js]]
    if (window.location.hostname.indexOf ('.onion') !== -1 || window.location.hostname.indexOf ('.i2p') !== -1) return; // -- no counters for Onion or i2p.
    // Yandex's and Rambler's counters:
    var counters = '<li id="yandex-counter"><a href="//yandex.ru/cy?base=0&host=traditio.wiki"><img src="//www.yandex.ru/cycounter?traditio.wiki" alt="ТИЦ Яндекса" width="88" height="31" /></a></li>'
//                 + '<a href="//top100.rambler.ru/navi/3124038/"><img src="//counter.rambler.ru/top100.cnt?3124038" alt="Rambler\'s Top 100" width="88" height="31" /></a>'
                 + '<li id="liveinternet-counter"><a href="//www.liveinternet.ru/click" target="_blank"><img src="//counter.yadro.ru/hit?t15.6;r' + escape (document.referrer)
                 + ((typeof (screen) === 'undefined') ? '' : ';s' + screen.width + '*' + screen.height + '*'
                     + (screen.colorDepth ? screen.colorDepth : screen.pixelDepth)
                   ) + ';u' + escape (document.URL) + ';h' + escape (document.title.substring (0,80)) + ';' + Math.random ()
                 + '" alt="Счётчик LiveInternet" title="LiveInternet: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня" '
                 + 'border="0" width="88" height="31"><\/a></li>';
    // Different ways in Common and Vector skins:
    if (mw.config.get ('skin') === 'vector') {
        $('li#footer-countersico').before (counters);
    } else {
        $('div#f-countersico').prepend ('&nbsp;&nbsp;' + counters);
    }
});