// ## xtd:  Ondersteunt de namen raden functie ##
// ## xtd2: Ondersteunt weergave antwoorden: * extra id "questionsection" in parent html file, 
// ##       * Dynamische opbouw aantalVragen Select tag (options tags van aantalVragen Select tag uit parent html file.)
// ## xtd3: Ondersteunt spellingcontrole variatie
// ## xtd4: Ondersteunt afdrukken oefenexemplaar (afbeelding + namen)
// ## xtd4a: Ondersteunt selectbox met samengestelde karakters.
// ## xtd4b: Ondersteunt meerdere plaatsnamen per item (gescheiden door ; )
// ##				 (4a->4b geen aanpassen in parent;)

var bgcolorDefault = '#FFFFFF';
var bgcolorOK      = '#33CC00';
var bNaamraden;      // Naamraden (true) of Plaatsaanwijzen (false)
var iNiveauItems;    // actuele aantal items zoals geselecteerd
var arrAlGevraagd;   // de gestelde vragen (true of false)
var arrAntwoorden;	 // de ingevoerde antwoorden (string met itemnr (aanwijzen) of naam (naamraden)).
var iAantalVragen;   // aantal te stellen vragen
var bsSpelLevel;     // spellingcontrole niveau (bitwise string)
var iItemNr;         // betreffend plaats in array met topo items
var iPunten;         // aantal goedbeantwoorde vragen
var iVragen;         // aantal gestelde vragen
var iLevel;          // moeilijkheidsniveau (1, 2 of 3)
var arrTopoItems = new Array();
var oaV;             // select form aantalvragen tbv uitlezen/zetten waarden
var omN;             // select form moeilijkheids niveau tbv uitlezen/zetten waarden


// deze functie wordt niet aangeroepen, alleen gebruikt in editor als inhoudsopgave.
function dummyIndex() {
	test();
	validateInput();        //(arg1)
	validateAanwijzen();    //(sInput, sAnswer)

	suppressIntroText();
	suppressSpecialChars(); // (sInput, bitLevel)
	
	initMoeilijkheidsNiveau();
	setMoeilijkheidsNiveau(); // (form)
	
	initSpelLevel();			// (bShow)
	initSpelLevelAntwoorden();
	getSpelLevel();         // (form)
	setSpelLevel();         // (form)
	
	setLevel();             // (iLevel)
	initAantalVragen();
	setAantalVragen();      // (form)
	
	geefAntwoorden();       // (bEersteGeefAntwoorden)
	terugNaarVragen();
	
	setHelpteksten();       // (ElementById)
	
	setSpecialCharsHtml();  // generates html for select tag specials chars options
	addSpecialChar(form);

	init();
	
	getSelectedOption();    // (form)
	submitenter();          // (myfield,e)
	findLocation();         // (lokatieId)
	
	oefenbladAfdrukken();		// 
}

function test() {
	var sTxtVraag;     // gebruikt voor naamraden of plaatsaanwijzen tekst 
	//alert('in test: iNiveauItems =' + iNiveauItems);
	//alert('in test: iAantalVragen =' + iAantalVragen);
	
	// ophogen waarden volgende vraag
	iVragen++;
	document.getElementById('vak').style.background = bgcolorDefault;
	document.getElementById('doorgaan').disabled = true;
	document.getElementById('txtAntwoord').innerHTML = "&nbsp;<BR>&nbsp;<BR>&nbsp;";
	document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + iVragen;
	document.getElementById('txtPunten').innerHTML = textFuTest[langCodeCS][1] + iPunten +
						(iVragen > 1 ? "&nbsp;&nbsp;&nbsp;<button id=\"antwoorden\" onclick=\"geefAntwoorden(true)\" title=\"" + textFuTest[0][2] + "\">&nbsp;" + textFuTest[langCodeCS][3] + "&nbsp;</button>" : "");

	// kies volgende plaats
	iItemNr = rand(iNiveauItems);
	// todo: nog een loopdetectie in plaatsen.
	while (arrAlGevraagd[iItemNr]) { // zoek volgende als al gevraagd  (=true)
		iItemNr++;
		if (iItemNr > iNiveauItems) iItemNr = 1; // einde van array set naar begin
	}
	arrAlGevraagd[iItemNr] = true;
	//alert('iItemNr=' + iItemNr);

	// stel vraag
	sTxtVraag = '';
	//alert(bNaamraden);
	if (bNaamraden) {
		//alert(bNaamraden)
		sTxtVraag += textFuTest[langCodeCS][4] + '<B>' + arrTopoItems[iItemNr][1] + '</B>:<!--BR-->';
		sTxtVraag += '<FORM name="naamraden">';
		// ORG: sTxtVraag += '<INPUT name="plaatsnaam" type="text" size="35" maxlength="40">';
		sTxtVraag += '<INPUT name="plaatsnaam" type="text" size="29" maxlength="50" onKeyPress="return submitenter(this,event)">';
		sTxtVraag += setSpecialCharsHtml();
		sTxtVraag += '<button id="testnaam" onclick="validateInput(document.forms[\'naamraden\'].plaatsnaam.value)" title="' + textFuTest[langCodeCS][6] + '">&nbsp;?&nbsp;</button>';
		sTxtVraag += '</FORM>';
	} else {
		sTxtVraag += textFuTest[langCodeCS][5] + '<SPAN class="txtPlaats">' + arrTopoItems[iItemNr][0].split(";")[0] + '</SPAN>';
	}
	document.getElementById('txtVraag').innerHTML = sTxtVraag;
	document.getElementById('opnieuw').disabled = false;
	if (bNaamraden) {
		// focus hieronder gaat alleen goed als ik een alert doe (maar altijd wel na een goed antwoord:-((;
		document.getElementById('naamraden').plaatsnaam.focus(); // werkt nog niet
	}
}

function validateInput(arg1) {
	// alleen valideren bij Aanwijzen
	// of Naamraden met als invoer een naam met een lengte > 1 (a..z onderdrukken)
	// Onderdrukt niet 'II' en hoger ) om te voorkomen dat namen met lengte 2 worden onderdrukt.
	// Onderdrukt ook input naamraden welke begint met een cijfer, zoals 9peize.

	var bAntwInArray;
	suppressIntroText(); // onderdruk de introductie-keywords tekst met lokaties ivm afkijken.

	if ( !bNaamraden 
			 || ( bNaamraden && isNaN(parseInt(arg1)) && arg1.length > 1 )
		 )
	{
		//alert('validateInput(' + arg1 + '), iItemNr=' + iItemNr); // test purposes
		if (document.getElementById('doorgaan').disabled == false) return;
		if (bNaamraden) {
			document.forms['naamraden'].plaatsnaam.disabled = true;
		}
		//alert('arg1 ==  arrTopoItems[' + iItemNr + '][1] \n' + arg1 + '    ==     ' + arrTopoItems[iItemNr][1]);
		arrAntwoorden[iItemNr] = arg1;

		for (var j=1; j<=arrTopoItems[iItemNr][0].split(";").length; j++ ) {
			if (   (  bNaamraden && ( suppressSpecialChars(arg1, bsSpelLevel).toString() == suppressSpecialChars(arrTopoItems[iItemNr][0].split(";")[j-1], bsSpelLevel).toString() ) )
				|| ( !bNaamraden && validateAanwijzen(arg1, arrTopoItems[iItemNr][1]) ) ) bAntwInArray = true;
			//alert('arrTopoItems[iItemNr][0]='+arrTopoItems[iItemNr][0]);
			//alert( suppressSpecialChars(arg1, bsSpelLevel).toString() + '==' + suppressSpecialChars(arrTopoItems[iItemNr][0].split(";")[j-1], bsSpelLevel).toString() );
		}		
		if (bAntwInArray) {
			//alert('OK');
			document.getElementById('vak').style.background = bgcolorOK;
			document.getElementById('txtAntwoord').innerHTML = "<BR><SPAN class=txtAntwoordAntw>" + textFuValIn[langCodeCS][0] + "</SPAN><BR>&nbsp;";
			document.getElementById('txtVraag').innerHTML = "<B>" + arrTopoItems[iItemNr][0].split(";")[0] + "</B>";
			iPunten++;
			document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + iVragen;
			document.getElementById('txtPunten').innerHTML = textFuTest[langCodeCS][1] + iPunten + 
				"&nbsp;&nbsp;&nbsp;<button id=\"antwoorden\" onclick=\"geefAntwoorden(true)\" title=\"" + textFuTest[0][2] + "\">&nbsp;" + textFuTest[langCodeCS][3] + "&nbsp;</button>";
			document.getElementById('doorgaan').disabled = false;
			document.getElementById('opnieuw').disabled = true;
		} else {
			var sFout = "<SPAN class=txtAntwoordText>" + textFuValIn[langCodeCS][1] + "</SPAN><BR><SPAN class=txtAntwoordAntw>";
			if (!bNaamraden) {
				//alert('NOK');
				var gevonden = false;
				// Uitzoeken welk array item werd geselecteerd ?
				//for (var n=0; (n <= iTotalItems && !gevonden); n++) {
				for (var n=0; (n <= arrAantalInNiveau[3] && !gevonden); n++) {
					if (arrTopoItems[n][1] == arg1) gevonden = true;
				}
				//alert('n=' + n);
				// todo: dubbele code opschonen in if lus :-(
				//alert(sFout);
				sFout += arrTopoItems[n-1][0].split(";")[0];
			}	else {
				sFout += arrTopoItems[iItemNr][0].split(";")[0];
			}
			//alert(sFout);
			sFout += "<BR><SPAN class=txtAntwoordText>" + textFuValIn[langCodeCS][4] + "</SPAN>";
			//alert(sFout);
			document.getElementById('txtAntwoord').innerHTML = sFout;
			document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + iVragen;
			document.getElementById('txtPunten').innerHTML = textFuTest[langCodeCS][1] + iPunten +
								"&nbsp;&nbsp;&nbsp;<button id=\"antwoorden\" onclick=\"geefAntwoorden(true)\" title=\"" + textFuTest[0][2] + "\">&nbsp;" + textFuTest[langCodeCS][3] + "&nbsp;</button>";
			document.getElementById('doorgaan').disabled = false;
			document.getElementById('opnieuw').disabled = false;
		}
		// controleer of max aantal vragen is gesteld (of aantal elementen op basis van niveau
		//iAantalVragen = 4; // moet worden uitgecommentarieerd is nl. alleen voor testdoeleinden!
    if (iVragen >= iAantalVragen || iVragen >=iNiveauItems ) {
			alert(textFuValIn[langCodeCS][2]);
			document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + 
				iVragen + textFuValIn[langCodeCS][3];
			document.getElementById('doorgaan').disabled = true;
			document.getElementById('opnieuw').disabled = false;
			geefAntwoorden(true); // laat de eindscore zien.
		}
		else {
			document.getElementById('doorgaan').focus();
		}
	}
}

// Deze functie controleert ingevoerde anwoord met correct anwoord in geval van Plaats aanwijzen.
// Hierbij geen spellingcontrole en daarmee conversie nodig.
function validateAanwijzen(sInput, sAnswer) {
	return (sInput == sAnswer);
}

// deze functie onderdrukt de inleidende tekst met keywords welke alleen tot de start van
// de test mag worden getoond ivm afkijken. Wordt aangeroepen in ValidateInput()
function suppressIntroText() {
	if (document.getElementById('introkeytekst').innerHTML.length > 0) {
		 document.getElementById('introkeytekst').innerHTML = '';
	}
}

// Deze functie converteert een inputstring naar een outputstring obv gewenste onderdrukking van speciale karakters.
// Dit wordt gebruikt bij Naamraden.
// De mogelijke spellingcontrole levels worden bitwise vastgelegd
// xxx: bitwise
// 1  : controleren op correcte gebruik van hoofdletters.
//  1 : controleren op correct gebruik van leestekens, zoals -,'<spatie>
//   1: controleren op correct gebruik van gecombineerd unicode karakters, zoals éëèñ
// voorbeeld: de waarde 011 zal niet niet hoofdletters controleren maar wel op correct gebruik van leestekens en samengestelde karakters.
//            de waarde 000 zal nergens op controleren, dus alles converteren.
function suppressSpecialChars(sInput, bitLevel) {
	var osInput = new String(sInput);
	//var osBitLevel;
	var i, sChar;
	var sConverted100 =''; // resulterende tmp string na lowercase conversie
	var sConverted010 =''; // resulterende tmp string na leestekens conversie
	var sConverted001 =''; // resulterende tmp string na karakter conversie
	var sConverted    =''; // resulterende final string na karakter conversie

	//alert('sInput=' + osInput + ', bitLevel=' + bitLevel); // [dev]
	//for (i=0; i<osInput.length; i++) {
	//	sTmp += osInput.charCodeAt(i) + ' ';
	//}

	// 010 : leestekens e.d onderdrukken ?
	//alert('010 (leestekens): ' + bitLevel + ' + 010 = ' + (bitLevel & '010')); // [dev]
	if ( (bitLevel & '010') == '000' ) {
		for (i=0; i<osInput.length; i++) {
		
			//alert('charCodeAt(' + i + ')=' + osInput.charCodeAt(i));
			switch (osInput.charCodeAt(i)) {
				// leestekens: <spatie>:32, ":34, &:38, ':39, ,:44, -:45, .:46 
				case 32: case 34: case 38: case 39: case 44: case 45: case 46:
					sChar = '';
					break;		
	
				default: // geen special karakter om te vervangen.
					sChar = osInput.charAt(i);
			}
			//alert('sChar=' + sChar);
			sConverted010 += sChar;
		}
		//alert('sConverted010 = ' + sConverted010); // [dev]
		osInput = sConverted010;
	}

	// 001 :  samensgestelde karakters onderdrukken
	//        belangrijkste: á acute, ç cedilla, ê circumflex, ò grave, ñ tilde, ü umlaut
	//alert('001 (karakters): ' + bitLevel + ' + 001 = ' + (bitLevel & '001')); // [dev]
	if ( (bitLevel & '001') == '000' ) {
		for (i=0; i<osInput.length; i++) {
			//alert('charCodeAt(' + i + ')=' + osInput.charCodeAt(i)); // [dev]
			switch (osInput.charCodeAt(i)) {
				// a varianten: à:224, á:225, â:226, ã:227, ä:228, å:229, æ:230 )
				case 224: case 225: case 226: case 227: case 228: case 229: case 230:
					sChar = 'a';
					break;
				// A varianten: À:192, Á:193, Â:194, Ã:195, Ä:196, Å:197, Æ:198 
				case 192: case 193: case 194: case 195: case 196: case 197: case 198:
					sChar = 'A';
					break;
				// b varianten: ß:223
				case 223:
					sChar = 'b';
					break;
				// c varianten: ç:231
				case 231:
					sChar = 'c';
					break;
				// C varianten: Ç:199
				case 199:
					sChar = 'C';
					break;
				// e varianten: è:232, é:233, ê:234, ë:235
				case 232: case 233: case 234: case 235:
					sChar = 'e';
					break;
				// E varianten: È:200, É:201, Ê:202, Ë:203
				case 200: case 201: case 202: case 203:
					sChar = 'E';
					break;
				// i varianten: ì:236, í:237, î:238, ï:239
				case 236: case 237: case 238: case 239:
					sChar = 'i';
					break;
				// I varianten: Ì:204, Í:205, Î:206, Ï:207
				case 204: case 205: case 206: case 207:
					sChar = 'I';
					break;
				// n varianten: ñ:241
				case 241:
					sChar = 'n';
					break;
				// N varianten: Ñ:209
				case 209:
					sChar = 'N';
					break;
				// o varianten: ò:242, ó:243, ô:244, õ:245, ö:246, ø:248
				case 242: case 243: case 244: case 245: case 246: case 248:
					sChar = 'o';
					break;
				// O varianten: Ò:210, Ó:211, Ô:212, Õ:213, Ö:214, Ø:216
				case 210: case 211: case 212: case 213: case 214: case 216:
					sChar = 'O';
					break;
				// u varianten: ù:249, ú:250, û:260, ü:261
				case 249: case 250: case 260: case 261:
					sChar = 'u';
					break;
				// U varianten: Ù:217, Ú:218, Û:219, Ü:220
				case 217: case 218: case 219: case 220:
					sChar = 'U';
					break;
				// y varianten: ý:253, ÿ:255
				//case 253: case 255:
				//	sChar = 'y';
				//	break;
				// Y varianten: Ý:221
				case 221:
					sChar = 'Y';
					break;
				default: // geen special karakter om te vervangen.
					sChar = osInput.charAt(i);
			}
			//alert('sChar=' + sChar);
			sConverted001 += sChar;
		}
		//alert('sConverted001 = ' + sConverted001); // [dev]
		osInput = sConverted001;
	}
	
	// 100 : lowercase conversie
	//alert('100 (lowercase): ' + bitLevel + ' + 100 = ' + (bitLevel & '101'));
	if ( (bitLevel & '100') == '000' ) {
		sConverted100 = osInput.toLowerCase()
		osInput = sConverted100;
		//alert('sConverted100 = ' + sConverted100); // [dev]
	}

	sConverted = osInput;
	//alert(sInput + ' > ' + sConverted);
	return sConverted;
}

// Deze functie crëert de Spellingcontrole input/tekst blok.
// de parameter bShow biedt de mogelijkheid om dit tekstblok al dan niet te onderdrukken (false bij Plaatsaanwijzen)
function initSpelLevel(bShow) {
	var htmlSpelControle = '';
	var sTitleA = textInSpelL[langCodeCS][0];
	var sTitleB = textInSpelL[langCodeCS][1];
	var sTitleC = textInSpelL[langCodeCS][2];
	
  htmlSpelControle += '<B>' + textInSpelL[langCodeCS][3] + '</B>';
  htmlSpelControle += '&nbsp;<IMG src="img/rest/ico_info.gif" class="helpImg" border="0" onmouseover="showHelp(\'help.spelling\');" onmouseout="showHelp(\'help.spelling\');">';
  htmlSpelControle += '<div  id="help.spelling" class="helpDiv"><span class="helpHeader">' + textInSpelL[langCodeCS][3] + '</span>' + textInSpelL[langCodeCS][4] + '</div>';
  htmlSpelControle += '&nbsp;';
  htmlSpelControle += '<INPUT name="spelA" type="checkbox" value="100" title="' + sTitleA + '" onclick="getSpelLevel(this.form)" CHECKED><SPAN title="' + sTitleA + '">' + textInSpelL[langCodeCS][5] + '<BR>';
  htmlSpelControle += '<INPUT name="spelB" type="checkbox" value="010" title="' + sTitleB + '" onclick="getSpelLevel(this.form)" CHECKED><SPAN title="' + sTitleB + '">' + textInSpelL[langCodeCS][6];
  htmlSpelControle += '<INPUT name="spelC" type="checkbox" value="001" title="' + sTitleC + '" onclick="getSpelLevel(this.form)" CHECKED><SPAN title="' + sTitleC + '">' + textInSpelL[langCodeCS][7];

	if (bShow) {
		document.getElementById('fspelcontrolForm').innerHTML = htmlSpelControle;
	} else {
		document.getElementById('fspelcontrolForm').innerHTML = '';
	}
}


// Deze functie crëert de Spellingcontrole input/tekst blok bij het antwoorden overzicht.
function initSpelLevelAntwoorden() {
	var htmlSpelControle = '';
	var sTitleA = textInSpelL[langCodeCS][0];
	var sTitleB = textInSpelL[langCodeCS][1];
	var sTitleC = textInSpelL[langCodeCS][2];

	//alert('initSpelLevelAntwoorden(): ' + bsSpelLevel);
		
	htmlSpelControle += '<B><SPAN title="' + textInSpelL[langCodeCS][4] + '">' + textInSpelL[langCodeCS][3] + ' [?]</SPAN>:</B>&nbsp;';
	htmlSpelControle += '<INPUT name="spelA" type="checkbox" value="100" title="' + sTitleA + '" onclick="getSpelLevel(this.form);geefAntwoorden(false);" ' + ( (bsSpelLevel & '100') == '100' ? 'CHECKED' : '' ) + '><SPAN title="' + sTitleA + '">' + textInSpelL[langCodeCS][5] + '<BR>';
	htmlSpelControle += '<INPUT name="spelB" type="checkbox" value="010" title="' + sTitleB + '" onclick="getSpelLevel(this.form);geefAntwoorden(false);" ' + ( (bsSpelLevel & '010') == '010' ? 'CHECKED' : '' ) + '><SPAN title="' + sTitleB + '">' + textInSpelL[langCodeCS][6];
	htmlSpelControle += '<INPUT name="spelC" type="checkbox" value="001" title="' + sTitleC + '" onclick="getSpelLevel(this.form);geefAntwoorden(false);" ' + ( (bsSpelLevel & '001') == '001' ? 'CHECKED' : '' ) + '><SPAN title="' + sTitleC + '">' + textInSpelL[langCodeCS][7];
	document.getElementById('fspelcontrolForm').innerHTML = htmlSpelControle;
}

// Deze functie bepaalt de SpellingControle niveau variabele aan als er een wijziging wordt aangeklikt.
function getSpelLevel(form) {
	//alert('getSpelLevel(' + form.name.toString() + ')');
	bsSpelLevel = '';
	//bsSpelLevel = '';	alert('bsSpelLevel0=' + bsSpelLevel);
	(form.spelA.checked ? bsSpelLevel += '1' : bsSpelLevel += '0'); 
	//alert('bsSpelLevelA=' + bsSpelLevel);
	(form.spelB.checked ? bsSpelLevel += '1' : bsSpelLevel += '0');
	//alert('bsSpelLevelB=' + bsSpelLevel);
	(form.spelC.checked ? bsSpelLevel += '1' : bsSpelLevel += '0');
	//alert('bsSpelLevelC=' + bsSpelLevel);
	//alert('nwe bsSpelLevel=' + bsSpelLevel);
}

// Deze functie zet de vinkjes bij SpellingControle op juiste wijze aan of uit obv bsSpelLevel waarde.
// Wordt gebruikt na terugkeren van geefAntwoorden naar vragen blok.
function setSpelLevel(form) {
	//alert('setSpelLevel(' + form.name.toString() + ') \n bsSpelLevel=' + bsSpelLevel);
	//bsSpelLevel = '';	alert('bsSpelLevel0=' + bsSpelLevel);
	( ((bsSpelLevel & '100') == '100') ? form.spelA.checked = true : form.spelA.checked = false );
	( ((bsSpelLevel & '010') == '010') ? form.spelB.checked = true : form.spelB.checked = false );
	( ((bsSpelLevel & '001') == '001') ? form.spelC.checked = true : form.spelC.checked = false );
}

// Deze functie past het aantal vragen aan aan de ingestelde moeilijkheidsniveau
// zodat aantal vragen nooit meer kan zijn dan aantal vragen in de moeilijkheidsgraad.
function setLevel(iLevelPriv) {
	//var oaV = document.forms["faantalVragen"].aantalVragen;
	//alert('setLevel(' + iLevel + ')');
	iNiveauItems = arrAantalInNiveau[iLevelPriv];
	//alert('1. iNiveauItems= ' + iNiveauItems  + ', iAantalVragen= ' + iAantalVragen);
	// pas eventueel het aantal vragen aan, want kan nooit meer zijn dan het aantal items bij dit niveau.
	if (iNiveauItems < iAantalVragen) {
		iAantalVragen = iNiveauItems;
		oaV.options[iLevelPriv-1].selected=true;
	}
	//alert('2. iNiveauItems= ' + iNiveauItems  + ', iAantalVragen= ' + iAantalVragen);
}

// intiële startwaarden toekennen aan weergegeven waarden en onderliggende values van Moeilijkheidsniveau (A, B of C)
// http://docs.sun.com/source/816-6408-10/option.htm
function initMoeilijkheidsNiveau() {
  //var oaV = document.forms["faantalVragen"].aantalVragen;
  var sLevelA = 'A - ' + textFiMoeiN[langCodeCS][0] + ' (' + arrAantalInNiveau[1] + ' ' + textFiMoeiN[langCodeCS][3] + ')';
  var sLevelB = 'B - ' + textFiMoeiN[langCodeCS][1] + ' (' + arrAantalInNiveau[2] + ' ' + textFiMoeiN[langCodeCS][3] + ')';
  var sLevelC = 'C - ' + textFiMoeiN[langCodeCS][2] + ' (' + arrAantalInNiveau[3] + ' ' + textFiMoeiN[langCodeCS][3] + ')';

  var option0 = new Option(sLevelA , "1" );
  var option1 = new Option(sLevelB , "2");
  var option2 = new Option(sLevelC , "3");
  // fyi: in geval van strings: var option0 = new Option("weergave", "value");
  
  for (var i=0; i < 3; i++) {
  	eval("omN.options[i]=option" + i);
  	if (i==1) { omN.options[i].selected=true;	}
  }
}

// Aanpassen moeilijksheidsniveau variabele bij wijziging in select box (incl. bbh helptekst)
function setMoeilijkheidsNiveau(form) {
	//var oaV = document.forms["flevel"].level;
  //alert('setMoeilijkheidsniveau was ' + );
  iLevel = form.level.options[form.level.selectedIndex].value;
  //alert('iLevel=' + iLevel);
  setLevel(iLevel);
  setHelpteksten(document.getElementById('help.niveauUitleg'));
}

// intiële startwaarden toekennen aan weergegeven waarden en onderliggende values
// http://docs.sun.com/source/816-6408-10/option.htm
function initAantalVragen() {
  //var oaV = document.forms["faantalVragen"].aantalVragen;
  var iAantalTussen0en1 = Math.round(arrAantalInNiveau[1]/2);
  var iAantalTussen1en2 = arrAantalInNiveau[1] + Math.round( (arrAantalInNiveau[2]-arrAantalInNiveau[1])/2 );
  var iAantalTussen2en3 = arrAantalInNiveau[2] + Math.round( (arrAantalInNiveau[3]-arrAantalInNiveau[2])/2 );
  
  var option0 = new Option(iAantalTussen0en1, iAantalTussen0en1);
  var option1 = new Option(arrAantalInNiveau[1], arrAantalInNiveau[1]);
  var option2 = new Option(iAantalTussen1en2, iAantalTussen1en2);
  var option3 = new Option(arrAantalInNiveau[2], arrAantalInNiveau[2]);
  var option4 = new Option(iAantalTussen2en3, iAantalTussen2en3);
  var option5 = new Option(arrAantalInNiveau[3], arrAantalInNiveau[3]);

  // fyi: in geval van strings: var option0 = new Option("weergave", "value");  
  for (var i=0; i < 6; i++) {
  	eval("oaV.options[i]=option" + i);
  	if (i==3) { oaV.options[i].selected=true;	}
  }
}

// Aanpassen aantalvragen variabele bij wijziging in select box.
function setAantalVragen(form) {
	//var oaV = document.forms["faantalVragen"].aantalVragen;
  //alert('setAantalVragen was ' + iAantalVragen);
  iAantalVragen = form.aantalVragen.options[form.aantalVragen.selectedIndex].value;
	// Alleen aantal vragen aanpassen als dat aantal ook past binnen het geselecteerde level.
	if (iNiveauItems < iAantalVragen) {
		iAantalVragen = iNiveauItems;
		alert(textSetAVra[langCodeCS][0]);

		// bepaal welke option tag hoort bij vastgestelde aantal vragen en die slecteren.
	  for (var i=0; i < 6; i++) {
	  	if (oaV.options[i].value == iAantalVragen) {
		  	//alert('option ' + i + ' wordt geslecteerd');
		  	oaV.options[i].selected=true;
			}
	  }
	}
  //alert('setAantalVragen is ' + iAantalVragen);
}

// presenteert (tussen)overzicht van gestelde vragen en gegeven antwoorden.
var strHtmlOrg; // globale variabele

function geefAntwoorden(bEersteGeefAntwoorden) {
	var strHtml = '';
	var bAntwInArray;
	//alert(iVragen);
	strHtml += '<TABLE width="286" cellpadding="0" bgcolor="#FFFFFF"><TR><TD width="128">' + textgeefAnt[langCodeCS][0] + '</TD>' +
    '<TD width="128">' +
		(bNaamraden ? textgeefAnt[langCodeCS][1] : textgeefAnt[langCodeCS][2]) + 
    '</TD><TD width="30">&nbsp;</TD></TR>';
	for (var i=1; i<=iNiveauItems ;i++ ) {
		if (arrAlGevraagd[i] && (arrAntwoorden[i] != null)) {
			strHtml += '<TR><TD class="answers">'
			strHtml += arrTopoItems[i][0].split(";")[0] + ' ('+ arrTopoItems[i][1] + ')';
			strHtml += '</TD><TD class="answers">';
			//strHtml += (bNaamraden ? arrAntwoorden[i] : arrTopoItems[arrAntwoorden[i]][0] + ' ('+arrAntwoorden[i]+')');
			//strHtml += arrAntwoorden[i];
			strHtml += (bNaamraden ? arrAntwoorden[i] : findLocation(arrAntwoorden[i])+' ('+arrAntwoorden[i]+')' );
      strHtml += '</TD>';
			strHtml += '<TD style="text-align:center"><IMG src="img/rest/smiley-';
			if (bNaamraden) { // Naamraden
				//ORG: strHtml += (arrTopoItems[i][0] == arrAntwoorden[i] ? 'ok' : 'nok');	

				bAntwInArray = false;
				for (j=1; j<=arrTopoItems[i][0].split(";").length; j++ ) {
					if (arrTopoItems[i][0].split(";")[j-1] == arrAntwoorden[i]) bAntwInArray = true; 
				}
				if (bAntwInArray) {
					strHtml += 'ok';
				} else {
					for (j=1; j<=arrTopoItems[i][0].split(";").length; j++ ) {
						if (suppressSpecialChars(arrTopoItems[i][0].split(";")[j-1], bsSpelLevel).toString() == suppressSpecialChars(arrAntwoorden[i], bsSpelLevel).toString()) bAntwInArray = true; 
					}
					if (bAntwInArray) {
						strHtml += 'aok';
					} else {
						strHtml += 'nok';
					}
				}
      } else {         // Aanwijzen
      	//ORG: strHtml += (arrTopoItems[i][1] == arrAntwoorden[i] ? 'ok' : 'nok');
      	strHtml += ( validateAanwijzen(arrTopoItems[i][1], arrAntwoorden[i]) ? 'ok' : 'nok');
      }
			strHtml += '.gif"></TD>';
      strHtml += '</TR>';
		}
	}
	
	strHtml += '<TR><TD colspan="3">'
	if (bNaamraden) {
		strHtml += '<HR>';
	}
	  
		strHtml += '<FORM name="fspelcontrol">';
		strHtml += '<DIV id="fspelcontrolForm">';
		strHtml += '</DIV>';
		strHtml += '</FORM>';

	strHtml += '<HR><CENTER>';
	strHtml += '<button id="terug" onclick="terugNaarVragen()">' + textgeefAnt[langCodeCS][3] + '</button>&nbsp;&nbsp;';
	//strHtml += '<button id="stoppen" onclick="javascript:if (confirm(\'weet je zeker dat je wilt stoppen?\')) location.href=\'index.htm\';">Stoppen</button>';
	strHtml += '</CENTER></TD></TR>';

	//if (strHtml != '') writeConsole(strHtml);
	strHtml += '</TABLE>';

	// alleen originele html opslaan voor de Terug optie bij eerste keer geefAntwoorden
	// anders wordt bij een refresh met nwe spellingcontrole de originele html overschreven.
	if (bEersteGeefAntwoorden) {
	  strHtmlOrg = document.getElementById('questionsection').innerHTML;
	}
	document.getElementById('questionsection').innerHTML = strHtml;	
  if (bNaamraden) initSpelLevelAntwoorden();
}

function terugNaarVragen() {
  document.getElementById('questionsection').innerHTML = strHtmlOrg;
  strHtmlOrg = ''; // leegmaken niet meer nodig.
  if (bNaamraden) setSpelLevel(document.forms['fspelcontrol']); // pas spellingcontrole settings aan nav evt wijzigingen bij geefAntwoorden blok.
}

function setHelpteksten(ElementById) {
	var sHtml='';
	var iLevelLocal;
	//alert('ElementById.name='+ElementById.id);
	
	if (ElementById.id == 'help.niveauUitleg') {
		iLevelLocal = getSelectedOption(omN);
		//alert('iLevelLocal='+iLevelLocal);
		sHtml += '<SPAN class="helpHeader">' + textSetHelp[langCodeCS][0] + ':</SPAN>';
	  for (var i=arrAantalInNiveau[iLevelLocal-1]+1; i <= arrAantalInNiveau[iLevelLocal]; i++) {
	  	sHtml += arrTopoItems[i][0].split(";")[0];
	  	if (i < arrAantalInNiveau[iLevelLocal]) {
	  		sHtml += ', ';
	  	} else {
	  		sHtml += '.';
	  	}
	  }
	}
	ElementById.innerHTML = sHtml;

}

function setSpecialCharsHtml() {
	var aSpecChar = new Array('+', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'ß', 'ç', 'Ç ', 'è', 'é', 'ê', 'ë', 'È', 'É', 'Ê', 'Ë', 'ì', 'í', 'î', 'ï', 'Ì', 'Í', 'Î', 'Ï', 'ñ', 'Ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'ù', 'ú', 'û', 'ü', 'Ù', 'Ú', 'Û', 'Ü', 'ý', 'ÿ', 'Ý');

	var sHtml = '';

	sHtml += '&nbsp;<SELECT onchange="addSpecialChar(this.form)" id="setSpecChar" name="setSpecChar" title="' + textSetChar[langCodeCS][0] + '">';
	for(var n=0; n<aSpecChar.length; n++) {
		sHtml += '<OPTION value="' + aSpecChar[n] + '" title="'+ aSpecChar[n] +'">' + aSpecChar[n] + '</OPTION>';
	}
	sHtml += '</SELECT>&nbsp;';
	return sHtml;
}

function addSpecialChar(form) {
	var sSpecChar = form.setSpecChar.options[form.setSpecChar.selectedIndex].value;

	document.getElementById('naamraden').plaatsnaam.value += sSpecChar;
}

function init() {
	// reset alle tellers
	iPunten = 0;
	iVragen = 0;
	iItemNr = 0;
	arrAlGevraagd = new Array();
	arrAntwoorden = new Array();
	oaV = document.forms["faantalVragen"].aantalVragen;
	omN = document.forms["flevel"].level;

	/* */

	// bepaal het vraagtype (naamraden of aanwijzen)
	bNaamraden = ('naamraden' == getCheckedRadioButton(document.forms["fvraagtype"].vraagtype));

	// set moeilijkheidsniveau opties.
	initMoeilijkheidsNiveau();
	setHelpteksten(document.getElementById('help.niveauUitleg'));

	// set aantalvragen per select optie.
	initAantalVragen();
		
	// bepaal het ingestelde aantal vragen
	iAantalVragen = getSelectedOption(oaV);
	//iAantalVragen = 5 // for test purposes only
	//alert('iAantalVragen selected = '+ iAantalVragen); // [dev]]

	// bepaal het ingestelde niveau en daarmee de lengte van de plaatsen array
	setLevel(getSelectedOption(omN));
	//setLevel(1); // for test purposes only

	// creëer spellingcontrole html (alleen bij naamraden)
	initSpelLevel(bNaamraden);
	if (bNaamraden) {
		bsSpelLevel = '111';
		// bepaal ingestelde spellingcontrole niveau
		getSpelLevel(document.forms["fspelcontrol"]);
	}
	
	// reset (set op false) de array die aangeeft welke plaatsen al zijn gevraagd.
	// noot: positie [0] is eigenlijk niet nodig, maar voor de zekerheid gereset.
	for (var i=0; i<=iNiveauItems ;i++ ) {
		arrAlGevraagd[i] = false;
	}

	// reset tekst en buttons
	document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + arrAlGevraagd.length;
	document.getElementById('txtPunten').innerHTML = textFuTest[langCodeCS][1] + iPunten;
	document.getElementById('doorgaan').disabled = true;
	document.getElementById('opnieuw').disabled  = true;
	
	// start de test
	test();	
}


// ### ondersteunende functies ###


// bepaal welke optie en bijbehorende waarde in de select form is geselecteerd
function getSelectedOption(form) {
	//alert('return getSelectedOption= ' + form.options[form.selectedIndex].value);
	return form.options[form.selectedIndex].value;
}

// bepaal welke radiobutton en bijbehorende waarde is geselecteerd
function getCheckedRadioButton(radiobuttons) {
	var checkedButtonValue = '';
	for (var i=0; i < radiobuttons.length; i++) {
		if (radiobuttons[i].checked) {
			checkedButtonValue=radiobuttons[i].value;
			i = radiobuttons.length;
		}
	}
	//alert('checkedButtonValue=' + checkedButtonValue);
	return checkedButtonValue;
}

// afvangen van een enter in het invoer veld om te voorkomen dat MSIE het form submit
function submitenter(myfield,e) {
	var keycode;
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	else return true;

	if (keycode == 13) {
		validateInput(document.forms['naamraden'].plaatsnaam.value);
		return false;
	}
	else {
		 return true;
	}
}

// deze functie retourneert de naam van de lokatie op basis van de ingevoerde lokatie-id
function findLocation(lokatieId) {
  //alert('lokatieId='+lokatieId);
  var lokatieNaam = '';
  for(var i=0; arrTopoItems[i][1] != lokatieId; i++ ) {
  }
  lokatieNaam = arrTopoItems[i][0].split(";")[0];
  //alert('i='+i+', lokatieNaam='+lokatieNaam);
  return lokatieNaam;
}


	var strHtmlConfigFrameOrg;
	var strHtmlAfdrukFrameOrg;
// deze functie voegt tekstveld onder de kaart met alle namen en drukt deze af, via de volgende stappen:
// * onderdrukken rechter configuratie frame (storend)
// * weergeven alle namen onder de kaart
// * afdruk opdracht
// * alle namen weer onderdrukken
// * configuratiescherm weer tonen.
function oefenbladAfdrukken() {

	var strHtml = '';
	//alert('oefenbladAfdrukken');
	strHtmlConfigFrameOrg = document.getElementById('questionsection').innerHTML;
	document.getElementById('questionsection').innerHTML = '<TABLE width="286" border="0" cellpadding="2" cellspacing="0"><TR><TD>&nbsp;</TD></TR></TABLE>';
	
	strHtmlAfdrukFrameOrg = document.getElementById('namenafdrukken').innerHTML;
	strHtml += '<TABLE class="oefenpaginaNamen" width="100%" border="1" cellpadding="2" cellspacing="0">';
	strHtml += '<TR><TD colspan="4"><B>Niveau A</B></TD></TR>';
	for (var n=arrAantalInNiveau[0]+1, i=0; (n <= arrAantalInNiveau[1]); n++, i++) {
		if (i % 2 == 0) strHtml += '<TR>';
		strHtml += '<TD class="oefenafdruk">' + arrTopoItems[n][1] + '</TD><TD class="oefenafdruk">' + arrTopoItems[n][0] + '</TD>';
		if (i % 2 == 1) strHtml += '</TR>';	
	}
	if (i % 2 == 1) strHtml += '<TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
	
	strHtml += '<TR><TD colspan="4"><B>Niveau B</B></TD></TR>';
	for (var n=arrAantalInNiveau[1]+1, i=0; (n <= arrAantalInNiveau[2]); n++, i++) {
		if (i % 2 == 0) strHtml += '<TR>';
		strHtml += '<TD class="oefenafdruk">' + arrTopoItems[n][1] + '</TD><TD class="oefenafdruk">' + arrTopoItems[n][0].split(";")[0] + '</TD>';
		if (i % 2 == 1) strHtml += '</TR>';	
	}
	if (i % 2 == 1) strHtml += '<TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';

	strHtml += '<TR><TD colspan="4"><B>Niveau C</B></TD></TR>';
	for (var n=arrAantalInNiveau[2]+1, i=0; (n <= arrAantalInNiveau[3]); n++, i++) {
		if (i % 2 == 0) strHtml += '<TR>';
		strHtml += '<TD class="oefenafdruk">' + arrTopoItems[n][1] + '</TD><TD class="oefenafdruk">' + arrTopoItems[n][0].split(";")[0] + '</TD>';
		if (i % 2 == 1) strHtml += '</TR>';	
	}
	if (i % 2 == 1) strHtml += '<TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';

	strHtml += '<TR><TD colspan="4">&nbsp;</TR>';
	strHtml += '<TR><TD colspan="4"><CENTER><BUTTON onclick="window.print()">' + textFuOefbl[langCodeCS][0] + '</BUTTON>&nbsp;&nbsp;&nbsp;&nbsp;';
	strHtml += '<BUTTON onclick="afdrukkenGereed()">' + textgeefAnt[langCodeCS][3] + '</BUTTON></CENTER></TD></TR>';
	strHtml += '</TABLE>'
	
		//strHtml += '<TR><TD colspan="4">';
		//strHtml += composeSpecificHtmlString();
		//strHtml += '</TR>';
	
	strHtmlAfdrukFrameOrg = document.getElementById('namenafdrukken').innerHTML;
	document.getElementById('namenafdrukken').innerHTML = strHtml;
}

// deze functie zet de teksten weer neer zoals de situatie was voor de afdrukken oefen pagina.
function afdrukkenGereed() {
	document.getElementById('namenafdrukken').innerHTML = strHtmlAfdrukFrameOrg;
	document.getElementById('questionsection').innerHTML = strHtmlConfigFrameOrg;
	resetTest()
}

// deze funtie reset de testvariabelen naar beginwaarden.
function resetTest() {
	iVragen = 1;
	iPunten = 0;
	for (var i=0; i<iNiveauItems ;i++ ) {
		arrAlGevraagd[i] = false;
	}

	document.getElementById('txtAantalVragen').innerHTML = textFuTest[langCodeCS][0] + iVragen;
	document.getElementById('txtPunten').innerHTML = textFuTest[langCodeCS][1] + iPunten;
}

function composeSpecificHtmlString() {

	var sHtml = '';

	sHtml += '<!-'+'- Start of StatCounter Code -'+'->';
	sHtml += '<scr' + 'ipt type="text/javascript">';
	sHtml += 'var sc_project=4059314;';
	sHtml += 'var sc_invisible=1;';
	sHtml += 'var sc_partition=50;';
	sHtml += 'var sc_click_stat=1;';
	sHtml += 'var sc_security="820222fd";'; 
	sHtml += '</scr' + 'ipt>';
		
	sHtml += '<scr' + 'ipt type="text/javascript" src="http://www.statcounter.com/counter/counter.js"></scr'+'ipt><noscr'+'ipt><div class="statcounter"><a title="site stats" href="http://www.statcounter.com/free_web_stats.html" target="_blank"><img class="statcounter" src="http://c.statcounter.com/4059314/0/820222fd/1/" alt="site stats" ></a></div></noscr'+'ipt>';
	sHtml += '<!-'+'- End of StatCounter Code -'+'->';

	return sHtml;
}

<!--
// The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)
// See:  http://www.msc.cornell.edu/~houle/javascript/randomizer.html
// aanroepen door rand(waarde), met waarde als integer getal.
// zou ook moeten kunnen met: parseInt(multiplier*Math.random() + 1)
rnd.today=new Date();
rnd.seed=rnd.today.getTime();

function rnd() {
        rnd.seed = (rnd.seed*9301+49297) % 233280;
        return rnd.seed/(233280.0);
}

function rand(number) {
        return Math.ceil(rnd()*number);
}
// end central randomizer. -->

// functie ter ondersteuning van weergeven [I]nfo label bij mouseover.
function showHelp(helpId){
	if (document.getElementById(helpId).className == 'helpDiv'){ document.getElementById(helpId).className = 'helpDivShow'; }
	else { document.getElementById(helpId).className = 'helpDiv'; }
}


