/*
	dit script bevat alle .js voor cme2
*/

/*
		browser check
	*/
	function browserCheck(){ 
		this.ver=navigator.appVersion; 
		this.agent=navigator.userAgent
		this.dom=document.getElementById?1:0
		this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom)?1:0;
		this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom)?1:0;
		this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom)?1:0;
		this.ie8=(this.ver.indexOf("MSIE 8")>-1 && this.dom)?1:0;
		this.ie9=(this.ver.indexOf("MSIE 9")>-1 && this.dom)?1:0;
		this.ie4=(document.all && !this.dom)?1:0;
		this.ie=this.ie4||this.ie5||this.ie6||this.ie7||this.ie8||this.ie9;
		this.mac=this.agent.indexOf("Mac")>-1
		this.opera5=this.agent.indexOf("Opera 5")>-1
		this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0; 
		this.ns4=(document.layers && !this.dom)?1:0;
		this.ns=this.ns4||this.ns6;
		this.bw=(this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.opera5 || this.dom)
		return this
	}
	var bw=new browserCheck();
	

/*
      leer de string class trimmen.
*/

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

/*
      shortcut naar bovenstaande functie.
*/

function trim(obj){
	obj.value = obj.value.trim();
}

/*
	filter functies zorgen ervoor dat een textbox alleen bepaalde 
	characters accepteert. we accepteren dus b.v. voor reals wel . en ,
	maar serverside wordt dat gewoon altijd met .
	
*/
/* 
	accepteer alleen 0..9, -
	accepteer - alleen als'ie vooraan staat 
*/
function filterInteger(obj){								
	obj.value = obj.value.replace(/[^\d\-]/, "").replace(/^(.+)-(.*)/, "$1$2").replace(/^(-?)0+(\d+)$/, "$1$2");
}
/* 
	accepteert 0..9, - . en , 
	accepteer - alleen als'ie vooraan staat
	komma wordt punt
	een eenzame punt krijgt 0.
	en 0.123 wordt 0.12
	er mag geen - in die niet aan het begin staat
	er mogen niet meer dan . punt in
	
*/
function filterReal(obj){										
	obj.value = obj.value.replace(/[^\.\,\-\d]/, "").replace(/\,/, ".").replace(/^(-?)\./, "$10.").replace(/^(-?\d+\.\d{2})\d+$/, "$1").replace(/^(.+)-(.*)/, "$1$2").replace(/^(.+)\.(.*)\.(.*)$/, "$1.$2$3");
}


/*
	adres gegevens, postcode b.v.
*/

function filterPostcode(obj){
	obj.value = obj.value.replace(/[^\w\d\s]/, "").toUpperCase().replace(/^(\d{0,3})[A-Z\s]/, "$1").replace(/^(\d{4})$/, "$1 ").replace(/^(\d{4})([^\s])/, "$1 $2").replace(/^(\d{4}\s)[^A-Z]/, "$1").replace(/^(\d{4}\s[A-Z]{2}).*$/, "$1");
}

/*
	check functies controleren textvelden op specifieke input
	de optionele msg wordt getoond als de check fout is
	optioneel kan een boolean focus worden meegegeven om de focus weer naar dat formfield te zetten
*/
function checkInteger(obj, msg, focus){
	if (obj.value.match(/^-?\d+$/)) return true;
	if (msg) alertWindow(msg);
	if (focus) obj.focus();
	return false;	
}	

function checkReal(obj, msg, focus){
	if (obj.value.match(/^-?\d+(\.\d{1,2})?$/)) return true;
	if (msg) alertWindow(msg);
	if (focus) obj.focus();
	return false;
}

/*
	adres gegevens
*/
function checkPostcode(obj, msg, focus){
	if (obj.value.match(/^\d{4}\s\w{2}$/)) return true;
	if (msg) alertWindow(msg);
	if (focus) obj.focus();
	return false;
}


/*
	functies voor sort en sortselect vragen, omslachting vanwege verschil ie/mozilla
*/
function addOption(selectBox, optionText, optionValue, optionSelected){
	var newOption = new Option(optionText, optionValue);
	if(optionSelected) newOption.selected = true;
	selectBox.options[selectBox.length] = newOption;
	
}

function deleteOption(selectBox, optionIndex){	
	if(selectBox.length>0) selectBox.options[optionIndex] = null;
}

/* 
	move functies werken met selectbox Id's!!!
*/
function moveOption(fromId, toId){
	
	var selectFrom = document.getElementById(fromId);
	var selectTo = document.getElementById(toId);
	
	/* 
		tijdelijke array voor de optie text/value pairs 
		ie snapt niet helemaal hoe je opties als object doorgeeft, vandaar
	*/
	var selectedText = new Array();
	var selectedValues = new Array();
	var selectedCount = 0;
	
	for(var i=selectFrom.length-1;i>=0;i--){
		if(selectFrom.options[i].selected){
			selectedText[selectedCount] = selectFrom.options[i].text;
			selectedValues[selectedCount] = selectFrom.options[i].value;
			deleteOption(selectFrom, i);
			selectedCount++;
		}
	}
	
	for(var i=selectedCount-1; i>=0; i--)	{
		addOption(selectTo, selectedText[i], selectedValues[i], true);
	}
	
	/*
		probeer de onchange functie aan te roepen, soms
		is het namelijk de linker en soms de rechter selectbox
	*/
	try {
		selectTo.onchange();
	}
	catch(e){
		//
	}
	try {
		selectFrom.onchange();
	}
	catch(e){
		//
	}

	
	return false;
}

/*
	selecteer ze allemaal en move ze dan
*/
function moveAllOptions(fromId, toId){
	var selectFrom = document.getElementById(fromId);
	for(var i=0;i<selectFrom.length;i++){
		selectFrom.options[i].selected = true;
	}
	moveOption(fromId, toId);
	return false;
}


/*
	reorder de options
	
	als je opties omhoog moved dan moet je van boven naar beneden erdoor, anders mis je opties
	opties omlaag moven is dan dus van de onderste naar de bovenste, als je een optie 'add'
	die al bestaat wordt deze dus 2 plaatsen omlaag geschoven omdat je de optie zelf uit de lijst haalt
	
*/
function reorderOption(selectId, up){
	var selectBox = document.getElementById(selectId);
	if(up){
		for (var i=1;i<selectBox.options.length;i++){
			if(selectBox.options[i].selected)	swapOptions(selectBox, i,i-1);
		}
	}
	else if(!up){
		for (var i=selectBox.options.length-2;i>=0;i--){
			if(selectBox.options[i].selected) swapOptions(selectBox, i,i+1);
		}
	}
	return false;
}

/*
	swap 2 opties binnen een box, beetje omslachtig, maarja...
*/
function swapOptions(selectBox, fromIndex, toIndex){

	var tempText;
	var tempValue;
	var tempSelected;
	
	tempText = selectBox.options[fromIndex].text;
	tempValue = selectBox.options[fromIndex].value;
	tempSelected = selectBox.options[fromIndex].selected;
	
	selectBox.options[fromIndex].text = selectBox.options[toIndex].text;
	selectBox.options[fromIndex].value = selectBox.options[toIndex].value;
	selectBox.options[fromIndex].selected = selectBox.options[toIndex].selected;
	
	selectBox.options[toIndex].text = tempText;
	selectBox.options[toIndex].value = tempValue;
	selectBox.options[toIndex].selected = tempSelected;
	
	selectBox.onchange();
	
	return false;
}

/*
	als je een selectbox submit dan verstuurt hij alleen de
	geselecteerde. om een volgorde op te slaan moet je dus 
	met hidden velden werken. we werken met id's
	van een selectbox id naar een hidden id
*/
function saveOptionsOrder(selectId, hiddenId){
	var selectBox = document.getElementById(selectId);
	var h = document.getElementById(hiddenId);
	
	
	h.value = "";
	for (var i=0;i<selectBox.options.length;i++){
		if(i>0) h.value += ",";
		h.value += selectBox.options[i].value;
	}

	return false;
}



/*
	confirm in javascript :-P
	alle urls die dit gaan gebruiken moeten in de vorm:
	
	<a href="#" onclick="confirmDelete('bericht dus', 'http://url/naar/page')">
*/
function confirmDelete(msg, url){
	if(confirm(msg)){
		if(url){
			if(url.match(/^document\..+$/)){	/* url is een document.frm.submit() */
				eval(url);
			} else {
				document.location.href = url;
			}
		} else {
			return true;
		}
	}
	return false;
}


/*
	activeert 1 bepaalde tab
*/
function activateTab(key, force){
	force = (force==null)?false:true;
	var tabs = document.getElementsByTagName("DIV");
	var foundTab = false;

	for (var i=0;i<tabs.length;i++){			
		if(tabs[i].id.match(/^td.+$/)){											/* begint het met td */
			var id = tabs[i].id.replace(/^td(.*)$/, "$1");		
			try {
				var td = document.getElementById('td' + id);
				var th = document.getElementById('th' + id);
				/* 
					WebGUI heeft ook div's met td... (gebruikt bij dragging)
					het moeten pairs zijn, anders zijn ze niet van ons 
				*/

				if(td != null && th != null && td.className != "dragable"){
					if(id == key || (force && !foundTab)){				/* key of force en nog niet gevonden */
						foundTab = true;														/* tab gevonden ! */
						td.style.display = "block";
						th.className = th.className.replace(/^inactive/, "active");
					} else {
						td.style.display = "none";
						th.className = th.className.replace(/^active/, "inactive");
					}
				}
			}
			catch(e){
				window.status = e.message;
			}
		}
	}
	/* 
		als een tab niet gevonden is, moet er iig een tabje open gaan, dat is dan de 1e 
	*/
	if(!foundTab && !force) activateTab("", true);
	
	setCookie("tab", key);
	return false;
}

	
/*
	style functions
*/

function hover(obj){
	obj.oldColor = obj.style.backgroundColor;
	obj.style.backgroundColor = "#ffff00";
}

function nover(obj){
	obj.style.backgroundColor = obj.oldColor;;
}


/*
	als je op een row klikt moeten de omliggende rows ook stoppen met actief zijn
	
*/
function clickObj(obj, url){
	obj.style.backgroundColor = "#ff9999";
	
	clickObj = function(obj,url){};
			
	hover = function(){};	// disable these functions
	nover = function(){};
	
	obj.style.cursor = "wait";						
	document.body.style.cursor = "wait";	// sadly there won't be a global

	document.location.href = url;
	

	return false;	
	
}


/*
	als je op een row clickt bij de products, dan wil je die meteen selecteren en het form submitten
*/

function clickProduct(formName, productId){
	try {
		var frm = document.getElementById(formName);
		frm.productId.value = productId;
		frm.submit();
	}
	catch(e){
		alertWindow(e.message);
	}
	return false;
}


/*
	in de history klikken op [+/-] klapt de rows uit die zichtbaar moeten worden en 
	sluit de rows die onzichtbaar moeten worden
*/
function openCloseHistory(year){
	try {
		var div = document.getElementById("history_"+year);
		var coll = div.getElementsByTagName("TR");
		for(var i=0;i<coll.length;i++){
			coll[i].style.display = (coll[i].style.display == "")?"none":"";
		}
	}
	catch(e){
		alertWindow(e.message);
	}
	return false;
}

/*
	grow en shrink 
*/
function growIcon(obj){
	var icon = getIcon(obj, "icon");
	if(icon != null){
		icon.src = icon.src.replace(/^(.+)_small.gif$/, "$1_medium.gif");
	}
}
function shrinkIcon(obj){
	var icon = getIcon(obj, "icon");
	if(icon != null){
		icon.src = icon.src.replace(/^(.+)_medium.gif$/, "$1_small.gif");
	}
}

/*
	open en close ook
*/
function openCloseIcon(obj){
	var icon = getIcon(obj, "icon");
	if(icon != null){
		if(icon.src.match(/_open_/)){
			icon.src = icon.src.replace(/_open_/, "_closed_");
		} else {
			icon.src = icon.src.replace(/_closed_/, "_open_");
		}
	}
}
function closeIcon(obj){
	var icon = getIcon(obj, "icon");
	if(icon != null) icon.src = icon.src.replace(/_open_/, "_closed_");
}
function openIcon(obj){
	var icon = getIcon(obj, "icon");
	if(icon != null) icon.src = icon.src.replace(/_closed_/, "_open_");
}
		


/*
	probeert een child icon te pakken
*/
function getIcon(obj, id){
	var icon = null;
	try {
		var coll = obj.getElementsByTagName("IMG");	/* alle images die child zijn */
		for(var i=0;i<coll.length;i++){
			if(coll[i].id==id){
				return coll[i];
			}
		}
	}
	catch(e){
		// nothing
	}
	return null;
}



/*
	document cookie is 1 lange string...
*/
function getCookie(name){
	try {
		var re = new RegExp(name+"=(.+?);");
		return unescape(re.exec(document.cookie+";")[1]);	/* ; aan het eind ;-) */
	}
	catch(e){
		return null;
	}
}

function setCookie(name, value){ 
	document.cookie = name + "=" + escape(value)+ ";expires=Sat, 31 Dec 2020 23:59:59 GMT;";
}

function deleteCookie(name){ 
	document.cookie = name + "=" + escape("empty"); + ";expires=Fri, 31 Dec 1999 23:59:59 GMT;";
}



/*
	de row waar je op klikt
*/
function _getRow(key){
	try {
		var row = document.getElementById("col_"+key);
		return row;
	}
	catch(e){
		window.status = e.message;
	}
	return null;
}


/*
	als er op een row geklikt wordt moet e.e.a. veranderen.
	key = col_id
	force = sluiten 
*/	
function collapse(key, force, cookieName, coll){
	var cn = cookieName==null ? "products" : cookieName;
	var row = _getRow(key);
	if(row != null){
		var open = row.getAttribute("open")=="true" ? "false" : "true";		//--- swap wat'ie nu is
		open = force ? "false" : open;																		//--- verplicht dicht?
		row.setAttribute("open", open);																		//--- terugschrijven
		if(open == "true"){																								//--- en eventueel icon updaten
			openIcon(row);
		} else {
			closeIcon(row);
		}
		/*
			check de children, style.display = "none" als ze dicht zitten
		*/
		coll = coll==null ? document.getElementsByTagName("TR") : coll;
		//var coll = document.getElementsByTagName("TR");
		for (var i=0;i<coll.length;i++){
			var child = coll[i];
			if(child.getAttribute("parentId") == key){													//--- is dit wel mijn child?		
				child.style.display = open=="true" ? "" : "none";									//--- update display
				var itemId = child.getAttribute("itemId");
				if(open=="false" && itemId != null) collapse(itemId, true, cn, coll);		//--- sluit dan ook de child
			}
		}
	}
	_saveState(cn);
}

/*
	saved het cookie met welke rows open staan
*/
function _saveState(cookieName){
	var arr = new Array();
	var coll = document.getElementsByTagName("TR");
	for (var i=0;i<coll.length;i++){
		var open = coll[i].getAttribute("open");
		if(open == "true"){
			arr.push(coll[i].getAttribute("itemId"));
		}
	}
	setCookie(cookieName, arr.join(','));
}


function initTabs(){
	var tab = getCookie("tab");
	activateTab(tab==null ? "Prop" : tab);
}	

/*
	activate subtab is een stuk simpeler omdat die maar 1x voorkomt
*/
function activateSubTab(key){
	
	if(key != null && key != "subTabBlocks" && key != "subTabPlayable" && key != "subTabPrint"){
		key = "subTabBlocks";
	}
	try {
		var tabs = new Array(document.getElementById("subTabBlocks"), document.getElementById("subTabPlayable"), document.getElementById("subTabPrint"));
		for (i=0;i<tabs.length;i++){
			if(tabs[i].id == key){
				tabs[i].style.display = "block";
			} else {
				tabs[i].style.display = "none";
			}
		}
		
	}
	catch(e){
		alertWindow(e.message);
	}
	setCookie("subtab", key);
	return false;
}


function initSubTabs(){
	var tab = getCookie("subtab");
	activateSubTab((tab==null)?"subTabBlocks":tab);
}

/*
	init voor de collapses
*/
function initCollapse(cookieName){
	initTabs();
	var cn = cookieName==null ? "products" : cookieName;
	var open = new String(getCookie(cn));
	if(open != null){
		var coll = open.split(',');
		for(var i=0;i<coll.length;i++){
			collapse(coll[i], false, cn);
		}
	}
}

/*
	obsolete?
*/
function changeNewQuestion(key){
	try {
		sel = document.getElementById(key);
		sub = document.getElementById(key + "Submit");
		if(sel.value != ""){
			sub.disabled = false;
		} else {
			sub.disabled = true;
		}
	}
	catch(e){
		window.status = e.message;
	}
	return false;
}

/*
	oude studietekst link is met nummers, dat kan nu ook, met een omweggetje ;-)	
	
*/
function studietekst(id){
	var url = document.location.href.replace(/cmeFunc\=play/,"cmeFunc=studytext#studietekst_"+id);
	if(!setFloaterUrlById("studietekstTab", url, true)){
		var win = window.open(url, "_studytext", "width=540,height=600,resizable=yes,location=no,status=no,scrollbars=yes");
	}
	
}

/*
	na vervanging
*/
function popupStudytext(lessonId, blockId, id){
	var url = document.location.href.replace(/^(.+?)\?.+$/, "$1");	/* alleen de base url */
	url += "?cmeType=ls&cmeFunc=studytext&cmeId=" + lessonId + "#" + blockId ;
	if(!setFloaterUrlById("studietekstTab", url, true)){
		var win = window.open(url, "_studytext", "width=540,height=600,resizable=yes,location=no,status=no,scrollbars=yes");
	}
}

/*
	onthoud de scrolling van de studietekst, tenzij er # is meegeven!
	in dat geval is er geen body onload, dus ook geen scroll reset!
	deze scripts worden aangeroepen in het print style template!

	op e.o.a. manier werkt dit niet voor de scrolling	in de studietekst tab.

*/

function getScrollXY() {
  var x = 0;
  var y = 0;
  try {
	  if(self.pageXOffset){
	    x = window.pageXOffset;
	    y = window.pageYOffset;
	  } 
	  else if(document.documentElement){
	    x = document.documentElement.scrollLeft;
	    y = document.documentElement.scrollTop;
	  }
	  else {
	    x = document.body.scrollLeft;
	    y = document.body.scrollTop;
	  } 
	}
	catch(e){
		//alert(e.message);
	}
  return new Array(x,y);
}


function setScrollXY(x, y) {
	try {
		if(self.pageYOffset){
	    self.pageXOffset = x;
	    self.pageYOffset = y;
	  } 
	  else if(document.documentElement){
	    document.documentElement.scrollLeft = x;
	    document.documentElement.scrollTop = y;
	  }
	  else {
	    document.body.scrollLeft = x;
	    document.body.scrollTop = y;
	  } 
	}
	catch(e){
	 	//alert(e.message);
	}
}

/*
	cookie -> scrolling
*/
function loadScroll(){
	if(document.location.href.match(/^.+?#.+$/)) return true;
	var offset = parseInt(getCookie("scrolling"));
	setScrollXY(0,offset);
}

/*
	scrolling -> cookie 
*/
function saveScroll(){
	setCookie("scrolling",getScrollXY()[1]);
}

/*
	scrollt een object into view
*/
function scrollBottom(objName){
	try {
		document.getElementById(objName).scrollIntoView(false);
	}
	catch(e){}
}


/*
	geeft de selected index van een radio, 0 based, -1 als er niets geselecteerd is
*/
function selectedIndex(obj){
	for(i=0;i<obj.length;i++){
		if(obj[i].checked) return i;
	}
	return -1;
}


function focusOn(key){
	try {
		key = key.replace(/response_/,"");
		var div = document.getElementById(key);
		div.style.backgroundColor = '#ffcccc';
	}
	catch(e){
};
}


/*
	checkt een radio vraag of er wel een keuze is gemaakt
*/
function checkRadio(key, msg, frm){
	try {
		var radios = new Array();
		for(var x=0;x<frm.length;x++){
			if(frm[x].name == key) radios.push(frm[x]);
		}
		if(selectedIndex(radios)<0){
			focusOn(key);
			alertWindow(msg);
			return false;
		}
		return true;
	}
	catch(e){
		alertWindow(e.message);
	}
	return true;	/* dan checken we iig nog serverside! */
}

/*
	checkt een check vraag of er wel een keuze is gemaakt
	FIXIT: als er meer checkbox vragen binnen het form staan? 
*/
function checkCheck(key, msg, frm){
	try {
		var radios = new Array();
		for(var x=0;x<frm.length;x++){
			if(frm[x].checked) return true;
			radios.push(frm[x]);
		}
		focusOn(key);
		alertWindow(msg);
		return false;
	}
	catch(e){
		alertWindow(e.message);
	}
	return true;	/* dan checken we iig nog serverside! */
}



/*
	checkt of er bij een open, real en integer vraag wel minimaal een teken is ingegeven
*/
function checkNotEmpty(key, msg, frm){
	try {
		var texts = new Array();
		
		for(var x=0;x<frm.length;x++){
			if(frm[x].name == key) texts.push(frm[x]);
		}
		var textbox = texts.pop(); /* eerste object in de lijst */
		if(textbox.value.trim().length <= 0){
			focusOn(key);
			alertWindow(msg);
			
			return false;
		}
		return true;
	}
	catch(e){
		alertWindow(e.message);
	}
	return true;	/* dan checken we iig nog serverside! */
}



/*
	als je een href binnen een form gebruikt is form.submit() niet
	te bereiken via this.submit()
*/
function submitParentForm(obj){
	if(obj.tagName == 'FORM'){
		
		try {
			waitWindow();
		}
		catch (e){
		}
		
		/* foreach textarea/htmlarea in form... */
		var coll = obj.getElementsByTagName("TEXTAREA");
		for(var i=0;i<coll.length;i++){
			try {
				editor_filterOutput(coll[i].id);
			}
			catch(e){
				//alert(e.message);
			}
		}
		
		//obj.submit.click();	//-- als je een hidden submitbutton hebt
		// obj.onsubmit(); // dit werkt helaas niet
		
		obj.submit();	
		return true;
	}
	//--- recurse de dom-tree als er een parent element is
	if(obj.parentElement) return submitParentForm(obj.parentElement);		//-- ie
	if(obj.parentNode) return submitParentForm(obj.parentNode);					//-- ff
	
	return false;
}

function showCourseDetails(id, title){ 
	var div = document.getElementById(id);
	if(title.length>50)title = title.substring(0,50)+"...";
	title = "Cursusinformatie" + (title != null ? ":<br/>" + title  : "");	
	infoWindow(div.innerHTML, title);   
}




/*
	passwordcheck op invoer, minimaal 6 tekens en minimaal 1 cijfer
*/
function checkPassword(obj, msg, focus){
	obj.value.trim();																				//--- spaties voor en achter eraf
	if (obj.value.match(/^NOCHANGE$/)) return true;		//--- onze speciale tag
	/* minimaal 1 getal, geen whitespace tekens en minimaal 6 characters lang */
	if (obj.value.match(/\d+/) && !obj.value.match(/\W+/) && obj.value.length > 5) return true;

	if (msg) alertWindow(msg);
	if (focus) obj.focus();
	return false;
}

function wopen(url, h, w){
 	if (h == null) h = 600;
 	if (w == null) w = 700;
 	window.open(url, '_blank', 'width=' + w + ', height=' + h + ', toolbar=yes, resizable=yes, location=yes, scrollbars=yes, status=yes');
 }

/*
	fp moet een functie naam zijn die we onload willen aanroepen
  het is helaas mogelijk om dubbele te maken
*/
function addOnLoad(fp){
	if (typeof document.attachEvent!='undefined'){ 
		eval("window.attachEvent('onload', " + fp + ");");
	} else { 
		eval("window.addEventListener('load'," + fp + ",false);");
	} 
}

/*
	dit script is voor de login rechtsboven
*/
function swapIdentifierBox(obj){
	var parent = obj.parentElement || obj.parentNode;
	var passwd = document.createElement("INPUT");
	passwd.setAttribute("id", "identifier");
	passwd.setAttribute("name", "identifier");
	passwd.setAttribute("type", "password");
	passwd.className = "small";
	parent.replaceChild(passwd, obj);
	passwd.focus();
	passwd.select();
}

function valueOr(cn, other){
	var result = getCookie(cn);
	if(result == null) return other;
	return result;
}

function initIdentifierBox(id){
	var frm = document.getElementById("frmLogin");
	var remember = valueOr("remember", false);
	if(remember == 1){
		frm.username.value = valueOr("username", "");
		swapIdentifierBox(frm.identifier);
		frm.identifier.value = valueOr("identifier", "");
		frm.remember.checked = true;
	}		
}

function rememberLogin(obj){
	if(obj.tagName == 'FORM'){
		if(obj.remember.checked){
			setCookie("username", obj.username.value);
			setCookie("identifier", obj.identifier.value);
			setCookie("remember", 1);
		} else {
			deleteCookie("username");
			deleteCookie("identifier");
			deleteCookie("remember");
		}
		return true;	
	}
	if(obj.parentElement) return rememberLogin(obj.parentElement);		//-- ie
	if(obj.parentNode) return rememberLogin(obj.parentNode);					//-- ff	
	return false;
}
	
/*
	attached een check voor een form in lesson play
	de templates van de bewuste vragen voegen dit toe!
*/
function attachFormCheck(id,func,msg){
	if(!window._formChecks)	window._formChecks = new Array();	
	window._formChecks.push(new Array(id,func,msg));
}
/*
	checks voor diverse forms, deze worden geattached in de 
	templates van die vragen!
*/
function onLessonPlaySubmit(form){
	if(window._formChecks){
		for(var i=0;i<window._formChecks.length;i++){
			var check = window._formChecks[i];
			var func = check[1] + "('" + check[0] + "','" + check[2] + "',form)";
			if(!eval(func))	return false;
		}
	}
	return true;
}

/*
	navigatie in de lessonPlay
	als je form.submit() aanroept dan loopt'ie niet door de onsubmit event code heen!
	dit is by design (security, anders kan een script forms voor jou gaan submitten)
*/

function navigateSubmit(image, direction){
	var form = getParentFormElement(image);
	
	if(form){
		
		/* 
			als we achteruit of vooruit bladeren is de onLessonPlaySubmit niet nodig
			tenzij er alleen reflections op een pagina staan, dan 
			alleen bij de check, en dan is direction 0
			als we finishen hoeven we niet te testen of de submit goed is
			
		*/
		 
		//var checked = direction != 0 || form.finish.value == 1 ? true : onLessonPlaySubmit(form);	
		var checked = (form.unanswered.value == 0 || direction < 0 || form.finish.value == 1) ? true : onLessonPlaySubmit(form);	
		if(checked){
			try {
				waitWindow();
			}
			catch (e){};
			form.direction.value = direction;
			form.submit();
		}
	}
	return false;
}




function getParentFormElement(obj){
	if(obj.tagName == 'FORM') return obj;
	if(obj.parentElement) return getParentFormElement(obj.parentElement);		//-- ie
	if(obj.parentNode) return getParentFormElement(obj.parentNode);					//-- ff
	return false;
}





/*
	genereert een (hopelijk) uniek id van textarea_ + 22 characters
*/
function randomId(){
	var valids = new String("abcdefghijklmnopqrstuvwxyz");
	var id = "textarea_";
	for(var i=0;i<22;i++){
		id += valids.charAt(Math.random()*valids.length)
	}
	return id;
}

function fullscreen(img){
	fullscreenLightbox(img);
	//window.open(img.src, "_blank", "status=yes,toolbar=no,resizable=yes,scrollbars=yes,menubar=no,width=700,height=500");
}

function swapCurrentHistory(showHistory){
	
	try {
		var divCurrent = document.getElementById("divCurrent");
		var divHistory = document.getElementById("divHistory");
		var refCurrent = document.getElementById("refCurrent");
		var refHistory = document.getElementById("refHistory");
	
		if(showHistory){
			divHistory.style.display = refCurrent.style.display = "";
			divCurrent.style.display = refHistory.style.display = "none";	
		}
		else {
			divHistory.style.display = refCurrent.style.display = "none";
			divCurrent.style.display = refHistory.style.display = "";	
		}
	}
	catch(e){
		//
	}
}


// VOETNOTEN
var footnoteids = new Array();
var footnotecount = 0;

function footnoteCounter(){
	footnotecount++;
	document.write(footnotecount);
}

function showFootnote(fnid,ev){
	TagToTip(fnid);
}

function hideFootnote(fnid){ 
	// = kopie van untip uit wz_tooltip
	tt_OpReHref();
	if(tt_aV[DURATION] < 0 && (tt_iState & 0x2))
		tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true);
	else if(!(tt_aV[STICKY] && (tt_iState & 0x2)))
		tt_HideInit();
}

function writeFootnotes(){
	if(footnotecount){
		var content = "<div class=\"footnotes\"><hr align=\"left\" style=\"height:1px;margin-left:0px;color:#333;width:240px\"><table>";
		var footNotes = getElementsByClassNameM("footnote","div");
		var c=0;
		var refc=0;
		var myReference = new Array();
		var myReferenceCount = new Array();
		while(c<footNotes.length){
			var foundEarlierReference = 0;
			var d=0;
			var tempvar = footNotes[c].innerHTML;
			tempvar = tempvar.replace(/<br>/ig, "");
			tempvar = tempvar.trim();
			//alert("'"+tempvar+"'");
			while(d<myReference.length){
				if(myReference[d] == tempvar){
					myReferenceCount[d] += ", "+(c+1);
					d=100;
					foundEarlierReference=1;
				}
				d++;	
			}
			if(!foundEarlierReference){
				myReference[refc] = tempvar;
				myReferenceCount[refc] = (c+1);
				refc++;
			}		
			c++;
		}
		var d=0;
		while(d<myReference.length){
			content += "<tr><td valign=\"top\" class=\"footnotes\"><sup>"+myReferenceCount[d]+"</sup>&nbsp;&nbsp;</td><td class=\"footnotes\">"+myReference[d]+"</td></tr>";
			d++;
		}	
		content += "</table></div>";
		document.write(content);

	}
}



/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getElementsByClassNameM/
*/
var getElementsByClassNameM = function (className, tag, elm){
	if (document.getElementsByClassNameM) {
		getElementsByClassNameM = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassNameM(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassNameM = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassNameM = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassNameM(className, tag, elm);
};

// DIAGNOSE VRAAG 
diagnosisClicks=0;
function initDiagnosis(){
	pageId = "diagn-"+(document.getElementById("frmQuestion").courseId.value)+"-"+(document.getElementById("frmQuestion").pn.value);
	diagCookie = getCookie(pageId);
	maxQuestionsDiagnosis = maxQuestionsDiagnosis.replace("<br/>", "");
	maxQuestionsDiagnosis = maxQuestionsDiagnosis.replace(" ", "");
	if(!maxQuestionsDiagnosis)maxQuestionsDiagnosis=5;

	jQuery.each($('.Diagnosis td'), function(i,j) {
		$(j).html('<span>'+$(j).html()+'</span>');
	});

	$('.Diagnosis td span').css('display','none');
	$('.Diagnosis td:first-child').addClass('tdWithLink');
	$('.Diagnosis td:first-child b').parents('td').removeClass('tdWithLink').addClass('diagnosisHeader');
	$('.Diagnosis td:first-child span').css('display','block'); // linkerregel
	$('.Diagnosis tr:first-child span').css('display','block'); // kopregel
	$('.Diagnosis tr:first-child td').css('cursor','default');
	
	count=0;
	jQuery.each($('.Diagnosis tr'), function(i,j) {
		count++;
		if(count>1){
			if($(j).children(':first-child').html().search(/<\/b>/i)> -1){ // td
				$(j).addClass('diagnosisHeader'); // tr
				// loop langs td's
				count2=0;
				jQuery.each($(j).children('td'), function(w,v) {
					count2++;
					if(count2>1){$(v).html("&nbsp;");}
				});
			}
			clickFunc = 'getDiagnosisRow("'+pageId+'","'+count+'",0)';
			if(!(bw.ie7||bw.ie6)){
				$(j).children(':first-child').attr('onClick',clickFunc);
			}else{
				tempvar = $(j).children(':first-child').children('span');
				if(tempvar.html().search(/<\/b>/i) == -1){
					tempvar.html('<a href=\'javascript:'+clickFunc+'\'>'+tempvar.html()+'</a>');
				}
			}
			$(j).attr('id','diagnosisRow'+count);
			if(diagCookie){
				if(diagCookie.search("A"+count+"B") > -1){
					getDiagnosisRow(pageId,count,1);
				}
			}			
		}
	});
	if(!(bw.ie7||bw.ie6)){
		$('.Diagnosis tr.diagnosisHeader td').css('display','table-cell'); // kopjes
	}
	$('.Diagnosis').css('display','block');
}

function getDiagnosisRow(pageId, rowId, skipC){
	btd=$('#diagnosisRow'+rowId+" span");
	btr=$('#diagnosisRow'+rowId);
	
	bts=$('#diagnosisRow'+rowId+" td:nth-child(2) span")
	btsdata = bts.text();
	btsdata = btsdata.replace(" ", "");
	btsdata = btsdata.replace("&nbsp;", "");
	if(btsdata){ // cel moet inhoud hebben
		if(bts.css('display')=="none"){ // cel moet niet al getoond worden
			if(diagnosisClicks < maxQuestionsDiagnosis){
				diagnosisClicks++;
				btd.css('display','block');
				if(!bw.ie){
					btr.css('display','none');
					btr.show('slow');
				}
				if(!skipC){
					diagCookie = getCookie(pageId);
					if(!diagCookie)diagCookie="";
					setCookie(pageId, diagCookie+"A"+rowId+"B");
				}				
			}else{
				alertWindow("U heeft al het maximum aantal vragen ("+maxQuestionsDiagnosis+") gesteld.");
			}
		}
	}
	//return false;
}

