var bShowBerekeningDetails = false;

function Wissen(){
	document.Berekening.reset();
}

function algValidatie() {
	function assertNotZero(element) {
		var value = parseInt( element.value );
		if( !isNaN(value) && value == 0 )
			element.value = "";
	}

	assertNotZero( document.Berekening['woning-huur'] );
	for( var i = 0; i < 8; ++i ) {
		assertNotZero( document.Berekening['kind-werkgeversbijdrage-aanvrager-bedrag-' + (i+1)] );
		assertNotZero( document.Berekening['kind-werkgeversbijdrage-partner-bedrag-' + (i+1)] );
		assertNotZero( document.Berekening['kind-bijdrage-aanvrager-bedrag-' + (i+1)] );
		assertNotZero( document.Berekening['kind-bijdrage-partner-bedrag-' + (i+1)] );
	}
}

function doShowResultsDevelop(bSwitch){
	var resultaten = document.getElementById( "resultaten" );
	if( resultaten ) {
		if( bSwitch == true )
			addClass( resultaten, "all-visible" );
		else
			removeClass( resultaten, "all-visible" );
	}
}

function showBerekeningDetails(bSwitch) {
	bShowBerekeningDetails = bSwitch;	

	var log = document.getElementById( "log" );
	if( log ) {
		if( bSwitch == true )
			addClass( log, "visible" );
		else
			removeClass( log, "visible" );
	}
}

/**
 fallback of nieuwe stijl tonen
*/
function showNieuweStijl( bSwitch ) {
	var container = document.getElementById( "divContainer" );
	if( bSwitch ) {
		removeClass( container, "fallback" );
		addClass( container, "nieuwe-stijl" );
	} else {
		addClass( container, "fallback" );
		removeClass( container, "nieuwe-stijl" );
	}
}

/**
 alle vragen tonen ja/nee
*/
function showFullForm( bSwitch ) {
	var container = document.getElementById( "divContainer" );
	if( bSwitch ) {
		addClass( container, "visible" );
	} else {
		removeClass( container, "visible" );
	}
}

/**
 aangeroepen als een toeslagen wordt aan- of uitgezet 
*/
function updateToeslagenAllOnOrOff() {
	var ids = ["huurtoeslag", "kindertoeslag", "kindgebonden-budget", "kinderopvangtoeslag", "zorgtoeslag"];
	var allOn = true;
	var allOff = true;
	for( var i = 0, sz = ids.length; i != sz; ++i ) {
		if( document.getElementById( ids[i] ).className.match( /(^|\s)visible(\s|$)/ ) ) {
			var checked = document.Berekening[ids[i]].checked;
			if( !checked ) {
				allOn = false;
			} else {
				allOff = false;
			}
		}
	}
	document.Berekening["kies-alle-toeslagen"].checked = allOn;
	
	// show extra message if at least one option is selected
	var extraDiv = document.getElementById('keuze-toeslagen-extra');
	if( allOff )
		addClass( extraDiv, 'invisible' );
	else
		removeClass( extraDiv, 'invisible' );
	
}

/**
 aangeroepen als op 'alle toeslagen wordt geklikt
*/
function onAlleToeslagen() {
	var ids = ["huurtoeslag", "kindertoeslag", "kindgebonden-budget", "kinderopvangtoeslag", "zorgtoeslag"];

	var allOn = true;
	for( var i = 0, sz = ids.length; i != sz; ++i )
		if( document.getElementById( ids[i] ).className.match( /(^|\s)visible(\s|$)/ ) )
			if( !document.Berekening[ids[i]].checked ) allOn = false;

	for( var i = 0, sz = ids.length; i != sz; ++i )
		document.Berekening[ids[i]].checked = !allOn;
		
	// show extra message if at least one option is selected
	var extraDiv = document.getElementById('keuze-toeslagen-extra');
	if( allOn )
		addClass( extraDiv, 'invisible' );
	else
		removeClass( extraDiv, 'invisible' );	
	
	updateForm();
	return true;
}

/**
 extra controle of doBuTiAlert aangeroepen moet worden
 */
function canDoBuTiAlert( input ) {
	if( (input.value !== undefined || input.value !== '') && input.id.match( /^input-medebewoner-toetsingsinkomen-\d+$/ ) !== null ) {
		var nr = input.id.match( /^input-medebewoner-toetsingsinkomen-(\d)+$/ )[1]; 
		
		var jaar = input.form.jaar.value;
		var geboortejaar = parseInt( document.getElementById( 'select-medebewoner-geboortejaar-' + nr ).value );
		var leeftijd = (isNaN(geboortejaar) ? NaN : jaar - geboortejaar - 1);
		
		if( !isNaN(leeftijd ) && leeftijd < 14 )
			return false;
	}
	
	return true; // in any other case do alert
}

/** 
 * enables or disables all elements in a form element
 *
 * @param formElement form element containing the inputs to disable or enable
 * @param isEnabled \c true to enable elements, \c false to disable elements
 */
function enableForm( formElement, isEnabled ) {
	for_each( [ "select", "input", "button" ], function( tag  ) {
		for_each( formElement.getElementsByTagName( tag ), function(input) {
			input.disabled = !isEnabled;
		});
	});
}

function Bereken() {
	// uitrekenen en zichtbaar maken van juiste resultaten gebeurt in interface.js
	// hier slechts het tonen van het resultatenblok en het disablen van de invoer
	addClass( document.getElementById( "resultaten" ), "visible" );		// resultaten tonen
	addClass( document.getElementById( "divButtons" ), "invisible" );	// Bereken knop verbergen
	enableForm( document.Berekening, false ); // formulier onwijzigbaar maken
	document.getElementById( "resultaat-wijzigen-button-1" ).disabled = false; // wijzigknop wel actief maken
	document.getElementById( "resultaat-wijzigen-button-2" ).disabled = false; // wijzigknop wel actief maken
	
	// blokkeer de toetsingsinkomen links
	for_each( Toeslagen.getElementsByClassName( "link-toetsingsinkomen" ), function(e) {
		addClass( e, "disabled" );
	} );

}

function doOpnieuw()
{
	removeClass( document.getElementById( "resultaten" ), "visible" );		// resultaten weer verbergen
	removeClass( document.getElementById( "divButtons" ), "invisible" );	// Berekenknop weer tonen
	enableForm( document.Berekening, true ); // formulier weer wijzigbaar maken
	
	// deblokkeer de toetsingsinkomen links
	for_each( Toeslagen.getElementsByClassName( "link-toetsingsinkomen" ), function(e) {
		removeClass( e, "disabled" );
	} );
}

function doTussenresultaat( id ) {
	addClass( document.getElementById( id ), "visible" ); // tussenresultaat tonen
	addClass( document.getElementById( "tussenresultaten" ), "visible" ); // tussenresultatenblok tonen
	addClass( document.getElementById( "divButtons" ), "invisible" );	// Bereken knop verbergen
	enableForm( document.Berekening, false ); // formulier onwijzigbaar maken
	var tussenresultaatVerder = document.getElementById( "tussenresultaat-Verder-button" );
	tussenresultaatVerder.disabled = false; //  wijzigknop wel actief maken

	// bij onclick tussenresultaat verwijderen en toevoegen aan lijst van tussenresultaten die we al kennen
	tussenresultaatVerder.onclick = function(id) { return function() { eindeTussenresultaat(id); } }(id);
}

function eindeTussenresultaat(id) {
	document.Berekening["tussenresultaten-negeren"].value += " " + id;

	removeClass( document.getElementById( id ), "visible" ); // tussenresultaat tonen
	removeClass( document.getElementById( "tussenresultaten" ), "visible" );	// tussenresultatenblok weer verbergen
	removeClass( document.getElementById( "divButtons" ), "invisible" );	// Bereken knop weer tonen
	enableForm( document.Berekening, true ); // formulier onwijzigbaar maken

	// onchange aanroepen zodat de workflow herstart wordt
	window.setTimeout( function() { document.Berekening['tussenresultaten-negeren'].onchange(); }, 0 );
}

// when jaar changes, the form should be reset
/**
 * generate debug message for calculations
 *
 * @param theCase case
 *
 * @return string
 */
function getDebug(theCase) {
	var message = "";
	
	message += "<h3>Casusattributen </h3>";
	for( var i in theCase )
		if( typeof theCase[i] != 'function' && i != 'tokens' && i != 'form' && i != 'formValues' && i != 'invoer' && i != 'visibleElements' )
		message += "<p><label>" + i + "</label>:" + theCase[i] + "</p>";
		
	message += "<h3>Ingevulde velden</h3>"
	for( var i in theCase.formValues )
		message += "<p><label>" + i + "</label>:" + theCase.formValues[i] + "</p>";

	message+= "<h3>Berekening Huurtoeslag</h3>\n";
	var htBerekening = new HtBerekening( new Halfjaar(theCase.formValues['woning-halfjaar']), new CaseInput(theCase) );
	for( var i in htBerekening )
		if( typeof htBerekening[i] == 'function' )
			message += "<p>" + i + "=" + htBerekening[i]() + "</p>\n";

	message+= "<h3>Berekening Kindertoeslag</h3>\n";
	var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
	var algemeenBerekening = new AlgemeenBerekening( jaarTableAccess, new CaseInput(theCase) );
	var kindBerekeningKtKgb = new KindBerekeningKtKgb(new CaseInput(theCase));
	var ktBerekening = new KtBerekening( algemeenBerekening, kindBerekeningKtKgb, jaarTableAccess );
	for( var i in ktBerekening)
		if( typeof ktBerekening[i] == 'function' )
			message += "<p>" + i + "=" + ktBerekening[i]() + "</p>\n";
		
	message += "<h3>Berekening Kindgebonden budget</h3>\n";
	var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
	var algemeenBerekening = new AlgemeenBerekening( jaarTableAccess, new CaseInput(theCase) );
	var kindBerekeningKtKgb = new KindBerekeningKtKgb(new CaseInput(theCase));
	var kgbBerekening = new KgbBerekening( algemeenBerekening, kindBerekeningKtKgb, jaarTableAccess, new CaseInput(theCase) );
	for( var i in kgbBerekening)
		if( typeof kgbBerekening[i] == 'function' )
			message += "<p>" + i + "=" + kgbBerekening[i]() + "</p>\n";

	message += "<h3>Berekening Kinderopvangtoeslag</h3>\n";
	var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
	var algemeenBerekening = new AlgemeenBerekening( jaarTableAccess, new CaseInput(theCase) );
	var kottTableAccess = new Kott( theCase.formValues['jaar'] );
	var kindBerekening = new KindBerekening( algemeenBerekening, jaarTableAccess, kottTableAccess, new CaseInput(theCase) );
	var kotBerekening = kindBerekening.kotBerekening;
	for( var i in kotBerekening)
		if( typeof kotBerekening[i] == 'function' )
			message += "<p>" + i + "=" + kotBerekening[i]() + "</p>\n";
		
	message += "<h3>Berekening Zorgtoeslag</h3>\n";
	var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
	var algemeenBerekening = new AlgemeenBerekening( jaarTableAccess, new CaseInput(theCase) );
	var wlfTableAccess = new Wlf( theCase.formValues['jaar'] );
	var aanvragerInkomenNlTableAccess = new AanvragerInkomenNl( theCase.formValues['aanvrager-inkomen-nl'] );
	var toeslagpartnerInkomenNlTableAccess = new ToeslagpartnerInkomenNl( theCase.formValues['toeslagpartner-inkomen-nl'] );
	var ztBerekening = new ZtBerekening( 
		algemeenBerekening, 
		jaarTableAccess, 
		wlfTableAccess, 
		aanvragerInkomenNlTableAccess,
		toeslagpartnerInkomenNlTableAccess, 
		new CaseInput(theCase) );
	for( var i in ztBerekening)
		if( typeof ztBerekening[i] == 'function' )
			message += "<p>" + i + "=" + ztBerekening[i]() + "</p>\n";
		
	return message;
}

/**
 * Handles the workflow of the form
 *
 * Shows/hides elements according to entered values
 */
var processFlow = function() {
	var visibleInputIdsCache = {}; // caching of inputs ids that are currently visible
	var visibleEndResultsCache = {}; // caching of end-result ids that are currently visible
	
	function processFlow() {
		// maak casus en start flow
		var theCase = {};	
		theCase["tussenresultaten-negeren"] = document.Berekening['tussenresultaten-negeren'].value;
		theCase.form = document.Berekening;
		theCase.formValues = {};
		Toeslagen.workflow.flowMain( theCase );

		// hide input elements that are visible in cache, but not in visible elements list
		for( var id in visibleInputIdsCache ) {
		
			if( theCase.visibleElements == undefined || theCase.visibleElements[id] == undefined ) {
				removeClass( document.getElementById(id), "visible" );
				
				//BEGIN workaround voor weergave proleem in IE met onjuist herpositioneren van help-icons en legends na verbergen fsToeslagpartner.
				if (id == 'fsToeslagpartner') {	
					if (hasClass(document.getElementById('fsWoning'), 'visible') ) {
						document.getElementById('fsWoning').style.display = "block"; document.getElementById('fsWoning').style.display = "none"; 
					}
					if (hasClass(document.getElementById('fsKinderen'), 'visible') ) {
						document.getElementById('fsKinderen').style.display = "block"; document.getElementById('fsKinderen').style.display = "none"; 
					}					
				} 
				//EINDE workaround voor weergave proleem in IE met onjuist herpositioneren van help-icons en legends na verbergen fsToeslagpartner.
				
			}
		}
		// show input elements that are not visible in cache, but are in visible elements list
		for( var id in (theCase.visibleElements || {}) ) {
			if( visibleInputIdsCache[id] == undefined )
				addClass( document.getElementById(id), "visible" );
				
			//BEGIN workaround voor weergave proleem in IE met onjuist herpositioneren van help-icons en legends na verbergen fsToeslagpartner.
			if (id == 'fsWoning') {	
					document.getElementById('fsWoning').style.display = "block"; document.getElementById('fsWoning').style.display = "none";
			}
			if (id == 'fsKinderen') {	
				document.getElementById('fsKinderen').style.display = "block"; document.getElementById('fsKinderen').style.display = "none";
			}
			//EINDE workaround voor weergave proleem in IE met onjuist herpositioneren van help-icons en legends na verbergen fsToeslagpartner.
	
		}
		// update cache
		visibleInputIdsCache = theCase.visibleElements || {};
		
		// enable/disable Bereken button
		document.getElementById( "but_bereken" ).disabled = !(theCase.eindconclusie == true);
		
		// show end results
		var visibleEndResults = Toeslagen.getEndResults(theCase);
		// hide visible end results that should not be visible now
		for( var id in visibleEndResultsCache ) {
			var visible = false; // assume no longer visible
			for( var i = 0; i < visibleEndResults.length; ++i ) {
				var visibleId = visibleEndResults[i];
				if( visibleId == id ) {
					visible = true;
					break;
				}
			}
			if( !visible )
				removeClass( document.getElementById( id ), "visible" );
		}
		// show invisible elements that should be visible now
		for( var i = 0; i < visibleEndResults.length; ++i ) {
			var id = visibleEndResults[i];
			var visible = false; // assume invisible
			for( var visibleId in visibleEndResultsCache ) {
				if( visibleId == id ) {
					visible = true;
					break;
				}
			}
			if( !visible )
				addClass( document.getElementById( id ), "visible" );
		}
		// update cache
		visibleEndResultsCache = {};
		for( var i = 0; i < visibleEndResults.length; ++i )
			visibleEndResultsCache[ visibleEndResults[i] ] = visibleEndResults[i];

		// store results from the case in the document (for dynamic text parts)
		document.Berekening["result-toeslag-toegekend"].value = theCase["toeslag-toegekend"];
		document.Berekening["result-toeslag-gekozen"].value = theCase["toeslag-gekozen"];
		document.Berekening["result-toeslag-totaal"].value = theCase["toeslag-totaal"];
		document.Berekening["result-huurgrens"].value = theCase.huurgrens;
		document.Berekening["result-doelgroepgrens"].value = theCase.doelgroepgrens;
		document.Berekening["result-huishouden"].value = theCase.huishouden;
		document.Berekening["result-huurtoeslag"].value = document.Berekening['result-toeslag-toegekend'].value.match( /(^|\s)huurtoeslag(\s|$)/ ) != null ? theCase.huurtoeslag : 0 ;
		document.Berekening["result-kindertoeslag"].value = document.Berekening['result-toeslag-toegekend'].value.match( /(^|\s)kindertoeslag(\s|$)/ ) != null ? theCase.kindertoeslag : 0 ;
		document.Berekening["result-kindgebonden-budget"].value = document.Berekening['result-toeslag-toegekend'].value.match( /(^|\s)kindgebonden-budget(\s|$)/ ) != null ? theCase['kindgebonden-budget'] : 0 ;		
		document.Berekening["result-kinderopvangtoeslag"].value = document.Berekening['result-toeslag-toegekend'].value.match( /(^|\s)kinderopvangtoeslag(\s|$)/ ) != null ? theCase.kinderopvangtoeslag : 0 ;		
		document.Berekening["result-kinderopvangtoeslag-totaal"].value = theCase.kinderopvangtoeslagNietAfgerond;
		for( var i = 0; i < theCase.formValues['aanvrager-kinderen']; ++i )
			document.Berekening["result-kinderopvangtoeslag-" + (i+1)].value = theCase['kinderopvangtoeslag-' + (i+1)];
		document.Berekening["result-zorgtoeslag"].value = document.Berekening['result-toeslag-toegekend'].value.match( /(^|\s)zorgtoeslag(\s|$)/ ) != null ? theCase.zorgtoeslag : 0 ;		
		
		// logging (if enabled)
		if( bShowBerekeningDetails == true )
		{
			var log = document.getElementById( "log" );
			if( log )
				log.innerHTML = getDebug(theCase);
		}
	}
	return processFlow;
}();

/**
 * werkt het formulier bij
 */
var updateForm = function() {
	var updating = false;	// flag to make sure updateForm is not called recursively
	
	function updateForm() {
		if( !updating ) {
			updating = true;
			try {
				processFlow();
				updateFormVisibility();
				updateFormContent();
				
				var temp = "ggg";
				
				
				
			} finally {
				updating = false;
			}
		}
	}
	return updateForm;
}();

/**
 * instellen van handlers voor onclick/onchange/onblur etc. events
 *
 * @note de event handlers worden toegevoegd aan de eventcode die in het html-formulier is geplaatst
 */
 
function setEventHandlers() {
	
	// reset form when changing jaar
	document.getElementById( "selectJaar" ).onchange = function() {
		var jaar = this.value;
		document.Berekening.reset();
		
		var extraDiv = document.getElementById('keuze-toeslagen-extra');
		addClass( extraDiv, 'invisible' );	
		
		// set some form controls manually, because they are hidden and 
		// some browsers do not reset hidden controls
		document.Berekening["tussenresultaten-negeren"].value = "";
		for( var elements = Toeslagen.getElementsByClassName( "input-set-amount" ), i = 0; i < elements.length; ++i ) {
			elements[i].value = 1; // reset to lines of expandable input sets to 1
		}
		updateExpandableInputSet(); // update the visibility of expandable inputs
		SluitHelp();
		this.value = jaar;
	}

	// register onclick on form (onclicks should  bubble up)
	document.Berekening.onclick = function onclickUpdate(e) {
		// bepaal de target
		var event = e || window.event;
		var target = event.target || event.srcElement;
		sFieldFocus = target.name == undefined ? target.parentNode.name : target.name ;
		if( target.getAttribute("type") && target.getAttribute("type").match(/^(radio|checkbox)$/) ) 
			updateForm(target);		
		return true;
	}
	
	// create list of all input elements
	var inputs = [];
	for_each( document.getElementsByTagName( "input" ), function(input) { inputs.push( input ); } );
	for_each( document.getElementsByTagName( "select" ), function(input) { inputs.push( input ); } );
	
	// hook up event handlers
	for_each( inputs, function(input) {
		var type = input.getAttribute("type");

		// gedrag voor textvelden
		if( type === "text" ) {
			var old = (typeof(input.onblur) === 'function' ? input.onblur : function() { return true; });
			input.onblur = function(old) { return function() { var r = old.call(this); updateForm(); return r; } }(old);
				
			var old = (typeof(input.onkeyup) === 'function' ? input.onkeyup : function() { return true; });
			input.onkeyup = function(old) { return function() { var r = old.call(this);  updateForm(); return r; } }(old);
				
			// fix for TAB. the form needs to be updated otherwise the focus is not put on an input element that is about to be shown
			var old = input.onkeydown;
			input.onkeydown = function(old) { return function(event) {
				var r = (typeof old == "function" ? old.call(this) : true);
				var event = event || window.event;
				var target = event.target || event.srcElement;
				sFieldFocus = target.name == undefined ? target.parentNode.name : target.name ;
				var code = event ? (event.which ? event.which : event.keyCode) : undefined; // key code
				if( code == 9 ) { // tab pressed?
					updateForm();
				}
				return r; 
			} }(old);
		}
		
		// bijwerken formulier op onchange van select en hidden
		if( input.nodeName.toLowerCase() === "select" || type === "hidden" ) {
			var old = (typeof(input.onchange) === 'function' ? input.onchange : function() {} );
			input.onchange = function(old) { return function(e) { 
				if(e != undefined){
					var event = e || window.event;
					var target = event.target || event.srcElement;
					sFieldFocus = target.name == undefined ? target.parentNode.name : target.name ;
				}
				old.call(this); window.setTimeout( updateForm, 0 ); } }(old);
		}
	});
}

/**
 * fills fields with table data
 *
 * these fields do not change while the user fills in the form
 */
function fillSelectFields()
{
	// woonland aan de hand van tabel WLF
	for_each( Toeslagen.getElementsByClassName( "input-woonland"  ), function(select) {
		var woonland = select;
		woonland.options.length = 0;
		var cnt = 0;
		for( var i in Tabellen.WLF )
			woonland.options[cnt++] = new Option( i, i, Tabellen.WLF[i].isDefault, Tabellen.WLF[i].isDefault );
	});
	
	// aanvrager-inkomen-nl aan de hand van tabel AanvragerInkomenNl
	for_each( Toeslagen.getElementsByClassName( "input-aanvrager-inkomen-nl" ), function(select) {
		var inkomenNl = select;
		inkomenNl.options.length = 0;
		var cnt = 0;
		for( var i in Tabellen.AanvragerInkomenNl )
			inkomenNl.options[cnt++] = new Option( i, i, Tabellen.AanvragerInkomenNl[i].isDefault, Tabellen.AanvragerInkomenNl[i].isDefault );
	});
	
	// toeslagpartner-inkomen-nl aan de hand van tabel ToeslagpartnerInkomenNl
	for_each( Toeslagen.getElementsByClassName( "input-toeslagpartner-inkomen-nl" ), function( select) {
		var inkomenNl = select;
		inkomenNl.options.length = 0;
		var cnt = 0;
		for( var i in Tabellen.ToeslagpartnerInkomenNl )
			inkomenNl.options[cnt++] = new Option( i, i, Tabellen.ToeslagpartnerInkomenNl[i].isDefault, Tabellen.ToeslagpartnerInkomenNl[i].isDefault );
	} );
}

/**
 * updates texts in the form based on entered form values
 */
var updateFormContent = function() {
	function getJaar() { return document.Berekening.jaar.value; };
	
	function getHalfjaar () { return document.Berekening["woning-halfjaar"].value; };
	
	function getAanvragerLeeftijd() { 
		var geboortejaar = document.Berekening['aanvrager-geboortejaar'].value;
		return geboortejaar == "" ? "" : document.Berekening['jaar'].value - document.Berekening['aanvrager-geboortejaar'].value - 1; 
	};
	
	function getAanvragerGeboortejaar() { return document.Berekening['aanvrager-geboortejaar'].value ; }
	
	function getToeslagpartnerLeeftijd() { 
		var geboortejaar = document.Berekening['toeslagpartner-geboortejaar'].value;
		return geboortejaar == "" ? "" : document.Berekening['jaar'].value - document.Berekening['toeslagpartner-geboortejaar'].value - 1; 
	};
	
	function getToeslagpartnerGeboortejaar () { return document.Berekening['toeslagpartner-geboortejaar'].value ; }
	
	function getMedebewonerLeeftijd( medebewonerNr ) {
		var geboortejaar = document.Berekening['medebewoner-geboortejaar-' + medebewonerNr].value;
		return geboortejaar == "" ? "" : document.Berekening['jaar'].value - geboortejaar - 1;  
	}

	function getMedebewonerGeboortejaar(medebewonerNr ) {
		var geboortejaar = document.Berekening['medebewoner-geboortejaar-' + medebewonerNr].value;
		return geboortejaar;
	}

	function fillWoningHalfjaar(jaar) {
		this.options.length = 0;
		if( Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].Halfjaar )
			this.options[0] = new Option( Tabellen.Jaar[jaar].Halfjaar, Tabellen.Jaar[jaar].Halfjaar, false, false );
		else {
			var cnt = 0;
			this.options[cnt++] = new Option( "", "", true, false );
			for( var i in Tabellen.Halfjaar )
				if( i.match( new RegExp("\\s" + jaar+"$") ) )
					this.options[cnt++] = new Option( i, i, false, false );
		}
	}
	
	function getWoning23MinGeboortejaar() {
		var jaar = document.Berekening.jaar.value;
		if( document.getElementById('woning-23-min').className.match( /(^|\s)visible(\s|$)/ ) ) {
			var is23Min = document.getElementById('radio-woning-23-min-ja').checked;
		} else {
			var is23Min = false;
		}
		return jaar - (is23Min ? 23 : 105);
	}

	function getKindGeboortejaar(kindNr) {
		return document.Berekening['select-kind-geboortejaar-' + kindNr].value;
	}
	
	function getKindLeeftijd( kindNr ) {
		var geboortejaar = document.Berekening['select-kind-geboortejaar-' + kindNr].value;
		return geboortejaar == "" ? "" : document.Berekening['jaar'].value - geboortejaar - 1;  
	}

	function fillGeboortejaar( selectElement, maxJaar, minJaar ) {
		var value = selectElement.value;
		selectElement.options.length = 0;
		var cnt = 0;
		selectElement.options[cnt++] = new Option( "", "", false, value == "" );
		for( var jaar = maxJaar; jaar >= minJaar; --jaar )
			selectElement.options[cnt++] = new Option( jaar, jaar, false, value == jaar );
	}

	// table of elements to change: 
	// - name : class name
	// - value: function() that returns the current value
	// - onchange: function(value) that is called when the value changes. Takes the changed value as an argument
	var dynamicContentElements = [
		{ name: "dit-jaar", value: getJaar, onchange: function(jaar){ this.innerHTML = jaar; } },
		{ name: "vorig-jaar", value: getJaar, onchange: function(jaar){ this.innerHTML = jaar - 1; } },
		{ name: "jaar-uit-bet-grns", value: getJaar, onchange: function(jaar) { var jaarTableAccess = new Jaar(jaar); this.innerHTML = formatCurrency( jaarTableAccess.uitBetGrns(), 0 ); } },
		{ name: "jaar-bovengrens", value: getJaar, onchange: function(jaar) { var jaarTableAccess = new Jaar(jaar); this.innerHTML = formatCurrency( jaarTableAccess.bovengrens(), 0 ); } },
		{ name: "jaar-ohga", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].OHGA ? formatCurrency( Tabellen.Jaar[jaar].OHGA, 0 ) : "-"; } },
		{ name: "jaar-ohgb", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].OHGB ? formatCurrency( Tabellen.Jaar[jaar].OHGB, 0 ): "-"; } },
		{ name: "jaar-igta", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].IGTA ? formatCurrency( Tabellen.Jaar[jaar].IGTA, 0 ) : "-"; } },
		{ name: "jaar-igua", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].IGUA ? formatCurrency( Tabellen.Jaar[jaar].IGUA, 0 ) : "-"; } },
		{ name: "jaar-igtb", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].IGTB ? formatCurrency( Tabellen.Jaar[jaar].IGTB, 0 ) : "-"; } },
		{ name: "jaar-igub", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].IGUB ? formatCurrency( Tabellen.Jaar[jaar].IGUB, 0 ) : "-"; } },
		{ name: "jaar-mx-ink-1", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].MxInk1 ? formatCurrency( Tabellen.Jaar[jaar].MxInk1, 0 ) : "-"; } },
		{ name: "jaar-mx-ink-2", value: getJaar, onchange: function(jaar){ this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].MxInk2 ? formatCurrency( Tabellen.Jaar[jaar].MxInk2, 0 ) : "-"; } },
		{ name: "jaar-vsvb", value: getJaar, onchange: function(jaar) { this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].VSVB ? formatCurrency( Tabellen.Jaar[jaar].VSVB, 0 ) : "-"; } },
		{ name: "kind-opvangvorm-maxuren", value: getJaar, onchange: function(jaar) { this.innerHTML = Tabellen.Jaar[jaar] && Tabellen.Jaar[jaar].MaxUren?Tabellen.Jaar[jaar].MaxUren:0; } },
		{ name: "toeslagpartner-leeftijd-plus-1", value: getToeslagpartnerLeeftijd, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "toeslagpartner-geboortejaar-min-1", value: getToeslagpartnerGeboortejaar, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "aanvrager-leeftijd-plus-1", value: getAanvragerLeeftijd, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "aanvrager-geboortejaar-min-1", value: getAanvragerGeboortejaar, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "woning-halfjaar", value: getJaar, onchange: fillWoningHalfjaar },
		{ name: "halfjaar-mx-sk", value: getHalfjaar, onchange: function(halfjaar) { this.innerHTML = Tabellen.Halfjaar[halfjaar] && Tabellen.Halfjaar[halfjaar].MxSK ? formatCurrency( Tabellen.Halfjaar[halfjaar].MxSK, 0 ) : "-"; } },
		{ name: "doelgroepgrens", value: function() { return document.Berekening['result-doelgroepgrens'].value; }, onchange: function(value) { this.innerHTML = formatCurrency( value, 0 ); } },
		{ name: "huurtoeslag", value: function() { return document.Berekening['result-huurtoeslag'].value; }, onchange: function(huurtoeslag) { this.innerHTML = formatCurrency(huurtoeslag, 0); } },
		{ name: "huurgrens", value: function() { return document.Berekening['result-huurgrens'].value; }, onchange: function(huurgrens) { this.innerHTML = formatCurrency(huurgrens); } },
		{ name: "kindertoeslag", value: function() { return document.Berekening['result-kindertoeslag'].value; }, onchange: function(kindertoeslag) { this.innerHTML = formatCurrency(kindertoeslag, 0); } },
		{ name: "kindgebonden-budget", value: function() { return document.Berekening['result-kindgebonden-budget'].value; }, onchange: function(kindgebondenBudget) { this.innerHTML = formatCurrency(kindgebondenBudget, 0); } },
		{ name: "kinderopvangtoeslag", value: function() { return document.Berekening['result-kinderopvangtoeslag'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag, 0); } },
		{ name: "kinderopvangtoeslag-niet-afgerond", value: function() { return document.Berekening['result-kinderopvangtoeslag-totaal'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-1", value: function() { return document.Berekening['result-kinderopvangtoeslag-1'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-2", value: function() { return document.Berekening['result-kinderopvangtoeslag-2'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-3", value: function() { return document.Berekening['result-kinderopvangtoeslag-3'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-4", value: function() { return document.Berekening['result-kinderopvangtoeslag-4'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-5", value: function() { return document.Berekening['result-kinderopvangtoeslag-5'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-6", value: function() { return document.Berekening['result-kinderopvangtoeslag-6'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-7", value: function() { return document.Berekening['result-kinderopvangtoeslag-7'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "kinderopvangtoeslag-8", value: function() { return document.Berekening['result-kinderopvangtoeslag-8'].value; }, onchange: function(kinderopvangtoeslag) { this.innerHTML = formatCurrency(kinderopvangtoeslag); } },
		{ name: "zorgtoeslag", value: function() { return document.Berekening['result-zorgtoeslag'].value; }, onchange: function(zorgtoeslag) { this.innerHTML = formatCurrency(zorgtoeslag, 0); } },
		{ name: "totaal-toeslag", value: function() { return document.Berekening['result-toeslag-totaal'].value; }, onchange: function(toeslag) { this.innerHTML = formatCurrency(toeslag, 0); } },
		{ name: "medebewoner-leeftijd-1-plus-1", value: function() { return getMedebewonerLeeftijd(1); }, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "medebewoner-leeftijd-2-plus-1", value: function() { return getMedebewonerLeeftijd(2); }, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "medebewoner-leeftijd-3-plus-1", value: function() { return getMedebewonerLeeftijd(3); }, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "medebewoner-leeftijd-4-plus-1", value: function() { return getMedebewonerLeeftijd(4); }, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "medebewoner-leeftijd-5-plus-1", value: function() { return getMedebewonerLeeftijd(5); }, onchange: function(leeftijd) { this.innerHTML = (leeftijd == "" ? "-" : leeftijd + 1); } },
		{ name: "medebewoner-geboortejaar-1-min-1", value: function() { return getMedebewonerGeboortejaar(1); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "medebewoner-geboortejaar-2-min-1", value: function() { return getMedebewonerGeboortejaar(2); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "medebewoner-geboortejaar-3-min-1", value: function() { return getMedebewonerGeboortejaar(3); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "medebewoner-geboortejaar-4-min-1", value: function() { return getMedebewonerGeboortejaar(4); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "medebewoner-geboortejaar-5-min-1", value: function() { return getMedebewonerGeboortejaar(5); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },
		{ name: "input-geboortejaar", value: getJaar, onchange: function(jaar) { fillGeboortejaar( this, jaar - 12, jaar - 105 ); } },
		{ name: "input-woning-geboortejaar", value: getWoning23MinGeboortejaar, onchange: function(minGeboortejaar) { fillGeboortejaar( this, document.Berekening.jaar.value, minGeboortejaar ); } },
		
		{ name: "input-kind-geboortejaar", value: getJaar, onchange: function(jaar) { fillGeboortejaar( this, jaar, jaar - 18); } },

/* 		{ name: "kind-leeftijd-1-plus-1", value: function() { return getKindLeeftijd(1); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-2-plus-1", value: function() { return getKindLeeftijd(2); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-3-plus-1", value: function() { return getKindLeeftijd(3); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-4-plus-1", value: function() { return getKindLeeftijd(4); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-5-plus-1", value: function() { return getKindLeeftijd(5); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-6-plus-1", value: function() { return getKindLeeftijd(6); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-7-plus-1", value: function() { return getKindLeeftijd(7); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } },
		{ name: "kind-leeftijd-8-plus-1", value: function() { return getKindLeeftijd(8); }, onchange: function(leeftijdKind) { this.innerHTML = (leeftijdKind == "" ? "-" : leeftijdKind + 1); } }, */
		{ name: "kind-geboortejaar-1-min-1", value: function() { return getKindGeboortejaar(1); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-2-min-1", value: function() { return getKindGeboortejaar(2); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-3-min-1", value: function() { return getKindGeboortejaar(3); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-4-min-1", value: function() { return getKindGeboortejaar(4); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-5-min-1", value: function() { return getKindGeboortejaar(5); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-6-min-1", value: function() { return getKindGeboortejaar(6); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-7-min-1", value: function() { return getKindGeboortejaar(7); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } },		
		{ name: "kind-geboortejaar-8-min-1", value: function() { return getKindGeboortejaar(8); }, onchange: function(jaar) { this.innerHTML = (jaar == "" ? "-" : jaar - 1); } }

		];
	
	function updateFormContent() {
		for_each( dynamicContentElements, function( value ) { 
			value.previous = value.current; 
			value.current = value.value();
			if( value.current != value.previous ) {
				var elements = Toeslagen.getElementsByClassName( value.name );
				for_each( elements, function(element) { value.onchange.call(element, value.current); } );
			}
		} );
	}
	
	return updateFormContent;
}();

/**
 * update visibility of parts of the form based on entered input fields
 *
 * This is used to specifically show parts of a text, not whole questions or blocks.
 * Those are 
 */
var updateFormVisibility = function() {
	function getFormSingleValue(node) {
		if( node.nodeType == 1 ) {
			if( node.checked !== undefined && node.checked )
				return node.value;
			else if( node.checked === undefined && node.value !== undefined )
				return node.value;
		} else if( node.length != undefined ) {
			for( var i = 0, sz = node.length; i < sz; ++i ) {
				var child = node[i];
				var value = getFormSingleValue(child);
				if( value != null )
					return value;
			}
		}
		return null
	}
	
	function isOpvang2Plus() { 
		var kot = 0; 
		for( var i = 0; i <= 8 && i < document.Berekening["aanvrager-kinderen"].value; ++i ) {
			var index = i + 1;
			kot += ( document.Berekening["kind-opvang-" + index].value == "geen" ? 0 : 1 );
		}
		return kot > 1;
	}
	
	// list of classes that are set to visible/invisible
	// - name: class name
	// - isVisible: function that returns true if the element should be shown or false if it should be hidden
	var toggleableElements = [
		{ name: "visible-for-ht", isVisible: function() { return hasClass(document.getElementById("huurtoeslag"),"visible") && document.Berekening.huurtoeslag.checked; } },
		{ name: "visible-for-zt", isVisible: function() { return hasClass(document.getElementById("zorgtoeslag"),"visible") && document.Berekening.zorgtoeslag.checked; } },
		{ name: "visible-for-not-zt", isVisible: function() { return !hasClass(document.getElementById("zorgtoeslag"),"visible") || !document.Berekening.zorgtoeslag.checked; } },
		{ name: "visible-for-kt", isVisible: function() { return hasClass(document.getElementById("kindertoeslag"),"visible") && document.Berekening.kindertoeslag.checked; } },
		{ name: "visible-for-kgb", isVisible: function() { return hasClass(document.getElementById("kindgebonden-budget"),"visible") && document.Berekening["kindgebonden-budget"].checked; } },
		{ name: "visible-for-kot", isVisible: function() { return hasClass( document.getElementById("kinderopvangtoeslag"), "visible" ) && document.Berekening.kinderopvangtoeslag.checked; } },
		{ name: "visible-for-2006", isVisible: function() { return parseInt(document.Berekening.jaar.value) === 2006; } },
		{ name: "visible-for-2007", isVisible: function() { return parseInt(document.Berekening.jaar.value) === 2007; } },
		{ name: "visible-for-2008", isVisible: function() { return parseInt(document.Berekening.jaar.value) === 2008; } },
		{ name: "visible-for-2009", isVisible: function() { return parseInt(document.Berekening.jaar.value) === 2009; } },
		{ name: "visible-for-2010", isVisible: function() { return parseInt(document.Berekening.jaar.value) === 2010; } },		
		{ name: "visible-for-kind", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value == 1; } },
		{ name: "visible-for-kinderen", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value != 1; } },
		{ name: "visible-for-medebewoner", isVisible: function() { return document.Berekening["woning-medebewoners"].value == 1; } },
		{ name: "visible-for-medebewoners", isVisible: function() { return document.Berekening["woning-medebewoners"].value != 1; } },
		{ name: "visible-for-toeslagpartner", isVisible: function() { return getFormSingleValue(document.Berekening["aanvrager-toeslagpartner"]) == "ja"; } },
		{ name: "visible-for-not-toeslagpartner", isVisible: function() { return getFormSingleValue(document.Berekening["aanvrager-toeslagpartner"]) != "ja"; } },
		{ name: "visible-for-woning-aangepast", isVisible: function() { return getFormSingleValue(document.Berekening["woning-aangepast"]) == "ja"; } },
		{ name: "visible-for-toeslagpartner-not-18-plus", isVisible: function() { return getFormSingleValue(document.Berekening["aanvrager-toeslagpartner"]) == "ja" && parseInt(document.Berekening['jaar'].value) - parseInt(getFormSingleValue(document.Berekening["toeslagpartner-geboortejaar"])) -1 < 18 ; } },
		{ name: "visible-for-result-huurtoeslag", isVisible: function() { return document.Berekening['result-toeslag-gekozen'].value.match( /(^|\s)huurtoeslag(\s|$)/ ) != null; } },
		{ name: "visible-for-result-kindertoeslag", isVisible: function() { return document.Berekening['result-toeslag-gekozen'].value.match( /(^|\s)kindertoeslag(\s|$)/ ) != null; } },
		{ name: "visible-for-result-kindgebonden-budget", isVisible: function() { return document.Berekening['result-toeslag-gekozen'].value.match( /(^|\s)kindgebonden-budget(\s|$)/ ) != null; } },
		{ name: "visible-for-result-kinderopvangtoeslag", isVisible: function() { return document.Berekening['result-toeslag-gekozen'].value.match( /(^|\s)kinderopvangtoeslag(\s|$)/ ) != null; } },
		{ name: "visible-for-result-zorgtoeslag", isVisible: function() { return document.Berekening['result-toeslag-gekozen'].value.match( /(^|\s)zorgtoeslag(\s|$)/ ) != null; } },
		{ name: "visible-for-huishouden-mph-or-mph-65-plus", isVisible: function() { var huishouden = document.Berekening["result-huishouden"].value; return huishouden == "MPH" || huishouden == "MPH65+"; } },
		{ name: "visible-for-aanvrager-17", isVisible: function() { var leeftijd = document.Berekening['jaar'].value - document.Berekening['aanvrager-geboortejaar'].value - 1; return leeftijd == 17; } },
		{ name: "visible-for-toeslagpartner-17", isVisible: function() {var leeftijd = parseInt(document.Berekening['jaar'].value) - parseInt(document.Berekening['toeslagpartner-geboortejaar'].value) - 1;return leeftijd == 17; } },
		{ name: "visible-for-kind-uitwonend-1", isVisible: function() { return document.Berekening["kind-woonsituatie-1"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-2", isVisible: function() { return document.Berekening["kind-woonsituatie-2"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-3", isVisible: function() { return document.Berekening["kind-woonsituatie-3"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-4", isVisible: function() { return document.Berekening["kind-woonsituatie-4"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-5", isVisible: function() { return document.Berekening["kind-woonsituatie-5"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-6", isVisible: function() { return document.Berekening["kind-woonsituatie-6"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-7", isVisible: function() { return document.Berekening["kind-woonsituatie-7"].value == "uitwonend"; } },
		{ name: "visible-for-kind-uitwonend-8", isVisible: function() { return document.Berekening["kind-woonsituatie-8"].value == "uitwonend"; } },
		{ name: "visible-for-kind-thuiswonend-1", isVisible: function() { return document.Berekening["kind-woonsituatie-1"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-2", isVisible: function() { return document.Berekening["kind-woonsituatie-2"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-3", isVisible: function() { return document.Berekening["kind-woonsituatie-3"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-4", isVisible: function() { return document.Berekening["kind-woonsituatie-4"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-5", isVisible: function() { return document.Berekening["kind-woonsituatie-5"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-6", isVisible: function() { return document.Berekening["kind-woonsituatie-6"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-7", isVisible: function() { return document.Berekening["kind-woonsituatie-7"].value == "thuiswonend"; } },
		{ name: "visible-for-kind-thuiswonend-8", isVisible: function() { return document.Berekening["kind-woonsituatie-8"].value == "thuiswonend"; } },
		{ name: "visible-for-kindopvang-1", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 1 && document.Berekening["kind-opvang-1"].value != "geen"; } },
		{ name: "visible-for-kindopvang-2", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 2 && document.Berekening["kind-opvang-2"].value != "geen"; } },
		{ name: "visible-for-kindopvang-3", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 3 && document.Berekening["kind-opvang-3"].value != "geen"; } },
		{ name: "visible-for-kindopvang-4", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 4 && document.Berekening["kind-opvang-4"].value != "geen"; } },
		{ name: "visible-for-kindopvang-5", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 5 && document.Berekening["kind-opvang-5"].value != "geen"; } },
		{ name: "visible-for-kindopvang-6", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 6 && document.Berekening["kind-opvang-6"].value != "geen"; } },
		{ name: "visible-for-kindopvang-7", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 7 && document.Berekening["kind-opvang-7"].value != "geen"; } },
		{ name: "visible-for-kindopvang-8", isVisible: function() { return document.Berekening["aanvrager-kinderen"].value >= 8 && document.Berekening["kind-opvang-8"].value != "geen"; } },
		{ name: "visible-for-kindopvang-2-plus", isVisible: function() { return isOpvang2Plus(); } }
	];

	function updateFormVisibility() {
		// get current toggle values
		var temp="ggg";
		for_each( toggleableElements, function(toggleable) { toggleable.previous = toggleable.current; toggleable.current = toggleable.isVisible(); } );

		// hide all disabled elements
		for_each( toggleableElements, function(toggleable) {
			if( toggleable.previous !== toggleable.current && !toggleable.current )
				for_each( Toeslagen.getElementsByClassName( toggleable.name ), function( element ) { 
					addClass( element, "invisible" ) 
				} );
		});

		// show all enabled elements
		// NOTE: if an element has at least one class token which is enabled, then it will be shown
		for_each( toggleableElements, function(toggleable) {
			if( toggleable.previous !== toggleable.current && toggleable.current )
				for_each( Toeslagen.getElementsByClassName( toggleable.name ), function( element ) { 
					removeClass( element, "invisible" ) 
				} );
		});
	}
	return updateFormVisibility;
}();

function initInterface() {
	setEventHandlers();
	fillSelectFields();
	
	// add log
	var div = document.createElement("div");
	div.id = "log";
	document.getElementsByTagName("body")[0].appendChild( div );

	// initialize expandable input sets
	initializeExpandableInputSet(updateForm);
	
	// HACK: disable action for disabled link-toetsingsinkomen
	// TODO: figure out if these links should be hidden instead as in other rekenhulp applications
	for_each( Toeslagen.getElementsByClassName( "link-toetsingsinkomen" ), function(link) {
		var old = (typeof link.onclick == "function" ? link.onclick : function() { return true; });
		link.onclick = function(link,old) { return function() {
			if( !hasClass( link, "disabled" ) )
				return old.apply(this);
			else
				return false;
		} }(link,old) 
	} );
	
	updateForm();

	// remove waiting indicator
	addClass( document.getElementById( "waiting" ), "invisible" );
}
