emptyString = /^\s*$/

// Date
function isDateAA(inputObj){
	return isDate(inputObj, "dd-MM-yyyy");
}

function compareDatesAA(inputObj, dateValue2){
	isDateAA(inputObj);
	var dateValue1 = inputObj.value;
	return compareDates(dateValue1, dateValue2);

}

function compareDecimals(inputObj, decimalValue2, decimalSeparator, groupingSeparator){
	var decimalValue1 = inputObj.value;
	
	//First remove any thousand-separators.
	var separatorPosition, length;
	separatorPosition = decimalValue1.indexOf(groupingSeparator);
	length = decimalValue1.length;
	while (separatorPosition != -1){
		decimalValue1 = decimalValue1.substring(0, separatorPosition) + decimalValue1.substring(separatorPosition+1, length);
		separatorPosition = decimalValue1.indexOf(groupingSeparator);	
	}

	separatorPosition = decimalValue2.indexOf(groupingSeparator);
	length = decimalValue2.length;
	while (separatorPosition != -1){
		decimalValue2 = decimalValue2.substring(0, separatorPosition) + decimalValue2.substring(separatorPosition+1, length);
		
		separatorPosition = decimalValue2.indexOf(groupingSeparator);	
	}
	
	
	// Als het decimaalteken geen punt is, vervang het dan door een punt.
	if (decimalSeparator != '.') {
		var floatingPointPosition = decimalValue1.indexOf(decimalSeparator);
		
		if (floatingPointPosition != -1){
			decimalValue1 = decimalValue1.substring(0, floatingPointPosition) + decimalValue1.substring(floatingPointPosition+1, length);
		}
	
		var floatingPointPosition = decimalValue2.indexOf(decimalSeparator);
		
		if (floatingPointPosition != -1){
			decimalValue2 = decimalValue2.substring(0, floatingPointPosition) + decimalValue2.substring(floatingPointPosition+1, length);
		}
	}

	var dec1 = parseFloat(decimalValue1);
	var dec2 = parseFloat(decimalValue2);

	if (dec1 > dec2) return 1;
	if (dec1 < dec2) return -1;
	if (dec1 == dec2) return 0;

}

// Functie voor de elf-proef.
function elevenTest(value) {
	var length = value.length;
	var sum = 0;
	
	for (var i=0; i<length; i++) {
		sum = sum + (value.charAt(i) * (length - i));
	}
	
	return ((sum % 11) == 0);
}

// Bankrekeningnummer
function isBankAccountNr(inputObj){
	var value = inputObj.value;

	if (value.length < 9 || (value.length == 9 && value.charAt(0) == "0")){
		return false;
	}else{
		return elevenTest(value);
	}
}
// Beleggingsrekeningnummer
function isInvestmentAccountNr(inputObj) {
	var value = inputObj.value;

	if (value.length < 8){
		return false;
	}else{
		return elevenTest(value);
	}
}

// Sofi number
function isSofiNumber(inputObj){
	var getal = inputObj.value;
	var result = true;

	if (getal.length == 8) {
		getal = "0" + getal;
	}


	if (getal.length<9){
		result=false;
	}else{
		var optel=(getal.charAt(0)*9)+(getal.charAt(1)*8)+(getal.charAt(2)*7)+(getal.charAt(3)*6)+(getal.charAt(4)*5)+(getal.charAt(5)*4)+(getal.charAt(6)*3)+(getal.charAt(7)*2)+(getal.charAt(8)*-1);
		var deel=optel%11;
		if (deel!="0"){
			result=false;
		}
	}

	inputObj.value = getal;
	return result;
}

// Belgisch bankrekeningnummer.
function isBankAccountNrBE(inputObj) {
	var getal = inputObj.value;

	// Checks op de vorm van de input.
	if (getal.length != 12 
		|| isNaN(getal.substring(0,10))
		|| isNaN(getal.substring(10,12))) {
		return false;
	}
	
	// Checks op het bankrekeningnummer (de 97-proef).
	var firstTenDigits = new Number(getal.substring(0,10));
	var checkDigits = new Number(getal.substring(10,12));
	
	var result = firstTenDigits % 97;
	if (result == 0 && checkDigits != 97) {
		return false;
	}
	
	if (result != 0 && result != checkDigits) {
		return false;
	}
	
	return true;
}

// Controle voor datatype 'vier cijfers'.
function isFourDigits(inputObject) {
	match = /^[0-9][0-9][0-9][0-9]$/;
	return match.test(inputObject.value);
}

// (Post)bankaccount number
function isPostBankAccountNrAA(input){
	var number = input.value;
	if (number.length >2 && number.length <8 ) //Postbankrekening 3 t/m 7 cijfers, P optioneel
	{
		if ((number.charAt(0).toLowerCase()) == "p")
		{
			if (!checkNaNAR(number.substring(1,number.length)) || 
				parseInt(number.substring(1,number.length))==0 ||
				Number(number.substring(1,number.length)) < 100)
			{
				return false;
			}
		}
		else
		{
			if (!checkNaNAR(number.substring(0,number.length)) || 
				parseInt(number.substring(0,number.length))==0 ||
				Number(number.substring(0,number.length)) < 100)
			{
				return false;
			}
		}
	}
	else if (number.length == 8) // 8 karakters, dus P verplicht
	{
		if ((number.charAt(0).toLowerCase()) != "p")
		{
			return false;
		}
		else
		{
			if (!checkNaNAR(number.substring(1,number.length)) || parseInt(number.substring(1,number.length))==0)
			{
				return false;
			}
		}
	}
	else if (number.length == 9 || number.length == 10) //Normale bankrekeningen + 11-proef
	{
		if(!isBankAccountNr(input))
		{
			return false;
		}
	}
	else //Meer dan 9 karakters of minder dan 3
	{
		return false;		
	}
	return true;
}

function checkNaNAR (string){
 	if (isNaN(string) || string == "" || string.indexOf(".") != -1 || string.indexOf(",") != -1 || string.indexOf(" ") != -1 || parseInt(string) < 0)
	{
	   return false;
	}
	return true;
}

// Airmilesaccount number
function isAirmilesAccountNr(inputObj){
	var getal = inputObj.value;

	if (getal.length < 9) {
		return false;
	} else {
		return elevenTest(getal);
	}
}

// Emailaddress
function isEmailAddressAA(input){
	var atIndex = input.value.indexOf("@");
	if (atIndex == -1){
		return false;
	}
	var user = input.value.substring(0, atIndex);
	if (user.length == 0) return false;

	var domain = input.value.substring(atIndex+1);	
	if (domain.length == 0) return false;
	if (domain.indexOf(".") == -1) return false;

	var nonEmailCharacters = "!\"#$%^&*(),/:;<> ?[]{}|+=~\\@\t";
	for (var j=0; j<nonEmailCharacters.length; j++ ){
		if (user.indexOf(nonEmailCharacters.charAt(j)) != -1) return false;
		if (domain.indexOf(nonEmailCharacters.charAt(j)) != -1) return false;
	}
	
	var index = 0;
	var lastIndex = -1;
	while(index != -1){
		index = user.indexOf(".", lastIndex+1);
		if (index == 0 || index == user.length-1) return false;
		if (index - lastIndex == 1) return false;
		lastIndex = index;
	}
	
	index = 0;
	lastIndex = -1;
	while(index != -1){
		index = domain.indexOf(".", lastIndex+1);
		if (index == 0 || index == domain.length-1) return false;
		if (index - lastIndex == 1) return false;
		lastIndex = index;
	}
	
	return true;
}


function isPostalCodeAA(inputObj) {
	var input = inputObj.value;
	var part1;
	var part2;
	match1 = /^[0-9]{4}[a-zA-Z]{2}$/;		// Pairs must be 4 nummbers and 2 characters without ' '
	match2 = /^[0-9]{4} [a-zA-Z]{2}$/;		// Pairs must be 4 nummbers and 2 characters with ' '

	if (match1.test(input)) {
		part1 = input.substring(0,4).toUpperCase();
		part2 = input.substring(4,6).toUpperCase();
	} else if (match2.test(input)) {
		part1 = input.substring(0,4).toUpperCase();
		part2 = input.substring(5,7).toUpperCase();
	} else {
		return false;
	}

	inputObj.value = part1+" "+part2;
	return true;
}


function comparePostalCodesAA(postalCode1, postalCode2){
	var postalCodeValue1 = postalCode1.value;
	return comparePostalCodes(postalCodeValue1, postalCode2);

}
function comparePostalCodes(value1, value2){

	if (value1.length == 7){
		value1 = value1.substring(0,4) + value1.substring(5,7);
	}
	if (value2.length == 7){
		value2 = value2.substring(0,4) + value2.substring(5,7);
	}
	var areaCode1 = value1.substring(0,4);
	var areaCode2 = value2.substring(0,4);

	var charCode1 = value1.substring(4,6).toUpperCase();
	var charCode2 = value2.substring(4,6).toUpperCase();

	if (areaCode1 > areaCode2) return 1;
	if (areaCode1 < areaCode2) return -1;
	if (areaCode1 == areaCode2) {
		if (charCode1 > charCode2) return 1;
		if (charCode1 < charCode2) return -1;
		if (charCode1 == charCode2) return 0;
	}
}


//*******************
// From informationLayers.js
//*******************

function getWindowHeight() {
	var windowHeight = 0;
	if (typeof(window.innerHeight) == 'number') {
		windowHeight = window.innerHeight;
	} 
	else {
		if (document.documentElement && document.documentElement.clientHeight) {
			windowHeight = document.documentElement.clientHeight;
		} 
		else {
			if (document.body && document.body.clientHeight) {
				windowHeight = document.body.clientHeight;
			}
		}
	}
	return windowHeight;
}

function getBodyHeight(){
	var bodyHeight = 0;
	if(document.body && document.body.scrollHeight){
		bodyHeight = document.body.scrollHeight;
	}else{	
		if (document.body && document.body.offsetHeight){
			bodyHeight = document.body.offsetHeight;
		}
	}
	return bodyHeight;
}



function showHideInformationLayer(elementName, isVisible, event) {
	var object;

	if (document.all){ //IE
		object = document.all(elementName);
		
		if (isVisible){
		
			// To position the layer next to the mouse click position.
			if (event.type == 'mousedown') {
				var mouseX = event.clientX + document.documentElement.scrollLeft;
			}
			// To position the layer next to the mouse click position.
			object.style.left = (mouseX - 280) + "px";  // The width of the layer is 280 !
			//object.style.pixelTop = mouseY;
		}
	}

	if(!document.all && document.getElementById){ //NS
		object = document.getElementById(elementName);

		if (isVisible){
			// To position the layer next to the mouse click position.
			if (event.type == 'mousedown') {
				var mouseX = event.clientX + window.pageXOffset;
				var mouseY = event.clientY + window.pageYOffset;
			}
			// To position the layer next to the mouse click position.
			object.style.left = (mouseX - 280) + "px";  // The width of the layer is 280 !
			//object.style.pixelTop = mouseY;
		}
	}

	object.style.display = (isVisible ? "inline" : "none");
	object.style.visibility = (isVisible ? "visible" : "hidden");/**/
}




//*******************
// From StdInputChecks.js
//*******************

// Shows the same informationlayer, but to the right of the cursor
function showHideInformationLayerRightFromCursor(elementName, isVisible, event) {
	var object;

	if (document.all){ //IE
		object = document.all(elementName);
 
		if (isVisible){
			// To position the layer next to the mouse click position.
			if (event.type == 'mousedown') {
				var mouseX = event.clientX + document.body.scrollLeft;
				var mouseY = event.clientY + document.body.scrollTop;
			}
			// To position the layer next to the mouse click position.
			// Determine layerwidth that still fits on the screen
			var layerWidth = Math.min(informationLayerLeft); 
			object.style.width = layerWidth;
			object.style.left = mouseX;
			object.style.pixelTop = mouseY;
		}
	}

	if(!document.all && document.getElementById){ //NS
		object = document.getElementById(elementName);

		if (isVisible){
			// To position the layer next to the mouse click position.
			if (event.type == 'mousedown') {
				var mouseX = event.clientX + window.pageXOffset;
				var mouseY = event.clientY + window.pageYOffset;
			}
			// To position the layer next to the mouse click position.
			// Determine layerwidth that still fits on the screen
			var layerWidth = Math.min(informationLayerLeft, mouseX);
			object.style.width = layerWidth;
			object.style.left = mouseX - layerWidth;
			object.style.pixelTop = mouseY;
		}
	}

	object.style.display = (isVisible ? "inline" : "none");
	object.style.visibility = (isVisible ? "visible" : "hidden");/**/
}

function isNumberLargerThan(inputObject,min) {
	return !isNaN(inputObject.value) && inputObject.value > min;
}
function isNumberSmallerThan(inputObject,max) {
	return !isNaN(inputObject.value) && inputObject.value < max;
}
function isInteger(inputObject) {
	match = /^-?[0-9]*$/;
	return match.test(inputObject.value);
}

function isDate(inputObj, format) {
	var f;
	if (format == "dd-MM-yyyy"){f=1;}
	else{if (format == "yyyy-MM-dd"){f=2;}else {return false;}}
	var input = inputObj.value;
	var day;
	var month;
	var year;
	match1 = /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/;
	match2 = /^[0-9][0-9]?\W[0-9][0-9]?\W[0-9][0-9][0-9][0-9]$/;
	match3 = /^[0-9][0-9][0-9][0-9]\W[0-9][0-9]?\W[0-9][0-9]?$/;
	match4 = /^[0-9][0-9][0-9][0-9][0-9][0-9]$/;
	match5 = /^[0-9][0-9]?\W[0-9][0-9]?\W[0-9][0-9]$/;
	if (match1.test(input)) {
		if (f == 1){
			day = input.substring(0,2);
			month = input.substring(2,4);
			year = input.substring(4,8);
		}
		if (f == 2){
			day = input.substring(6,8);
			month = input.substring(4,6);
			year = input.substring(0,4);
		}
	}else if ((match2.test(input) && f==1) || (match3.test(input) && f==2)) {
			sep = /\W/;
			var sep1, sep2;
			var i = 0;
			for(i=0;i<input.length;i++){
				if (sep.test(input.charAt(i))){sep1=i; break;}
				}
			for(var j=i+1;j<input.length;j++){
				if (sep.test(input.charAt(j))){sep2=j; break;}
				}
			if (f == 1){
				day = input.substring(0,sep1);
				month = input.substring(sep1+1,sep2);
				year = input.substring(sep2+1,input.length);
			}
			if (f == 2){
				year = input.substring(0,sep1);
				month = input.substring(sep1+1,sep2);
				day = input.substring(sep2+1,input.length);
			}
	}else if (match4.test(input)) {
		if (f == 1){
			day = input.substring(0,2);
			month = input.substring(2,4);
			year = input.substring(4,6);
			if (year >= 20){
				year = "19" + year;
			}else{
				year = "20" + year;
			}
		}
	}else if (match5.test(input)) {
			sep = /\W/;
			var sep1, sep2;
			var i = 0;
			for(i=0;i<input.length;i++){
				if (sep.test(input.charAt(i))){sep1=i; break;}
				}
			for(var j=i+1;j<input.length;j++){
				if (sep.test(input.charAt(j))){sep2=j; break;}
				}
			if (f == 1){
				day = input.substring(0,sep1);
				month = input.substring(sep1+1,sep2);
				year = input.substring(sep2+1,input.length);
				if (year >= 20){
					year = "19" + year;
				}else{
					year = "20" + year;
				}
			}
	}else {return false;}

	//if (year < 1900) {return false;}
	if (month < 1 || month > 12) {return false;}
	var daymax;
	if (month==4 || month==6 || month==9 || month==11) {daymax = 30;}
	else {
		if (month==2) {
			if ((year%4==0 && year%100!=0) || year%400==0) {daymax = 29}
			else {daymax = 28;}
			}
		else {daymax = 31;}
	}
	if (day < 1 || day > daymax) {return false;}
	if (day.length == 1){day = "0" + day;}
	if (month.length == 1){month = "0" + month;}
	if (f == 1){inputObj.value = day + "-" + month + "-" + year;}
	if (f == 2){inputObj.value = year + "-" + month + "-" + day;}
	return true;
}

function compareDates(dateValue1, dateValue2){
    if (dateValue1 == "" && dateValue2 == "") return 0;
    if (dateValue1 == "" ) return -1;
    if (dateValue2 == "" ) return 1;


	var day = dateValue1.substring(0,2);
	var month = dateValue1.substring(3,5);
	var year = dateValue1.substring(6,10);
	var date1 = year + month + day;

	day = dateValue2.substring(0,2);
	month = dateValue2.substring(3,5);
	year = dateValue2.substring(6,10);
	var date2 = year + month + day;

	if (date1 > date2) return 1;
	if (date1 < date2) return -1;
	if (date1 == date2) return 0;
}

// This function determines the element type of a form element
function getFormElementType(el) {
	// If nescessary, resolve the first element of an array
	// (radio buttons are typically ordered this way)
	var el0 = el;
	if (typeof el0.tagName == "undefined") {
		el0 = el[0];
	}

	// Resolve the element type
	var eltype = el0.tagName;
	if (eltype == "INPUT") {
		eltype = "INPUT/"+el0.type.toUpperCase();
	}

	return eltype;
}


// This function checks whether the user has changed an input field
function formChanged(document){
	for (d = 0; d < document.forms.length; d++) {
		var formObj = document.forms[d];
		for (i = 0; i < formObj.length; i++) {
			var el = formObj.elements[i];
			var eltype = getFormElementType(el);

			if (eltype == "INPUT/TEXT") {
				if (el.value != el.defaultValue) {
					return true;
				}
			}
			if (eltype == "INPUT/RADIO") {
				if (el.checked != el.defaultChecked) {
					return true;
				}
			}
			if (eltype == "INPUT/CHECKBOX") {
				if (el.checked != el.defaultChecked) {
					return true;
				}
			}
			if (eltype == "SELECT") {
				for (j = 0; j < el.length; j++) {
					if (el[j].selected != el[j].defaultSelected) {
						return true;
					}
				}
			}
			if (el.tagName == "TEXTAREA") {
				if (el.value != el.defaultValue) {
					return true;
				}
			}
		}
	}
	return false;
}

function clearField(el){
	var eltype = getFormElementType(el);

	if (eltype == "INPUT/TEXT") {
		el.value = "";
	}
	if (eltype == "INPUT/PASSWORD") {
		el.value = "";
	}
	if (eltype == "INPUT/HIDDEN") {
		el.value = "";
	}
	if (eltype == "INPUT/RADIO") {
		for (j=0; j<el.length; j++) {
			el[j].checked = false;
		}
		// Hoeveel waardes heeft de radio-button-array?
		if (el.name) {
			// Maar 1 waarde - refereer op deze manier aan het eerste element.
			var elementref = el;
		} else {
			// Meerdere waardes - refereer op deze manier aan het eerste element.
			var elementref = el[0];
		}
		var elementName = elementref.name;
		// A radio button has a hidden field with the same prefix.
		// (the radio buttons themselves are suffixed with "_radio")
		var companionName = elementName.substring(0, elementName.length-6);
		el[0].form.elements[companionName].value="";
	}
	if (eltype == "INPUT/CHECKBOX") {
		// Instead of deselecting manually, let the element take care of it.
		// The element will set the inevitable hidden field to the right value.
		if (el.checked) {
			el.click();
		}
	}
	if (eltype == "SELECT") {
		for (j = 0; j < el.length; j++) {
			if (el[j].value == "") {
				el[j].selected = true;
			} else {
				el[j].selected = false;
			}
		}
	}
	if (eltype == "TEXTAREA") {
		el.value = "";
	}
}

function resetField(el){
	var eltype = getFormElementType(el);

	if (eltype == "INPUT/TEXT") {
		el.value = el.defaultValue;
	}
	if (eltype == "INPUT/PASSWORD") {
		el.value = el.defaultValue;
	}
	if (eltype == "INPUT/HIDDEN") {
		el.value = el.defaultValue;
	}
	if (eltype == "INPUT/RADIO") {
		// Hoeveel waardes heeft de radio-button-array?
		if (el.name) {
			// Maar 1 waarde - refereer op deze manier aan het eerste element.
			var elementref = el;
		} else {
			// Meerdere waardes - refereer op deze manier aan het eerste element.
			var elementref = el[0];
		}
		var elementName = elementref.name;
		// A radio button has a hidden field with the same prefix.
		// (the radio buttons themselves are suffixed with "_radio")
		var companionName = elementName.substring(0, elementName.length-6);
		var companionElement = elementref.form.elements[companionName];
		companionElement.value = "";

		// Now fill the cleared field
		for (j=0; j<el.length; j++) {
			if (el[j].defaultChecked) {
				companionElement.value = el[j].value;
			}
			el[j].checked = el[j].defaultChecked;
		}
	}
	if (eltype == "INPUT/CHECKBOX") {
		// Instead of (de)selecting manually, let the element take care of it.
		// The element will set the inevitable hidden field to the right value.
		if (el.checked != el.defaultChecked) {
			el.click();
		}
	}
	if (eltype == "SELECT") {
		for (j = 0; j < el.length; j++) {
			el[j].selected = el[j].defaultSelected;
		}
	}
	if (eltype == "TEXTAREA") {
		el.value = el.defaultValue;
	}
}

function addDocumentLoaded(fn) {
	if (document.readyState==="complete") {
		fn();
	} else {
		if (document.addEventListener) { // Standards
			function contentLoaded() {
				document.removeEventListener("DOMContentLoaded", contentLoaded, false );
				fn();
			}
			document.addEventListener('DOMContentLoaded', contentLoaded, false);
		} else if (document.attachEvent) { // IE
			function stateChanged() {
				if (document.readyState==="complete") {
					document.detachEvent( "onreadystatechange", stateChanged );
					fn();
				}
			}
			document.attachEvent("onreadystatechange", stateChanged);
		}
	}
}

// Sets the focus to the specified form element.
function setFocus(el) {
	// If the element is not on the page, or not visible, we do not set the focus.
	if(el == null || !isVisible(el)) return;
	
	var eltype = getFormElementType(el);
	if (el.length != null && eltype != "SELECT"){
		eltype = getFormElementType(el[0]);
	}
	if (eltype == "INPUT/TEXT"     ||
		eltype == "INPUT/CHECKBOX" ||
		eltype == "SELECT"         ||
		eltype == "TEXTAREA" ||
		eltype == "INPUT/BUTTON" ||
		eltype == "INPUT/RADIO") {
		var elName = (el.length != null && eltype != "SELECT") ? el[0].name : el.name;
		addDocumentLoaded(function() {
			var elements = document['forms']['form'][elName];
			var element = typeof elements.length=='undefined' ? elements : elements[0];
			element.focus();
		});
	}
}

// Function to get the visibility of a named page element.
function isVisible(elementName) {
	var object;
	if (document.all){
		object = document.all(elementName);
	}
	if(!document.all && document.getElementById){
		object = document.getElementById(elementName);
	}

	if (object == null) return true;
	if (object.style.visibility == "hidden"
		|| object.style.display == "none" ) {
		return false;
	} else {
		return true;
	}
}

// Function to set the visibility of a named page element.
function setVisible(elementName, usesSpaceIfHidden, isVisible) {
	var object;
	if (document.all){
		object = document.all(elementName);
	}
	if(!document.all && document.getElementById){
		object = document.getElementById(elementName);
	}
	if (object == null) return;
	object.style.display = (isVisible || usesSpaceIfHidden ? "inline" : "none");
	object.style.visibility = (isVisible ? "visible" : "hidden");
}

// Constructor voor QuestionVisibility object. In de Java code wordt een array van deze objecten gegenereerd, waarin per vraag
// wordt bijgehouden wat de zichtbaarheid is van de vraag en de groep waartoe deze behoort. De reden dat we deze array bijhouden
// is een verbetering van de performance:
// * Bij het aanpassen van de zichtbaarheid doorlopen we alleen de relevante elementen (formuliervragen) i.p.v. alle elementen
//   in het document. Bovendien gaat het doorlopen van een array sneller dan het doorlopen van de elementen in een document.
// * We passen de zichtbaarheid op het scherm alleen aan als het nodig is, i.p.v. de oude methode waarin eerst alle elementen
//   zichtbaar werden gemaakt en vervolgens per element werd bepaald of deze onzichtbaar moest worden.
// Argumenten:
// - fieldName: naam van de formuliervraag
// - isQuestionVisible: geeft weer of de vraag zichtbaar is
// - isGroupVisible: geeft aan of de groep waartoe de vraag behoort zichtbaar is
function QuestionVisibility(fieldName, isQuestionVisible, isGroupVisible) {
	this.fieldName = fieldName;
	this.isQuestionVisible = isQuestionVisible;
	this.isGroupVisible = isGroupVisible;
}

// Variabele waarin we de array met QuestionVisibility objecten opslaan.
var questionVisibilities = new Array();

// Bepaalt de index van het element in de QuestionVisibility array met de gegeven waarde voor fieldName.
// Als het element niet is gevonden, retourneert de functie -1.
function determineIndexInQuestionVisibilityArray(fieldName) {
	// Loop over alle elementen in de QuestionVisibility array.
	for (var i = 0; i < questionVisibilities.length; i++) {
		if (fieldName == questionVisibilities[i].fieldName) {
			return i;
		}
	}
	return -1;
}

// Bepaalt of de zichtbaarheid van de vraag op het scherm veranderd moet worden.
function shouldQuestionVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isQuestionVisibleNew) {
	// Controleer of de zichtbaarheid van de vraag op het scherm verandert.
	// Dit is het geval als:
	// - de vraag onzichtbaar is op het scherm en hij wordt zichtbaar op het scherm, of
	// - de vraag zichtbaar is op het scherm en hij wordt onzichtbaar op het scherm.
	if (((!isQuestionVisibleOld || !isGroupVisibleOld) && (isQuestionVisibleNew && isGroupVisibleOld))
			|| ((isQuestionVisibleOld && isGroupVisibleOld) && (!isQuestionVisibleNew || !isGroupVisibleOld))) {
		return true;
	}
	return false;
}

// Bepaalt of de zichtbaarheid van de vraag in de groep op het scherm veranderd moet worden.
function shouldQuestionInGroupVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isGroupVisibleNew) {
	// Controleer of de zichtbaarheid van de vraag op het scherm verandert.
	// Dit is het geval als de vraag zichtbaar is en de zichtbaarheid van de groep op het scherm verandert.
	if (isQuestionVisibleOld &&
			(!isGroupVisibleOld && isGroupVisibleNew) || (isGroupVisibleOld && !isGroupVisibleNew)) {
		return true;
	}
	return false;
}

// Toont/verbergt de vraag op het scherm t.g.v. nieuwe zichtbaarheid op vraagniveau.
// De zichtbaarheid van de vraag op het scherm wordt alleen aangepast als dit nodig is.
function showQuestion(fieldName, isQuestionVisibleNew, useMultipleErrorMessages) {
	// Bepaal de index van het juiste element in de QuestionVisibility array.
	var idx = determineIndexInQuestionVisibilityArray(fieldName);

	// Bepaal de huidige zichtbaarheid van de vraag en de groep.
	var isQuestionVisibleOld = questionVisibilities[idx].isQuestionVisible;
	var isGroupVisibleOld = questionVisibilities[idx].isGroupVisible;
	
	// Controleer of de zichtbaarheid van de vraag op het scherm verandert.
	if (shouldQuestionVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isQuestionVisibleNew)) {
		// Als we de vraag gaan tonen op het scherm, reset dan eerst de vraag.
		if ((isQuestionVisibleNew && isGroupVisibleOld)) {
			emptyQuestion(fieldName);
		}
		// Pas de zichtbaarheid van de vraag aan op het scherm.
		// De vraag is zichtbaar op het scherm als zowel de vraag als de groep zichtbaar zijn.
		setVisible(fieldName+"_enabled", false, (isQuestionVisibleNew && isGroupVisibleOld));

		// Controleer of configuratieparameter useMultipleErrorMessages = true.
		if (useMultipleErrorMessages) {
			// Controleer of de vraag onzichtbaar is op het scherm.
			if ((!isQuestionVisibleNew || !isGroupVisibleOld)) {
				// Verberg ook de rij voor de messages.
				var nameMessageRow = fieldName.replace(fieldName.substring(0,2),"MF");
	
				if (nameMessageRow.lastIndexOf("_") != nameMessageRow.indexOf("_")) {
					nameMessageRow = nameMessageRow.substring(0, nameMessageRow.lastIndexOf("_"));
				}			
				setMessage(nameMessageRow, "invisible", "");
			}
		}
	}
	// Pas de zichtbaarheid van de vraag aan in de QuestionVisibility array.
	questionVisibilities[idx].isQuestionVisible = isQuestionVisibleNew;
}

// Toont/verbergt de vraag op het scherm t.g.v. nieuwe zichtbaarheid op groepniveau.
// De zichtbaarheid van de vraag op het scherm wordt alleen aangepast als dit nodig is.
function showQuestionInGroup(fieldName, isGroupVisibleNew, useMultipleErrorMessages) {
	// Bepaal de index van het juiste element in de QuestionVisibility array.
	var idx = determineIndexInQuestionVisibilityArray(fieldName);

	// Bepaal de huidige zichtbaarheid van de vraag en de groep.
	var isQuestionVisibleOld = questionVisibilities[idx].isQuestionVisible;
	var isGroupVisibleOld = questionVisibilities[idx].isGroupVisible;

	// Controleer of de zichtbaarheid van de vraag in de groep op het scherm verandert.
	if (shouldQuestionInGroupVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isGroupVisibleNew)) {
		// Als we de vraag gaan tonen op het scherm, reset dan eerst de vraag.
		if ((isQuestionVisibleOld && isGroupVisibleNew)) {
			emptyQuestion(fieldName);
		}
		// Pas de zichtbaarheid van de vraag aan op het scherm.
		// De vraag is zichtbaar op het scherm als zowel de vraag als de groep zichtbaar zijn.
		setVisible(fieldName+"_enabled", false, (isQuestionVisibleOld && isGroupVisibleNew));

		// Controleer of configuratieparameter useMultipleErrorMessages = true.
		if (useMultipleErrorMessages) {
			// Controleer of de vraag onzichtbaar is op het scherm.
			if ((!isQuestionVisibleOld) || (!isGroupVisibleNew)) {
				// Verberg ook de rij voor de messages.
				var nameMessageRow = fieldName.replace(fieldName.substring(0,2),"MF");
	
				if (nameMessageRow.lastIndexOf("_") != nameMessageRow.indexOf("_")) {
					nameMessageRow = nameMessageRow.substring(0, nameMessageRow.lastIndexOf("_"));
				}			
				setMessage(nameMessageRow, "invisible", "");
			}
		}
	}
	// Pas de zichtbaarheid van de groep aan in de QuestionVisibility array.
	questionVisibilities[idx].isGroupVisible = isGroupVisibleNew;
}

function showQuestionEditable(fieldName) {
	setVisible(fieldName+"_editable", false, true);
	setVisible(fieldName+"_not_editable", false, false);
}

function showQuestionNotEditable(fieldName){
	emptyQuestion(fieldName);
	setVisible(fieldName+"_editable", false, false);
	setVisible(fieldName+"_not_editable", false, true);
}

function changeStyleOfLabel(nameLabel, show){
	if (document.getElementById(nameLabel)!= null) {
		if (show) {
			setActiveStyleClass(nameLabel,'applicable');
		} else {
			setActiveStyleClass(nameLabel,'nonapplicable');
		}
	}
}

// Verandert de stijl van de labels t.g.v. het tonen/verbergen van een vraag.
function changeStyleOfLabels(fieldName, isVisible) {
	// Change the style of the label of the inputfield.			
	var nameLabel = fieldName.replace(fieldName.substring(0,2),"LA");

	if (nameLabel.lastIndexOf("_") != nameLabel.indexOf("_")) {
		nameLabel = nameLabel.substring(0, nameLabel.lastIndexOf("_"));
	}			
	if (document.getElementById(nameLabel)!= null) {
		if (isVisible) {
			setActiveStyleClass(nameLabel,'applicable');
		} else {
			setActiveStyleClass(nameLabel,'nonapplicable');
		}
	}

	// Change the style of the text right to the inputfield.			
	var nameTextRight = fieldName.replace(fieldName.substring(0,2),"TR");

	if (nameTextRight.lastIndexOf("_") != nameTextRight.indexOf("_")) {
		nameTextRight = nameTextRight.substring(0, nameTextRight.lastIndexOf("_"));
	}			
	if (isVisible) {
		setVisible(nameTextRight, false, true);
	} else {
		setVisible(nameTextRight, false, false);
	}

	// Change the style of the infolink.			
	var nameInfoLink = fieldName.replace(fieldName.substring(0,2),"IL");

	if (nameInfoLink.lastIndexOf("_") != nameInfoLink.indexOf("_")) {
		nameInfoLink = nameInfoLink.substring(0, nameInfoLink.lastIndexOf("_"));
	}			
	if (isVisible) {
		setVisible(nameInfoLink, false, true);
	} else {
		setVisible(nameInfoLink, false, false);
	}
	
	// Disable the parent tr if all td's are hidden.
	determineStyleOfQuestionRow(fieldName);
}

// Toont/verbergt de vraag en labels op het scherm t.g.v. nieuwe zichtbaarheid op vraagniveau.
// De zichtbaarheid van de vraag en de labels op het scherm wordt alleen aangepast als dit nodig is.
function showQuestionAndChangeStyleOfLabel(fieldName, isQuestionVisibleNew, useMultipleErrorMessages){
	// Bepaal de index van het juiste element in de QuestionVisibility array.
	var idx = determineIndexInQuestionVisibilityArray(fieldName);

	// Bepaal de huidige zichtbaarheid van de vraag en de groep.
	// We doen dit voor de aanroep van showQuestion, omdat binnen deze functie de waarde van isQuestionVisible
	// wordt aangepast in de QuestionVisibility array. We hebben echter de 'oude' waarde nodig voor de aanroep van
	// de functie shouldQuestionVisibilityBeChanged (zie if-looop verderop in deze functie).
	var isQuestionVisibleOld = questionVisibilities[idx].isQuestionVisible;
	var isGroupVisibleOld = questionVisibilities[idx].isGroupVisible;
	// Toon/verberg de vraag.
	showQuestion(fieldName, isQuestionVisibleNew, useMultipleErrorMessages);

	// Controleer of de zichtbaarheid van de vraag op het scherm verandert.
	if (shouldQuestionVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isQuestionVisibleNew)) {
		// Pas ook de stijl van de labels aan.
		// De labels zijn zichtbaar op het scherm als zowel de vraag als de groep zichtbaar zijn.
		changeStyleOfLabels(fieldName, (isQuestionVisibleNew && isGroupVisibleOld));
	}
}

// Toont/verbergt de vraag en labels op het scherm t.g.v. nieuwe zichtbaarheid op groepniveau.
// De zichtbaarheid van de vraag en de labels op het scherm wordt alleen aangepast als dit nodig is.
function showQuestionInGroupAndChangeStyleOfLabel(fieldName, isGroupVisibleNew, useMultipleErrorMessages){
	// Bepaal de index van het juiste element in de QuestionVisibility array.
	var idx = determineIndexInQuestionVisibilityArray(fieldName);

	// Bepaal de huidige zichtbaarheid van de vraag en de groep.
	// We doen dit voor de aanroep van showQuestionInGroup, omdat binnen deze functie de waarde van isGroupVisible
	// wordt aangepast in de QuestionVisibility array. We hebben echter de 'oude' waarde nodig voor de aanroep van
	// de functie shouldQuestionInGroupVisibilityBeChanged (zie if-looop verderop in deze functie).
	var isQuestionVisibleOld = questionVisibilities[idx].isQuestionVisible;
	var isGroupVisibleOld = questionVisibilities[idx].isGroupVisible;

	// Toon/verberg de vraag in de groep.
	showQuestionInGroup(fieldName, isGroupVisibleNew, useMultipleErrorMessages);

	// Controleer of de zichtbaarheid van de vraag in de groep op het scherm verandert.
	if (shouldQuestionInGroupVisibilityBeChanged(isQuestionVisibleOld, isGroupVisibleOld, isGroupVisibleNew)) {
		// Pas ook de stijl van de labels aan.
		// De labels zijn zichtbaar op het scherm als zowel de vraag als de groep zichtbaar zijn.
		changeStyleOfLabels(fieldName, (isQuestionVisibleOld && isGroupVisibleNew));
	}
}

function determineStyleOfQuestionRow(fieldName) {
	
	// fieldName is something like IF302_416
	// We need to check whether all labels (LA_xxx), and inputfields (IF302_416_enabled) are disabled for this 
	// tr. If this is the case, disable the complete tr.
	
	var fieldEnabledElement = document.getElementById(fieldName+"_enabled");
	
	if (fieldEnabledElement != null) {
		// The tr to disable / enable is the parent of the parent of the div <fieldname>_enabled.
		var trElement = fieldEnabledElement.parentNode.parentNode;
	
		// By default, set the tr to nonapplicable.
		var setEnabled = false;

		// When we find one element that is applicable, enable the the tr, otherwise, disable it.
		var elementsToCheck = trElement.getElementsByTagName('*');
		for (var i = 0; i < elementsToCheck.length; i++) {
			if (checkActiveStyleClassForElement(elementsToCheck[i], 'applicable')) {
				setEnabled = true;
				break;
			}
		}
		
		// Because the tr originally doesn't have a class, we can just set the class.				
		if (setEnabled == true) {
			trElement.className='applicable';
		} else {
			trElement.className='nonapplicable';
		}
	}

}

// Reset de vraag.
function emptyQuestion(fieldName){
	var formObj = document.forms["form"];

	if (formObj.elements[fieldName] == null) {
		return;
	}
	resetField(formObj.elements[fieldName]);

	if(formObj.elements[fieldName+"_radio"] != null) {
		resetField(formObj.elements[fieldName+"_radio"]);
	}

	if(formObj.elements[fieldName+"_checkbox"] != null) {
		resetField(formObj.elements[fieldName+"_checkbox"]);
	}
}

//This function changes the style class of the element with name elementName in the class given in the 
//attribute cl.
function setActiveStyleClass(elementName, cl) {
   document.getElementById(elementName).className = cl;
}

//This function changes the style class of the element element in the class given in the attribute cl.
function setActiveStyleClassForElement(element,cl) {
	element.className = cl;
}

//This function adds the class cl to the style of the given element.
function addActiveStyleClassForElement(element, cl) {	
	if (! checkActiveStyleClassForElement(element,cl)) {
		element.className+=element.className?' '+cl:cl;
	}
}


//This function removes the class cl from the style of the given element.
function removeActiveStyleClassForElement(element, cl) {
	var rep = new RegExp('\\b' + cl + '\\b', 'g'); // Verwijder alle classes met deze naam
	element.className = element.className.replace(rep,'');
}

//This function checks if the class cl is already applied to the element and returns true or false.
function checkActiveStyleClassForElement(element, cl) {
	return new RegExp('\\b' + cl + '\\b').test(element.className);
}

// Toont/verbergt een alle vragen binnen een groep.
// De zichtbaarheid van een vraag op het scherm wordt alleen aangepast als dit nodig is.
function showQuestions(fieldNameStart, isGroupVisible, useMultipleErrorMessages){
	// Doorloop alle elementen in de QuestionVisibility array.
	for (var i = 0; i < questionVisibilities.length; i++) {
		var fieldName = questionVisibilities[i].fieldName;

		// Controleer of de vraag begint met 'IF<questionGroupId>'.
		if (fieldName.substring(0, fieldName.indexOf("_")) == fieldNameStart){
			// De vraag behoort tot de groep. Toon/verberg de vraag op het scherm.
			showQuestionInGroup(fieldName, isGroupVisible, useMultipleErrorMessages);
		}
	}	
}

// Toont/verbergt een alle vragen en labels binnen een groep.
// De zichtbaarheid van een vraag en labels op het scherm wordt alleen aangepast als dit nodig is.
function showQuestionsAndChangeStyleOfLabels(fieldNameStart, isGroupVisible, useMultipleErrorMessages){
	// Doorloop alle elementen in de QuestionVisibility array.
	for (var i = 0; i < questionVisibilities.length; i++) {
		var fieldName = questionVisibilities[i].fieldName;

		// Controleer of de vraag begint met 'IF<questionGroupId>'.
		if (fieldName.substring(0, fieldName.indexOf("_")) == fieldNameStart){
			// De vraag behoort tot de groep. Toon/verberg de vraag en de labels op het scherm.
			showQuestionInGroupAndChangeStyleOfLabel(fieldName, isGroupVisible, useMultipleErrorMessages);
		}
	}	
}

//*******************
// From TopArea.jsp
//*******************

function goAction(id) {
	document.forms["form"].action.value = id;
	document.forms["form"].isFormChanged.value = (isFormChanged || formChanged(document));
	document.forms["form"].submit();
}
function goActionCheckFormChanged(id) {
	if (checkForFormChanged && (isFormChanged || formChanged(document))) {
		if (confirm(confirmDiscardFormChangesMessage)) {
			goAction(id);
		}
	} else {
		goAction(id);
	}
}
function goActionCheckInputs(id) {
	if (checkInputs()){
		goAction(id);
	} else {
		alert(errorMessage);
		if (typeof errorField == "string") {
			if (errorField != "") setFocus(document.forms["form"].elements[errorField]);
		} else {
			setFocus(errorField);
		}
	}
}

function showErrorMessageAndFocus(){
	alert(errorMessage);
	if (typeof errorField == 'string') {
		if (errorField.length > 0) setFocus(document.forms['form'].elements[errorField]);
	} else {
		setFocus(errorField);
	}
}

function setErrorField(field) {
	// Give all errorfields a highlighted background:
		if (typeof field == "string") {
			if (field != "") addActiveStyleClassForElement(document.forms["form"].elements[field],'errorField');
		} else {
			addActiveStyleClassForElement(field,'errorField')
		}

	// Set the errorField, this will get the focus.
	// only set the errorField if it was not set already before:
	if (emptyString.test(errorField)) {
		errorField = field;
	}
}

function checkRequired(field, focusField, displayName){
	if((trim(field.value)).length == 0) {
		return false;
	}
	return true;
}

function isDutchMoney(inputObject) {
	var input = inputObject.value;

	var match = /^[0-9]{1,3}(\.?[0-9]{3})*(,[0-9]{1,2})?$/;

	if (match.test(input)) {
		return true;
	}
	return false;
}

function isDecimalValue(inputObject, numberOfDecimals, decimalSeparator, groupingSeparator) {
	if (decimalSeparator == ',') {
		return isDecimalValueUsingCommaAsDecimalSeparator(inputObject, numberOfDecimals)
	}
	if (decimalSeparator == '.') {
		return isDecimalValueUsingDotAsDecimalSeparator(inputObject, numberOfDecimals)
	}
	return false;
}

function isDecimalValueUsingCommaAsDecimalSeparator(inputObject, numberOfDecimals) {
	var input = inputObject.value;
	var match;
	var inputObjectLength = inputObject.maxLength;
	
	if (numberOfDecimals == 0){
		match = new RegExp("^-?[0-9]{1,3}(\\.?[0-9]{3})*$");
	}else{
		match = new RegExp("^-?[0-9]{1,3}(\\.?[0-9]{3})*(,[0-9]{1,"+numberOfDecimals+"})?$");	
	}

	if (!match.test(input)) {
		return false;
	}
	
	//Remove all existing thousand separators.
	while (input.match(/.*\..*/)){
		input = input.replace(/\./,'');
	}
	
	//Vervang komma door punt
    input = input.replace(/\,/,'.');
    
    // Converteer de input string naar een float (voor toFixed functie)
	input = parseFloat(input);
		
	//Controlleer het aantal decimalen en vul aan indien nodig
	input = input.toFixed(numberOfDecimals);
	
	//Vervang punt door komma
    input = input.replace(/\./,',');

	//Add thousand separators.
	while (input.match(/^-?\d\d{3}/)){
		input = input.replace(/(\d)(\d{3}(\.|,|$))/, '$1' + '.' + '$2');
	}
		
	//Check if the formatted number still fits in the inputObject.
	if (input.length > inputObjectLength){
		return false;
	}
	
	//Put the formatted number back into the inputfield.
	inputObject.value = input;
	
	return true;	
}

function isDecimalValueUsingDotAsDecimalSeparator(inputObject, numberOfDecimals) {
	var input = inputObject.value;
	var match;
	var inputObjectLength = inputObject.maxLength;
	
	if (numberOfDecimals == 0){
		match = new RegExp("^-?[0-9]{1,3}(,?[0-9]{3})*$");
	}else{
		match = new RegExp("^-?[0-9]{1,3}(,?[0-9]{3})*(\\.[0-9]{1,"+numberOfDecimals+"})?$");	
	}

	if (!match.test(input)) {
		return false;
	}
	
	//Remove all existing thousand separators.
	while (input.match(/.*,.*/)){
		input = input.replace(/,/,'');
	}
	
	//Vervang decimaalteken door punt
    // Dat hoeft dus niet, want het decimaalteken is een punt.
    
    // Converteer de input string naar een float (voor toFixed functie)
	input = parseFloat(input);
		
	//Controlleer het aantal decimalen en vul aan indien nodig
	input = input.toFixed(numberOfDecimals);
	
	//Vervang punt door decimaalteken
    // Dat hoeft dus niet, want het decimaalteken is een punt.

	//Add thousand separators.
	while (input.match(/^-?\d\d{3}/)){
		input = input.replace(/(\d)(\d{3}(,|\.|$))/, '$1' + ',' + '$2');
	}
		
	//Check if the formatted number still fits in the inputObject.
	if (input.length > inputObjectLength){
		return false;
	}
	
	//Put the formatted number back into the inputfield.
	inputObject.value = input;
	
	return true;	
}

function isDutchLicencePlate(inputObj) {
	var input = inputObj.value;
	var part1;
	var part2;
	var part3;
	match1 = /^(([0-9]{2}|[a-zA-Z]{2})-){2}([0-9]{2}|[a-zA-Z]{2})$/;	// Pairs must be all letters, or all numbers; with -
	match2 = /^(([0-9]{2}|[a-zA-Z]{2})){2}([0-9]{2}|[a-zA-Z]{2})$/;		// Pairs must be all letters, or all numbers; without -
	
	// Sidecode 7
	match3 = /^(([0-9]{2})-)(([a-zA-Z]{3})-)([0-9]{1})$/;				// Nieuw kenteken: Pairs must be 2 numbers, 3 letters and 1 number; with -
	match4 = /^([0-9]{2})([a-zA-Z]{3})([0-9]{1})$/;						// Nieuw kenteken: Pairs must be 2 numbers, 3 letters and 1 number; without -
	
	// Sidecode 8
	match5 = /^(([0-9]{1})-)(([a-zA-Z]{3})-)([0-9]{2})$/;
	match6 = /^([0-9]{1})([a-zA-Z]{3})([0-9]{2})$/;	

	// Sidecode 9
	match7 = /^(([a-zA-Z]{2})-)(([0-9]{3})-)([a-zA-Z]{1})$/;
	match8 = /^([a-zA-Z]{2})([0-9]{3})([a-zA-Z]{1})$/;	

	// Sidecode 10
	match9 = /^(([a-zA-Z]{1})-)(([0-9]{3})-)([a-zA-Z]{2})$/;
	match10 = /^([a-zA-Z]{1})([0-9]{3})([a-zA-Z]{2})$/;	

	if (match1.test(input)) {
		part1 = input.substring(0,2).toUpperCase();
		part2 = input.substring(3,5).toUpperCase();
		part3 = input.substring(6,8).toUpperCase();
	} else if (match2.test(input)) {
		part1 = input.substring(0,2).toUpperCase();
		part2 = input.substring(2,4).toUpperCase();
		part3 = input.substring(4,6).toUpperCase();
	} else if (match3.test(input) || match7.test(input)) {
		// Sidecode 7 en 9 met streepjes	
		part1 = input.substring(0,2).toUpperCase();
		part2 = input.substring(3,6).toUpperCase();
		part3 = input.substring(7,8).toUpperCase();
	} else if (match4.test(input) || match8.test(input)) {
		// Sidecode 7 en 9 zonder streepjes
		part1 = input.substring(0,2).toUpperCase();
		part2 = input.substring(2,5).toUpperCase();
		part3 = input.substring(5,6).toUpperCase();
	} else if (match5.test(input) || match9.test(input)) {
		// Sidecode 8 en 10 met streepjes
		part1 = input.substring(0,1).toUpperCase();
		part2 = input.substring(2,5).toUpperCase();
		part3 = input.substring(6,8).toUpperCase();					
	} else if (match6.test(input) || match10.test(input)) {
		// Sidecode 8 en 10 zonder streepjes	
		part1 = input.substring(0,1).toUpperCase();
		part2 = input.substring(1,4).toUpperCase();
		part3 = input.substring(4,6).toUpperCase();				
	} else {
		return false;
	}

	inputObj.value = part1+"-"+part2+"-"+part3;
	return true;
}

// Checks if the inputObj is a time in 'uu:mm' or 'u:mm' or 'uu:m' or 'u:m' format,
// If the format is UU:M or U:M or U:MM, the format is changed in UU:MM.
function isTimeUUMM(inputObj) {
	var input = inputObj.value;
	var hour;
	var minute;

	match1 = /^[0-9][0-9]\:[0-9][0-9]$/;
	match2 = /^[0-9]\:[0-9][0-9]$/;
	match3 = /^[0-9][0-9]\:[0-9]$/;
	match4 = /^[0-9]\:[0-9]$/;

	if (match2.test(input) || match4.test(input)) {
		input = "0" + input;
	}

	if (match1.test(input)) {
		hour = input.substring(0,2);
		minute = input.substring(3,5);
	} else if (match3.test(input)) {
		hour = input.substring(0,2);
		minute = "0" + input.substring(3,4);
	} else {
		return false;
	}

	if (hour > 23) {return false;}
	if (minute > 59) {return false;}

	inputObj.value = hour + ":" + minute;

	return true;
}

// Compares two times of the format 'UU:MM'.
// Returns 1 if the first time is later, -1 if the second time is later and 0 if the times are equal.
function compareTimesUUMM(timeValue1, timeValue2){
    if (timeValue1 == "" && timeValue2 == "") return 0;
    if (timeValue1 == "" ) return -1;
    if (timeValue2 == "" ) return 1;

	var hour = timeValue1.substring(0,2);
	var minute = timeValue1.substring(3,5);
	var time1 = hour + minute;

	hour = timeValue2.substring(0,2);
	minute = timeValue2.substring(3,5);
	var time2 = hour + minute;

	if (time1 > time2) return 1;
	if (time1 < time2) return -1;
	if (time1 == time2) return 0;
}
/*
	Function to display a message in a given css-style in a given element.
*/
function setMessage(
	elementId,		// id of element to display message in
	messageType,	// CSS class to give element ("warn", "error", or "ok")
	message			// string to display
	) {

	var displayMessage;

	// If the message is empty, set &nbsp; as displayMessage:
	if (emptyString.test(message)) {
		var nbsp = 160;    // non-breaking space char
		displayMessage = String.fromCharCode(nbsp);
	} else {
		displayMessage = message;
	}
	
	// Get the element to put the message in:
	var elem = document.getElementById(elementId);
	
	if (elem != null) {
		// Display the message in the div within the td-element:
		elem.getElementsByTagName('td')[0].firstChild.firstChild.nodeValue = displayMessage;
		
		// Set the css-style of the element:
		elem.className = messageType;
	}
}

// Returns whether or not inputObj.value is a Dutch phone number
function isDutchPhoneNumber(inputObj) {
    var input = inputObj.value;

    // if you update this pattern, also update this pattern
    // in junit test TestDataType (and run/update the tests)
    pattern = new RegExp("^((\\+?)|(0)*)0*(31)?[-\\s]?0*((("
        + "(599)|(598)|(597)|(596)|(595)|(594)|(593)|(592)|(591)|(578)|(577)|(575)|(573)|(572)|(571)|(570)|"
        + "(566)|(562)|(561)|(548)|(547)|(546)|(545)|(544)|(543)|(541)|(529)|(528)|(527)|(525)|(524)|"
        + "(523)|(522)|(521)|(519)|(518)|(517)|(516)|(515)|(514)|(513)|(512)|(511)|(499)|(497)|(495)|"
        + "(493)|(492)|(488)|(487)|(486)|(485)|(481)|(478)|(475)|(418)|(416)|(413)|(412)|(411)|(348)|"
        + "(347)|(346)|(345)|(344)|(343)|(342)|(341)|(321)|(320)|(318)|(317)|(316)|(315)|(314)|(313)|(299)|"
        + "(297)|(294)|(255)|(252)|(251)|(229)|(228)|(227)|(226)|(224)|(223)|(222)|(187)|(186)|(184)|"
        + "(183)|(182)|(181)|(180)|(174)|(172)|(168)|(167)|(166)|(165)|(164)|(162)|(161)|(118)|(117)|(115)|"
        + "(114)|(113)|(111)"
        + ")[-\\s]?\\d{6})|(("
        + "(79)|(78)|(77)|(76)|(75)|(74)|(73)|(72)|(71)|(70)|(58)|(55)|(53)|(50)|"
        + "(46)|(45)|(43)|(40)|(38)|(36)|(35)|(33)|(30)|(26)|(24)|(23)|(20)|(15)|(13)|(10)"
        + ")[-\\s]?\\d{7})|(("
        + "(9)|(8)|(6)"
        + ")[-\\s]?\\d{8}))$");

    result = pattern.test(input);

    return result;
}

function trim(str){
	return str.replace(/^\s*|\s*$/g,"");
}

// This function determines the element type of a form element
function getElementType(el) {
	// If nescessary, resolve the first element of an array
	// (radio buttons are typically ordered this way)
	var el0 = el;
	if (typeof el0.tagName == "undefined") {
		el0 = el[0];
	}

	// Resolve the element type
	var eltype = el0.tagName;
	if (eltype == "INPUT") {
		eltype = "INPUT/"+el0.type.toUpperCase();
	}

	return eltype;
}

// Function that tells whether a document element is a button
function isButton(el) {
	var eltype = getElementType(el);

	// Check if this element is a button.
	if (
		eltype == "INPUT/SUBMIT"
	) {
		return true;
	}
	
	return false;
}


function disableButtons() {
	var entries = document.getElementsByTagName('input');
	for (var i=0; i < entries.length; i++) {

		if (isButton(entries[i])) {
			// This element is a button, disable it.
			entries[i].disabled="disabled";	
		}
	}
}

function callSetIframeHeightIfNeeded(){
  // Check whether this form has a parent-frame (thus lives in an iframe)
  // and the parent-frame has the setIframeHeigth-function.
  if ((parent) && parent.setIframeHeight){
    // If both conditions hold, Pass the new height to the parent.
	var bodyHeight = getBodyHeight();
    parent.setIframeHeight(bodyHeight);

  }
}

function toUpperCase(value) {
	if (value == null) {
		return value;
	} else {
	 	return value.toUpperCase();
	}
}

// Adds an separator between each character and at the end as well.
// Result: strips of all separator, and adds the separator 
// to after each remaining character.
function toUpperCaseNormalizedSeparateBy(value, separator) {
		return toUpperCaseNormalizedSeparateBy(value, separator, false);
}

// Adds an separator between each character but not at the end.
// Result: strips of all separator, and adds the separator 
// to after each remaining character except the last one.
function toUpperCaseNormalizedSeparateByIncludingEnd(value, separator) {
		return toUpperCaseNormalizedSeparateBy(value, separator, true);
}

function toUpperCaseNormalizedSeparateBy(value, separator, addAtEnd) {
	   separated = toNormalizedSeparateBy(value, separator, addAtEnd);
       return toUpperCase(separated);
}


function toNormalizedSeparateBy(value, separator, addAtEnd) {

    if (value == null || separator == null
    	|| value.length==0 || separator.length == 0) {
    	return value;
    } else {
    	// Strip of all separators.
    	regexp = new RegExp('(['+separator+'])','g');
    	value = value.replace(regexp,'');
    	
        // Add the separator for each character that is left.
        regexp = new RegExp('([^'+separator+'])','g');
        value = value.replace(regexp, '$1'+separator);
        
        if (!addAtEnd) {
          // remove the last character
          value = value.substring(0,value.length-1);	
        
        }
        return value;
    }
	
}

function firstCharacterToUpperCase(value) {
	if (value == null || value.length==0 ) {
		return value;
	} else if (value.length == 1){
		return toUpperCase(value);
	} else {
		var firstCharacter = value.substring(0,1);
		var rest = value.substring(1,value.length);
		
		return toUpperCase(firstCharacter) + rest;
	}
}

//for Quinity presentation
function setQuinityForm()
	{
		var trNodes,tableNodes,divNodes,tdNodes;
		
		divNodes = document.getElementsByTagName('div');
		var i = divNodes.length;
	
		while (i--){
			if(divNodes[i].className =="quinity_form"){
				
				//for  send button alignment in summary Page
				ancBtnNodes = divNodes[i].getElementsByTagName('a');
				var ancBtnLen = ancBtnNodes.length;
				var sendFlag = 0;
				var printFlag = 0;
				while (ancBtnLen--){
					if(ancBtnNodes[ancBtnLen].name =="AllFieldsSend") 
						sendFlag = 1;
					
					if(ancBtnNodes[ancBtnLen].name =="AllFieldsPrint")
						printFlag = 1;
				}
				if(sendFlag == 1 && printFlag == 0)
					document.getElementById('SendButtonDiv').style.marginTop = "-14px";
				
				
				tableNodes = divNodes[i].getElementsByTagName('table');
				var j = tableNodes.length;
				while (j--){
					if(tableNodes[j].className.indexOf('grouptable') != -1 || tableNodes[j].className.indexOf('formtable') != -1){
						trNodes = tableNodes[j].getElementsByTagName('tr');
						var k = trNodes.length;
						
						while (k--){
							tdNodes = trNodes[k].getElementsByTagName('td');
							var p = tdNodes.length;
							
							//To provide the padding-left for single TD
							if(p > 0)
								if(tdNodes[0].getAttribute('colspan') == 3 ){
							tdNodes[0].id='lblBoldFontHeading';								
							}	
							
							while (p--){
								
								//for Post text alignment (for Date)
								if(tdNodes[p].className == "input"){
									var spanNodes = tdNodes[p].getElementsByTagName('span');
									var spanL = spanNodes.length;
									while(spanL--){
										if(spanNodes[spanL].id.substring(0,2) == "TR")
											spanNodes[spanL].style.verticalAlign="top";
									}
											
								}
								
								//To remove the tab from info popup
								if(tdNodes[p].className == "infolinkcell"){
									var aNodes = tdNodes[p].getElementsByTagName('a');
									var ancL = aNodes.length;
									
									while(ancL--){
										aNodes[ancL].setAttribute("tabIndex",'-1');
									}
											
								}
								
							}
						}
						
						if(trNodes.length > 1){
							flagTh = 0;
							
							//To remove extra TR on top
							var thNodes = trNodes[0].getElementsByTagName('th');
							if(thNodes.length > 0){
								var thText = thNodes[0].innerHTML;
								if(thText == ''){
									flagTh = 1;
									trNodes[0].parentNode.removeChild(trNodes[0]);
								}	
							}
							
							//To provide padding top for TD present in second TR
							if(flagTh == 0 && trNodes[1].className.indexOf('warning') == -1){
								tdNodes = trNodes[1].getElementsByTagName('td');
								var l = tdNodes.length;
								
								while (l--){
									tdNodes[l].id='grpTableFirstChildTr';
									if(!(tdNodes[l].nextSibling || tdNodes[l].previousSibling)){
										tdNodes[l].id = 'longParaFirstChild';
									}								
								}
							}
						}					
						
					}				
	
				
				}
				
				//To change the title of info popup
				var imgNode = divNodes[i].getElementsByTagName('img');
				for (var imgN = 0; imgN < imgNode.length; imgN++) { 
					if (imgNode[imgN].className.indexOf('infolinkimage') != -1){
						imgNode[imgN].setAttribute("title","meer informatie");
					}
				} 
			}	
		}		
	}
