function laadForm(titel, formGUID, ID, width, height, parameters, formParameters) {
	if (typeof(width) == undefined) width = 'auto';
	if (typeof(height) == undefined) height = 'auto';

	var formulier = new ultraform();
	var formConfig = {
		titel : (titel!=''?titel:(ID>0? T_bewerken: T_toevoegen)),
		width    : width,
		height   : height,
		formGUID : formGUID,
		recordID : ID
	};
	if (formParameters){
		if (formParameters.assignXML){
			formulier.afterSave = function(response){
				if (getXMLValue(response, 'succes') == 'true'){
					assignXML(response);
				}
			}
		}
		if (formParameters.key){
			formConfig.key = formParameters.key;
		}
	}



	if (parameters != undefined){
		var ajaxConfig = {
			parameters : parameters
		};
	}else{
		ajaxConfig = {};
	}

	formulier.load(formConfig, 	ajaxConfig);
	return formulier;
	//ajaxPromptWindow(titel+(ID>0?' bewerken':' toevoegen'), {actie : 'laadForm', parameters: 'formGUID='+form+'&ID='+ID}, height, width);
}

function laadFormNR(titel, formGUID, ID, width, height, parameters, formParameters) {
	// Deze functie is nodig voor wanneer je de laadForm vanuit een link wilt benaderen
	// Op deze manier gaat de browser niet daadwerkelijk naar een andere url
	laadForm(titel, formGUID, ID, width, height, parameters, formParameters);
}


/* function formOnOkeResult(result, formGuid, ID){
	//uitvoeren onOke van de promptform


	// parameters sommeren
	var parameters = 'formGUID='+formGuid+'&';
	for(var key in result){
		if (typeof(result[key]) != "undefined" && (typeof(result[key]) != 'function')){
			parameters += key + '=' + result[key]+'&';
		}
	}

	var ajax = new ajaxObject();

	config = {actie : 'save', parameters: parameters, validReturn : 'xml'};
	ajax.onReady = function(response){

		if (response.getElementsByTagName('onOke').length > 0){
			var onOkeStr = getXMLValue(response, 'onOke');
			eval(onOkeStr);
		}
	}
	ajax.load(config);
	return
} */


function ultraform(){
	if (promptWindow == 'undefined'){
		alert('promptwindow not found');
		return {};//leeg object
	}
	return {
		_defaults :  {
			titel    : '', //de titel van het window
			width    : 'auto', //breedte van de window
			height   : 'auto', //hoogte van de window
			formGUID : '', //het GUID van het te laden form
			recordID : 0, //als deze 0 is dan betekent dat toevoegen
			key : '', //ultraform handtekening '' betekent niet controleren
			validate : true //geld ALLEEN voor de php validatie!
		},
		_ajaxConfigDefault : {
			actie      : 'laadForm',
			parameters : ''
		},

		load : function(config, ajaxConfig){

			//laad het formulier via ajax
			if (typeof(ajaxConfig) == 'undefined') ajaxConfig = {};

			//params maken met combi van defaults en mee gegeven config
			for (var key in this._defaults){
				if (config[key] == null || config[key] == undefined){
					config[key] = this._defaults[key];
				}
			}

			//ajax config parameters combineren met meegegeven config
			for (var key in this._ajaxConfigDefault){
				if (ajaxConfig[key] == null || ajaxConfig[key] == undefined){
					ajaxConfig[key] = this._ajaxConfigDefault[key];
				}
			}

			if (ajaxConfig['parameters'] != ''){
				ajaxConfig['parameters'] += '&';
			}
			ajaxConfig['parameters'] += 'formGUID='+config.formGUID+'&ID='+config.recordID+'&key='+config.key;

			this.ajax = new ajaxObject();
			this.ajax.init(ajaxConfig);
			this.ajax.ultraform = this;
			this.ajax.onReady = function (response){
				var stop;
				if (stop = getXMLValue(response, 'stop')){
					alert(stop);
					return;
				}
				if (getXMLValue(response, 'klaar')){
					this.promptWin.ultraform.saveResult(response);
					inputWin.clicked = 'cancel'; //cancel omdat alles al opgeslagen is
					inputWin.hide();
					return;
				}

				var promptData = getXMLValue(response, 'result');
				//this.AIM = getXMLValue(response, 'AIM');

				promptData = parseJSON(promptData);
				promptWindow.resize = 0;
				this.promptWin = promptWindow.show(config.titel, '', promptData, config.height, config.width);

				this.promptWin.ultraform = this.ultraform;
				//validate form via php
				if (config.validate){
					this.promptWin.validate = function(promptResult){
						return formValidateAjax(promptResult, config.formGUID);
					}
				}

				this.promptWin.onOke = function(result){
					//custom onOke runnen
					var ultraformonOkeResult = this.ultraform.onOke(result);
					if (!ultraformonOkeResult){
						//niet opslaan
						return false;
					}

					//de save form via ajax aanroepen
					var parameters = result;
					parameters['formGUID'] = config.formGUID;
					parameters['ID'] = config.recordID;
					//var parameters = 'formGUID='+config.formGUID+'&ID='+config.recordID;
					//for(var key in result){
					//	if (typeof(result[key]) != "undefined" && (typeof(result[key]) != 'function')){
					//		parameters += '&' + key + '=' + escape(result[key].replace(/\r/g, ''));
					//	}
					//}

					/*if (promptData['AIM'] == 'true') {
						var form = document.getElementById('promptForm');
						//var AIMcallBackFunctions = eval('({\'onComplete\' : AIMonFormComplete})');
						var AIMcallBackFunctions = new Object();
						AIMcallBackFunctions.onComplete = function(xml){
							alert(1);
							this.ultraform.saveResult(xml);
						}
						return AIM.submit(form, AIMcallBackFunctions);
					}*/

					var promptOkeAjax = new ajaxObject();
					promptOkeAjax.ultraform = this.ultraform;

					promptOkeAjax.onReady = function(response){
						//het result van de save
						this.ultraform.saveResult(response);
					}
					if (promptData['AIM'] == 'true') {
						promptOkeAjax.load(config = {
							actie : 'save',
							parameters: document.getElementById('promptForm'),
							method: 'AIM'
						});
					}else{
						promptOkeAjax.load(config = {
							actie : 'save',
							parameters: parameters,
							validReturn : 'xml'
						});
					}
					return true;
				}

				// onCancel functie aanwezig?
				this.promptWin.onCancel = function(result){
					//run ajax request om object uit sessie te clearen
					var promptCancelAjax = new ajaxObject();
					promptCancelAjax.load({
						actie : 'clear',
						parameters: 'formGUID='+config.formGUID,
						asynchroon : false
					});

					if (response.getElementsByTagName('onCancel').length > 0){
						var onCancelStr = getXMLValue(response, 'onCancel');
							eval(onCancelStr);
					}
					var cancelResult = this.ultraform.onCancel();
					return cancelResult;
				}

				// volgende stap in wizzard (inputWin is het dhtmlwindow van het promptobject
				inputWin.volgende = function(){
					//verzamel het resultaat
					inputWin.clicked = 'volgende';
					inputWin.formResult = inputWin.promptObject.genereerResult();
					var closeResult = inputWin.onclose();
					if (closeResult){
						//verwerk de stap en laad volgende stap op save
						var newparameters = ajaxConfig['parameters'] += '&';
						for (var key in inputWin.formResult){
							newparameters += key+'='+inputWin.formResult[key]+'&';
						}
						inputWin.promptObject.ultraform.ajax.load({
							parameters	: newparameters,
							actie : 'laadVolgendeStap'
						});

					}
				}
			}
			this.ajax.load({});
		},
		saveResult : function(response){
			//het result van de save
			if (response.getElementsByTagName('onOke').length > 0){
				var onOkeStr = getXMLValue(response, 'onOke');
				eval(onOkeStr);
			}
			//run de afterSave van het ultraform object
			this.afterSave(response);

		},
		afterSave : function (response){
			//gaat af na de save
			//response is de xml die de save func terug krijgt
			//deze kun je overrulen

		},
		onOke : function (result){
			// gaat af op moment na Oke en voor Save
			// result = form result
			//deze kun je overrulen
			return true;
		},
		onCancel : function (){
			// gaat of als je op cancel clickt
			//deze kun je overrulen
			return true;
		},
		onVolgende : function(){
			// gaat of als je op volgende clickt
			//deze kun je overrulen
			return true;
		}
	}
}

function AIMonFormComplete(xml){
	var melding = getXMLValue(xml, 'alert');
	if (melding){
		alert(melding);
	}
	var stop = getXMLValue(xml, 'stop')
	if (stop){
		alert(stop);
		return;
	}
	if (xml.getElementsByTagName('succes')[0].firstChild.nodeValue == "false"){
	}else{
		if (xml.getElementsByTagName('onOke').length > 0){
				var onOkeStr = getXMLValue(xml, 'onOke');
				eval(onOkeStr);
		}
	}
}

function assignXML(xml, object, rootNode){
	rootNode = (rootNode|| 'xmlData')
	if (object == undefined) object = window;
	var rowValues, tagName, rowID, domObject, i, j;
	var xmlData = xml.getElementsByTagName(rootNode)[0].childNodes;
	//for (i=0; i<xml.firstChild.childNodes)

	for (i=0; i < xmlData.length; i++){
		if (xmlData[i].tagName == 'row'){
			//get ID van Row
			rowID = xmlData[i].attributes.getNamedItem('ID').value;
			//Get row Values
			if (rowValues = xmlData[i].childNodes){
				for (j=0; j < rowValues.length; j++){
					tagName = rowValues[j].tagName;
					var tagValue = (rowValues[j].firstChild? rowValues[j].firstChild.nodeValue : '');
					switch (tagName){
						case 'moveTo':
							//move het object naar een andere plaats binnen het dom
							$$('#'+rowID).appendTo('#'+tagValue);
							break;
						case 'reload':
							window.location.href = window.location.href.replace(/#/g, '');
							//history.go(0)
							//window.location.reload();
							break;
						default:
							//replace dit op de pagina
							if (domObject = $$('#'+rowID+tagName)[0]){
								domObject.innerHTML = tagValue;
							}
							break;
					}
				}
			}
		}
	}
}

function validateUltraForm(form, formGUID, ajaxValidate) {
	var result = formValidator(form);
	if (result) {
		if (ajaxValidate){
			var parameters = getFormData(form);
			delete parameters['actie'];
			result = formValidateAjax(parameters, formGUID);
		}
	}
	return result;
}

/*function getFormData(form) { /*LET OP DEZE FUNC STAAT OOK IN PROMPT
	//maak de resultaat array
	//hebben we tinymce dan trigger de save func
	var result = new Array();
	if (typeof(tinyMCE) != "undefined"){
		tinyMCE.triggerSave();
	}
	var checkBoxVelden  = new Array();
	var fields = form.elements;
	for (var i=0; i<fields.length; i++){
		//button overslaan
		if (fields[i].type == 'button'){
		//file werkt niet dus overslaan
		} else if (fields[i].type == 'file'){
			//we sturen alleen de naam mee voor een eventuele validate
			result[fields[i].name+"[name]"] = fields[i].value;
		//ongecheckte radios overslaan
		} else if ((fields[i].type == 'radio') ||(fields[i].type == 'checkbox')) {//
			if ((fields[i].checked)){
				//is de name al als array?
				if (fields[i].name.lastIndexOf('[')!=false){
					result[fields[i].name] = fields[i].value;
				}else{
					if (typeof(checkBoxVelden[fields[i].name]) == 'undefined'){
						checkBoxVelden[fields[i].name] = 0;

					}else{
						checkBoxVelden[fields[i].name]++
					}
					var index = checkBoxVelden[fields[i].name];
					result[fields[i].name+"["+index+"]"] = fields[i].value;
				}
			}
		} else {
			result[fields[i].name] = fields[i].value;
		}
	}
	return result;
}*/

function formValidateAjax(parameters, formGUID){
	//run de aajaxcall voor validate
	if (formGUID != undefined){
		parameters['formGUID'] = formGUID;
	}
	var validateAjax = new ajaxObject();
	var validateResponse = validateAjax.load({
		actie : 'validate',
		parameters : parameters,
		asynchroon : false,
		validReturn : 'xml'
	})
	var evaluate = getXMLValue(validateResponse, 'eval');
	if (evaluate){
		eval(evaluate);
	}
	if (getXMLValue(validateResponse, 'valid') == 'true'){
		 return true;
	}else{
		return false;
	}
}

function ultraButtonSelecteerWindow(compGuid, titel, windowLink, viewCell, waardeCell, breedte, hoogte){
	viewCell = (viewCell || -1);
	waardeCell = (waardeCell || -1);
	breedte = (breedte || 582);
	hoogte = (hoogte || 465);
	
	var selecteerWindow = dhtmlselecteerwindow.open('toevoegBox', "iframe", windowLink, titel , "width="+breedte+",height="+hoogte+",resize=0,scrolling=0,left=50,top=50");
	selecteerWindow.onselecteer = function (selecteerGrid) {
		if (selecteerGrid.getSelectedRowId() == undefined){
			alert(T_selecteerRegel);
			return false;
		}
		if (isNaN(parseInt(viewCell))){
			viewCell = selecteerGrid.getColIndexById(viewCell)
		}
		if (isNaN(parseInt(waardeCell))){
			waardeCell = selecteerGrid.getColIndexById(waardeCell)
		}
		var selectedBestandID = selecteerGrid.getSelectedRowId()
		var waardeVeld = eval('document.getElementById("C'+compGuid+'")');
		var viewVeld = eval('document.getElementById("V'+compGuid+'")');
		
		if (waardeVeld.value != selectedBestandID){
			waardeVeld.value = selectedBestandID;
			if (typeof waardeVeld.onchange == 'function'){
				waardeVeld.onchange();
			}
		}

		if (viewCell > -1){
			var cell = selecteerGrid.cells(selectedBestandID, viewCell).cell;
			viewVeld.value = cell.firstChild.nodeValue;
		}else{
			viewVeld.value = selectedBestandID;
		}
		return true;
	}
}

function ultraButtonGrid(formGUID, compGUID, titel){
	var windowLink = ((typeof(base) == 'undefined')?'':base)+((typeof(applicatieFolder) == 'undefined')?'':applicatieFolder)+(mainfile||'')+'?form='+formGUID+'&pagina=ultraButtonGrid&compGUID='+compGUID;
	var selecteerWindow = dhtmlselecteerwindow.open('toevoegBox', "iframe", windowLink, titel , "width=320,height=320,resize=0,scrolling=0,left=50,top=50");
	selecteerWindow.onselecteer = function (selecteerGrid) {
	}
}
function ultraButtonGridToevoegen(titel){
	var data = new Array();
	data['html'] = '<input type="text" width="200px" name="toevoegen" />';
	toevoegwin = promptWindow.show(titel, '', data);
	/* toevoegwin.onClose(){

	} */
}
function datepickerFocus(e){
	var input = event.currentTarget;
	var range = input.createTextRange();
	range.move("character", 1);
	alert(1);
}


/*function datepickerKeyUp(event){
	var input = event.currentTarget;

	//currentElement = input;
	//if (input.value != '' && validate_date(input.value)){
	$$.datepicker._setDateFromField($$.datepicker._curInst);
	//$$.datepicker._notifyChange($$.datepicker._curInst);
	$$.datepicker._updateDatepicker($$.datepicker._curInst);

}
*/
function datepickerKeyDown(event, input){
	//formvalidator2 is verplicht
	var dag = false, maand = false, jaar =false;
	var dagValid = false, maandValid = false, jaarValid =false;
	if (event.target){
		var input = event.target;
	}else{
		var input = event.srcElement;
	}
	//alert(event.keyCode);
	switch (event.keyCode){
		case 9: //tab
		case 8: //backspace
			return true
			break;
		case 13:
			return false;
			break;
		case 48:
		case 49:
		case 50:
		case 51:
		case 52:
		case 53:
		case 54:
		case 55:
		case 56:
		case 57:
		case 96:
		case 97:
		case 98:
		case 98:
		case 99:
		case 100:
		case 101:
		case 102:
		case 103:
		case 104:
		case 105:
		case 109:
		case 132:
		case 189: //ie -
		case 191:

			var minMax = getDatepickerMinMaxDatum(input);
			var minDag = minMax.min.dag;
			var minMaand = minMax.min.maand;
			var minJaar = minMax.min.jaar;
			var maxDag = minMax.max.dag;
			var maxMaand = minMax.max.maand;
			var maxJaar = minMax.max.jaar;
			//set het huidige karakter er bij
			if (event.keyCode==109 || event.keyCode==189) {
				//streeje hier niet zetten
				value = input.value;
			}else{
				var value = input.value + keyCodeToString(event.keyCode);
			}
			var dateParts = value.split('-');
			//controleer de aanwezige datum delen (geen breaks gebruikt)
			switch (dateParts.length){
				case 3:
					//controleer jaar
					/*jaar =  dateParts[2];
					if (isNaN(jaar) ||
							(jaar.length > 4) |
							(jaar < parseInt(minJaar.substr(0, jaar.toString().length)) ) ||
							(jaar > parseInt(maxJaar.substr(0, jaar.toString().length)) )){
						jaarValid = false
					}else{
						jaarValid = true;
					}*/
					jaar =  dateParts[2];
					jaarValid = ffvalidate_jaar(jaar, minMax, true);
				case 2:
					//controleer maand
					maand =  dateParts[1];
					/*if (isNaN(maand) ||
							(maand.length > 2) |
							(maand.length>1 && maand <= 0) ||
							maand > 12){
						maandValid = false
					}else{
						maandValid = true;
					}*/
					maandValid = ffvalidate_maand(maand, minMax, jaar, true);
				case 1:
					//controleer dag
					dag = dateParts[0];
					var maxAantalDagen;
					//check dag
					var maandInt = parseInt(maand);
					if (maand == false || maandInt == 1 || maandInt == 3 || maandInt == 5 ||maandInt == 7 ||maandInt == 8 ||maandInt == 10 ||maandInt == 12){
						maxAantalDagen = 31;
					}else if (maandInt==2){
						var isSchrikkel = false;
						if (jaar==false || jaar.length != 4){
							//jaar niet compleet dus niet te checken
							isSchrikkel = true;
						}else if (jaar/4 == parseInt(jaar/4)){
							isSchrikkel = true;
							if(jaar/100 == parseInt(jaar/100)){
								isSchrikkel = false;
								if(jaar/400 == parseInt(jaar/400)) {
									isSchrikkel = true;
								}
							}
						}
						if(isSchrikkel){
							maxAantalDagen = 29;
						}else{
							maxAantalDagen = 28;
						}
					}else{
						maxAantalDagen = 30;
					}
					var minAantalDagen = "01";
					if (isNaN(dag) ||
							(dag.length > 2) ||
						  (dag < parseInt(minAantalDagen.toString().substr(0, dag.toString().length)) ) ||
							(dag > parseInt(maxAantalDagen.toString().substr(0, dag.toString().length)) )){

						dagValid = false;
					}else{
						dagValid = true;
					}
					break;
				default:
					return false;
					break;
			}

			if(dagValid && (maand === false || (maandValid && dag > 0)) && (jaar === false || (jaarValid  && maand	 > 0))){
				var datumMinValid = false;
				var datumMaxValid = false;
				if (event.keyCode==109 || event.keyCode==189) {
					//we hebben een - getypt en dat mag allen hier
					if(dag.length==2 && (maand === false || maand.length==2) && (jaar === false)){
						value = input.value + '-';
						datumMinValid = datumMaxValid = true;
					}
				}else{

					//als maxJaar en maxJaar of maxMaand en maxMaand enz gelijk zijn dan de waarde hierop in stellen zodat we al kunnen chekcen voordat het jaar ingevuld is
					if (!dagValid && minDag == maxDag) dag = minDag;
					if (!maandValid && minMaand == maxMaand) maand = minMaand;
					if (!jaarValid && minJaar == maxJaar) jaar = minJaar;


					if (dag && dag.length == 2 && maand && maand.length == 2 && jaar && jaar.length == 4){

						//check of de max en max date  niet is overschreven
						//eerst minDate
						if (jaar >= minJaar){
							if (jaar == minJaar){
								//chek maand
								if (maand >= minMaand){
									if (maand == minMaand){
										//check dag
										if (dag >= minDag){
											datumMinValid = true;
										}
									}else{
										datumMinValid = true;
									}
								}
							}else{
								datumMinValid = true;
							}
						}
						//check maxDate
						if (jaar <= maxJaar){
							if (jaar == maxJaar){
								//chek maand
								if (maand <= maxMaand){
									if (maand == maxMaand){
										//check dag
										if (dag <= maxDag){
											datumMaxValid = true;
										}
									}else{
										datumMaxValid = true;
									}
								}
							}else{
								datumMaxValid = true;
							}
						}
					}else{
						//nog geen te checkeb datum ingevuld
						datumMinValid = datumMaxValid = true;
					}
				}

				if (datumMinValid && datumMaxValid ){
					//set input value voor datepicker
					input.value = value;
					if ($$.datepicker._curInst){
						//set datum in datepicker
						$$.datepicker._setDateFromField($$.datepicker._curInst);
						$$.datepicker._updateDatepicker($$.datepicker._curInst);
					}
					//altijd return false omdat we zelf de value zetten
				}
			}
			break;
	}
	return false;
}

function updateDatePicker(e){

	if (e.keyCode == 13 && $$.datepicker._curInst){
		//set datum in datepicker
		$$.datepicker._setDateFromField($$.datepicker._curInst);
		$$.datepicker._updateDatepicker($$.datepicker._curInst);
	}
}

function keyCodeToString(keyCode){
	switch (keyCode){
		case 96:
			return "0";
		case 97:
			return "1";
		case 98:
			return "2";
		case 99:
			return "3";
		case 100:
			return "4";
		case 101:
			return "5";
		case 102:
			return "6";
		case 103:
			return "7";
		case 104:
			return "8";
		case 105:
			return "9";
			break;
		default:
			return String.fromCharCode(keyCode);
			break
	}
}

function laadComboOpties(combo, waarde, formGUID){
	combo.length = 0;
	combo.disabled = true;
	if (waarde != ''){
		var ajx = new ajaxObject();
		ajx.load({
			actie : 'laadComboOpties',
			parameters : 'waarde='+waarde+'&formGUID='+formGUID,
			validReturn : 'json'
		});
		ajx.onReady = function(options){
			var optie;
			for (var key in options ){
				optie = options[key];
				var opt = document.createElement('option');
				opt.text = optie['tekst'];
				opt.value = optie['waarde'];
				if (optie['selected']){
					opt.selected = true;
				}
				try {
					combo.add(opt, null); // standards compliant; doesn't work in IE
				}
				catch(ex) {
					combo.add(opt); // IE only
				}
				if (options.length > 1){
					combo.disabled = false;
				}
			}
		}
	}
}

//LET OP!! Er staat een copy in prompt.js voorde prompt zonder ultraform!!!!
function getFormData(form) {
	//maak de resultaat array
	//hebben we tinymce dan trigger de save func
	var result = new Array();
	var fields = new Object();
	if (typeof(tinyMCE) != "undefined"){
		tinyMCE.triggerSave();
	}
	var checkBoxVelden = new Array();
	fields = form.elements;
	for (var i=0; i<fields.length; i++){
		//button overslaan
		if (fields[i].type == 'button'){
		//file werkt niet dus overslaan
		} else if (fields[i].type == 'file'){
			//we sturen alleen de naam mee voor een eventuele validate
			result[fields[i].name+"[name]"] = fields[i].value;
		//ongecheckte radios overslaan
		} else if ((fields[i].type == 'radio') ||(fields[i].type == 'checkbox')) {//
			if ((fields[i].checked)){
				//is de name al als array?
				if (fields[i].name.lastIndexOf('[')!=false){
					result[fields[i].name] = componentToAjax(fields[i].value);
				}else{
					if (typeof(checkBoxVelden[fields[i].name]) == 'undefined'){
						checkBoxVelden[fields[i].name] = 0;

					}else{
						checkBoxVelden[fields[i].name]++
					}
					var index = checkBoxVelden[fields[i].name];
					result[fields[i].name+"["+index+"]"] = componentToAjax(fields[i].value);
				}
			}
		} else {
			result[fields[i].name] = componentToAjax(fields[i].value);
		}
	}
	return result;
}
function componentToAjax(waarde){
	return encodeURIComponent(waarde).replace(/€/g, escape('€')).replace(/&/g, escape('&'));
}
// einde LET OP!!! copy
