Używacz:Przemub/wp sk.js

Ze Wikipedia

Pozōr: żeby ôbejzdrzeć zmiany po spamiyntaniu, może być potrzebne wysnŏżynie pamiyńci podryncznyj przeglōndarki.

  • Firefox / Safari: Przitrzim Shift przi klikaniu Ôdświyż terŏźnõ strōnã, abo naciś knefle Ctrl+F5 abo Ctrl+R (⌘-R na kōmputrze Mac)
  • Google Chrome: Naciś Ctrl-Shift-R (⌘-Shift-R na kōmputrze Mac)
  • Internet Explorer: Przitrzim Ctrl przi klikaniu Ôdświyż, abo naciś knefle Ctrl+F5
  • Opera: Przejdź do Myni → Sztelōnki (Opera → Preferyncyje w Mac), a potym Prywatność i bezpieczyństwo → Wysnŏż dane przeglōndaniŏ → Ôprōznij pamiyńć podryncznõ.
/*
* <nowiki>
* Rozszerzeńy kodu WP:SK (autor: Nux) lo ślůnskij Wikipedyji
* http://szl.wikipedia.org/wiki/WP:SK
* Autor: Przemub
* Copyright: ©2007-2011 Maciej Jaros (pl:User:Nux, en:User:EcceNux)
* ©2012 Przemysław Buczkowski (szl:User:Przemub, pl:User:Przemub)
* Licencyjo: GNU General Public License v3
* http://opensource.org/licenses/gpl-30.html
* DEJ POZŮR!
* To je ino beta a zawdy sprawdź zajta przed spamjyntańym!
*/
//  wersja:
	var tmp_VERSION = '2.6.40';  // = wp_sk.version = wp_sk.ver
// ------------------------------------------------------------------------ //
 
//
// Moduł(y) zewnętrzne
//
if (typeof importScriptAtr=='undefined')
{
	function importScriptAtr(page, atr)
	{
		var uri = wgScript + '?atr='+atr+'&title=' +
			encodeURIComponent(page.replace(/ /g,'_')).replace(/%2F/ig,'/').replace(/%3A/ig,':') +
			'&action=raw&ctype=text/javascript';
		mw.loader.load(uri);
	}
}
if ((typeof sel_t)!='object' || ((typeof sel_t)=='object' && (typeof sel_t.version)=='string' && sel_t.version.indexOf('1.0')==0))
{
	importScriptAtr('Wikipedysta:Nux/sel_t.js', 'ver110')
}
if ((typeof nuxedtoolkit)!='object')
{
	importScriptAtr('Wikipedysta:Nux/nuxedtoolkit.js', 'ver106')
}
 
/* =====================================================
	Object Init
   ===================================================== */
if (wp_sk!=undefined)
{
	alert('Błąd krytyczny - konflikt nazw!\n\nJeden ze skryptów używa już nazwy wp_sk jako zmienną globalną.');
}
var wp_sk = new Object();
wp_sk.ver = wp_sk.version = tmp_VERSION;
 
/* =====================================================
	Function: wp_sk.debug(htxt)
 
	Wyświetlenie komunikatu html jeśli debug aktywny
   ===================================================== */
wp_sk.debug = function (htxt)
{
	if (typeof wp_sk_debug_enabled!='undefined' && wp_sk_debug_enabled && typeof nux_debug=='function')
	{
		nux_debug(htxt);
	}
}
 
/* =====================================================
	Function: wp_sk.button()
 
	Dodaje przycisk sprzątania
   ===================================================== */
wp_sk.button = function ()
{
	// przygotowanie
	nuxedtoolkit.prepare();
	wp_sk.is_old_toolbar = nuxedtoolkit.is_old_toolbar;
	// grupa
	wp_sk.btns = nuxedtoolkit.addGroup();
	// przycisk
	var btn_attrs = {
		title : 'Czyszczenie kodu (wer. '+wp_sk.ver+')',
		alt : "WP:SK",
		id : "wp_sk_img_btn"
	};
	var icons = {
		// with blue background
		oldbar : '//upload.wikimedia.org/wikipedia/commons/2/2e/Button_broom.png',
		// plain no background, SVG advised
		newbar : '//commons.wikimedia.org/w/thumb.php?f=Broom%20icon.svg&w=22'
	};
	nuxedtoolkit.addBtn(wp_sk.btns, 'wp_sk.cleanup(document.getElementById(\'wpTextbox1\'))', icons, btn_attrs);
}
 
/* =====================================================
	Function: wp_sk.warning(input)
 
	Dodaje ostrzeżenie i likwiduje je
	po wciśnięciu odpowiedniego przycisku
   ===================================================== */
wp_sk.warning = function (input)
{
	var el=document.getElementById('wpSummary');
	if (wp_sk.nochanges)
	{
		el.style.border='2px solid #696';	// kolorowanka, gdy bez zmian
	}
	else
	{
		el.style.border='';
		if (el.value!='')
			el.value+=', ';
		el.value+='po czyszczeniu kodu przejrzyj wykonane zmiany!'
		el.className = 'summaryWarning';
 
		el=document.getElementById('wpDiff');
		el.className = 'summaryWarning';
		el.onclick=function()
		{
			var el=document.getElementById('wpSummary');
			el.value=el.value.replace('po czyszczeniu kodu przejrzyj wykonane zmiany!', '[[WP:SK]]');
		};
	}
}
 
/* =====================================================
	Function: wp_sk.cleanup(input)
 
	Główna funkcja inicjująca i wywołująca funkcję
	czyszczącą
   ===================================================== */
wp_sk.cleanup = function (input)
{
	// default input
	if (!input)
	{
		input = document.getElementById('wpTextbox1')
	}
	//
	// Pobierz zaznaczony fragment (całość jeśli nic nie zaznaczone)
	//
	var str = sel_t.getSelStr(input, true);
	// OMG - IE & Opera fix
	str = str.replace(/\r\n/g, '\n');
 
	//
	// Wywołanie czyszciciela
	//
	str = str.replace(/\n+$/,''); // bez końcowych enterów
	var str_pre = str;
	str = wp_sk.cleaner(str);
	wp_sk.nochanges = (str==str_pre);
 
	//
	// zapisanie zmian
	//
	if (!wp_sk.nochanges)
	{
		sel_t.qsetSelStr(input, str, true);
	}
 
	input.focus();
 
	wp_sk.warning();
}
 
/* =====================================================
	Function: wp_sk.cleaner(str)
 
	Funkcja czyszcząca podany na wejściu ciąg znaków str.
	Zwraca przetworzony ciąg znaków.
   ===================================================== */
wp_sk.cleaner = function (str)
{
	//
	// ukrywanie obszarów w tagach: nowiki, pre, source i math
	str = wp_sk.nowiki.hide(str);
 
	//
	// sprzątanie podstawowe
	str = wp_sk.cleanerLinks(str);		// wikilinki
	str = wp_sk.cleanerTpls(str);		// szablony
	str = wp_sk.cleanerWikiVaria(str);	// pozostałe wikiskładniowe
 
	str = wp_sk.cleanerTXT(str);		// poza składniowe
 
	//
	// końcowe porządkowanie międzywiki itp
	str = wp_sk.cleanerMagicLinks(str);
 
	//
	// przywrócenie ukrytych tagów
	str = wp_sk.nowiki.show(str);
 
	return str;
}
 
/* =====================================================
	Function: wp_sk.cleanerLinks(str)
 
	Sprzątanie wikilinków
        
        Sprowjane lo ślůnskigo.
   ===================================================== */
wp_sk.cleanerLinks = function (str)
{
	// [[http://]]→[http://...]
	str = str.replace(/\[\[([a-z]+:\/\/[^\|\]]+)\]\]/g, '[$1]');
	// [[Kto%C5%9B_jaki%C5%9B#co.C5.9B|...]]→[[Ktoś jakiś#coś|...]]
	str = str.replace(/\[\[([^|#\]]*)([^|\]]*)(\||\]\])/g, wp_sk.rLinkdecode);
 
	// poprawa nazw przestrzeni i drobne okoliczne
	str = str.replace(/\[\[(:?) *(image|grafika|file) *: *([^ ])/gi, function (a,dw,co,l1) {return '[['+dw+'Plik:'+l1.toUpperCase();} );
	str = str.replace(/\[\[(:?) *(category|kategoria) *: *([^ ])/gi, function (a,dw,co,l1) {return '[['+dw+'Kategoryjo:'+l1.toUpperCase();} );
	str = str.replace(/\[\[ *(:?) *(template|szablon) *: *([^ ])/gi, function (a,dw,co,l1) {return '[[Muster:'+l1.toUpperCase();} );
	str = str.replace(/\[\[ *(:?) *(special|specjalna) *: *([^ ])/gi, function (a,dw,co,l1) {return '[[Szpecyjalna:'+l1.toUpperCase();} );
 
	str = str.replace(/\[\[ *:? *[Dd]yskusja( [a-z]*) *: */g, '[[Dyskusyjo$1:');
	str = str.replace(/\[\[ *:? *[Dd]yskusyjo( [a-z]*) *: */g, '[[Dyskusyjo$1:');
 
	// usunięcie klucza sortowania kat. jeśli w całości jest prefiksem nazwy artykułu lub nazwą artykułu
	if (str.search(/\{\{[ ]*DEFAULTSORT[ ]*:/)==-1)
	{
		str = str.replace(/\[\[(Kategoryjo:[^\|\[\]\n]+)\|([^\|\[\]\n]+)\]\]/gi,
			function (a,kat,klucz)
			{
				if (wgTitle.indexOf(klucz)==0)
					return '[['+kat+']]'
				;
				return a;
			}
		);
	}
 
	// zbędne w obrazkach
	str = str.replace(/(\[\[Plik:[^\|\]]+?\|thumb)\|right/, '$1');		// niepotrzebne
	str = str.replace(/(\[\[Plik:[^\|\]]+?\|)frame(\|[0-9x]+px)/, '$1thumb$2');	// prawie na pewno błąd
	str = str.replace(/(\[\[Plik:[^\|\]]+\|[^\|\]]+)\.\]\]/, '$1]]');	// kropka
	// -mid spacje
	/* // zawiesza FF w niektórych warunkach, psuje niektóre opisy
	str = str.replace(/(\[\[Plik:[^\|\[\]]+)(\|[^\[\]\{\}]+ [^\[\]\{\}]*)(\|([^\|\[\]]+|[^\|\[\]]+\[\[[^\[\]]+\]\]){7,}\]\])/g, function(a,g1,gmid,gn)
	{
		return g1+ gmid.replace(/\s/g,'') +gn;
	});
	*/
 
	// usuwanie [[:pl:
	str = str.replace(/\[\[ *:? *pl *: */g, '[[');
 
	// stare przestrzenie
	str = str.replace(/\[\[Dyskusja Wikipedysty/g, '[[Dyskusyjo używacza');
        str = str.replace(/\[\[Dyskusja wikipedysty/g, '[[Dyskusyjo używacza');
 
	// [[link|| -> [[link|
	str = str.replace(/\[\[ *([^\]\|:]+) *\| *\| */g, '[[$1|');
 
	//
	// (ro)zwijanie wikilinków
	// [[Link|link]] > [[link]] i [[Link|linka]] > [[link]]a
	//str = str.replace(/\[\[([^|\]])([^|\]]*)\|([^\]])\2([a-zA-ZżółćęśąźńůŻÓŁĆĘŚĄŹŃŮ]*)\]\]/g, function (a, w1_1, w_rest, w2_1, poza)
	str = str.replace(/\[\[([^|\]])([^|\]]*)\|([^\]])\2([a-zżółćęśąźńů]*)\]\]/g, function (a, w1_1, w_rest, w2_1, poza)
	{
		return (w1_1.toUpperCase()==w2_1.toUpperCase()) ? '[['+w2_1+w_rest+']]'+poza : a;
	});
	// [[Link|link]]er > [[Link|linker]]
	//str = str.replace(/\[\[([^|\]]+)\|([^|\]]+)\]\]([a-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ]+)/g, '[[$1|$2$3]]');
	str = str.replace(/\[\[([^|\]]+)\|([^|\[\]]+)\]\]([a-zżółćęśąźń]+)/g, '[[$1|$2$3]]');
 
	// usuwanie spacji w wikilinkach
	str = str.replace(/\[\[ *([^\]\|:]*[^\]\| ]) *\|/g, '[[$1|');
	str = str.replace(/([^ \t\n])\[\[ +/g, '$1 [[');
	str = str.replace(/\[\[ +/g, '[[');
	str = str.replace(/([^ \t\n])\[\[([^\]\|:]+)\| +/g, '$1 [[$2|');
	str = str.replace(/\[\[([^\]\|:]+)\| +/g, '[[$1|');
	str = str.replace(/([^ \|]) +\]\]([^ \t\na-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ])/g, '$1]] $2');
	str = str.replace(/([^ \|]) +\]\]([^a-zA-ZżółćęśąźńŻÓŁĆĘŚĄŹŃ])/g, '$1]]$2');
 
	// sklejanie skrótów linkowych
	str = str.replace(/m\.? ?\[\[n\.? ?p\.? ?m\.?\]\]/g, 'm [[n.p.m.]]');
 
	/*// korekty dat - niepotrzebny przecinek
	str = str.replace(/(\[\[[0-9]+ (stycznia|lutego|marca|kwietnia|maja|czerwca|lipca|sierpnia|września|października|listopada|grudnia)\]\]), (\[\[[0-9]{4}\]\])/g, '$1 $3');
 
	// linkowanie do wieków
	str = str.replace(/\[\[([XVI]{1,5}) [wW]\.?\]\]/g, '[[$1 wiek|$1 w.]]');
	str = str.replace(/\[\[([XVI]{1,5}) [wW]\.?\|/g, '[[$1 wiek|');
	str = str.replace(/\[\[(III|II|IV|VIII|VII|VI|IX|XIII|XII|XI|XIV|XV|XVIII|XVII|XVI|XIX|XXI|XX)\]\]/g, '[[$1 wiek|$1]]');
	str = str.replace(/\[\[(III|II|IV|VIII|VII|VI|IX|XIII|XII|XI|XIV|XV|XVIII|XVII|XVI|XIX|XXI|XX)\|/g, '[[$1 wiek|');
 
	// rozwijanie typowych linków
	str = str.replace(/\[\[ang\.\]\]/g, '[[angielski|ang.]]');
	str = str.replace(/\[\[cz\.\]\]/g, '[[język czeski|cz.]]');
	str = str.replace(/\[\[fr\.\]\]/g, '[[język francuski|fr.]]');
	str = str.replace(/\[\[łac\.\]\]/g, '[[łacina|łac.]]');
	str = str.replace(/\[\[niem\.\]\]/g, '[[język niemiecki|niem.]]');
	str = str.replace(/\[\[pol\.\]\]/g, '[[język polski|pol.]]');
	str = str.replace(/\[\[pl\.\]\]/g, '[[język polski|pol.]]');
	str = str.replace(/\[\[ros\.\]\]/g, '[[język rosyjski|ros.]]');
	str = str.replace(/\[\[(((G|g)iga|(M|m)ega|(K|k)ilo)herc|[GMk]Hz)\|/g, '[[herc|');*/
 
	return str;
}
/* =====================================================
	Function: wp_sk.cleanerTpls(str)
 
	Sprzątanie szablonów
   ===================================================== */
wp_sk.cleanerTpls = function (str)
{
	// niepotrzebna przestrzeń
	str = str.replace(/\{\{ *([Tt]emplate|[Ss]zablon|[Mm]uster|msg) *: */g, '{{');
 
	// zbędne spacje w szablonach jedno wierszowych
	str = str.replace(/\{\{[ \t]+([^\n\{\} ]+)[ \t]*\}\}/g, '{{$1}}').replace(/\{\{([^\n\{\}]+)[ \t]+\}\}/g, '{{$1}}');
 
	// poprawki lang i nowy multilang
	str = str.replace(/\{\{[lL]ang\|cz\}\}/g, '{{lang|cs}}');
	str = str.replace(/\{\{[lL]ang\|dk\}\}/g, '{{lang|da}}');
	str = str.replace(/\{\{[lL]ang\|nb\}\}/g, '{{lang|no}}');
	str = str.replace(/(\{\{lang\|[a-z-]+\}\}[\t ]*){2,10}/g, function(a) {
		return '{{lang'+a.replace(/\{\{lang\|([a-z-]+)\}\}\s*/g, '|$1')+'}}';
	});
}
/* =====================================================
	Function: wp_sk.cleanerWikiVaria(str)
 
	Sprzątanie pozostałych elementów wikiskładni
   ===================================================== */
wp_sk.cleanerWikiVaria = function (str)
{
 
	// nagłówki
	str = str.replace(/(^|\n)(=+) *([^=\n].*?)[ :]*\2(?=\s)/g, '$1$2 $3 $2'); // =a= > = a =, =a:= > = a =
	str = str.replace(/(^|\n)(=+[^=\n]+=+)[\n]{2,}/g, '$1$2\n');	// jeden \n
 
	// przypisy - szablon
	str = str.replace(/\n== Przipisy ==[ \t\n]+<references ?\/>/g, '\n{{Przipisy}}');
	str = str.replace(/\n(={3,}) Przipisy \1[ \t\n]+<references ?\/>/g, '\n{{Przypisy|stopień= $1}}');
	// nowe linie przed ref w references
	str = str.replace(/(\{\{Przipisy[\s\S]*?\|\s*przipisy\s*=|\{\{Uwagi[\s\S]*?\|\s*uwagi\s*=|\{\{Przypisy-lista[\s\S]*?\|\s*l. kolumn\s*=\s*[0-9]+\s*\|\s*1=|\{\{Przypisy-lista[\s\S]*?\|\s*1=)((?:<ref name[^<>]+>[\s\S]*?<\/ref>\s*)+)/gi,
		function(a, prerefs, refs)
		{
			refs = refs.replace(/<\/ref><ref/gi, '</ref>\n<ref');
			return prerefs + '\n' + refs;
		}
	);
	// przypisy i interpunkcja
	str = str.replace(/([,])((?:<ref[\s\S]+?(?:<\/ref|\/)>)+)/g, "$2$1");	// przecinek
	str = str.replace(/((?:\s|^)[^& ]*);((?:<ref[\s\S]+?(?:<\/ref|\/)>)+)/g, "$1$2;");	// średnik
	str = str.replace(/([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]{5}|[()\[\]{}"”'>])[.]((?:<ref[\s\S]+?(?:<\/ref|\/)>)+)/g, "$1$2.");	// długi wyraz lub znak specjalny
	str = str.replace(/([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ][aeiouyąę])[.]((?:<ref[\s\S]+?(?:<\/ref|\/)>)+)/g, "$1$2.");	// krótki z samogłoską
	str = str.replace(/<\/ref>\.\.(?=\s)/g, '</ref>.');  // dwukropek poziomy
 
	// fakty i interpunkcja
	str = str.replace(/([,])(\{\{[Ff]akt(?:\|data=[0-9\-]+)?\}\})/g, "$2$1");	// przecinek
	str = str.replace(/((?:\s|^)[^& ]*);(\{\{[Ff]akt(?:\|data=[0-9\-]+)?\}\})/g, "$1$2;");	// średnik
	str = str.replace(/([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]{5}|[()\[\]{}"”'>])[.](\{\{[Ff]akt(?:\|data=[0-9\-]+)?\}\})/g, "$1$2.");	// długi wyraz lub znak specjalny
	str = str.replace(/([a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ][aeiouyąę])[.](\{\{[Ff]akt(?:\|data=[0-9\-]+)?\}\})/g, "$1$2.");	// krótki z samogłoską
 
	// listy ze spacjami
	str = str.replace(/(\n[#*:;]+)(?![ \t\n#*:;{]|if[a-z]* ?:|switch ?:|time ?:|rel2abs ?:|titleparts ?:)/g, '$1 ');
 
	// rozwijanie linków w listach
	str = str.replace(/\n\*[ \t]*\[(http:\/\/[^ \n\]]+)\]/g, "\n* [$1 $1]");
 
	// galerie fix cooked by ToSter
	str = str.replace(/<gallery>([\s\S]+?)<\/gallery>/gi, function(a, zaw) {
		zaw = zaw.replace(/\n(Image|Grafika|File):/gi, '\nPlik:');
		return "<gallery>" + zaw + "</gallery>";
	});
 
 
	return str;
}
/* =====================================================
	Function: wp_sk.cleanerTXT(str)
 
	Sprzątanie nie związane bezpośrednio z wikiskładnią
   ===================================================== */
wp_sk.cleanerTXT = function (str)
{
	// usuwanie unikodowych znaków sterujących
	str = str.replace(/[\u200B\uFEFF\u200E]/g, '');
 
	/*// korekty dat
	// występuje w interwiki (hr)
	//str = str.replace(/([0-9])\. *(stycznia|lutego|marca|kwietnia|maja|czerwca|lipca|sierpnia|września|października|listopada|grudnia)/g, '$1 $2')	// niepotrzebna kropka
	str = str.replace(/([^0-9])0([0-9]) *(stycznia|lutego|marca|kwietnia|maja|czerwca|lipca|sierpnia|września|października|listopada|grudnia)/g, '$1$2 $3')	// niepotrzebne 0*/
 
	// poprawkowate różne (kolejność jest istotna!)
	str = str.replace(/&deg;/g, '°');
	str = str.replace(/&sum;/g, '∑');
	str = str.replace(/&larr;/g, '←');
	str = str.replace(/&rarr;/g, '→');
	str = str.replace(/&uarr;/g, '↑');
	str = str.replace(/&darr;/g, '↓');
	str = str.replace(/&dagger;/g, '†');
	str = str.replace(/<sup>o<\/sup>/g, '°');
 
	str = str.replace(/([0-9]) (%|‰|°)(?!C)/g, '$1$2'); // bez x °C
	str = str.replace(/([0-9])(°C)/g, '$1 $2'); // spacja
 
	str = str.replace(/<\/?br ?\/?>/gi, '<br />');
 
	// dopisanie kropki itp
	str = str.replace(/ (tzw|tzn) /g, ' $1. ');
	str = str.replace(/([ \n])ok\.([0-9])/g, '$1ok. $2');
	//str = str.replace(/([ \n])ok ([^ ])/g, '$1ok. $2');
	str = str.replace(/ d\/s /g, ' ds. ');
	str = str.replace(/ wg. /g, ' wg ');
 
	// sklejanie skrótów
	str = str.replace(/m\.? ?(npm|n[. ]{1,3}p[. ]{1,3}m\.?)/g, 'm n.p.m.');
	str = str.replace(/ m\. in\./g, ' m.in.');
	str = str.replace(/ o\. o\./g, ' o.o.');
 
	// Sprawy wagi Państwowej ;-)
	str = str.replace(/(gmina wiejska w powiecie [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ\-]+ województwa [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ\-]+) II Rzeczpospolitej/g, '\1 II Rzeczypospolitej');
 
	return str;
}
/* =====================================================
	Function: wp_sk.cleanerMagicLinks(str)
 
	Sprzątanie końcowe magicznych linków i elementów
	powiązanych - międzywiki, medale dla nich i kategorie.
   ===================================================== */
wp_sk.cleanerMagicLinks = function (str)
{
	// zbieranie
	str = wp_sk.cat.gather(str);
	str = wp_sk.iWiki.gather(str);
	str = wp_sk.iWikiFA.gather(str);
	str = wp_sk.iWikiGA.gather(str);
 
	// usuwanie pozostawionych przy zbieraniu i innych wielokrotnych, pustych wierszy
	str = str.replace(/[\n]{3,}/g, '\n\n');
 
	// wstawienie na koniec (call not copy to have "this")
	str = str.replace(/\s*$/, function(a) {return wp_sk.cat.output(a)});
	str = str.replace(/\s*$/, function(a) {return wp_sk.iWikiFA.output(a)});
	str = str.replace(/\s*$/, function(a) {return wp_sk.iWikiGA.output(a)});
	str = str.replace(/\s*$/, function(a) {return wp_sk.iWiki.output(a)});
 
	return str;
}
 
/* =====================================================
	Funkcje wspomagające porządkowanie           {START}
   ----------------------------------------------------- */
//
// Sprzątanie infoboksów
//
wp_sk.rFriendlyIbox = function (a,nazwa,zaw)
{
	if (zaw.indexOf('<!--')!=-1 || zaw.indexOf('=')==-1 || zaw.indexOf('\n')==-1)
	{
		return a;
	}
	nazwa = nazwa.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");	// trim
 
	//
	// escapowanie parametrów
	//
	// wewnętrzne szablony
	zaw = zaw.replace(/<<<(#+)>>>/g,'<<<#$1>>>').replace(/\{\{[^}]+\}\}/g,function(a){ return a.replace(/\|/g,'<<<#>>>') });
	// wewnętrzne linki
	zaw = zaw.replace(/\[\[[^\]]+\]\]/g,function(a){ return a.replace(/\|/g,'<<<#>>>') });
 
	//
	// sprzątanie
	//
	// del pustych
	zaw = zaw.replace(/\|\s*(?=\|)/g, function(a) {return (a.indexOf('\n')==-1)?'':'\n'}).replace(/\|\s*$/g, "");
	zaw = zaw.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");	// trim
	// przeniesienie | na początek wiersza
	zaw = '\n'+zaw+'\n';
	zaw = zaw.replace(/\s*\|(\s*)/g, function(a, post)
	{
		if (a.indexOf('\n')==-1)
		{
			return a;
		}
		else if (post.indexOf('\n')==-1)
		{
			return '\n |'+post;
		}
		else
		{
			return '\n | ';
		}
	});
 
	//
	// odescapowanie
	zaw = zaw.replace(/<<<#>>>/g,'|').replace(/<<<#(#+)>>>/g,'<<<$1>>>');
 
	//
	// Zakończenie
	//
	return '{{'+nazwa.substring(0,1).toUpperCase()+nazwa.substring(1)+zaw+'}}';
}
//
// Dekodowanie linków
//
wp_sk.rLinkdecode = function(a,name,anchor,end)
{
	try
	{
		name=decodeURIComponent(name)
		anchor=decodeURIComponent(anchor.replace(/\.([0-9A-F]{2})/g,'%$1'))
		a='[['+name+anchor+end;
	}
	catch(err){}
 
	return a.replace(/_/g,' ');
}
/* -----------------------------------------------------
	Funkcje wspomagające porządkowanie          {KONIEC}
   ===================================================== */
 
/* =====================================================
	Klasy wspomagające porządkowanie             {START}
   ----------------------------------------------------- */
/* =====================================================
	Class: wp_sk.nowiki
 
	Ukrywanie obszarów w tagach: nowiki, pre, source i math
 
	.hide(str)
		ukrywanie tagów specjalnych wraz z ich wnętrzami
	.show(str)
		przywrócenie ukrytych tagów
   ===================================================== */
//
// object init
//
wp_sk.nowiki = new Object();
 
//
// .hide(str)
//
wp_sk.nowiki.hide = function(str)
{
	//
	// escapowanie przed nowikowe
	str = str.replace(/<<<(#*[0-9]+)>>>/g, '<<<#$1>>>');
 
	//
	// właściwe ukrywanie
	var re = /<(nowiki|pre|source|math|includeonly|noinclude)(|[ \t\n][^>]*)>/g;
	var m;
	wp_sk.nowiki.tags = new Array();
	// póki znaleziono tag otwierający
	for (var t_i = 0; (m=re.exec(str))!=null; t_i++)
	{
		var start, end, re_end;
 
		start = m.index;
 
		// odszukanie końca: </tag([ \t\n]*)>
		re_end = new RegExp("</"+m[1]+"([ \t\n]*)>", "g")
		m = re_end.exec(str.substring(re.lastIndex));
		end = (m==null) ? str.length : re.lastIndex+re_end.lastIndex;
 
		// dopisanie do tablicy zawartości
		wp_sk.nowiki.tags[t_i] = str.substring(start,end);
 
		// zamiana całości znalezionego obszaru na: <<<indeks>>>
		str = str.substring(0,start)+"<<<"+t_i+">>>"+str.substring(end);
 
		// szukanie od startu, bo część znaków już usunięto
		re.lastIndex = start;
	}
 
	return str;
}
//
// .show(str)
//
wp_sk.nowiki.show = function(str)
{
	// tagi
	str = str.replace(/<<<([0-9]+)>>>/g, function (a, i)
	{
		return wp_sk.nowiki.tags[i];
	});
	// odescapowanie nowikowe
	str = str.replace(/<<<(#*[0-9]+)>>>/g, '<<<#$1>>>');
 
	return str;
}
 
/* =====================================================
	Class: wp_sk.cat
 
	Zbieranie, porządkowanie i wstawianie kategorii
 
	.gather(str)
		zbieranie kategorii ze str ze zwrotem nowego str
	.output(a)
		porządkuje i zwraca wikitekst z kategoriami;
		parametr a jest nieistotny
	.getDefSort()
		zwraca wyrażenie regularne dla defaultsort
	.newDefSort()
		szukanie nowego (najpopularniejszego) defaultsort
 
	.art_def_sort
		znaleziony w artykule defaultsort
	.def_sort
		wybrany dla artykułu defsort
	.arr
		tablica z kategoriami ('nazwa|sorotwanie')
	.arr_i
		indeks pomocniczy, a także liczba elementów w arr
   ===================================================== */
// object init
wp_sk.cat = new Object();
//
// .gather(str)
//
wp_sk.cat.gather = function(str)
{
	//
	// zbiórka i kasowanie
	wp_sk.cat.arr = new Array();
	wp_sk.cat.arr_i = 0;
	wp_sk.cat.art_def_sort = '';
	str = str.replace(/\{\{DEFAULTSORT:([^\{\}]+|\{\{[^\{\}]+\}\})\}\}(?:[ \t]+\n)?/g, function(a, ds){wp_sk.cat.art_def_sort=ds; return ''});
	str = str.replace(/(?:\n[ \t]+)?\[\[Kategoria:([^\]\[]+)\]\](?:[ \t]+\n)?/g, function(a, cat){wp_sk.cat.arr[wp_sk.cat.arr_i++]=cat; return ''});
	wp_sk.cat.def_sort = wp_sk.cat.art_def_sort;
 
	return str;
}
//
// .output(a)
//
wp_sk.cat.output = function (a)
{
	if (wp_sk.cat.arr_i==0)
	{
		return a;
	}
	var str = '\n';
 
	//
	// sortowanie (jeśli dostępna odpowiednia funkcja)
/*
	if(String.prototype.localeCompare)
	{
		function fn_sort(a,b)
		{
			return a.localeCompare(b)
		}
		wp_sk.cat.arr.sort(fn_sort);
	}
*/
 
	//
	// ustawienie regexp dla defaultsort (wg starego lub znalezionego)
	var reDefSort = wp_sk.cat.getDefSort();
 
	//
	// zbędne spacje
	for (var i=0; i<wp_sk.cat.arr_i; i++)
	{
		if (/^.+\| $/.test(wp_sk.cat.arr[i]) == false)
		{
			wp_sk.cat.arr[i] = wp_sk.cat.arr[i].replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");	// trim
		}
	}
 
	//
	// "wyświetlanie" kategorii
	if (reDefSort!="") // jeśli jest jakiś defaultsort
	{
		str += '\n{{DEFAULTSORT:'+wp_sk.cat.def_sort+'}}';
		for (var i=0; i<wp_sk.cat.arr_i; i++)
		{
			// jeśli nie było defaultsort i puste, to dodajemy domyślne, żeby nie psuć
			if (!wp_sk.cat.art_def_sort.length && wp_sk.cat.arr[i].indexOf('|')==-1)
			{
				str += '\n[[Kategoria:'+wp_sk.cat.arr[i]+'|{{PAGENAME}}]]';
			}
			else
			{
				wp_sk.cat.arr[i] = wp_sk.cat.arr[i].replace(reDefSort,'');	// usuwanie klucza
				str += '\n[[Kategoria:'+wp_sk.cat.arr[i]+']]';
			}
		}
	}
	else
	{
		for (var i=0; i<wp_sk.cat.arr_i; i++)
		{
			str += '\n[[Kategoria:'+wp_sk.cat.arr[i]+']]';
		}
	}
 
	return str;
}
//
// .getDefSort()
//
wp_sk.cat.getDefSort = function ()
{
	//
	// wybieramy klucz sortowania
	if (wp_sk.cat.art_def_sort.length)
	{
		wp_sk.cat.def_sort = wp_sk.cat.art_def_sort;
	}
	// szukanie nowego jeśli liczba kategorii jest większa od 1
	else if (wp_sk.cat.arr_i>1)
	{
		wp_sk.cat.def_sort = wp_sk.cat.newDefSort();
	}
 
	var reDefSort="";
	if (wp_sk.cat.def_sort!="")
	{
		// zamiana na regexp (żeby uniknąć częściowych dopasowań)
		reDefSort = wp_sk.cat.def_sort.replace(/([(){}\[\]\\|.*?$^])/g, '\\$1');
		reDefSort = new RegExp('\\|'+reDefSort+'$');
	}
 
	return reDefSort;
}
//
// .newDefSort()
//
wp_sk.cat.newDefSort = function ()
{
	var def_sort = '';
 
	//
	// sprawdzenie, czy wybrano jakiś klucz sortowania w kategoriach
	var sort_i;
	for (sort_i=0; sort_i<wp_sk.cat.arr_i && wp_sk.cat.arr[sort_i].indexOf('|')<0; sort_i++);
 
	//
	// liczenie kategorii z kluczami
	var total_sort_num = 0;	// całkowita liczba kluczy sortowania
	for (var i = sort_i; i<wp_sk.cat.arr_i; i++)	// zaczynamy od już znalezionego
	{
		if (wp_sk.cat.arr[i].indexOf('|')>0)
			total_sort_num++;
	}
	//
	// jeśli mało kluczy (byłoby dużo {{PAGENAME}}), to bez domyślnego klucza
	if (total_sort_num*2<wp_sk.cat.arr_i) //<50%
	{
		return '';
	}
 
	//
	// jeśli wybrano jakieś sorotwanie, to szukamy nowego klucza (wg popularności)
	if (sort_i!=wp_sk.cat.arr_i)
	{
		//
		//
		var def_sort_num = 0;
		var def_sort_forbiden = ['!', ' ', '*', '+'];
		for (var i = sort_i; i<wp_sk.cat.arr_i; i++)	// zaczynamy od już znalezionego
		{
			var j, tmp_def_sort, tmp_def_sort_re, tmp_def_sort_num;
 
			// dochodzimy do klucza kandydującego
			for (j = i; j<wp_sk.cat.arr_i && wp_sk.cat.arr[j].indexOf('|')<0; j++);
			if (j==wp_sk.cat.arr_i)
				break;
			i = j;
 
			// klucz
			tmp_def_sort = wp_sk.cat.arr[j].substr(wp_sk.cat.arr[j].indexOf('|')+1);
			if (def_sort == tmp_def_sort)	// już był
			{
				continue;
			}
			// zamiana na regexp (żeby uniknąć częściowych dopasowań)
			tmp_def_sort_re = tmp_def_sort.replace(/([(){}\[\]\\|.*?$^])/g, '\\$1');	// escapowanie znaków regexpowych
			tmp_def_sort_re = new RegExp('\\|'+tmp_def_sort_re+'$');
 
			// liczenie wystąpień
			var tmp_def_sort_num=1;
			for (j++; j<wp_sk.cat.arr_i; j++)
			{
				if (tmp_def_sort_re.test(wp_sk.cat.arr[j]))
				{
					tmp_def_sort_num++;
				}
			}
 
			// kandydyjący = nowy?
			if (tmp_def_sort_num<2 || def_sort_num > tmp_def_sort_num)
			{
				continue;
			}
			if (tmp_def_sort_num*2>wp_sk.cat.arr_i || def_sort_forbiden.indexOf(tmp_def_sort)<0) //>50% || nie niedozwolone
			{
				def_sort_num = tmp_def_sort_num;
				def_sort = tmp_def_sort;
			}
		}
	}
 
	return def_sort;
}
 
/* =====================================================
	Class: wp_sk.iWiki
 
	Zbieranie, porządkowanie i wstawianie interwiki
 
	.gather(str)
		zbieranie interwiki ze str ze zwrotem nowego str
	.output(a)
		porządkuje i zwraca wikitekst z interwiki;
		parametr a jest nieistotny
	.comp(a, b)
		porównuje a z b i zwraca wartość odpowiednią
		dla funkcji sort()
 
	.order
		tablica z językami ustawionymi wg kolejności
		wg której mają być sortowane interwiki
	.arr
		tablica z interwiki ([język, artykuł])
	.arr_i
		indeks pomocniczy, a także liczba elementów w arr
   ===================================================== */
// object init
wp_sk.iWiki = new Object();
//
// .gather(str)
//
wp_sk.iWiki.gather = function(str)
{
	wp_sk.iWiki.arr = new Array();
	wp_sk.iWiki.arr_i = 0;
	str = str.replace(
		// wg: http://meta.wikimedia.org/wiki/List_of_Wikipedias
		/\[\[([a-z\-]{2,3}|simple|ru-sib|be-x-old|zh-yue|map-bms|zh-min-nan|nds-nl|bat-smg|zh-classical|fiu-vro|roa-rup|tokipona|cbk-zam|roa-tara):([^\]\|\[]+)\]\](?:[ \t]+\n)?/gi,
		function (a, lang, art)
		{
			lang = lang.toLowerCase(); // [[DE:blah]]
			// wg: http://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/maintenance/interwiki.sql
			if (lang!='wp' && lang!='mw' && lang!='gej' && lang!='ppr' && lang!='rfc' && lang!='uea' && lang!='why' && lang!='csi') // CSI: Kryminalne...
			{
				wp_sk.iWiki.arr[wp_sk.iWiki.arr_i] = new Array(lang,art);
				wp_sk.iWiki.arr_i++;
				return '';
			}
			else
			{
				return a;
			}
		}
	);
 
	return str;
}
//
// .output(a)
//
wp_sk.iWiki.output = function (a)
{
	if (wp_sk.iWiki.arr_i==0)
	{
		return a;
	}
	var str = '\n';
 
	wp_sk.iWiki.arr.sort(wp_sk.iWiki.comp); // alfabetycznie wg kodu literowego
	for (var i=0; i<wp_sk.iWiki.arr_i; i++)
	{
		str += '\n[['+wp_sk.iWiki.arr[i][0]+':'+wp_sk.iWiki.arr[i][1]+']]';
	}
 
	return str;
}
//
// .comp(a,b)
//
wp_sk.iWiki.comp = function (a, b)
{
	if (wp_sk.iWiki.order.indexOf(a[0]) < wp_sk.iWiki.order.indexOf(b[0]))
	{
		return -1;
	}
	else if (wp_sk.iWiki.order.indexOf(a[0]) > wp_sk.iWiki.order.indexOf(b[0]))
	{
		return 1;
	}
	// else
	return 0;
}
// wg <del>http://meta.wikimedia.org/wiki/Interwiki_sorting_order#By_order_of_alphabet.2C_based_on_local_language</del>
// Pomoc:Interwiki
wp_sk.iWiki.order = [
'ace', 'af', 'ak', 'als', 'am', 'ang', 'ab', 'ar', 'an', 'arc',
'roa-rup', 'frp', 'as', 'ast', 'gn', 'av', 'ay', 'az', 'bm', 'bn',
'bjn', 'zh-min-nan', 'nan', 'map-bms', 'ba', 'be', 'be-x-old', 'bh',
'bcl', 'bi', 'bar', 'bo', 'bs', 'br', 'bg', 'bxr', 'ca', 'cv',
'ceb', 'cs', 'ch', 'cbk-zam', 'ny', 'sn', 'tum', 'cho', 'co', 'cy',
'da', 'dk', 'pdc', 'de', 'dv', 'nv', 'dsb', 'dz', 'mh', 'et', 'el',
'eml', 'en', 'myv', 'es', 'eo', 'ext', 'eu', 'ee', 'fa', 'hif',
'fo', 'fr', 'fy', 'ff', 'fur', 'ga', 'gv', 'gag', 'gd', 'gl', 'gan',
'ki', 'glk', 'gu', 'got', 'hak', 'xal', 'ko', 'ha', 'haw', 'hy',
'hi', 'ho', 'hsb', 'hr', 'io', 'ig', 'ilo', 'bpy', 'id', 'ia', 'ie',
'iu', 'ik', 'os', 'xh', 'zu', 'is', 'it', 'he', 'jv', 'kl', 'kn',
'kr', 'pam', 'krc', 'ka', 'ks', 'csb', 'kk', 'kw', 'rw', 'ky', 'rn',
'sw', 'kv', 'kg', 'ht', 'ku', 'kj', 'mrj', 'lad', 'lbe', 'lo',
'ltg', 'la', 'lv', 'lb', 'lt', 'lij', 'li', 'ln', 'jbo', 'lg',
'lmo', 'hu', 'mk', 'mg', 'ml', 'mt', 'mi', 'mr', 'xmf', 'arz',
'mzn', 'ms', 'cdo', 'mwl', 'mdf', 'mo', 'mn', 'mus', 'my', 'nah',
'na', 'fj', 'nl', 'nds-nl', 'cr', 'ne', 'new', 'ja', 'nap', 'ce',
'frr', 'pih', 'no', 'nb', 'nn', 'nrm', 'nov', 'ii', 'oc', 'mhr',
'or', 'om', 'ng', 'hz', 'uz', 'pa', 'pi', 'pfl', 'pag', 'pnb',
'pap', 'ps', 'koi', 'km', 'pcd', 'pms', 'tpi', 'nds', 'pl',
'tokipona', 'tp', 'pnt', 'pt', 'kbd', 'aa', 'kaa', 'crh', 'ty',
'ksh', 'ro', 'rmy', 'rm', 'qu', 'rue', 'ru', 'sah', 'se', 'sm',
'sa', 'sg', 'sc', 'sco', 'stq', 'st', 'tn', 'sq', 'scn', 'si',
'simple', 'sd', 'ss', 'sk', 'cu', 'sl', 'szl', 'so', 'ckb', 'srn',
'sr', 'sh', 'su', 'fi', 'sv', 'tl', 'ta', 'kab', 'roa-tara', 'tt',
'te', 'tet', 'th', 'ti', 'tg', 'to', 'chr', 'chy', 've', 'tr', 'tk',
'tw', 'udm', 'bug', 'uk', 'ur', 'ug', 'za', 'vec', 'vi', 'vo',
'fiu-vro', 'wa', 'zh-classical', 'vls', 'war', 'wo', 'wuu', 'ts',
'yi', 'yo', 'zh-yue', 'diq', 'zea', 'bat-smg', 'zh', 'zh-tw',
'zh-cn',
]
 
/* =====================================================
	Class: wp_sk.iWikiFA | iWikiGA
 
	Zbieranie, porządkowanie i wstawianie interwikowych
	szablonów Featured Articles
 
	.gather(str)
		zbieranie szablonów FA ze str ze zwrotem nowego str
	.output(a)
		porządkuje i zwraca wikitekst z szablonami FA;
		parametr a jest nieistotny
 
	.arr
		tablica z szablonami FA ([język, artykuł])
	.arr_i
		indeks pomocniczy, a także liczba elementów w arr
   ===================================================== */
// object init
wp_sk.iWikiFA = {
	're': /\{\{[Ll]ink FA\|([a-z\-]{2,3}|simple|ru-sib|be-x-old|zh-yue|map-bms|zh-min-nan|nds-nl|bat-smg|zh-classical|fiu-vro|roa-rup|tokipona|cbk-zam|roa-tara)\}\}(?:[ \t]+\n)?/g,
	'out_szablon' : 'link FA'
}
//
// .gather(str)
//
wp_sk.iWikiFA.gather = function(str)
{
	var arr = new Array();
	var arr_i = 0;
	// wg: http://meta.wikimedia.org/wiki/List_of_Wikipedias
	str = str.replace(
		this.re,
		function (a, lang)
		{
			// wg: http://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/maintenance/interwiki.sql
			if (lang!='wp' && lang!='mw' && lang!='gej' && lang!='ppr' && lang!='rfc' && lang!='uea' && lang!='why')
			{
				arr[arr_i] = lang;
				arr_i++;
				return '';
			}
			else
			{
				return a;
			}
		}
	);
	this.arr = arr;
	this.arr_i = arr_i;
 
	return str;
}
//
// .output(a)
//
wp_sk.iWikiFA.output = function (a)
{
	if (this.arr_i==0)
	{
		return a;
	}
	var str = '\n';
 
	this.arr.sort(wp_sk.iWiki.comp); // alfabetycznie wg kodu literowego // funkcja wspólna wp_sk.iWiki
	for (var i=0; i<this.arr_i; i++)
	{
		str += '\n{{'+this.out_szablon+'|'+this.arr[i]+'}}';
	}
 
	return str;
}
 
//
// iWikiGA
//
// object init
wp_sk.iWikiGA = {
	're': /\{\{[Ll]ink GA\|([a-z\-]{2,3}|simple|ru-sib|be-x-old|zh-yue|map-bms|zh-min-nan|nds-nl|bat-smg|zh-classical|fiu-vro|roa-rup|tokipona|cbk-zam|roa-tara)\}\}(?:[ \t]+\n)?/g,
	'out_szablon' : 'link GA'
}
// rest as above
wp_sk.iWikiGA.gather = wp_sk.iWikiFA.gather;
wp_sk.iWikiGA.output = wp_sk.iWikiFA.output;
 
/* =====================================================
	Class: wp_sk.lnkMapPL
 
	Porządkowanie i wypełnianie szablonu Linków do map polski
 
	.cleanup(str)
		porządkowanie i wypełnanie (z linka z Google)
   ===================================================== */
// object init
wp_sk.lnkMapPL = new Object();
//
// Ustawienia
//
wp_sk.lnkMapPL.search_re = /\{\{(Linki do map Polski[^}]+)\n\|?\}\}\n/;
wp_sk.lnkMapPL.tpl = '\
{{Linki do map Polski\n\
 | stopniN= | minutN= | sekundN= \n\
 | stopniE= | minutE= | sekundE= \n\
}}\n\
';
// kolejność istotna dla konwersji!
wp_sk.lnkMapPL.params = new Array(
	'stopniN',
	'minutN',
	'sekundN',
	'stopniE',
	'minutE',
	'sekundE'
);
 
//
// .cleanup(str)
//
wp_sk.lnkMapPL.cleanup = function (str)
{
	//
	// Pobranie zaw. infoboksu
	//
	var box = str.match(wp_sk.lnkMapPL.search_re);
	if (!box)
	{
		return str;
	}
	box = box[1];
 
	//
	// Pobieranie wartości parametrów
	//
	var re;
	var vals = new Array();
	// "escapowanie" parametrów wewnętrznych szablonów
	box = box.replace('{{{}}}','#{{{}}}#').replace(/\{\{[^}]*\}\}/g,function(a){ return a.replace('|','{{{}}}') });
	for (var i=0; i<wp_sk.lnkMapPL.params.length; i++)
	{
		re = new RegExp(wp_sk.lnkMapPL.params[i]+'[ ]*=[ ]*([^|\\n]+)');
		vals[i] = box.match(re);
		if (vals[i]==null)
		{
			vals[i]='';
			continue;
		}
		// usuwanie spacji itp oraz odescapowanie
		vals[i] = vals[i][1].replace(/[ \t]*$/,'').replace(/^[ \t]*/,'').replace(/(^|[^#])\{\{\{\}\}\}([^#]|$)/g,'$1|$2').replace('#{{{}}}#','{{{}}}');
	}
 
	//
	// konwersja specjalna
	//
	// konwersja na paramtery jeśli vals[0] = url z ...ll=latitude,longitude...
	var ll_tmp,l_tmp,tmp;
	var ll_re = /ll=([0-9.]+),([0-9.]+)/;
	if(vals[0].indexOf('ll=')>=0)
	{
		ll_tmp = vals[0];
		ll_tmp = ll_re.exec(ll_tmp);
		if (ll_tmp!=null)
		{
			// N
			l_tmp = ll_tmp[1];
			vals[0] = tmp = Math.floor(l_tmp);	// stopni
			l_tmp -= tmp;
			l_tmp *= 60;
			vals[1] = tmp = Math.floor(l_tmp);	// minut
			l_tmp -= tmp;
			l_tmp *= 60;
			vals[2] = Math.floor(l_tmp*100000)/100000;	// sekund
			// N
			l_tmp = ll_tmp[2];
			vals[3] = tmp = Math.floor(l_tmp);	// stopni
			l_tmp -= tmp;
			l_tmp *= 60;
			vals[4] = tmp = Math.floor(l_tmp);	// minut
			l_tmp -= tmp;
			l_tmp *= 60;
			vals[5] = Math.floor(l_tmp*100000)/100000;	// sekund
		}
	}
 
	//
	// Tworzenie nowego boksa i zastąpienie poprzedniej wersji
	//
	box = wp_sk.lnkMapPL.tpl;
	for (var i=0; i<wp_sk.lnkMapPL.params.length; i++)
	{
		re = new RegExp('('+wp_sk.lnkMapPL.params[i]+'[ ]*=[ ]*)');
		box = box.replace(re,'$1'+vals[i]);
	}
 
	return str.replace(wp_sk.lnkMapPL.search_re,box);
}
 
/* =====================================================
	Class: wp_sk.redir
 
	Poprawianie redrictów. Przynajmniej na razie bazuje
	na podglądzie artykułu, w którym redirecty są oznaczone
	specjalną klasą (mw-redirect).
 
	.init()
		inicjowanie poprawek przez wstawienie ikonki przetwarzania
		wyszukanie redirectów i wysłanie wstępnego żądania
		do serwera o rozwinięcie redirectów
	.resp(res)
		funkcja przyjmująca odpowiedzieć (res) z serwera
		i przetwarzająca ją na tabelką rozwinięć redirectów
 
	.arr	- tabela rozwinięć redirectów wykorzystywana wewnętrznie
	.arr_i	- indeks używany przy tworzeniu tabeli
	.url	- url wstępnego zapytania, potrzebny w razie
			konieczności kontynuowania żądań (wymóg API)
   ===================================================== */
//
// object init
//
wp_sk.redir = new Object();
 
//
// .init()
//
wp_sk.redir.init = function()
{
	wp_sk.redir.base_url = wgServer+'/w/api.php?action=query&redirects&format=json&titles=';
	var img_loading = '//upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif';
	// var img_loading='//upload.wikimedia.org/wikipedia/commons/3/32/Loader3.gif';
 
	// ograniczenie czasowe, ale tylko w podglądzie (żeby nie zamęczyć serwerów)
	if (wgAction=='submit')
	{
		if (document.cookie.indexOf('wpsk_redir_time_disable=1')!=-1)
		{
			return;
		}
		else
		{
			var d = new Date();
			d = new Date(d.getTime()+300000); //+5min (il. sekund * 1000)
			document.cookie = "wpsk_redir_time_disable=1; path=/; expires=" + d.toGMTString();
		}
	}
 
	var elWikiBody = document.getElementById('wikiPreview');
	if (elWikiBody)
	{
		//
		// szukanie redirectów
		wp_sk.redir.urls = new Array();
		wp_sk.redir.urls[0] = new Array();
		var url_i = url_j = 0;
		var as = elWikiBody.getElementsByTagName('a');
		for (var i=0; i<as.length; i++)
		{
			if (as[i].className=='mw-redirect')
			{
				var tmp = as[i].href.replace(/^.+\/wiki\/([^#]+).*$/,'$1').replace(/_/g,'%20');
				// new url?
				var isnew=true;
				for (var ui=0; ui<=url_i; ui++)
				{
					for (var uj=0; uj<url_j; uj++)
					{
						if (wp_sk.redir.urls[ui][uj]==tmp)
						{
							isnew=false;
							break;
						}
					}
					if (!isnew)
						break;
				}
				// add to array
				if (isnew)
				{
					wp_sk.redir.urls[url_i][url_j++] = tmp;
					if (url_j>=50)	// ograniczenie API
					{
						if (url_i>=4)	// max (4+1)x50 linków
						{
							break;
						}
						url_j = 0;
						wp_sk.redir.urls[++url_i] = new Array();
					}
				}
			}
		}
		//
		// ostateczne przygotowanie i wsyłanie żądania
		if (wp_sk.redir.urls[0].length>0)
		{
			// trwa przetwarzanie...
			var nel = document.createElement('span');
			nel.id = 'wp_sk_redirs';
			nel.innerHTML = '<img title="Czyszczenie przekierowań - przygotowanie" alt="..." src="'+img_loading+'" border="0" width="18" />';
			wp_sk.btns.appendChild(nel)
 
			// na znalezione redirecty
			wp_sk.redir.arr = new Array();
			wp_sk.redir.arr_i = 0;
 
			// przygotowanie pierwszej porcji
			wp_sk.redir.urls_i = 0;
			var url = wp_sk.redir.urls[wp_sk.redir.urls_i].join('|');
			wp_sk.redir.url = wp_sk.redir.base_url+url;
			wp_sk.redir.full_prev_url = wp_sk.redir.url;
			//wp_sk.debug('<h2>['+wp_sk.redir.urls_i+']['+wp_sk.redir.urls[wp_sk.redir.urls_i].length+']</h2>');
			// run
			wp_sk.ajaxRun(wp_sk.redir.url, wp_sk.redir.resp);
		}
	}
}
 
//
// .resp(res)
//
wp_sk.redir.resp = function (res)
{
	//wp_sk.debug(res+'<hr />');
	var jres = eval('('+res+')');
 
	// zbiórka tłumaczenia redirectów
	var txtescape = /([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g;
	for (var r in jres.query.redirects)
	{
		r = jres.query.redirects[r];
		wp_sk.redir.arr[wp_sk.redir.arr_i++] = {
			'rdir' : r.from,
			'art' : r.to
		}
		//wp_sk.debug('['+(wp_sk.redir.arr_i-1)+']rdir:'+r.from+'<br />art:'+r.to);
	}
	// kontynuacja?
	if (jres['query-continue']!=null)
	{
		var continue_url = wp_sk.redir.url + '&plcontinue='+encodeURIComponent(jres['query-continue'].links.plcontinue);
		if (wp_sk.redir.full_prev_url != continue_url)	// <s>api</s> potential bug workaround
		{
			wp_sk.redir.full_prev_url = continue_url;
			wp_sk.ajaxRun(continue_url, wp_sk.redir.resp);
			return;
		}
		else
		{
			//wp_sk.debug('<p style="font-weight:bold;font-size:200%">Warning! Query continue loop.</p>');
		}
	}
	// kolejna porcja linków
	else if (wp_sk.redir.urls_i < wp_sk.redir.urls.length-1)
	{
		var url = wp_sk.redir.urls[++wp_sk.redir.urls_i].join('|');
		wp_sk.redir.url = wp_sk.redir.base_url+url;
		wp_sk.redir.full_prev_url = wp_sk.redir.url;
		//wp_sk.debug('<h2>['+wp_sk.redir.urls_i+']['+wp_sk.redir.urls[wp_sk.redir.urls_i].length+']</h2>');
		wp_sk.ajaxRun(wp_sk.redir.url, wp_sk.redir.resp);
		return;
	}
 
	/*
	// debug - start
	var str;
	// szukane
	str = ''
	for (var i=0;i<wp_sk.redir.urls.length;i++)
		for (var j=0;j<wp_sk.redir.urls[i].length;j++)
			str += '\nwp.urls['+i+']['+j+']='+ wp_sk.redir.urls[i][j]
	;
	wp_sk.debug('<textarea>'+str+'</textarea>');
 
	// znalezione
	str = ''
	for (var i=0;i<wp_sk.redir.arr.length;i++)
		str += '\nwp.rdirs['+i+']='+ wp_sk.redir.arr[i].rdir
	;
	wp_sk.debug('<textarea>'+str+'</textarea>');
	// debug - end
	*/
 
	// przygotowanie funkcji podmiany redirectów
	wp_sk.cleanerLinks_orig = wp_sk.cleanerLinks;
	wp_sk.cleanerLinks = function (str)
	{
		var reTxtEscape = /([\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g;
		for (var page in wp_sk.redir.arr)
		{
			page = wp_sk.redir.arr[page];
			var re = page.rdir.replace(reTxtEscape,'\\$1');
			if (re.search(/^[a-zżółćęśąźń]/i)==0)
			{
				re = '['+ re[0].toLowerCase() + re[0].toUpperCase() +']'
					+ re.substr(1);
			}
			var re = new RegExp('\\[\\[('+re+')(\\||\\]\\])', 'g');
			str = str.replace(re, function (a, art, end)
			{
				return '[['+ page.art + (end=='|' ? '|' : '|'+art+']]');
			});
		}
 
		return wp_sk.cleanerLinks_orig(str);	// dopiero teraz, żeby poprawiać także zmienione linki
	}
 
	// loading finished
	var redirs_loading_el = document.getElementById('wp_sk_redirs')
	if (redirs_loading_el)
	{
		redirs_loading_el.innerHTML='';
		redirs_loading_el.style.display='none';
	}
	var el = document.getElementById('wp_sk_img_btn');
	if (wp_sk.is_old_toolbar)
	{
		el.src = '//upload.wikimedia.org/wikipedia/commons/3/31/Button_broom_R.png';
	}
	else
	{
		el.src = '//commons.wikimedia.org/w/thumb.php?f=Broom%20icon%20R.svg&w=22';
	}
}
/* -----------------------------------------------------
	Klasy wspomagające porządkowanie            {KONIEC}
   ===================================================== */
 
/* =====================================================
	Function: wp_sk.ajaxRun(url,fun_odbioru)
 
	Wysyłanie żądania podanego w param. url z odbiorem
	danych przez fun_odbioru (obiera tekst w swoim
	pierwszym parametrze).
   ===================================================== */
wp_sk.ajaxRun = function (url,fun_odbioru)
{
	var xmlhttp = sajax_init_object();
	if(xmlhttp)
	{
		try
		{
			//wp_sk.debug('<a href="'+url.replace(/[?&]format=[^&]+/g,'')+'>ajax call</a>');
 
			xmlhttp.open("GET", url, true);
			xmlhttp.onreadystatechange=function()
			{
				// zakończono przetwarzanie
				if (xmlhttp.readyState==4)
				{
					fun_odbioru (xmlhttp.responseText);
				}
			};
			xmlhttp.send(null);
		}
		catch (e)
		{
			if (window.location.hostname == "localhost")
			{
				alert("Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing.");
			}
			throw e;
		}
	}
}
 
/* =====================================================
	Function: Array.prototype.indexOf(elt)
 
	Dostępna normalnie: Gecko>1.8b2
   ===================================================== */
if (!Array.prototype.indexOf)
{
	Array.prototype.indexOf = function(elt /*, from*/)
	{
		var len = this.length;
 
		var from = Number(arguments[1]) || 0;
		from = (from < 0) ? Math.ceil(from) : Math.floor(from);
		if (from < 0)
			from += len;
 
		for (; from < len; from++)
		{
			if (from in this && this[from] === elt)
				return from;
		}
		return -1;
	};
}
 
/* =====================================================
	OnLoad
   ===================================================== */
if (typeof wp_sk_show_as_button!='undefined' && wp_sk_show_as_button)
{
	if(wgAction=='submit' || wgAction=='edit')
		$(wp_sk.button);
}
 
if (typeof wp_sk_redir_enabled!='undefined' && wp_sk_redir_enabled)
{
	// ktoś może mieć ustawiony podgląd od razu przy edycji - wówczas działa od razu
	if(wgAction=='submit' || wgAction=='edit')
		$(wp_sk.redir.init)
	;
}
// </nowiki>