Meidogger:Snakesteuben/prototypearticle.js

Opmerking: Nei it fêstlizzen kin it nedich wêze de oerslach fan jo blêder te leegjen, foar't de wizigings te sjen binne.

  • Firefox / Safari: Hâld Shift yntreaun wylst jo op Fernije klikke, of typ Ctrl-F5 of Ctrl-R (⌘-R op in Mac)
  • Google Chrome: Typ Ctrl-Shift-R (⌘-Shift-R op in Mac)
  • Internet Explorer / Edge: Hâld Ctrl yntreaun wylst jo Vernieuwen klikke, of typ Ctrl-F5
  • Opera: Typ Ctrl-F5.
/*
== Prototype Article ==
GFDL: Dan Pettersson, http://sv.wiktionary.org/wiki/Anv%C3%A4ndare:Skalman
*/

// disable by adding  paLoad = false;  to your monobook.js
if (paLoad == undefined)
	var paLoad = true;

var nahSaveCookie = false; // default is no, when initializing we'll change this if there's a cookie

var nahPoSs = {
	noun:  ["Substantiv", "subst"],
	verb:  ["Verb", "verb"],
	adj:   ["Adjektiv", "adj"],
	adv:   ["Adverb", "adv"],
	count: ["Räkneord", "räkn"],
	pron:  ["Pronomen", "pron"],
	interj:["Interjektion", "interj"],
	conj:  ["Konjunktion", "konj"],
	prep:  ["Preposition", "prep"],
	abbr:  ["Förkortning", "förkortning"],
	phrase:["Fras", "fras"],
	idiom: ["Idiom", "idiom"],
	provrb:["Ordspråk", "ordspråk"],
	saying:["Talesätt", "talesätt"],
	affix: ["Affix", "affix"],
	prefix:["Förled", "förled"],
	suffix:["Efterled", "efterled"],
	symbol:["Tecken", "tecken"]
};

var nahLangs = {
	sv:"svenska",
	"--":"tvärspråkligt", abq:"abazinska", ab:"abchaziska", aa:"afar", af:"afrikaans",
	ain:"ainu", ak:"akan", sia:"akkalasamiska", sq:"albanska", als:"alemanniska", tut:"altaiska",
	am:"amhariska", ang:"anglosaxiska", ar:"arabiska", an:"aragonska", arc:"arameiska",
	hy:"armeniska", "roa-rup":"arumänska", as:"assamesiska", ast:"asturiska", av:"avariska",
	ay:"aymara", az:"azerbajdzjanska", bm:"bamana", ba:"basjkiriska", eu:"baskiska", bar:"bayerska",
	bn:"bengali", ber:"berberspråk", bh:"bihari", bpy:"bishnupriya manipuri", bi:"bislama",
	no:"bokmål", bs:"bosniska", br:"bretonska", bg:"bulgariska", bxr:"burjatiska", my:"burmesiska",
	ceb:"cebuano", ch:"chamorro", chr:"cherokesiska", ny:"chichewa", cr:"cree", da:"danska",
	din:"dinka", dv:"divehi", dz:"dzongkha", smn:"enaresamiska", en:"engelska", eo:"esperanto",
	et:"estniska", ee:"ewe", fj:"fiji", fil:"filipino", fi:"finska", frp:"frankoprovensalska",
	fr:"franska", fy:"frisiska", fur:"friuliska", fo:"färöiska", gag:"gagauziska", gl:"galiciska",
	ka:"georgiska", got:"gotiska", el:"grekiska", kl:"grönländska", gn:"guaraní", gu:"gujarati",
	ht:"haitisk kreol", hak:"hakka", ha:"hausa", haw:"hawaiiska", he:"hebreiska", hi:"hindi",
	hsb:"högsorbiska", io:"ido", ig:"igbo", id:"indonesiska", ia:"interlingua", ie:"interlingue",
	iu:"inuktitut", ik:"iñupiaq", ga:"iriska", is:"isländska", it:"italienska", ja:"japanska",
	jv:"javanesiska", yi:"jiddisch", xmu:"kammu", kn:"kannada", pam:"kapampangan", ks:"kashimiri",
	csb:"kasjubiska", ca:"katalanska", kk:"kazakiska", km:"khmer", kg:"kikongo", sjd:"kildinsamiska",
	zh:"kinesiska", ky:"kirgiziska", rn:"kirundi", tlh:"klingonska", ko:"koreanska", kw:"korniska",
	co:"korsikanska", crh:"krimtatariska", hr:"kroatiska", ku:"kurdiska", cy:"kymriska",
	lad:"ladino", lld:"ladinska", lo:"lao", la:"latin", lv:"lettiska", lij:"liguriska",
	li:"limburgiska", ln:"lingala", lt:"litauiska", jbo:"lojban", smj:"lulesamiska", lb:"luxemburgiska",
	sco:"lågskotska", dsb:"lågsorbiska", nds:"lågtyska", mk:"makedonska", mg:"malagassiska",
	ms:"malajiska", ml:"malayalam", mt:"maltesiska", gv:"manx", mi:"maori", mr:"marathi",
	mh:"marshalliska", "zh-min-nan":"min nan", mo:"moldaviska", mn:"mongoliska", nah:"nahuatl",
	pih:"narfuk", na:"nauriska", nv:"navajo", ng:"ndonga", nap:"neapolitanska", nl:"nederländska",
	ne:"nepali", nd:"nordndebele", se:"nordsamiska", nrm:"normandiska", nov:"novial", nn:"nynorska",
	oc:"occitanska", oj:"ojibwe", or:"oriya", om:"oromo", os:"ossetiska", pap:"papiamento",
	pi:"pali", pag:"pangasisnan", ps:"pashto", fa:"persiska", pms:"piedmontesiska", sje:"pitesamiska",
	pjt:"pitjantjatjara", pl:"polska", pt:"portugisiska", pa:"punjabi", qu:"quechua", rom:"romani",
	ro:"rumänska", rw:"rwanda", ru:"ryska", rm:"rätoromanska", sm:"samoanska", sg:"sango",
	sa:"sanskrit", sc:"sardiska", nso:"sepedi", sr:"serbiska", sh:"serbokroatiska", st:"sesotho",
	sn:"shona", scn:"sicilianska", sd:"sindhi", si:"singalesiska", ss:"siswati", sms:"skoltsamiska",
	gd:"skotsk gäliska", sk:"slovakiska", sl:"slovenska", so:"somaliska", es:"spanska",
	su:"sundanesiska", sw:"swahili", nr:"sydndebele", sma:"sydsamiska", tl:"tagalog", tg:"tadzjikiska",
	ta:"tamil", tt:"tatariska", te:"telugu", sjt:"tersamiska", tet:"tetum", th:"thai",
	bo:"tibetanska", ti:"tigrinska", cs:"tjeckiska", ce:"tjetjenska", cv:"tjuvasjiska",
	tpi:"tok pisin", to:"tonganska", ts:"tsonga", tn:"tswana", tr:"turkiska", tk:"turkmeniska",
	tw:"twi", de:"tyska", udm:"udmurtiska", ug:"uiguriska", uk:"ukrainska", sju:"umesamiska",
	hu:"ungerska", ur:"urdu", uz:"uzbekiska", wa:"vallonska", vec:"venetianska", vi:"vietnamesiska",
	be:"vitryska", vo:"volapük", wo:"wolof", xh:"xhosa", ii:"yi", yo:"yoruba", za:"zhuang",
	zu:"zulu"
};

// will contain the same array, but {"language":"code", ...} instead
// we will do this only if the user actually uses NAH to minimize memory use
var nahLangsRev;

var nahGenericArticle = {
	// "name": ["description", inserted_text, how_as_default]
	// inserted_text: if a number, nahGeneratedText is called with that number which
	//    results in certain generated text - otherwise a string which will be the result
	// show_as_default: 0=don't have to show;  1=must show
	"-1": ["{{wikipedia}}-mall <small>(endast för svenska uppslag)</small>", -1, 0],
	0: ["Bild <small>(endast för svenska uppslag)</small>", 0, 0],
	"0_5": ["\n"],
	1: ["Språkrubriken", 1, 1], // språkrubriken
	2: ["Ordklassrubriken", 2, 1], // ordklassrubriken
	3: ["Grammatikmall", 3, 1], // språkindexering/gramamtikmall
	4: ["Fetstilsraden", 4, 1], // fetstilsraden
	5: ["Uttal", 5, 0], // uttalsmall
	6: ["Definition", 6, 1], // definitionen (<skriv definitionen här>)
	7: ["Exempelmening", 7, 0], // exempel
	"7_5": ["\n"],
	8: ["Rubriken Varianter", "====Varianter====\n*[[]]\n\n", 0],
	9: ["Rubriken Etymologi", "====Etymologi====\n", 0],
	10: ["Rubriken Grammatik", "====Grammatik====\n", 0],
	11: ["Rubriken Användning", "====Användning====\n", 0],
	12: ["Rubriken Synonymer", "====Synonymer====\n*[[]]\n\n", 0],
	13: ["Rubriken Antonymer", "====Antonymer====\n*[[]]\n\n", 0],
	14: ["Rubriken Hyperonymer", "====Hyperonymer====\n*[[]]\n\n", 0],
	15: ["Rubriken Hyponymer", "====Hyponymer====\n*[[]]\n\n", 0],
	16: ["Rubriken Kohyponymer", "====Kohyponymer====\n*[[]]\n\n", 0],
	17: ["Rubriken Holonymer", "====Holonymer====\n*[[]]\n\n", 0],
	18: ["Rubriken Meronymer", "====Meronymer====\n*[[]]\n\n", 0],
	19: ["Rubriken Troponymer", "====Troponymer====\n*[[]]\n\n", 0],
	20: ["Rubriken Besläktade ord", "====Besläktade ord====\n*[[]]\n\n", 0],
	21: ["Rubriken Sammansättningar", "====Sammansättningar====\n*[[]]\n\n", 0],
	22: ["Rubriken Fraser", 22, 0], // fraser
	23: ["Rubriken Homofoner", "====Homofoner====\n*[[]]\n\n", 0],
	24: ["Rubriken Översättningar <small>(endast för svenska uppslag)</small>", 24, 0], // översättningar
	25: ["Rubriken Koder", 25, 0],
	26: ["Rubriken Se även", "====Se även====\n*[[]]\n\n", 0]
}
// defaults: 
var nahTemplates = [{"name":"min prototyp", 1:"sv", 2:"noun", 3:true, 4:true, 6:"-", 24:true}]; // default, the rest should be loaded via the saved cookie
var nahCurTemplate;
var nahNumInsertedNewTemplates = 0;

function nahGeneratedText(nahTemplateId, action) {
	action += "";
	nahTmpTemp = nahTemplates[nahTemplateId];
	curLang = nahTmpTemp[1];
	curPoS = nahTmpTemp[2];
	switch (action) {
		case "-1": // {{wikipedia}}
			return (curLang=="sv" ? "{{wikipedia}}\n" : "");
		case "0": // image
			return (curLang=="sv" ? "[[Bild:]]\n" : "");
		case "1": // language
			langName = nahLangs[curLang];
			langName = langName.charAt(0).toUpperCase() + langName.substring(1);
			return "==" + langName + "==\n";
		case "2": // part of speech
			return "===" + nahPoSs[curPoS][0] + "===\n";
		case "3": // grammar template
			if (curLang == "sv")
				return "{{" + nahPoSs[curPoS][1] + "}}\n";
			else
				return "{{" + nahPoSs[curPoS][1] + "|" + curLang + "}}\n";
		case "4": // bold row
			noBoldLangs = {"<langcode1>":1, "<langcode2>":1};
			if (curPoS == "symbol" || noBoldLangs[curLang])
				return wgPageName;
			else
				return "'''" + wgPageName + "'''\n";
		case "5": // pronunciation
			return "*{{uttal|enkel=|ipa=|ljud=" + (curLang=="sv"?"":"|språk="+nahLangs[curLang]) + "}}\n";
		case "6": // definition
			if (nahTmpTemp[6] == "-")
				return "#<separator>\n"; // <separator> will be changed
			else
				return "#{{kat|" + (nahTmpTemp[6]==" "?"":nahTmpTemp[6]) + (curLang=="sv"?"":"|språk="+nahLangs[curLang]) + "}} <separator>\n";
		case "7": // example
			return "#:'' ''' ''' ''\n" + (curLang == "sv" ? "" : "#::'' ''' ''' ''\n");
		case "22": return (curPoS=="phrase" ? "" : "====Fraser====\n*[[]]\n\n");
		case "24": return (curLang=="sv" ? "====Översättningar====\n{{topp|}}\n*engelska: [[]]\n{{botten}}\n" : "");
		case "25": return (curPoS=="symbol" ? "====Koder====\n*[[]]\n\n" : "");
		default: return nahGenericArticle[action][1];
	}
}

// initialize the whole process
function nahInit() {
	if (!paLoad || !document.getElementById || !document.getElementById("toolbar"))
		return;
	
	var nahHTML = "";
	// text displayed from the beginning
	nahHTML += "<div id=\"nahIntroLinks\">" +
		"<p><small>Om du vill kan du när du skapar nya uppslag</small> <b><a href=\"javascript:nahSettings(0);\">infoga en prototypartikel</a></b>" +
		" &mdash; <a href=\"http://sv.wiktionary.org/wiki/Wiktionary:Hj%C3%A4lp/Prototypartiklar\" title=\"Öppnas i nytt fönster\" class=\"external\" target=\"_blank\">Hjälp/information</a></p>" +
		"<p id=\"nahInsertableTemplates\" style=\"display:none;\"></p>";
	
	// hidden shell in which everything goes when the user clicks
	nahHTML += "<div id=\"nahEditSettings\" style=\"display:none;\"><div>" +
		"<p><a href=\"javascript:nahCloseSettings();\" id=\"nahCloseButton\" style=\"float:right; height:22px; font-size:14px; border-width:1px; background:url(http://internetvision.se/dan/projekt/wikt/button.png); padding:0 4px;\">[stäng]</a></p>" +
		"<h3 id=\"nahSettingsTitle\"></h3>" +
		"<div id=\"nahStep0\" style=\"background:#eef;\">" +
		"<p><b>Allmän info</b>: Detta är tänkt att vara en hjälp för att göra det snabbare att skapa många nya artiklar. <i>Man är alltså inte bunden att endast använda det språk och de rubriker man anger här, utan kan efter att man infogat prototypartikeln ändra fritt.</i> Likaså går det alldeles utmärkt att skriva in allt manuellt om man tycker det är enklare. <a href=\"http://sv.wiktionary.org/wiki/Wiktionary:Hj%C3%A4lp/Prototypartiklar\" target=\"_blank\" class=\"external\" title=\"Öppnas i nytt fönster\">Mer info</a>...</p>" +
		
		"<p>Nuvarande inställning: " +
		"<span id=\"nahCookieSettingsOn\" style=\"display:none;\"><b style=\"color:#060;\">Kommer ihåg prototypartiklar</b> (<a href=\"javascript:nahForgetMe();\">glöm bort</a>)</span>" +
		"<span id=\"nahCookieSettingsOff\"><b style=\"color:#900;\">Kommer inte ihåg prototypartiklar</b> (<a href=\"javascript:nahRememberMe();\">kom ihåg</a>)</span>" +
		"</p></div>" +
		
		"<div id=\"nahStep1\" style=\"display:none;\">" +
		"<p style=\"text-align:center;\"><a href=\"javascript:nahInsert(nahCurTemplate, &quot;new&quot;);\">[Infoga genererad text]</a> &mdash; <a href=\"javascript:nahGoToStep(2);\" class=\"selected\">[Fortsätt med fler inställningar &rarr;]</a></p><hr>" +
	
	// choose a name for the template
		"<h4>Välj namn för din prototypmall</h4><p>Du kan skapa upp till 5 prototypmallar; välj ett namn för prototypmallen: <input type=\"text\" id=\"nahNameInput\" onblur=\"nahSet(&quot;name&quot;, 0, this.value);\"></p>" +
	
	// choose language
		"<h4>Välj språk</h4><p>Skriv in vilket språk du vill använda: <input type=\"text\" id=\"nahLangInput\" onkeyup=\"nahSet(1, &quot;set name&quot;, this.value);\" onblur=\"nahSet(1, &quot;set name&quot;, this.value);\"> <span id=\"nahLangStatusError\" style=\"display:none;\">(okänt språk - <b style=\"color:#c00;\">xx</b>)</span><span id=\"nahLangStatusOk\" style=\"display:none;\">(motsvarande språkkod: <b style=\"color:#090;\" id=\"nahLangStatusCode\"></b>)</span><span id=\"nahLangStatusOkCode\" style=\"display:none;\">(motsvarande språk: <b style=\"color:#090;\" id=\"nahLangStatusName\"></b>)</span><br><small>Om du vet vilken språkkod språket har kan du välja att skriva in den istället.</small> Får du inte fram ett accepterat språk kan du titta i <a href=\"http://sv.wiktionary.org/wiki/Wiktionary:Stilguide/Spr%C3%A5knamn\" target=\"_blank\" class=\"external\" title=\"Öppnas i nytt fönster\">listan över alla språknamn</a>.</p>";
	
	// choose part of speech
	nahHTML += "<h4>Välj ordklass</h4><p>";
	var nahFirst = true;
	for (nahTempPoS in nahPoSs) {
		if (nahFirst) nahFirst=false;
		else nahHTML += ' - ';
		nahHTML += "<a href=\"javascript:nahSet(2, &quot;" + nahTempPoS + "&quot;);\" id=\"nahPoS_" + nahTempPoS + "\">" + nahPoSs[nahTempPoS][0] + "</a>";
	}
	nahHTML += "</p>";
	
	nahHTML += "</div>";
	
	// step 2
	nahHTML += "<div id=\"nahStep2\" style=\"display:none;\">" +
		"<p style=\"text-align:center;\"><a href=\"javascript:nahGoToStep(1);\">[&larr; Gå tillbaka till föregående inställningar]</a> &mdash; <a href=\"javascript:nahInsert(nahCurTemplate, &quot;new&quot;);\" class=\"selected\">[Infoga genererad text]</a></p><hr>" +
		"<h4>Välj vad du vill inkludera i den infogade artikeln</h4><ul style=\"list-style:none;\">";
	
	// headings to choose
	for (nahTempRow in nahGenericArticle) {
		if (nahGenericArticle[nahTempRow][0] == "\n")
			continue;
		if (!nahGenericArticle[nahTempRow][2]) { // optional
			nahHTML += "<div><tt id=\"nahRows_" + nahTempRow + "\">[ ]</tt> " +
				"<a href=\"javascript:nahSet(&quot;" + nahTempRow + "&quot;, &quot;toggle&quot;);\" id=\"nahRows_" + nahTempRow + "_link\">" + nahGenericArticle[nahTempRow][0] + "</a>";
		} else
			nahHTML += "<div><tt>[X]</tt> <i><b>" + nahGenericArticle[nahTempRow][0] + "</b></i> <small>(måste inkluderas)</small>";
		// custom is for those headings that want to give more choices etc.
		nahHTML += "<div id=\"nahRows_" + nahTempRow + "_custom\" style=\"display:none; margin-left:4em;\"></div></div>";

	}
	nahHTML += "</ul>";
	nahHTML += "</div>";
	
	nahHTML += "</div></div>";
	
	// ...and put it on the actual page
	var nahNahToolbar = document.createElement("div");
	nahNahToolbar.setAttribute("id", "nahToolbar");
	nahNahToolbar.innerHTML = nahHTML;
	var nahToolbar = document.getElementById('toolbar');
	nahToolbar.parentNode.insertBefore(nahNahToolbar, nahToolbar);
	
	// read cookie
	if (null != nahReadCookie("prototypeArticles")) {
		// <cookie> ::= <prot>|<prot>|<prot>|<prot>|<prot>
		// <prot> ::= ("" OR <action>=<val>&<action>=<val> ...)
		nahSaveCookie = true;
		nahDoLangsRev();
		theCookie = nahReadCookie("prototypeArticles");
		theCookie = "|" + theCookie; // to create indexes 1-5
		theCookie = theCookie.split("|");
		for (nahTemplateId=1; nahTemplateId<=5; nahTemplateId++) { // each prototype
			if (!theCookie[nahTemplateId] || theCookie[nahTemplateId] == "") {
				continue;
			}
			nahTemplates[nahTemplateId] = {};
			nahCurTemplate = nahTemplateId;
			thisProt = theCookie[nahTemplateId].split("&");
			for (i=0; i<thisProt.length; i++) {
				tmpAction = thisProt[i].split("=");
				if (tmpAction[1]) {
					nahSet(unescape(tmpAction[0]), "update", unescape(tmpAction[1]), true);
				}
			}
		}
		document.getElementById("nahCookieSettingsOn").style.display = "inline";
		document.getElementById("nahCookieSettingsOff").style.display = "none";
		nahUpdateCookie(); // should re-set the cookie so it won't disappear
	}
	nahUpdateInsertableTemplates();
} // end: nahInit()

function nahDoLangsRev() {
	if (!nahLangsRev) {
		nahLangsRev = {};
		for (nahTmpCode in nahLangs)
			nahLangsRev[ nahLangs[nahTmpCode] ] = nahTmpCode;
	}
} // end: nahDoLangsRev()

function nahSettings(nahTemplateId) {
	if (nahTemplateId == 0) {
		allUsed = true;
		for (i=1; i<=5; i++)
			if (!nahTemplates[i])
				allUsed = false;
		if (allUsed) {
			alert("Du kan max skapa 5 prototypartiklar. Vill du skapa en ny måste du ta bort en av de du redan skapat eller så kan du ändra en gammal.");
			return;
		}
		
		// confusing if it has the same name as any other - add (2) or change the number
		tmpName = nahTemplates[0]["name"];
		for (i=1; i<=5; i++) {
			if (nahTemplates[i] && nahTemplates[i]["name"] == tmpName) {
				tmpName = tmpName.split(" (");
				if (tmpName[ tmpName.length-1 ] == parseInt(tmpName[ tmpName.length-1 ])+")" )
					tmpName[ tmpName.length-1 ] = (1+parseInt(tmpName[ tmpName.length-1 ]))+")";
				else
					tmpName[ tmpName.length ] = "2)";
				tmpName = tmpName.join(" (");
			}
		}
		nahTemplates[0]["name"] = tmpName;

	}
	
	// now is the time to create reversal of nahLangs, if it hasn't already been done
	nahDoLangsRev();
	
	nahCurTemplate = nahTemplateId;
	document.getElementById("nahSettingsTitle").innerHTML = (nahTemplateId==0 ? "Infoga en (ny) prototypartikel" : "Redigera din prototypartikel &quot;" + nahHtmlEscape(nahTemplates[nahTemplateId]["name"]) + "&quot;");
	document.getElementById("nahEditSettings").style.display = "block";
	nahGoToStep(1);
	
	nahUpdateNameInput();
	
	// the rest
	for (nahTempRow in nahGenericArticle) {
		if (nahGenericArticle[nahTempRow][0] == "\n") // new row or required row (=no special alternatives used)
			continue;
		if (nahTemplates[nahTemplateId][nahTempRow]) { // if this setting should be used
			nahSet(nahTempRow, "update", nahTemplates[nahTemplateId][nahTempRow]); // re-set the already set setting
		}
	}
	
} // end: nahSettings()

function nahCloseSettings() {
	document.getElementById("nahEditSettings").style.display = "none";
	document.getElementById("nahLangStatusError").style.display = document.getElementById("nahLangStatusOk").style.display = document.getElementById("nahLangStatusOkCode").style.display = "none";
	for (tmpPoS in nahPoSs)
		document.getElementById("nahPoS_" + tmpPoS).className = "";
	document.getElementById("nahStep1").style.display = "none";
	document.getElementById("nahStep2").style.display = "none";
	for (i in nahGenericArticle) {
		if (document.getElementById("nahRows_" + i) && document.getElementById("nahRows_" + i + "_link")) {
			document.getElementById("nahRows_" + i).innerHTML = "[ ]";
			document.getElementById("nahRows_" + i + "_link").className = "";
		}
		if (document.getElementById("nahRows_" + i + "_custom")) {
			document.getElementById("nahRows_" + i + "_custom").style.display = "none";
			document.getElementById("nahRows_" + i + "_custom").innerHTML = "";
		}
	}
	nahUpdateInsertableTemplates();
	nahUpdateCookie();
} // end: nahCloseSettings()

function nahGoToStep(step) {
	document.getElementById("nahStep1").style.display = "none";
	document.getElementById("nahStep2").style.display = "none";
	document.getElementById("nahStep" + step).style.display = "block";
	document.getElementById("nahCloseButton").focus();
} // end: nahGoToStep()

function nahSet(action, value, param, loading) {
	if (action=="name") {
		param = param.replace(/^\s*/, ""); // ltrim
		param = param.replace(/\s*$/, ""); // rtrim
		if (param == "")
			return; // don't set
		nahTemplates[nahCurTemplate]["name"] = param;
		return;
	} else if (action=="act" && value=="update") {
		// simple representation: act=7,8,16
		param = param.split(",");
		for (co=0; co<param.length; co++)
			nahTemplates[nahCurTemplate][ param[co] ] = true;
		return;
	}
	
	updated = false;
	updateChoices = (value == "toggle" || value == "update");
	tempActive = (value == "update");
	nahDontUpdate = false;
	action += ""; // convert to string

	switch (action) {
		case "1": // language
			nahDontUpdate = true;
			if (value == "update") {
				document.getElementById("nahLangInput").value = nahLangs[param];
				nahLangName = nahLangs[param];
			} else if (value == "set name") {
				nahLangName = document.getElementById("nahLangInput").value.toLowerCase();
			}
			
			if (nahLangsRev[nahLangName]) {
				value = nahLangsRev[nahLangName];
				document.getElementById("nahLangStatusError").style.display = "none";
				document.getElementById("nahLangStatusOk").style.display = "inline";
				document.getElementById("nahLangStatusOkCode").style.display = "none";
				document.getElementById("nahLangStatusCode").innerHTML = value;
				nahTemplates[nahCurTemplate][1] = value;
			} else if (nahLangs[nahLangName]) { // input was actually lang code
				document.getElementById("nahLangStatusError").style.display = "none";
				document.getElementById("nahLangStatusOk").style.display = "none";
				document.getElementById("nahLangStatusOkCode").style.display = "inline";
				document.getElementById("nahLangStatusName").innerHTML = nahLangs[nahLangName];
				nahTemplates[nahCurTemplate][1] = nahLangName;
			} else {
				document.getElementById("nahLangStatusError").style.display = "inline";
				document.getElementById("nahLangStatusOk").style.display = "none";
				document.getElementById("nahLangStatusOkCode").style.display = "none";
			}
			break;
		case "2": // part of speech
			nahDontUpdate = true;
			if (value == "update") {
				value = param;
			} else {
				document.getElementById("nahPoS_" + nahTemplates[nahCurTemplate][2]).className = "";
			}
			if (!loading)
				document.getElementById("nahPoS_" + value).className = "selected";
			nahTemplates[nahCurTemplate][2] = value;
			break;
		case "6": // definition row
			if (value == "update") {
				document.getElementById("nahRows_6_custom").innerHTML = "<code id=\"nahRows_6_cat_active\">[ ]</code> <a href=\"javascript:nahSet(6, &quot;cat-click&quot;);\" id=\"nahRows_6_cat_link\">Ha med <code>{{kat}}</code>-mall</a> <span id=\"nahRows_6_cat\">på formatet <code>{{kat|<input type=\"text\" id=\"nahRows_6_cat_input\" onblur=\"nahSet(6, &quot;cat-update&quot;, this.value);\">|språk=<i>&lt;språk&gt;</i>}}</code></span>";
				document.getElementById("nahRows_6_custom").style.display = "block";
			}
			if (value == "cat-click") {
				param = nahTemplates[nahCurTemplate][6] = (nahTemplates[nahCurTemplate][6] == "-"?"kat=":"-");
				value = "update";
			}
			if (value == "update") {
				isAct = (nahTemplates[nahCurTemplate][6] != "-");
				document.getElementById("nahRows_6_cat").style.display = (isAct?"inline":"none");
				document.getElementById("nahRows_6_cat_link").className = (isAct?"selected":"");
				document.getElementById("nahRows_6_cat_active").innerHTML = (isAct?"[X]":"[ ]");
				if (isAct)
					document.getElementById("nahRows_6_cat_input").value = (nahTemplates[nahCurTemplate][6]==" "?"":nahTemplates[nahCurTemplate][6]);
			}
			if (value == "cat-update") {
				param = param.replace(/^[\s\|]*/, ""); // trim spaces and |
				param = param.replace(/[\s\|]*$/, "");
				if (param == "-" || param == "") // dash shouldn't be used, but shouldn't give too unexpected results; can't store ""
					param = " ";
			}
			value = param;
			updateChoices = false;
			break;
	}
	if (value == "toggle") { // for simple toggle sections
		if (!updated)
			nahTemplates[nahCurTemplate][action] = tempActive = !nahTemplates[nahCurTemplate][action];
		else
			tempActive = nahTemplates[nahCurTemplate][action];
	}
	
	if (updateChoices && !loading) {
		if (document.getElementById("nahRows_" + action) && document.getElementById("nahRows_" + action + "_link")) {
			document.getElementById("nahRows_" + action).innerHTML = (tempActive?"[X]":"[ ]");
			document.getElementById("nahRows_" + action + "_link").className = (tempActive?"selected":"");
		}
		if (!tempActive)
			document.getElementById("nahRows_" + action + "_custom").innerHTML = "";
	}
	else if (!nahDontUpdate) {
		nahTemplates[nahCurTemplate][action] = value;
	}
} // end: nahSet()

function nahUpdateNameInput() {
	document.getElementById("nahNameInput").value = nahTemplates[nahCurTemplate]["name"];
} // end: nahUpdateNameInput()

function nahInsert(nahTemplateId, mode) {
	if (mode == "new") {
		if (nahTemplateId == 0) { // save a new template
			for (i=1; i<=5; i++)
				if (!nahTemplates[i])
					break;
			if (nahTemplates[i]) { // no empty template spaces - something's wrong
				alert("Något i det här skriptet har gått fel. Ladda om sidan så bör det fungera igen.");
				nahCloseSettings();
				return;
			}
			nahNumInsertedNewTemplates++;
			nahTemplates[i] = nahClone(nahTemplates[0]);
			nahTemplateId = i;
		}
		nahUpdateCookie();
		nahUpdateInsertableTemplates();
	}
	
	// replace {{ingen artikel}}
	nahAllText = document.getElementById("wpTextbox1").value;
	if (nahAllText.indexOf("{{ingen artikel") != -1) {
		nahAllText = nahAllText.replace("{{ingen artikel}}", "");
		nahAllText = nahAllText.replace(/\{\{ingen artikel\|([^\}]*)\}\}/, "{{se även|$1}}\n\n");
		document.getElementById("wpTextbox1").value = nahAllText;
		nahAllText = false;
	}
	
	// and now the actual inserting
	nahText = "";
	for (row in nahGenericArticle)
		if (nahTemplates[nahTemplateId][row])
			nahText += nahGeneratedText(nahTemplateId, row);
		else if (nahGenericArticle[row][0] == "\n")
			nahText += "\n";
	
	nahText = nahText.replace(/^\s*/, ""); // ltrim
	nahText = nahText.replace(/\s*$/, ""); // rtrim
	
	nahText = nahText.split("<separator>");
	if (nahText.length == 2)
		insertTags(nahText[0], nahText[1], "<skriv definitionen här>");
	else {
		alert("Det verkar som om definitionsraden inte kom med. Var även uppmärksam på andra fel.");
		insertTags(nahText[0], "", "");
	}
	nahCloseSettings();
} // end: nahInsert()


function nahForgetMe() {
	if (confirm("Är du helt säker på att du vill ta bort alla dina prototypmallar?\nDetta går inte att ångra!\n(den cookie som lagrar datan kommer att raderas)")) {
		nahSaveCookie = false;
		for (i=1; i<=5; i++)
			nahTemplates[i] = false;
		nahUpdateCookie();
		nahCloseSettings();
	}
} // end: nahForgetMe()

function nahRememberMe() {
	if (confirm("Om du väljer att komma ihåg prototypmallar sparas dessa i en cookie och när du redigerar en annan sida dyker de upp.\nBekräfta att du vill göra detta.")) {
		nahSaveCookie = true;
		nahUpdateCookie();
		if (nahReadCookie("prototypeArticles") == null) {
			alert("Det går inte att spara cookien i din webbläsare.\nAktivera cookies för denna funktionalitet.");
			nahSaveCookie = false;
			nahUpdateCookie();
		}
	}
} // end: nahRememberMe()

function nahUpdateCookie() {
	if (nahSaveCookie) {
		theCookie = [""];
		for (i=1; i<=5; i++) {
			theCookie[i] = "";
			headers = "";
			if (typeof nahTemplates[i] == "object") {
				for (j in nahTemplates[i]) {
					if (typeof nahTemplates[i][j] == "boolean")
						if (nahTemplates[i][j])
							headers += ","+escape(j); // simpler representation: act=7,9,16
						else
							theCookie[i] += "&" + escape(j) + "="; // false represented by empty string
					else
						theCookie[i] += "&" + escape(j) + "=" + escape(nahTemplates[i][j]);
				}
			}
			if (headers != "")
				theCookie[i] += "&act="+headers.substring(1);
			if (theCookie[i] != "")
				theCookie[i] = theCookie[i].substring(1);
			
		}
		theCookie = theCookie.join("|");
		theCookie = theCookie.substring(1);
		
		nahCreateCookie("prototypeArticles", theCookie, 30);
		document.getElementById("nahCookieSettingsOn").style.display = "inline";
		document.getElementById("nahCookieSettingsOff").style.display = "none";
	} else {
		nahEraseCookie("prototypeArticles");
		document.getElementById("nahCookieSettingsOn").style.display = "none";
		document.getElementById("nahCookieSettingsOff").style.display = "inline";
	}
} // end: nahUpdateCookie()

function nahUpdateInsertableTemplates() {
	nahHTML = "Dina prototypartiklar <small>(infogas när du klickar på namnet)</small>: ";
	nahFirst = true;
	for (i=1; i<=5; i++) {
		if (nahTemplates[i]) {
			if (nahFirst) nahFirst = false;
			else nahHTML += " &mdash; ";
			nahHTML += "<b><a href=\"javascript:nahInsert("+i+");\" title=\"Infoga denna prototypartikel\">" + nahHtmlEscape(nahTemplates[i]["name"]) + "</a></b> <small><a href=\"javascript:nahSettings("+i+");\" title=\"Ändra denna prototypartikel\">[+/-]</a> <a href=\"javascript:nahDeleteTemplate("+i+");\" title=\"Ta bort denna prototypartikel\">[&times;]</a></small>";
		}
	}
	if (nahFirst) // no templates created
		nahHTML = "";
	document.getElementById("nahInsertableTemplates").innerHTML = nahHTML;
	document.getElementById("nahInsertableTemplates").style.display = (nahHTML==""?"none":"block");
} // end: nahUpdateInsertableTemplates()

function nahDeleteTemplate(nahTemplateId) {
	if (confirm("Är du helt säker på att du vill ta bort din prototypartikel \""+nahTemplates[nahTemplateId]["name"]+"\"?\nDetta kan inte ångras.")) {
		nahTemplates[nahTemplateId] = false;
		nahUpdateInsertableTemplates();
		nahUpdateCookie();
	}
} // end: nahDeleteTemplate()

// NAH specific functions end here, but since it isn't included anywhere else we
// need a few extra that could be used in any script

function nahClone(myObj) {
	if (typeof myObj != "object") return myObj;
	if (myObj == null) return myObj;

	var myNewObj = new Object();
	for (var tmpKey in myObj)
		myNewObj[tmpKey] = nahClone(myObj[tmpKey]);
	return myNewObj;
}

function nahHtmlEscape(str) {
	str = str.replace(/&/g, "&amp;");
	str = str.replace(/</g, "&lt;");
	str = str.replace(/>/g, "&gt;");
	str = str.replace(/"/g, "&quot;");
	return str;
}

function nahCreateCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function nahReadCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function nahEraseCookie(name) {
	nahCreateCookie(name,"",-1);
}

$(nahInit);