// <nowiki>

(function() {
	"use strict";
	
	function unifyNavbox() {
		var result = $("#wpTextbox1").val();
		
		// navbox2 substolása, ha ez van használatban
		// ezután el kell menteni a sablont, majd a substolt (magyarított) verziót még egyszer megnyitni és javítani ezzel a scripttel
		if (result.match(/\{\{avbox2/g)) {
			result = result.replaceAll(/\{\{avbox2/g, "{{subst:Navbox2");
			$("#wpTextbox1").val(result);
			
			alert("A módosítandó szövegben {{Navbox2}} volt, ami most substolva lett, más változás nem történt.\nMost mentsd el a lapot, majd a substolt, magyar paraméterneveket tartalmazó szöveget javítsd ki újra ezzel a scripttel.\n(Ha nem akarod, hogy ez az üzenet minden substoláskor megjelenjen, tegyél // jelet a scriptben az \"alert\" kezdetű sor elejére.)");
			
			return;
		}
		
		// szóköz törlése a paraméternevek elől ("\n | csoport1=" -> "\n|csoport1=")
		result = result.replaceAll(
			/*\| *((csoport|lista)+(osztály|stílus)?|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)?|(bal)?kép|név|cím|állapot)/g,
			"\n|$1"
		);
		
		// angol paraméternevek cseréje magyarra
		result = result.replaceAll(/\n *\| *name(?=)/g, "\n|név");
		result = result.replaceAll(/\n *\| *title(?=)/g, "\n|cím");
		result = result.replaceAll(/\n *\| *state(?=)/g, "\n|állapot");
		result = result.replaceAll(/\n *\| *image(?=)/g, "\n|kép");
		result = result.replaceAll(/\n *\| *group(+)(?=)/g, "\n|csoport$1");
		result = result.replaceAll(/\n *\| *list(+)(?=)/g, "\n|lista$1");
		result = result.replaceAll(/\n *\| *bodyclass(?=)/g, "\n|bodyosztály");
		result = result.replaceAll(/\n *\| *listclass(?=)/g, "\n|listaosztály");
		
		// "{{Navbox|subgroup" helyett "{{Navbox alcsoport"
		result = result.replaceAll(/\{\{ *avbox*\|*subgroup(?=)/g, "{{Navbox alcsoport");
		
		// paraméternevek kipótlása szóközzel 10 karakterre (9 karakter + még egy szóköz) ("|lista1=" -> "|lista1    =")
		result = result.replaceAll(
			/\n\|((csoport|lista)+(osztály|stílus)?|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)?|(bal)?kép|név|cím|állapot) *=/g,
			(match, p1) => ("\n|" + p1.padEnd(9, " ") + " =")
		);
		
		// "|paraméternév = érték"-ben szóköz az egyenlőségjel után
		result = result.replaceAll(
			/\n\|((csoport+|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)|(bal)?kép|név|cím|állapot) *)= */g,
			"\n|$1= "
		);
		
		// szóköz törlése sor végi egyenlőségjel után
		result = result.replaceAll(/= +\n/g, "=\n");
		
		// paraméter végén lévő pötty törlése
		result = result.replaceAll(/*((\{\{(·|•|,)\}\})|·|•)*(?=\n\|)/g, "");
		
		// {{·}}, {{•}}, {{,}} sablonok cseréje felsorolásra
		// csak a "|listaN =" paraméterek értékében
		result = result.replaceAll(
			/(\n\|lista+ *=) *(*)*/g,
			(match, p1, p2) => (p1 + "\n* " + p2.replaceAll(/*((\{\{(·|•|,)\}\})|·|•)*/g, "\n* "))
		);
		
		// {{·}}, {{•}}, {{,}} sablonok cseréje felsorolásra
		// mindenhol
		result = result.replaceAll(/*((\{\{(·|•|,)\}\})|·|•)*/g, "\n* ");
		
		// ·, • cseréje felsorolásra
		// mindenhol
		result = result.replaceAll(/**/g, "\n* ");
		
		// &bull;, &bullet; cseréje felsorolásra
		result = result.replaceAll(/*&bull(et)?;*/g, "\n* ");
		
		// sor végi &nbsp; törlése
		result = result.replaceAll(/ *&nbsp; *\n/g, "\n");
		
		// <br />, <br> cseréje felsorolásra
		// sokszor felesleges, inkább kiveszem
		//result = result.replaceAll(/*<br ?\/?>*/g, "\n* ");
		
		// <br />, <br> cseréje üres sorra
		// lehet, hogy ez jobb
		//result = result.replaceAll(/*<br ?\/?>*/g, "\n\n");
		
		// felsorolásjelben legyen szóköz ("\n*szöveg" -> "\n* szöveg")
		result = result.replaceAll(/\n(\*+) */g, "\n$1 ");
		
		// paraméter végén lévő <br>, <br /> törlése
		result = result.replaceAll(/ *<br ?\/?> *(\n+)\|/g, "$1|");
		
		// csoportNstílus törlése, ha üres
		result = result.replaceAll(/(\|csoport+stílus*=*)(?=\|)/g, "");
		
		// címstílus, csoportstílus törlése, ha üres
		result = result.replaceAll(/(\|(cím|csoport)stílus*=*)(?=\|)/g, "");
		
		// "|listaosztály = hlist" beszúrása az első csoport elé
		result = result.replaceAll(/*((*\|csoport1 *=*)?(\n\|lista1 *=))/g, "\n|listaosztály = hlist\n$1");
		
		// duplikált "|listaosztály = hlist" javítása
		result = result.replaceAll("\n|listaosztály = hlist\n|listaosztály = hlist\n", "\n|listaosztály = hlist\n");
		
		// "|listaN =" után sortörés
		//result = result.replaceAll(/(lista+*=)*/g, "$1\n* ");
		
		// üres sor beszúrása minden csoport elé
		result = result.replaceAll(/*((\n\|csoport+ *=*)?(\n\|lista+ *=))/g, "\n$1");
		
		// minden csoportN előtt egy üres sor
		//result = result.replaceAll(/\n(\|csoport+*=)/g, "\n\n$1");
		
		// {{navbox|...}}, {{navbox alcsoport|...}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navbox", "{{Navbox");
		
		// {{navoszlop|...}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navoszlop", "{{Navoszlop");
		
		// {{Navbox|gyerek|...}}, {{Navbox|alcsoport|...}} -> {{Navbox alcsoport|...}}
		result = result.replaceAll(/=*\**\{\{Navbox *\| *(gyerek|alcsoport) */g, "= {{Navbox alcsoport");
		
		// {{Navbox alcsoport|...}} előtt ne legyen felsorolásjel
		result = result.replaceAll(/=*\**\{\{Navbox alcsoport/g, "= {{Navbox alcsoport");
		
		// "{{Navbox alcsoport" után legyen üres sor
		result = result.replaceAll(/\{\{Navbox alcsoport*/g, "{{Navbox alcsoport\n\n");
		
		// {{Navbox alcsoport|...}}-ban ne legyen még egyszer "|listaosztály = hlist"
		result = result.replaceAll(/(\{\{Navbox alcsoport)(*)(\n\|listaosztály *= *hlist *\n\n?)/g, "$1$2\n");
		
		// {{Navbox alcsoport|...}}-ot lezáró }} legyen külön sorban
		// sokszor feleslegesen módosít, kivettem
		//result = result.replaceAll(/(\n\|lista+ *=) *((\n\* *)+)\}\}\n(?=\|)*/g, "$1$2\n}}\n\n");
		
		// "|alul =" és "|felül =" előtt üres sor
		result = result.replaceAll(/*(\|(alul|felül) *=)/g, "\n\n$1");
		
		// "|alul =" és "|felül =" átalakítás listává, -osztály = hlist hozzáadása
		result = result.replaceAll(
			/\|((alul|felül) *=) *(*)/g,
			(match, p1, p2, p3) => ("|" + p2 + "osztály = hlist\n" +"|" + p1 + "\n* " + p3.replaceAll(/*\{\{(·|•|,)\}\}/g, "\n* "))
		);
		
		// üres felsorolásos sorok törlése
		result = result.replaceAll(/\n\*+ *(?=\n)/g, "");
		
		// "}}</includeonly>" előtt egy üres sor
		result = result.replaceAll(/*(\}\}*<\/includeonly>)/g, "\n\n}}</includeonly>");
		
		// </includeonly> és <noinclude> közötti szóköz, új sor törlése
		result = result.replaceAll(/<\/includeonly>*<noinclude>/g, "</includeonly><noinclude>");
		
		// [[kategória: csere nagy kezdőbetűre
		result = result.replaceAll("[[kategória:", "[[Kategória:");
		
		// kategóriák külön sorba
		result = result.replaceAll(/*(\]+\]\])/g, "\n$1");
		result = result.replaceAll(/(\]+\]\])*/g, "$1\n");
		
		// {{Navboxdoc}} -> {{Navbox sablondokumentációja}}
		result = result.replaceAll(/\{\{avboxdoc*(\||\}\})/g, "{{Navbox sablondokumentációja$1");
		
		// {{navbox sablondokumentációja}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navbox sablondokumentációja", "{{Navbox sablondokumentációja");
		
		// {{Navbox sablondokumentációja}} külön sorba
		result = result.replaceAll(/*\{\{Navbox sablondokumentációja(*)\}\}*/g, "\n{{Navbox sablondokumentációja$1}}\n");
		
		// az elején ne legyen üres sor, a végén 1 legyen
		result = result.trim() + "\n";
		
		// <includeonly>...</includeonly> pótlása
		if (!result.includes("<includeonly>") && !result.includes("</includeonly>")) {
			result = "<includeonly>" + result;
			result = result.replaceAll("<noinclude>", "</includeonly><noinclude>");
		}
		
		// <noinclude>...</noinclude> pótlása, ha egyik sincs
		if (!result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result.replaceAll(/<\/includeonly>((.|\n)*)$/g, "</includeonly><noinclude>$1</noinclude>\n");
		}
		
		// </noinclude> pótlása, ha <noinclude> van
		if (result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result + "</noinclude>\n";
		}
		
		// lezáró }} előtt üres sor
		result = result.replaceAll(/\n+\}\}<\/includeonly><noinclude>/g, "\n\n}}</includeonly><noinclude>");
		
		// {{Navbox sablondokumentációja}} pótlása, ha nincs
		if (!result.includes("{{Navbox sablondokumentációja")) {
			result = result.replaceAll("<noinclude>", "<noinclude>\n{{Navbox sablondokumentációja}}");
		}
		
		// sor végi szóközök törlése
		result = result.replaceAll(/ +\n/g, "\n");
		
		// alsablonok paramétereinek behúzása
		var lines = result.split("\n");
		var level = 0;
		for (var i = 0; i < lines.length; i++) {
			if (lines.match(/^\|+ *=/)) {
				lines = "  ".repeat(level - 1) + lines;
			}
			var opener = (lines.match(/\{/g) || ).length;
			var closer = (lines.match(/\}/g) || ).length;
			level = level + Math.floor((opener - closer) / 2);
			if (level < 0) {level = 0;}
		}
		result = lines.join("\n");
		
		$("#wpTextbox1").val(result);
	}
	
	function hadjaratNavoszlopJavit() {
		var result = $("#wpTextbox1").val();
		
		// szóköz törlése a paraméternevek elől ("\n | csoport1=" -> "\n|csoport1=")
		result = result.replaceAll(
			/*\| *(sablon|cím|szélesség|kép|listaosztály|szöveg)/g,
			"\n|$1"
		);
		
		// paraméternevek kipótlása szóközzel 10 karakterre (9 karakter + még egy szóköz) ("|lista1=" -> "|lista1    =")
		result = result.replaceAll(
			/\n\|(sablon|cím|szélesség|szöveg) *=/g,
			(match, p1) => ("\n|" + p1.padEnd(9, " ") + " =")
		);
		
		// "|paraméternév = érték"-ben szóköz az egyenlőségjel után
		result = result.replaceAll(
			/\n\|((sablon|cím|szélesség|szöveg) *)= */g,
			"\n|$1= "
		);
		
		// szóköz törlése sor végi egyenlőségjel után
		result = result.replaceAll(/= +\n/g, "=\n");
		
		// paraméter végén lévő pötty törlése
		result = result.replaceAll(/*((\{\{(·|•|,)\}\})|·|•)*(?=\n\|)/g, "");
		
		// {{·}}, {{•}}, {{,}} ·, • cseréje felsorolásra
		// mindenhol
		result = result.replaceAll(/*((\{\{(·|•|,)\}\})|·|•)*/g, "\n* ");
		
		// &bull;, &bullet; cseréje felsorolásra
		result = result.replaceAll(/*&bull(et)?;*/g, "\n* ");
		
		// sor végi &nbsp; törlése
		result = result.replaceAll(/ *&nbsp; *\n/g, "\n");
		
		// felsorolásjelben legyen szóköz ("\n*szöveg" -> "\n* szöveg")
		result = result.replaceAll(/\n(\*+) */g, "\n$1 ");
		
		// paraméter végén lévő <br>, <br /> törlése
		result = result.replaceAll(/ *<br ?\/?> *(\n+)\|/g, "$1|");
		
		// szöveg első sorába felsorolásjel
		result = result.replaceAll(/(\| *szöveg *=)*(?=)/g, "$1\n* ");
		
		// üres felsorolásos sorok törlése
		result = result.replaceAll(/\n\*+ *(?=\n)/g, "");
		
		// "|listaosztály = hlist" beszúrása a szöveg elé
		result = result.replaceAll(/*(\n\|szöveg *=)/g, "\n|listaosztály = hlist$1");
		
		// duplikált "|listaosztály = hlist" javítása
		result = result.replaceAll("\n|listaosztály = hlist\n|listaosztály = hlist\n", "\n|listaosztály = hlist\n");
		
		// [[kategória: csere nagy kezdőbetűre
		result = result.replaceAll("[[kategória:", "[[Kategória:");
		
		// kategóriák külön sorba
		result = result.replaceAll(/*(\]+\]\])/g, "\n$1");
		result = result.replaceAll(/(\]+\]\])*/g, "$1\n");
		
		// {{Navboxdoc}} -> {{Navbox sablondokumentációja}}
		result = result.replaceAll(/\{\{avboxdoc*(\||\}\})/g, "{{Navbox sablondokumentációja$1");
		
		// {{navbox sablondokumentációja}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navbox sablondokumentációja", "{{Navbox sablondokumentációja");
		
		// {{Navbox sablondokumentációja}} külön sorba
		result = result.replaceAll(/*\{\{Navbox sablondokumentációja(*)\}\}*/g, "\n{{Navbox sablondokumentációja$1}}\n");
		
		// az elején ne legyen üres sor, a végén 1 legyen
		result = result.trim() + "\n";
		
		// <includeonly>...</includeonly> pótlása
		if (!result.includes("<includeonly>") && !result.includes("</includeonly>")) {
			result = "<includeonly>" + result;
			result = result.replaceAll("<noinclude>", "</includeonly><noinclude>");
		}
		
		// <noinclude>...</noinclude> pótlása, ha egyik sincs
		if (!result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result.replaceAll(/<\/includeonly>((.|\n)*)$/g, "</includeonly><noinclude>$1</noinclude>\n");
		}
		
		// </noinclude> pótlása, ha <noinclude> van
		if (result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result + "</noinclude>\n";
		}
		
		// "}}</includeonly>" előtti üres sor törlése
		result = result.replaceAll(/*(\}\}*<\/includeonly>)/g, "\n}}</includeonly>");
		
		// </includeonly> és <noinclude> közötti szóköz, új sor törlése
		result = result.replaceAll(/<\/includeonly>*<noinclude>/g, "</includeonly><noinclude>");
		
		// }} és </includeonly>/<noinclude> közötti szóköz, új sor törlése
		result = result.replaceAll(/\}\}*(<\/includeonly>|<noinclude>)/g, "}}$1");
		
		// {{Navbox sablondokumentációja}} pótlása, ha nincs
		if (!result.includes("{{Navbox sablondokumentációja")) {
			result = result.replaceAll("<noinclude>", "<noinclude>\n{{Navbox sablondokumentációja}}");
		}
		
		// sor végi szóközök törlése
		result = result.replaceAll(/ +\n/g, "\n");
		
		$("#wpTextbox1").val(result);
	}
	
	function splitInfobox() {
		var result = $("#wpTextbox1").val();
		
		result = result.replaceAll(
			/\{\{(+ infobox) *((\| *(+) *= *((|\]+\]\]|\{\{+\}\})*))*)\}\}*/gi,
			(match, p1, p2) => (
				"{"+"{" + p1 +
				p2.replaceAll(/\| *(+) *= *((|\]+\]\]|\{\{+\}\})*)/g, "\n|$1 = $2") +
				"\n}}\n\n")
		);
		
		$("#wpTextbox1").val(result);
	}
	
	// build GUI
	var buttonCSS = "display: inline-block; margin: 2px; border: 1px solid #069; border-radius: 4px; padding: 2px 4px; background-color: #cde; color: black;";
	
	var $navboxUnify = $("<a>")
		.attr("id", "unify-navbox")
		.attr("href", "#")
		.attr("style", buttonCSS)
		.text("Navbox egységesít")
		.click(unifyNavbox);
	
	var $hadjaratNavoszlopJavit = $("<a>")
		.attr("id", "hadjarat-navoszlop-javit")
		.attr("href", "#")
		.attr("style", buttonCSS)
		.text("Hadjárat navoszlop javít")
		.click(hadjaratNavoszlopJavit);
	
	var $splitInfobox = $("<a>")
		.attr("id", "split-infobox")
		.attr("href", "#")
		.attr("style", buttonCSS)
		.text("Infobox tördelése")
		.click(splitInfobox);
	
	var $separator = $("<span>")
		.html(" &bullet; ");
	
	var $menu = $("<div>")
		.attr("style", "border: 1px solid #808080; margin: 10px 0px; padding: 2px;")
		.append (
			$navboxUnify,
			//$separator,
			$hadjaratNavoszlopJavit,
			//$separator,
			$splitInfobox,
		);
	
	$("#specialchars").after($menu);
	
}) ();

// </nowiki>