var Toeslagen = Toeslagen || {};

/** 
 * worklow for toeslagen
 *
 */
Toeslagen.workflow = function() {

	/**
	 * shows a div with the given id
	 *
	 * @param theCase case
	 * @param id of the element
	 *
	 * the div is added to the list of visible elements and not actually shown
	 * for caching reasons
	 */
	function show( theCase, id ) {
		theCase.visibleElements = theCase.visibleElements || {};
		theCase.visibleElements[id] = document.getElementById(id);
	}
	
	/** 
	 * get the value of an input field
	 *
	 * @param elem input element (e.g. input, select)
	 */
	function getFormValue(elem) {
		if( elem.getAttribute && (elem.getAttribute('type') == 'radio' || elem.getAttribute('type') == 'checkbox') ) {
			if( elem.checked )
				return elem.value;
		} else if( elem.value != undefined ) {
			if( elem.value != '' )
				return elem.value;
		} else {
			var value = undefined;
			for( var i = 0; i < elem.length; ++i ) {
				var value = getFormValue( elem[i] );
				if( value != undefined )
					return value;
			}
		}
		return undefined;
	}
	
	/**
	 * sets the value of an input element
	 *
	 * @param element element (e.g. input, select)
	 * @param value new value
	 */
	function setFormValue( element, value ) {
		if( typeof element.nodeName === 'string' && element.nodeName.toLowerCase() == 'select' ) {
			for( var i = 0, sz = element.options.length; i < sz; ++i )
				if( "" + element.options[i].value == "" + value ) {
					element.selectedIndex = i;
					break;
				}
		} else if( element.getAttribute && element.getAttribute("type") != null && (element.getAttribute("type").toLowerCase() == 'radio' || element.getAttribute("type").toLowerCase() == 'checkbox') ) {
			if( element.value == value )
				element.checked = true;
		} else if( element.value != undefined ) {
			element.value = value;
		} else if( element.length != undefined ) {
			for_each( element, function(child) { setFormValue( child, value ); } );
		}
	}
		
	/**
	 * show an input field
	 *
	 * @param theCase case
	 * @id both the id of the surround element containing the input field and the name of the input field, e.g.
	 *		<p id="question-age"><label for="input-age">Enter your age</label> <input type="text" name="question-age" id="input-age"/></p>
	 *
	 * If a value is entered, it is stored as a case attribute in theCase.formValues
	 *
	 * @note if a case value is already set then the form value is set to this value and the question is *not* displayed
	 */
	function showInput( theCase, id ) {
		// check if the value has already been calculated
		if( theCase.formValues[id] != undefined )
		{
			setFormValue( theCase.form[id], theCase.formValues[id] );
		} else
		{
			show( theCase, id );
			theCase.formValues[id] = getFormValue(theCase.form[id]);
		}
	}

	function isHt( theCase ) { return theCase.htMin ? 'nee' : (theCase.formValues['huurtoeslag'] === 'ja' ? 'ja' : 'nee') }
	function isKt(theCase) { return theCase.ktMin ? 'nee' : (theCase.formValues['kindertoeslag'] === 'ja' ? 'ja' : 'nee'); }
	function isKgb(theCase) { return theCase.kgbMin ? 'nee' : (theCase.formValues['kindgebonden-budget'] === 'ja' ? 'ja' : 'nee'); }
	function isKot(theCase) { return theCase.kotMin ? 'nee' : (theCase.formValues['kinderopvangtoeslag'] === 'ja' ? 'ja' : 'nee'); }
	function isZt( theCase ) { return theCase.ztMin ? 'nee' : (theCase.formValues['zorgtoeslag'] === 'ja' ? 'ja' : 'nee'); }
	
	/**
	 * medebewoner subflow
	 *
	 * @return \c true if the flow is completed, otherwise \c false
	 */
	function flowMedebewoner(theCase) {
		var medebewonerCount = parseInt( theCase.formValues['woning-medebewoners'] );
		
		show( theCase, 'fsMedebewoner' ); // toon blok medebewoners
		
		var medebewonerNr = 1;
		while( medebewonerNr <= medebewonerCount ) {
			show( theCase, 'fsMedebewoner-' + medebewonerNr ); // toon blok specifieke medebewoner
			
			showInput( theCase, 'medebewoner-geboortejaar-' + medebewonerNr );
			if( theCase.formValues['medebewoner-geboortejaar-' + medebewonerNr] === undefined) {
				break; 
			}
			
			var geboortejaar = theCase.formValues['medebewoner-geboortejaar-' + medebewonerNr];
			var leeftijd = undefined;
			// leid af: leeftijd (indien beschikbaar)
			if( geboortejaar !== undefined ) {
				var jaar = theCase.formValues['jaar'];
				leeftijd = parseInt(jaar) - parseInt(geboortejaar) - 1;
				theCase['medebewoner-leeftijd-' + medebewonerNr] = leeftijd;
			
				// tussenresultaat tonen bij leeftijd 22 of 64
				if( leeftijd === 22 || leeftijd === 64 ) {
					var id = "tussenresultaat-medebewoner-22-64-bij-ht-" + medebewonerNr;
					var regexp = new RegExp( "(^|\\s)" + id + "(\\s|$)" );
					if( theCase['tussenresultaten-negeren'].match( regexp ) == null ) {
						doTussenresultaat( id );
						theCase.tussenresultaat = id;
					}
					
					if( theCase.tussenresultaat !== undefined )
						break; // wacht op 'verder'
				}
			}

			if ( theCase['aanvrager-leeftijd'] < 23 && document.getElementById('radio-woning-23-min-ja').checked == true && leeftijd >= 23  ) {
				break; // wacht op invoer, er is een waarde ingevuld die geen keuze in de lijst meer is (n.a.v. bevinding 335).
			}

			if( leeftijd < 23 ) {
				showInput( theCase, 'medebewoner-kind-' + medebewonerNr );
				if( theCase.formValues['medebewoner-kind-' + medebewonerNr] === undefined )
					break; // wacht op invoer
			}			

			showInput( theCase, 'medebewoner-toetsingsinkomen-' + medebewonerNr );
			if( theCase.formValues['medebewoner-toetsingsinkomen-' + medebewonerNr] === undefined ) {
				break; // wacht op invoer geboortejaar en toetsingsinkomen
			}
			
			++medebewonerNr;
		}
		
		if( medebewonerNr === medebewonerCount + 1 ) {
			return true;
		} else {
			return false; // invoer van een of meer medebewoners niet compleet
		}
	}

	/**
	 * woning subflow
	*
	 * @return \c true if the flow is completed, otherwise \c false
	 */
	function flowWoning(theCase) {
		do {
			show( theCase, 'fsWoning' ); // toon blok woning

			// bepaal jaar.Halfjaar aanwezig
			var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
			var halfjaar = jaarTableAccess.halfjaar();			
			
			if( halfjaar !== '' ) {
				// stel halfjaar automatisch in want er is maar 1 optie
				theCase.formValues['woning-halfjaar'] = halfjaar;
			} else {
				showInput( theCase, 'woning-halfjaar' );
				if( theCase.formValues['woning-halfjaar'] === undefined )
					break; // wacht op invoer
			}
			document.getElementById('KwKrtGrns_1').innerHTML = formatCurrency(Tabellen.Halfjaar[document.getElementById('select-woning-halfjaar').value].KwKrtGrns,2);
			document.getElementById('MaxHuur_1').innerHTML = formatCurrency(Tabellen.Halfjaar[document.getElementById('select-woning-halfjaar').value].MaxHuur,2);
			document.getElementById('MaxHuur_2').innerHTML = document.getElementById('MaxHuur_1').innerHTML;

			showInput( theCase, 'woning-op-kamers' );
			if( theCase.formValues['woning-op-kamers'] === undefined )
				break; // wacht op invoer
			
			if( theCase.formValues['woning-op-kamers'] === 'ja' ) {
				showInput( theCase, 'woning-aangewezen' );
				if( theCase.formValues['woning-aangewezen'] === undefined )
					break; // wacht op invoer
					
				if( theCase.formValues['woning-aangewezen'] === 'nee' )
					theCase.htMin = true; // HT-
			}
	
			if( theCase.htMin !== true ) {
				showInput( theCase, 'woning-aangepast' );
				if( theCase.formValues['woning-aangepast'] === undefined )
					break; // wacht op invoer
					
				if( theCase.formValues['woning-aangepast'] === 'nee' && theCase['aanvrager-leeftijd'] < 23 &&
						(theCase.formValues['aanvrager-toeslagpartner'] === 'nee' 
						|| theCase.formValues['toeslagpartner-zelfde-adres'] === 'nee' 
						|| theCase['toeslagpartner-leeftijd'] < 23 ) ) {
					showInput( theCase, 'woning-23-min' );
					if( theCase.formValues['woning-23-min'] === undefined )
						break; // wacht op invoer
					
					if( theCase.formValues['woning-23-min'] === 'ja' ) {
						showInput( theCase, 'woning-kind' );
						if( theCase.formValues['woning-kind'] === undefined )
							break; // wacht op invoer
							
						if( theCase.formValues['woning-kind'] === 'nee' && jaarTableAccess.hdcp() === 'Ja') {
							showInput( theCase, 'woning-handicap' );
							if( theCase.formValues['woning-handicap'] === undefined )
								break; // wacht op invoer
						}
					}
				}

				theCase.garage = false;
				if (jaarTableAccess.garage() === true) {	
					theCase.garage = true;
					showInput( theCase, 'woning-garage' );
					if( theCase.formValues['woning-garage'] === undefined ) {
						break; // wacht op invoer
					}
				}
				
				showInput( theCase, 'woning-huur' );
				if( theCase.formValues['woning-huur'] === undefined )
					break; // wacht op invoer
				
				// bereken HuurNaGarage en Huurgrens
				var halfjaarTableAccess = new Halfjaar( theCase.formValues['woning-halfjaar'] );
				var htBerekening = new HtBerekening( halfjaarTableAccess, new CaseInput(theCase) );
				theCase['huur-na-garage'] = htBerekening.huurNaGarage();
				theCase['huurgrens'] = htBerekening.huurgrens();
				
				if( theCase.formValues['woning-aangepast'] === 'nee' && theCase['huur-na-garage'] > theCase['huurgrens'] ) {
					theCase.htMin = true; // HT-
				} else {
					showInput( theCase, 'woning-servicekosten' );
					if( theCase.formValues['woning-servicekosten'] === undefined )
						break; // wacht op invoer
					
					// bereken HuurVoorOh
					var halfjaarTableAccess = new Halfjaar( theCase.formValues['woning-halfjaar'] );
					var htBerekening = new HtBerekening( halfjaarTableAccess, new CaseInput(theCase) );
					theCase['huur-voor-oh'] = htBerekening.huurVoorOh();
					
					if( theCase.formValues['woning-aangepast'] === 'nee' && theCase['huur-voor-oh'] > theCase['huurgrens'] ) {
						theCase.htMin = true;
					} else {
						theCase.onderhuur = false;
						if (jaarTableAccess.onderhuur() === true) {	
							theCase.onderhuur = true;
							showInput( theCase, 'woning-onderhuur' );
							if( theCase.formValues['woning-onderhuur'] === undefined ) {
								break; // wacht op invoer
							}
						}	
							
						showInput( theCase, 'woning-medebewoners' );
						if( theCase.formValues['woning-medebewoners'] === undefined )
							break; // wacht op invoer
							
						if( theCase.formValues['woning-medebewoners'] > 0 ) {
							// medebewoners
						}
					}
				}
			}
			theCase['woning-afgerond'] = true;

			if( parseInt(theCase.formValues['woning-medebewoners']) > 0 )
				return flowMedebewoner(theCase);
			else
				return true;
		} while(false);
		
		return false;
	};

	/**
	 * kind B subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowKindB(theCase, kindNr) {
		do {
			if( isKot(theCase) === 'ja' ) {
				showInput( theCase, 'kind-opvang-' + kindNr );
				if( theCase.formValues['kind-opvang-' + kindNr] === undefined )
					break; // wacht op invoer
					
				if( theCase.formValues['kind-opvang-' + kindNr] !== 'geen' ) {
					show( theCase, 'kind-kinderopvang-' + kindNr ); // make kind-kinderopvang visible
					showInput( theCase, 'kind-kinderopvang-aantal-' + kindNr ); // 1 to 3 values possible
					
					// uren/uurprijs zitten niet in workflow vanwege de dynamische methode waarbij 
					// opvang kan worden toegevoegd en verwijderd
					// deze stap leest ze uit en plaats ze 'handmatig' in de formValues van de case
					var aantal =  theCase.formValues['kind-kinderopvang-aantal-' + kindNr];
					if( aantal ) {
						for( var i = 0; i < aantal; ++i ) {
							var opvangNr = i+1;
							theCase.formValues['kind-opvangvorm-' + kindNr + '-' + opvangNr] = document.Berekening['select-opvang-vorm-' + kindNr + '-' + opvangNr].value;							
							theCase.formValues['kind-uren-' + kindNr + '-' + opvangNr] = document.Berekening['kind-uren-' + kindNr + '-' + opvangNr].value;
							theCase.formValues['kind-uurprijs-' + kindNr + '-' + opvangNr] = document.Berekening['kind-uurprijs-' + kindNr + '-' + opvangNr].value.replace(/,/,".");
						}
					}

					// maximum uren ophalen
					var jaarTableAccess = new Jaar( theCase.formValues['jaar'] );
					var maxuren = jaarTableAccess.maxUren();
					theCase['maxuren'] = maxuren;
					
					// wacht tot uren/uurprijs compleet is
					var rowAmount = parseInt( theCase.formValues['kind-kinderopvang-aantal-' + kindNr] )
					var incomplete = false; // assume complete
					var urenGO = 0; 
					var urenKC = 0;
					var iRijBovenMax;
					for( var i = 0; i < rowAmount && iRijBovenMax == undefined; ++i ) {
						var opvangNr = i + 1;
						var opvangvorm = theCase.formValues['kind-opvangvorm-' + kindNr + '-' + opvangNr];
						var uren = theCase.formValues['kind-uren-' + kindNr + "-" + opvangNr];
						var uurprijs = theCase.formValues['kind-uurprijs-' + kindNr + "-" + opvangNr]

						if (opvangvorm != "" && uren != "" && uren != undefined) {
							//het totaal aantal uren bijhouden
							if (opvangvorm == "gastouderopvang" ) {urenGO += parseInt(uren);}
							if (opvangvorm == "kindercentrum" ) {urenKC += parseInt(uren);}
							if (maxuren != null && (urenGO > maxuren || urenKC > maxuren)) {
								iRijBovenMax = i + 1;
							}
						}
						
						if( uren === undefined || uren === "" || uurprijs === undefined || uurprijs === "" || opvangvorm === "" ) {
							incomplete = true;
						}
					}

					// Controleer of het aantal uren boven het maximum uitkomt

					theCase['toturengo'] = urenGO;
					theCase['toturenkc'] = urenKC;

 					if (maxuren != null && (urenGO > maxuren || urenKC > maxuren)) {
						alert("Per opvangvorm mag u niet meer dan " + maxuren + " uren opgeven.");
						//De rij bepalen welke de focus moet krijgen:
						var iFocusRij = sFieldFocus.substr(sFieldFocus.lastIndexOf("-") + 1);
						//het veld leegmaken
						document.getElementById("input-kind-uren-" +  kindNr + "-" + iFocusRij).value = "";						
						//het veld de focus geven
						SetFocus("input-kind-uren-" +  kindNr + "-" + iFocusRij);
						break; // stop flow, want niet alle waarden zijn compleet		
					}
					
					if( incomplete )
						break; // stop flow, want niet alle waarden zijn compleet

					
					// bepaal jaar.werkgeversbijdrage

					var wrkgvrBdr = jaarTableAccess.wrkgvrBdr();
					theCase['jaar-werkgeversbijdrage'] = (wrkgvrBdr == 'Ja' ? 'ja' : 'nee');
					
					if( theCase['jaar-werkgeversbijdrage'] === 'ja' ) {
						if( theCase.formValues['aanvrager-werk']  === 'ja' ) {
							showInput( theCase, 'kind-werkgeversbijdrage-aanvrager-' + kindNr );
							if( theCase.formValues['kind-werkgeversbijdrage-aanvrager-' + kindNr] === undefined )
								break; // wacht op invoer
								
							if( theCase.formValues['kind-werkgeversbijdrage-aanvrager-' + kindNr] === 'anders' ) {
								showInput( theCase, 'kind-werkgeversbijdrage-aanvrager-bedrag-' + kindNr );
								if( theCase.formValues['kind-werkgeversbijdrage-aanvrager-bedrag-' + kindNr] === undefined )
									break; // wacht op invoer
							}
						}
						
						if( theCase.formValues['aanvrager-toeslagpartner'] === 'ja' && theCase.formValues['toeslagpartner-werk'] === 'ja' ) {
							showInput( theCase, 'kind-werkgeversbijdrage-partner-' + kindNr );
							if( theCase.formValues['kind-werkgeversbijdrage-partner-' + kindNr] === undefined )
								break; // wacht op invoer
								
							if( theCase.formValues['kind-werkgeversbijdrage-partner-' + kindNr] === 'anders' ) {
								showInput( theCase, 'kind-werkgeversbijdrage-partner-bedrag-' + kindNr );
								if( theCase.formValues['kind-werkgeversbijdrage-partner-bedrag-' + kindNr] === undefined )
									break;
							}
						}
					}
					
					if( theCase.formValues['aanvrager-bijdrage'] === 'ja' && theCase.formValues['aanvrager-werk']  === 'ja') {
						showInput( theCase, 'kind-bijdrage-aanvrager-' + kindNr );
						if( theCase.formValues['kind-bijdrage-aanvrager-' + kindNr] === undefined )
							break; // wacht op invoer
							
						if( theCase.formValues['kind-bijdrage-aanvrager-' + kindNr] === 'anders' ) {
							showInput( theCase, 'kind-bijdrage-aanvrager-bedrag-' + kindNr );
							if( theCase.formValues['kind-bijdrage-aanvrager-bedrag-' + kindNr] === undefined )
								break; // wacht op invoer
						}
					}
					
					if( theCase.formValues['toeslagpartner-bijdrage'] === 'ja' && theCase.formValues['toeslagpartner-werk'] === 'ja' ) {
						showInput( theCase, 'kind-bijdrage-partner-' + kindNr );
						if( theCase.formValues['kind-bijdrage-partner-' + kindNr] === undefined )
							break; // wacht op invoer
							
						if( theCase.formValues['kind-bijdrage-partner-' + kindNr] === 'anders' ) {
							showInput( theCase, 'kind-bijdrage-partner-bedrag-' + kindNr );
							if( theCase.formValues['kind-bijdrage-partner-bedrag-' + kindNr] === undefined )
								break; // wacht op invoer
						}
					}
				}
			}
			theCase['kind-b-' + kindNr + '-afgerond'] = true;
			return true;
		} while(false);

		return false;
	}

	/**
	 * kind A subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowKindA(theCase, kindNr) {
		do {
			if( isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' ) {
				var jaar = theCase.formValues['jaar'];
				var jaarTableHelper = new Jaar(jaar);		
				if (isKgb(theCase) === 'ja' && jaarTableHelper.wtos() === true) {
					showInput( theCase, 'kind-geboortejaar-' + kindNr );
					if( theCase.formValues['kind-geboortejaar-' + kindNr] === undefined )
						break; // wacht op invoer			

					var kind_leeftijd = parseInt(jaar) - parseInt(theCase.formValues['kind-geboortejaar-' + kindNr]) - 1;
					theCase['kind_leeftijd-' + kindNr] = kind_leeftijd;
						
					// tussenresultaat tonen bij leeftijd 11 of 15
					if( kind_leeftijd === 11 || kind_leeftijd === 15 ) {
						var id = "tussenresultaat-kind-" + kind_leeftijd + "-bij-kgb-" + kindNr;
						var regexp = new RegExp( "(^|\\s)" + id + "(\\s|$)" );
						if( theCase['tussenresultaten-negeren'].match( regexp ) == null ) {
							doTussenresultaat( id );
							theCase.tussenresultaat = id;
						}
						
						if( theCase.tussenresultaat !== undefined )
							break; // wacht op 'verder'			
					
					}				
				}	

				showInput( theCase, 'kind-kb-aanvr-' + kindNr );
				if( theCase.formValues['kind-kb-aanvr-' + kindNr] === undefined )
					break; // wacht op invoer
					
				if( theCase.formValues['kind-kb-aanvr-' + kindNr] == 'ja' ) {
					theCase['kt-kgb-voor-kind-' + kindNr] = 'ja'; // wel kt/kgb voor kind
				} else {
					showInput( theCase, 'kind-kb-kind-' + kindNr );
					if( theCase.formValues['kind-kb-kind-' + kindNr] === undefined )
						break; // wacht op invoer
						
					if( theCase.formValues['kind-kb-kind-' + kindNr] === 'ja' ) {
						theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
					} else if( theCase.formValues['kind-kb-kind-' + kindNr] === 'nee' ) {
						// systeemdatum voor 1 okt van {jaar}?
						var dateNow = new Date(); 
						var date1OktJaar = new Date(); 
						date1OktJaar.setHours(0); date1OktJaar.setMinutes(0); date1OktJaar.setSeconds(0);
						date1OktJaar.setFullYear( theCase.formValues['jaar'], 9, 1 ); // januari is maand 0, oktober is 9!
		
						
						if( dateNow >= date1OktJaar  && (jaarTableHelper.ohga() != jaarTableHelper.ohgb() || jaarTableHelper.igta() != jaarTableHelper.igtb() || jaarTableHelper.igua() != jaarTableHelper.igub() ) ) {
							// na 1 oktober
							showInput( theCase, 'kind-onderhoud-a-' + kindNr );
							if( theCase.formValues['kind-onderhoud-a-' + kindNr] === undefined )
								break; // wacht op invoer
								
							if( theCase.formValues['kind-onderhoud-a-' + kindNr] === 'nee' ) {
								theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
							} else {
								showInput( theCase, 'kind-onderhoud-b-' + kindNr );
								if( theCase.formValues['kind-onderhoud-b-' + kindNr] === undefined )
									break; // wacht op invoer
									
								if( theCase.formValues['kind-onderhoud-b-' + kindNr] === 'nee' ) {
									theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
								} else {
									showInput( theCase, 'kind-woonsituatie-' + kindNr );
									if( theCase.formValues['kind-woonsituatie-' + kindNr] === undefined )
										break; // wacht op invoer

									showInput( theCase, 'kind-inkomensgrens-a-' + kindNr );
									if( theCase.formValues['kind-inkomensgrens-a-' + kindNr] === undefined )
										break; // wacht op invoer
										
									if( theCase.formValues['kind-inkomensgrens-a-' + kindNr] === 'nee' ) {
										theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
									} else {
										showInput( theCase, 'kind-inkomensgrens-b-' + kindNr );
										if( theCase.formValues['kind-inkomensgrens-b-' + kindNr] === undefined )
											break; // wacht op invoer
											
										if( theCase.formValues['kind-inkomensgrens-b-' + kindNr] === 'nee' ) {
											theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
										} else {
											theCase['kt-kgb-voor-kind-' + kindNr] = 'ja'; // wel kt/kgb voor kind
										}
									}
								}
							}										
						} else {				
							// voor 1 oktober
							
							showInput( theCase, 'kind-onderhoud-' + kindNr );
							if( theCase.formValues['kind-onderhoud-' + kindNr] === undefined )
								break; // wacht op invoer
							
							if( theCase.formValues['kind-onderhoud-' + kindNr] === 'ja' ) {
								showInput( theCase, 'kind-woonsituatie-' + kindNr );
								if( theCase.formValues['kind-woonsituatie-' + kindNr] === undefined )
									break; // wacht op invoer
									
								showInput( theCase, 'kind-inkomensgrens-' + kindNr );
								if( theCase.formValues['kind-inkomensgrens-' + kindNr] === undefined )
									break; // wacht op invoer
									
								if( theCase.formValues['kind-inkomensgrens-' + kindNr] === 'ja' ) {
									theCase['kt-kgb-voor-kind-' + kindNr] = 'ja'; // wel kt/kgb voor kind
								} else {
									theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
								}
							} else {
								theCase['kt-kgb-voor-kind-' + kindNr] = 'nee'; // geen kt/kgb voor kind
							}
						}
					}
				}
									
				//Telling verhoging 12+ en 16+
 				if(theCase['kt-kgb-voor-kind-' + kindNr] == 'ja' && jaarTableHelper.wtos() == true )	{
					if( kind_leeftijd >= 12 && kind_leeftijd < 16){
						theCase['12plus']++;
					} else if(kind_leeftijd >= 16){
						theCase['16plus']++;
					}					
				} 
				
				
			}
			theCase['kind-a-' + kindNr + '-afgerond'] = true;
			return true; // afgerond
		} while( false );

		return false; // niet afgerond
	}

	/**
	 * kinderen subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowKinderen(theCase) {
		
		var afgerond = true; // assume all completed
		var kinderen = theCase.formValues['aanvrager-kinderen'];
		theCase['12plus'] = 0;
		theCase['16plus'] = 0;
		if( kinderen !== undefined && parseInt(kinderen) > 0 
				&& (isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' ) )
		{
			show( theCase, 'fsKinderen' ) // toon blok kinderen
			for( var i = 0; i < kinderen && afgerond === true; ++i ) {
				var kindNr = i + 1;
				
				show( theCase, 'fsKind-' + kindNr ); // toon blok kind
				var kindA = flowKindA( theCase, kindNr );
				var kindB = kindA ? flowKindB(theCase, kindNr) : false;
				afgerond = afgerond && kindA && kindB;
			}
			
			if( !afgerond )
				return false; // niet alle gegevens van kinderen zijn ingevuld
		}
		
		// geen kinderen of invoer gegevens alle kinderen afgerond
		if( isHt(theCase) === 'ja' )
			return flowWoning( theCase );
		else
			return true;
	}


	/**
	 * keuze toeslagen subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowKeuzeToeslagen(theCase) {
		show( theCase, "keuze-toeslagen" ); // toon vraag
	
		// bepaal toegestane keuzes op basis van jaar
		var jaar = new Jaar( theCase.formValues['jaar'] );
		if( !(jaar.ht() == true) ) { theCase.htMin = true; }
		if( !(jaar.kt() == true) ) { theCase.ktMin = true; }
		if( !(jaar.kgb() == true) ) { theCase.kgbMin = true; }
		if( !(jaar.kot() == true) ) { theCase.kotMin = true; }
		if( !(jaar.zt() == true) ) { theCase.ztMin = true; }
		
		// toon toeslagkeuzes
		if( !theCase.htMin )
			showInput( theCase, "huurtoeslag" );
		if( !theCase.ktMin )
			showInput( theCase, "kindertoeslag" );
		if( !theCase.kgbMin )
			showInput( theCase, "kindgebonden-budget" );
		if( !theCase.kotMin )
			showInput( theCase, "kinderopvangtoeslag" );
		if( !theCase.ztMin )
			showInput( theCase, "zorgtoeslag" );
		
		// keuze afgerond 
		if( theCase.formValues['huurtoeslag'] !== 'ja' 
				&& theCase.formValues['kindertoeslag'] !== 'ja' 
				&& theCase.formValues['kindgebonden-budget'] !== 'ja' 
				&& theCase.formValues['kinderopvangtoeslag'] !== 'ja' 
				&& theCase.formValues['zorgtoeslag'] !== 'ja' ) {
			return false; // geen keuze gemaakt
		} else {
			return true;
		}
	}

	/**
	 * introductie subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowIntroductie(theCase) {
		show( theCase, "fsIntroductie" ); // toon blok
		showInput( theCase, "jaar" );
		if( theCase.formValues['jaar'] === undefined )
			return false; // wacht op jaar
		
		// bepaal uiterste aanvraagdatum 
		var jaar = theCase.formValues['jaar'];
		var jaarTableHelper = new Jaar(jaar);
		var aanvraagdatum = jaarTableHelper.aanvraagdatum().split(/-/);

		// omzetten naar Date
		var aanvraagdatum_date = new Date();
		// set time to midnight on aanvraagdatum
		aanvraagdatum_date.setHours( 0 ); 
		aanvraagdatum_date.setMinutes( 0 ); 
		aanvraagdatum_date.setSeconds( 0 ); 
		aanvraagdatum_date.setFullYear( aanvraagdatum[2], aanvraagdatum[1] - 1, aanvraagdatum[0] );
		
		if( aanvraagdatum_date < new Date() ) {
			// tussenresultaat tonen
			var id = "tussenresultaat-aanvraagdatum-verlopen";
			if( theCase['tussenresultaten-negeren'].match( /(^|\s)tussenresultaat-aanvraagdatum-verlopen(\s|$)/ ) == null )
			{
				doTussenresultaat( id );
				theCase.tussenresultaat = id;
			}
			
			if( theCase["tussenresultaat"] !== undefined )
				return false; // wacht op verder
		}
		
		 wtos = jaarTableHelper.wtos();
		
		// verder met keuze toeslagen
		return flowKeuzeToeslagen(theCase);
	}
	
	
	/*
	 * toeslagpartner subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowToeslagpartner(theCase) {
		do {
			show( theCase, "fsToeslagpartner" ); // toon blok
			
			if( isHt(theCase) === 'ja' ) {
				showInput( theCase, 'toeslagpartner-zelfde-adres' );
				if( theCase.formValues['toeslagpartner-zelfde-adres'] === undefined )
					break; // wacht op invoer
			}
					
			if( (isHt(theCase) && theCase.formValues['toeslagpartner-zelfde-adres'] === 'ja') || isZt(theCase)  === 'ja' ) {
				showInput( theCase, 'toeslagpartner-geboortejaar' );
				if( theCase.formValues['toeslagpartner-geboortejaar'] === undefined )
					break; // wacht op invoer
				
				// leid af: leeftijd en 18+
				theCase['toeslagpartner-leeftijd'] = theCase.formValues['jaar'] - theCase.formValues['toeslagpartner-geboortejaar'] - 1;
				theCase['toeslagpartner-achtien-plus'] = theCase['toeslagpartner-leeftijd'] >= 18 ? 'ja' : 'nee';
				theCase.formValues['toeslagpartner-achtien-plus'] = theCase['toeslagpartner-achtien-plus'];
				
				if( isHt(theCase) === 'ja' && theCase.formValues['toeslagpartner-zelfde-adres'] === 'ja' ) {
					// leid af: woonland (zelfde als aanvrager-woonland), ook niet meer vragen
					theCase.formValues['toeslagpartner-woonland'] = theCase.formValues['aanvrager-woonland'];
				}
				
				// leeftijd=17 bij ht/zt of leeftijd=22/64 bij ht
				if( (theCase['toeslagpartner-leeftijd'] === 17 && (isHt(theCase) === 'ja' || isZt(theCase) === 'ja'))
					|| ( (theCase['toeslagpartner-leeftijd'] === 22 || theCase['toeslagpartner-leeftijd'] === 64) && isHt(theCase) === 'ja' ) ) {
					// registreer tussenresultaat
					var id = "tussenresultaat-toeslagpartner-17-bij-ht-zt-of-22-64-bij-ht";
					if( theCase['tussenresultaten-negeren'].match( /(^|\s)tussenresultaat-toeslagpartner-17-bij-ht-zt-of-22-64-bij-ht(\s|$)/ ) == null )
					{
						doTussenresultaat( id );
						theCase.tussenresultaat = id;
					}
					
					if( theCase["tussenresultaat"] !== undefined )
						break; // wacht op 'verder'
				}
			}
				
			if( isZt(theCase) === 'ja' ) {
				var jaarTableAccess = new Jaar(theCase.formValues['jaar']);
				if( jaarTableAccess.wlf() === 'Ja' ) {
					// ZT en Jaar.WLF=Ja
					showInput( theCase, 'toeslagpartner-woonland' );
					if( theCase.formValues['toeslagpartner-woonland'] === undefined )
						break; // wacht op invoer
						
					if( theCase.formValues['toeslagpartner-woonland'] !== 'Nederland' && theCase.formValues['toeslagpartner-woonland'] !== '- Ander land -' ) {
						showInput( theCase, 'toeslagpartner-inkomen-nl' );
						if( theCase.formValues['toeslagpartner-inkomen-nl'] === undefined )
							break; // wacht op invoer
							
						// leid af: werk
						var toeslagpartnerInkomenNlTableAccess = new ToeslagpartnerInkomenNl( theCase.formValues['toeslagpartner-inkomen-nl'] );
						var werk = toeslagpartnerInkomenNlTableAccess.werk();
						if( werk == 'Ja' )
							theCase['toeslagpartner-werk'] = 'ja';
						else if( werk == 'Nee' )
							theCase['toeslagpartner-werk'] = 'nee';
						
						var inkomenNl = theCase.formValues['toeslagpartner-inkomen-nl'];
						if( inkomenNl === 'Nee, mijn toeslagpartner werkt niet.' || inkomenNl === 'Ja, mijn toeslagpartner heeft alleen een pensioen of uitkering uit Nederland.' ) {
							showInput( theCase, 'toeslagpartner-cvz' )
							if( theCase.formValues['toeslagpartner-cvz'] === undefined )
								break; // wacht op invoer
						}
					}
				}
			}
			
			if( isKot(theCase) === 'ja' ) {
				showInput( theCase, 'toeslagpartner-werk' );
				if( theCase.formValues['toeslagpartner-werk'] === undefined )
					break; // wacht op invoer
					
				showInput( theCase, 'toeslagpartner-bijdrage' );
				if( theCase.formValues['toeslagpartner-bijdrage'] === undefined )
					break; // wacht op invoer
					
				if( !(theCase.formValues['toeslagpartner-werk'] === 'ja' || theCase.formValues['toeslagpartner-bijdrage'] === 'ja') ) {
					theCase.kotMin = true; // KOT-
				}
			}
			
			if( (isHt(theCase) === 'ja' && theCase.formValues['toeslagpartner-zelfde-adres'] === 'ja')
				|| isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' || isZt(theCase) === 'ja' )
			{
				showInput( theCase, 'toeslagpartner-toetsingsinkomen' );
				if( theCase.formValues['toeslagpartner-toetsingsinkomen'] === undefined )
					break; // wacht op invoer
					
				// bepaal mxInk2 
				var caseInput = new CaseInput( theCase );
				var jaarTableAccess = new Jaar( caseInput.getJaar() );
				var algemeenBerekening = new AlgemeenBerekening( jaarTableAccess, caseInput );
				var algemeenInkomen = algemeenBerekening.inkomen();
				var mxInk2 = jaarTableAccess.mxInk2();

				// store as attributes for debugging
				theCase['algemeen-inkomen'] = algemeenInkomen;
				theCase['mxInk2'] = mxInk2;
				
				if( algemeenInkomen > mxInk2 )
					theCase.ztMin = true; // ZT-
			}
			
			if( isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' ) {
				// KT of KGB of KOT => kinderen
				return flowKinderen(theCase);
			} else  if( isHt(theCase) === 'ja') {
				// HT? => woning
				return flowWoning(theCase);
			} else {
				// einde
				return true;
			}
		} while( false );
		
		// flow niet afgerond
		return false;
	}
	
	/**
	 * aanvrager-ht-zt subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	var flowAanvragerHtZt = function(theCase) {
	
		do {
			if( isHt(theCase) === 'ja' || isZt(theCase) === 'ja' ) {
				showInput( theCase, "aanvrager-geboortejaar" );
				if( theCase.formValues['aanvrager-geboortejaar'] === undefined )
					break;
				
				// leid af: aanvrager-leeftijd en aanvrager-achtien-plus
				theCase['aanvrager-leeftijd'] = theCase.formValues.jaar - theCase.formValues['aanvrager-geboortejaar'] - 1;
				theCase['aanvrager-achtien-plus']= theCase['aanvrager-leeftijd'] >= 18 ? 'ja' : 'nee';
				theCase.formValues['aanvrager-achtien-plus'] = theCase['aanvrager-achtien-plus'];
				
				// leeftijd 17 bij HT/ZT of 22/64 bij HT?
				if( (theCase['aanvrager-leeftijd'] === 17 && (isHt(theCase) === 'ja' || isZt(theCase) === 'ja'))
					|| ((theCase['aanvrager-leeftijd'] === 22 || theCase['aanvrager-leeftijd'] === 64) && isHt(theCase) == 'ja' ) ) {
					
					// toon tussenresultaat
					var id = "tussenresultaat-aanvrager-17-bij-ht-zt-of-22-64-bij-ht";
					if( theCase['tussenresultaten-negeren'].match( /(^|\s)tussenresultaat-aanvrager-17-bij-ht-zt-of-22-64-bij-ht(\s|$)/ ) == null )
					{
						doTussenresultaat( id );
						theCase.tussenresultaat = id;
					}

					if( theCase['tussenresultaat'] !== undefined )
						break; // wacht op 'verder'
				}
				
				if( theCase['aanvrager-leeftijd'] >= 18 ) {
					// bepaal jaar.wlf
					var jaar = theCase.formValues.jaar;
					var jaarTableAccess = new Jaar(jaar);
					var isjaarWlf = (jaarTableAccess.wlf() == 'Ja' ? 'ja' : 'nee');

					// ZT en Jaar.WLF?
					if( isZt(theCase) === 'ja' && isjaarWlf === 'ja' ) {
						showInput( theCase, 'aanvrager-woonland' );
						if( theCase.formValues['aanvrager-woonland'] === undefined )
							break; // wacht op invoer woonland
							
						if( theCase.formValues['aanvrager-woonland'] === 'Nederland' ) {
							// niets te doen
						} else if( theCase.formValues['aanvrager-woonland'] == '- Ander land -' ) {
							theCase.htMin = true; // HT-
							theCase.ztMin = true; // ZT-
						} else {
							theCase.htMin = true; // HT-
							showInput( theCase, 'aanvrager-inkomen-nl' );
							
							// leid af: aanvrager werk
							var aanvragerInkomenNlTableAccess = new AanvragerInkomenNl( theCase.formValues['aanvrager-inkomen-nl'] );
							if( aanvragerInkomenNlTableAccess.werk() == 'Ja' )
								theCase['aanvrager-werk'] = 'ja';
							else
								theCase['aanvrager-werk'] = 'nee';
							
  							if( theCase['aanvrager-werk'] == 'nee' )
								theCase.ztMin = true; // ZT-  
						}
					}
				} else {
					theCase.ztMin = true; // ZT-
					if( isHt( theCase ) === 'ja' ) {
						showInput( theCase, 'aanvrager-getrouwd' );
						if( theCase.formValues['aanvrager-getrouwd'] === undefined )
							break; // wacht op invoer
						
						if( theCase.formValues['aanvrager-getrouwd'] === 'nee' ) {
							showInput( theCase, 'aanvrager-kind' );
							if( theCase.formValues['aanvrager-kind'] === undefined )
								break; // wacht op invoer
							
							if( theCase.formValues['aanvrager-kind'] === 'nee' ) {
								// geen kinderen, dus stel aantal kinderen in op 0 om deze vraag in het vervolg te voorkomen
								theCase.formValues['aanvrager-kinderen'] = 0;
								
								showInput( theCase, 'aanvrager-wees' );
								if( theCase.formValues['aanvrager-wees'] === undefined )
									break; // wacht op invoer
								
								if( theCase.formValues['aanvrager-wees'] === 'nee' )
									theCase.htMin = true; // HT-
							}
						}
					}
				}
			}
			
			// flow afgerond
			return true;
			
		} while(false);
		
		// flow niet afgerond.
		return false;
	};

	/**
	 * aanvrager-kot-kt-kgb subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	 function flowAanvragerKotKtKgb(theCase) {
		
		do {
			if( isHt(theCase) === 'ja' || isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' || isZt(theCase) === 'ja' ) {
				showInput( theCase, 'aanvrager-toeslagpartner' );
				if( theCase.formValues['aanvrager-toeslagpartner'] === undefined )
					break; // wacht op invoer
			}

			if( isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' || isKt(theCase) === 'ja' ) {
				showInput( theCase, 'aanvrager-kinderen' );
				if( theCase.formValues['aanvrager-kinderen'] === undefined )
					break; // wacht op invoer
	
				if( parseInt(theCase.formValues['aanvrager-kinderen']) === 0 )
				{
					theCase.ktMin = true; // KT-
					theCase.kgbMin = true; // KGB-
					theCase.kotMin = true; // KOT-
				} else {
					if( isKot(theCase) === 'ja' ) {
						showInput( theCase, 'aanvrager-werk' );
						if( theCase.formValues['aanvrager-werk'] === undefined )
							break; // wacht op invoer
							
						showInput( theCase, 'aanvrager-bijdrage' );
						if( theCase.formValues['aanvrager-bijdrage'] === undefined )
							break; // wacht op invoer
						
						if( !( theCase.formValues['aanvrager-werk'] === 'ja' || theCase.formValues['aanvrager-bijdrage'] === 'ja' ) ) {
							theCase.kotMin = true; // KOT-
						}
					}
				}
			}
			
			if( isHt(theCase) === 'ja' || isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' || isZt(theCase) === 'ja' ) {
				showInput( theCase, 'aanvrager-toetsingsinkomen' );
				if( theCase.formValues['aanvrager-toetsingsinkomen'] === undefined )
					break; // wacht op invoer
					
				if( theCase.formValues['aanvrager-toeslagpartner'] === 'nee' ) {
					// bepaal inkomen 
					var jaarAccessTable = new Jaar( theCase.formValues['jaar'] );
					var algemeenBerekening = new AlgemeenBerekening( jaarAccessTable, new CaseInput(theCase) );
					theCase['algemeen-inkomen'] = algemeenBerekening.inkomen();
					
					// bepaal jaar,mxInk1
					var jaarAccessTable = new Jaar( theCase.formValues['jaar'] );
					theCase.mxInk1 = jaarAccessTable.mxInk1();
					
					if( theCase['algemeen-inkomen'] > theCase.mxInk1 ) {
						theCase.ztMin = true; // ZT-
					}
				}
			}
			
			theCase['aanvrager-kot-kt-kgb-afgerond'] = true;
			
			if( theCase.formValues['aanvrager-toeslagpartner'] === 'ja' && (isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' || isHt(theCase) === 'ja' || isZt(theCase) === 'ja' ) ) {
				return flowToeslagpartner(theCase);
			} else if( isKt(theCase) === 'ja' || isKgb(theCase) === 'ja' || isKot(theCase) === 'ja' ) {
				return flowKinderen(theCase);	
			} else if( isHt(theCase) === 'ja') {
				return flowWoning(theCase);
			} else {
				return true;
			}
			
		} while( false );

		// niet afgerond
		return false;
	}
	
	/**
	 * aanvrager subflow
	 *
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowAanvrager(theCase) {	
		show( theCase, "fsAanvrager" ); // toon blok
		
		return flowAanvragerHtZt(theCase) && flowAanvragerKotKtKgb(theCase);
	}

	/**
	 * hoofdflow
	 *
   * @param theCase casus object waarin casus attributen worden opgeslagen
	 * 
	 * @return \c true if the flow completed, otherwise \c false
	 */
	function flowMain(theCase) {
		var complete = flowIntroductie(theCase) && flowAanvrager(theCase);
		if( complete )
			theCase.eindconclusie = true;
	}
	
	return {
		flowMain: flowMain	
	};
}();
