Заўвага: Пасля апублікавання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змены.

  • Firefox / Safari: націсніце Reload, утрымліваючы Shift, або націсніце Ctrl-F5 ці Ctrl-R (⌘-R на Макінтошах)
  • Google Chrome: Націсніце Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer / Edge: націсніце Refresh, утрымліваючы Ctrl, або націсніце Ctrl-F5
  • Opera: Увайдзіце Menu → Settings (Opera → Preferences на Mac), далей Privacy & security → Clear browsing data → Cached images and files.
importMW = function ( name ) {
	importScript( 'MediaWiki:' + name + '.js' );
};

var importScript_ = importScript;
importScript = function ( page, proj ) {
	if ( !proj ) {
		importScript_( page );
	} else {
		if ( proj.indexOf( '.' ) === -1 ) {
			proj += '.wikipedia.org';
		}
		mw.loader.using( 'mediawiki.util' ).done( function () {
			mw.loader.load( '//' + proj + '/w/index.php?title=' + mw.util.wikiUrlencode( page ) +
				'&action=raw&ctype=text/javascript' );
		} );
	}
};

/**
 * Часта тыя ці іншыя маніпуляцыі са старонкай трэба выканаць як мага раней, але няма гарантыі, што
 * на момант выканання коду патрэбны ўчастак DOM гатовы, а падзея поўнай загрузкі старонкі адбываецца
 * занадта позна. У гэтай функцыі правяраецца наяўнасць элемента $testElement і ў выпадку поспеху
 * функцыя-колбэк выконваецца, інакш як выкананне перадаецца іншай функцыі. Калі элемент
 * у $testElement мае змесціва, больш правільна будзе пазначыць наступны за ім элемент, каб быць
 * перакананым, што ён загрузіўся да канца. Майце на ўвазе, што розныя скіны часта ўжываюць розныя
 * назвы класаў і ідэнтыфікатараў.
 */
function runAsEarlyAsPossible( callback, $testElement, func ) {
	func = func || $;
	$testElement = $testElement || $( '#footer' );

	if ( $testElement.length ) {
		callback();
	} else {
		func( callback );
	}
}

/**
 * Настройка апрацоўкі «і» і «ў» пры сартаванні ў табліцах
 */
mw.config.set( 'tableSorterCollation', { 'І': 'И', 'і': 'и', 'Ў': 'У', 'ў': 'у' } );

/**
 * Кнопкі апісання правак для візуальнага рэдактара
 */
mw.hook( 've.activationComplete' ).add( function () {
	mw.loader.load( 'ext.gadget.summaryButtons' );
} );

 /**
 * Радкі. Іншамоўны інтэрфейс меркавана ўключаюць рэдка, таму раздуваць спіс не варта
 */
var expandCaption, collapseCaption, zeroSectionTip;
if ( mw.config.get( 'wgUserLanguage' ) === 'en' ) {
	expandCaption = 'show';
	collapseCaption = 'hide';
	zeroSectionTip = 'Edit lead section';
} else {
	expandCaption = 'паказаць';
	collapseCaption = 'схаваць';
	zeroSectionTip = 'Правіць прэамбулу';
}

/**
 * [[ВП:Згортвальныя блокі]]
 */
// Лік раскрытых па змоўчанні навігацыйных (і не толькі) шаблонаў, калі ім зададзены параметр
// autocollapse. Удзельнікі могуць перавызначаць гэта значэнне ў асабістых JS.
var NavigationBarShowDefault;
if ( typeof NavigationBarShowDefault === 'undefined' ) {
	NavigationBarShowDefault = 1;
}

// table.collapsible
// collapsibleTablesItrIdx - часовае решэнне, каб не дубляваліся id,
// калі падчас спрацоўвання хука 'wikipage.content' дадаюцца новыя згортвальныя блокі
var collapsibleTablesItrIdx = 0;
	
function collapsibleTables( $content ) {
	var $btn,
		$a,
		tblIdx = collapsibleTablesItrIdx,
		navboxCount = 0,
		notNavboxCount = 0,
		colTables = [],
		$Tables = $content.find( 'table' );

	$Tables.each( function ( i, table ) {
		if ( $( table ).hasClass( 'collapsible' ) ) {
			var $tableinner = $( this ),
				$row = $tableinner.find( 'tr' ).first(),
				$cell = $row.find( 'th' ).first();
			if ( !$cell.length ) {
				return;
			}
			$tableinner.attr( 'id', 'collapsibleTable' + tblIdx );
			$btn = $( '<span>' ).addClass( 'collapseButton' );
			$a = $( '<a>' )
				.attr( 'id', 'collapseButton' + tblIdx )
				.attr( 'href', 'javascript:collapseTable(' + tblIdx + ');' )
				// Змяняем колер спасылкі, толькі калі колер тэксту ў навігацыйнай табліцы нестандартны
				.css( 'color', $cell.css( 'color' ) === $( '.mw-body' ).css( 'color' ) ? 'auto' :
					$cell.css( 'color' ) )
				.text( collapseCaption );
			$btn
				.append( '[' )
				.append( $a )
				.append( ']' );
			if ( $cell.contents().length ) {
				$btn.insertBefore( $cell.contents().first() );
			} else {
				$btn.appendTo( $cell );
			}
		}
		var $table = $( this );
		// hasClass( 'navbox' ) — часовае рашэнне для навігацыйных шаблонаў, яшчэ не пераведзеных
		// на {{Навігацыйная табліца}} (таксама ніжэй)
		if ( $table.hasClass( 'navbox-inner' ) || $table.hasClass( 'navbox' ) || $table.hasClass( 'toCollapsibleCount' ) ) {
			navboxCount++;
		} else {
			notNavboxCount++;
		}
		colTables[tblIdx++] = $table;
	} );
	for ( var i = collapsibleTablesItrIdx; i < tblIdx; i++ ) {
		if ( colTables[i].hasClass( 'collapsed' ) ||
			( colTables[i].hasClass( 'autocollapse' ) &&
				( ( ( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
						navboxCount > NavigationBarShowDefault ) ||
					( !( colTables[i].hasClass( 'navbox-inner' ) || colTables[i].hasClass( 'navbox' ) ) &&
						notNavboxCount > NavigationBarShowDefault ) ) ) )
		{
			collapseTable( i );
		}
	}
	collapsibleTablesItrIdx = tblIdx;
	// Трэба перапісаць код на "mw-collapsible", і замяніць ужыванне хука на "wikipage.collapsibleContent"
	mw.hook( 'common.collapsibleContent' ).fire( colTables );
}

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

function collapseTable( idx ) {
	var $table = $( '#collapsibleTable' + idx ),
		$rows = $table.children().children( 'tr' ),
		$btn = $( '#collapseButton' + idx );
	if ( !$table.length || !$rows.length || !$btn.length ) {
		return false;
	}

	var isExpanded = ( $btn.text() === collapseCaption ),
		cssDisplay = isExpanded ? 'none' : $rows.first().css( 'display' );

	$btn.text( isExpanded ? expandCaption : collapseCaption );
	$rows.slice( 1 ).each( function () {
		$( this ).css( 'display', cssDisplay );
	} );
}

// div.NavFrame
var navFrameExpandCaption = '[' + expandCaption + ']',
	navFrameCollapseCaption = '[' + collapseCaption + ']';

// Ізалюем код з глабальной вобласці бачнасці
( function () {
	function collapsibleDivs( $content ) {
		var navFrameIndex = 0,
			navFrames = [],
			i;

		$content.find( 'div' ).each( function () {
			var $div = $( this );
			if ( $div.hasClass( 'NavFrame' ) ) {
				var $btn = $( '<a>' )
					.addClass( 'NavToggle' )
					.attr( 'href', 'javascript:' )
					.text( navFrameCollapseCaption )
					.click( navToggleClickHandler );
				$div.children( '.NavHead' ).append( $btn );
				navFrames[ navFrameIndex++ ] = $div;
			}
		} );
		for ( i = 0; i < navFrameIndex; i++ ) {
			if ( navFrames[ i ].hasClass( 'collapsed' ) ||
				( navFrameIndex > NavigationBarShowDefault &&
					!navFrames[ i ].hasClass( 'expanded' )
				)
			) {
				toggleDiv( navFrames[ i ] );
			}
		}
	}

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

	function navToggleClickHandler() {
		var $btn = $( this );
		toggleDiv( $btn.closest( '.NavFrame' ), $btn );
	}

	function toggleDiv( $div, $btn ) {
		$btn = $btn || $div.find( '.NavToggle' ).first();
		if ( !$div.length || !$btn.length ) return false;
		var isExpanded = ( $btn.text() === navFrameCollapseCaption );
		$btn.text( isExpanded ? navFrameExpandCaption : navFrameCollapseCaption );
		$div.children( '.NavContent, .NavPic' ).each( function () {
			$( this ).css( 'display', isExpanded ? 'none' : 'block' );
		} );
	}
	
	/**
	 * Загрузка скрыптоў праз сістему падгаджэтаў
	 */	
	
	var namespaceNumber = mw.config.get( 'wgNamespaceNumber' );

	if ( namespaceNumber === -1 ) {
		var specialGadgets = [
			'Movepage',
			'Newpages',
			'Upload'
		];
		var canonicalSpecialPageName = mw.config.get( 'wgCanonicalSpecialPageName' );
		if ( specialGadgets.indexOf( canonicalSpecialPageName ) > -1 ) {
			mw.loader.load( 'ext.gadget.common-special-' + canonicalSpecialPageName.toLowerCase() );
		}
	}
}() );

/* Пераключэнне карт у шаблонах-картках */
$( '.localmap-switcher' ).click( function() {
    var currentMap = $( ' ~ div.localmap-basket > div:not(:hidden)', $( this ).parent() );
    var nextMap = $( ' + div.localmap-basket > div:hidden', $( this ).parent() );
    var captionContainer = $( this ).prev()
    $( currentMap ).hide();
    $( nextMap ).show();
    $( captionContainer ).text( $( nextMap ).data( 'caption' ) );
    $( this ).attr( 'title', $( currentMap ).data( 'title' ) );
} );

/**
 * Выкананне скрыптоў з прасторы MediaWiki, якія пазначаны ва URL
 * Гл. таксама https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 */
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&<>=#]+\.js))/i );
if ( withJS ) {
	importScript_( 'MediaWiki:' + withJS[3] );
}

/**
 * Код, які трэба выканаць як мага хутчэй. Ён выконваецца, калі загружаны падвал старонкі,
 * інакш чакае наступлення падзеі wikipage.content (гл. вышэй вызначэнне runAsEarlyAsPossible
 * і ніжэй пра wikipage.content).
 */
runAsEarlyAsPossible( function () {
	/**
	 * {{Выканаць скрыпт}}
	 */
	var $execJS = $( '.executeJS' );
	if ( $execJS.length ) {
		$execJS.each( function () {
			$.each( $( this ).data( 'scriptnames' ).split( ' ' ), function ( i, sc ) {
				sc = $.trim( sc.replace( /[^\w ]/g, '' ) );
				if ( sc ) {
					importScript( 'MediaWiki:Script/' + sc + '.js' );
				}
			} );
		} );
	}

	/**
	 * Каб спасылкі на ачыстку кэшу не патрабавалі пацвярджэння (яны мусяць быць змешчаны ў тэг з класам
	 * purgelink і назвай старонкі ў параметры data-pagename, напрыклад як у шаблоне {{purge}})
	 */
	$( '.purgelink a' ).click( function ( e ) {
		mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ).done( function () {
			var pageName = $( this ).parent( '.purgelink' ).data( 'pagename' ) || mw.config.get( 'wgPageName' );
			new mw.Api().post( {
				action: 'purge',
				titles: pageName
			} ).then( function () {
				var url = mw.util.getUrl( pageName );
				if ( e.ctrlKey ) {
					if ( !window.open( url ) ) {
						location.assign( url );
					}
				} else {
					location.assign( url );
				}
			}, function () {
				mw.notify( 'Не атрымалася ачысціць кэш.', { type: 'error' } );
			} );
			e.preventDefault();
		} );
	} );
}, $( '#footer' ), mw.hook( 'wikipage.content' ).add );

mw.hook( 've.loadModules' ).add( function( addPlugin ) {
	/**
	 * Падтрымка Вікіфікатара ў новым рэжыме вікі-тэксту aka 2017 wikitext editor
	 */
	addPlugin( function () {
		return mw.loader.using( 'ext.gadget.wikificator' );
	} );
} );

/**
 * {{TOC hidden}}
 */
function TOChidden() {
	$( '.tochidden-wrapper > #toc > #toctogglecheckbox' ).prop('checked', true );
	$( '.tochidden-wrapper' ).attr( "class", "toc-wrapper" );
}

runAsEarlyAsPossible( function () {
	if ( $( '.tochidden-wrapper' ).length ) {
		mw.loader.using( [ 'mediawiki.cookie' ] ).done( function () {
			if ( mw.cookie.get( 'hidetoc' ) === null ) {
				$.when( mw.loader.using( [ 'mediawiki.toc' ] ), $.ready ).then( TOChidden );
			}
		} );
	}
}, $( '#toc' ), mw.hook( 'wikipage.content' ).add );

/**
 * Код, які выконваецца на падзею wikipage.content (яе апрацоўка выконваецца раней за колбэкі для $,
 * хоць у глыбіні гэта адна і тая ж падзея, проста колбэк, які ініцыюе wikipage.content, становіцца 
 * ў чаргу раней). Паколькі wikipage.content ініцыюецца пасля абнаўлення старонкі ў выніку
 * Ajax-запытаў (напрыклад, гаджэтам хуткага перадпрагляду), не дадавайце сюды коды, якія
 * мусяць гарантавана быць выкананы адзін раз на старонцы.
 */
mw.hook( 'wikipage.content' ).add( function () {
	/**
	 * Адключэнне абцякання раздзела заўваг, калі ў ім ёсць слупкі
	 */
	$( '.references-small.columns' ).each( function () {
		$( this )
			.prevUntil( 'h1, h2, h3, h4, h5, h6' )
			.addBack()
			.first()
			.prev()
			.css( 'clear', 'both' );
	} );

	/**
	 * Imagemap Highlight
	 */
	// На старонцы ёсць як мінімум адзін элемент .imageMapHighlighter, а браўзер падтрымлівае <canvas>
	if ( $( '.imageMapHighlighter' ).length && $( '<canvas>' )[ 0 ].getContext ) {
		importScript( 'MediaWiki:Imagemap-Highlight.js' );
	}

	/**
	 * imgToggle
	 */
	// На старонцы ёсць як мінімум адзін элемент div.img_toggle
	if ( $( 'div.img_toggle' ).length ) {
		mw.loader.load( 'ext.gadget.imgToggle' );
	}

	/**
	 * Аўтаразбіццё спісаў на слупкі. Будзе працаваць толькі для аднарадковых спісаў. 35em
	 * (з Mediawiki:Common.css) ёсць папярэднім лікам, а фактычны будзе вылічаны зыходзячы
	 * з шырыні элементаў. Мусіць ужывацца толькі для UL унутры DIV. Прыклад ужывання —
	 * шаблон {{Wikidata/SisterCities}}.
	 */
	$("div.autocolumns").each(function(d, div) {
		var parentWidth = $(div).parent()[0].offsetWidth;
		if (!parentWidth) return;

		var maxWidth = 0;
		var elements = 0;
		$(div).find("ul>li").each(function(l, li) {
			elements++;
			var jLi = $(li);
			if (jLi.children().length != jLi.contents().length)
				jLi.wrapInner(document.createElement("span"));

			var liWidth = 0;
			jLi.children().each(function(c, child) {
				liWidth += child.offsetWidth;
			});
			if (liWidth > maxWidth)
				maxWidth = liWidth;
		});
		if ( maxWidth == 0 ) return;
		// UL/LI bullet width + padding
		maxWidth += 22.5 * 2;

		var maxColumns = "" + Math.ceil( elements / 5 );
		$(div).css({"-moz-columns": maxWidth + "px " + maxColumns, "columns" : maxWidth + "px " + maxColumns});
	});
});

/**
 * Старыя коды
 */
if ( navigator.platform.indexOf( 'Win' ) !== -1 ) {
	mw.loader.using( 'mediawiki.util' ).done( function () {
		mw.util.addCSS( '.IPA, .Unicode { font-family: "Arial Unicode MS", "Lucida Sans Unicode"; }' );
	} );
}

// Execution
mw.loader.using( 'mediawiki.util', function() {
	if ( mw.config.get( 'wgIsMainPage' ) ) {
		importScript('MediaWiki:Mainpage.js');
	}
} );

/**
 * Magic editintros ****************************************************
 *
 * Description: Adds editintros on BLP pages.
 * Maintainers: [[User:RockMFR]]
 *
 * @param {string} name
 */
function addEditIntro( name ) {
	$( '.mw-editsection, #ca-edit, #ca-ve-edit' ).find( 'a' ).each( function ( i, el ) {
		el.href = $( this ).attr( 'href' ) + '&editintro=' + name;
	} );
}

if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
	$( function () {
		var cats = mw.config.get( 'wgCategories' );
		if ( !cats ) {
			return;
		}
		if ( $.inArray( 'Вікіпедыя:Біяграфіі сучаснікаў', cats ) !== -1 ) {
			addEditIntro( 'Template:BLP_editintro' );
		}
		else if ( $.inArray( 'Вікіпедыя:Асобы, якія памерлі менш за год таму', cats ) !== -1 ) {
			addEditIntro( 'Template:Editnotice/Нядаўна_памерлы' );
		}
	} );
}