function initFormWidgets(){
	var form = getParentByTagName($("btnsubmit"),"form");
	if(form){
		addTrimFunctions(form);
		
		var floats = $C("floatwidget");
		var ints = $C("integerwidget");
		var pccheck = $C("postcodecheck");
		var chkminvalue = $C("checkminvalue");
		var chkfreeminvalue = $C("checkfreeminvalue");
		var warningfields = $C("warningfield");
		var huisnummer = $C("pccheckfield_huisnummer");
		var bedraginvoer = $C("wijzigtermijnbedrag");
		var termijnselectie = $C("wijzigtermijn");
		var productbedrag = $C("productaantal");
		var vrijbedrag  = $C("vrijbedrag");
		var banknr = $C("banknr");
		var voorletters = $C("voorletters");
		var achternaam = $C("achternaam");
		var voornaam = $C("voornaam");
		var tussenvoegsel = $C("tussenvoegsel");
		var prodaantal = $C("prodaantal");
		var pakketaantal = $C("pakketaantal");
		
		
		addEvent(floats,"keypress",isFloat);
		addEvent(ints,"keypress",isInt);
		// addEvent(pccheck,"keypress",checkPostCodeInput);
		addEvent(voorletters,"blur",initials);
		addEvent(achternaam,"blur",capitalize);
		addEvent(voornaam,"blur",capitalize);
		addEvent(tussenvoegsel,"blur",decapitalize);
		addEvent(pccheck,"blur",ajaxPostcode);
		addEvent(chkminvalue,"blur",checkMinValue);
		addEvent(bedraginvoer,"blur",wijzigTermijnBedrag);
		addEvent(termijnselectie,"change",wijzigTermijnBedrag);
		addEvent(productbedrag,"change",updateTotaalBedrag);
		addEvent(vrijbedrag,"change",formatBedrag);
		addEvent(warningfields,"blur",showWarningMessage);
		addEvent(prodaantal,"blur",setAutoBedrag);
		addEvent(prodaantal,"change",setAutoBedrag);
		
		
		/*addEvent(banknr,"blur",isBankNr);*/
		// addEvent(huisnummer,"blur",ajaxPostcode)
		addEvent(new Array(form),"submit",checkRequired);
		initFreeMinVals(chkfreeminvalue, form);
		setMinVals(chkminvalue);
		updateTotaalBedrag(null); // set productbedrag op 0
	}
}

function setAutoBedrag(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var bedr = $C("prodbedrag")[0];
	var disp = $(bedr.id.split("_")[0]);
	if(el.value==''){
		disp.value = "";
		return;
	}
	var val = parseInt(el.value);
	bedr = parseFloat((parseInt(bedr.value)*val)/100).toFixed(2);
	disp.value = convOutBedrag(bedr);
}

function addTrimFunctions(frm){
	if(frm){
		for(var i=0,el;i<frm.elements.length,el=frm.elements[i];i++){
			if(isTrimmable(el)){
				addEvent(new Array(el),"blur",smartTrim);
			}
		}
	}
}

function killSpaces(val){
	var spaces = /(\s)*/g;
	return val.replace(spaces,'');
}

function killMultiSpaces(val){
	var multiplespaces = /(\s)+/g;
	return val.replace(multiplespaces,' ');
}

function smartTrim(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	doSmartTrim(el);
	// alert(el.value);
}

function doSmartTrim(el){
	/**/
	el.value = killMultiSpaces(el.value);
	el.value = el.value.trim();
}

function isTrimmable(el){
	switch(el.tagName.toLowerCase()){
		case "textarea":
			return true;
		case "input":
			if(el.type){
				switch(el.type.toLowerCase()){
					case "password":
					case "text":
						return true;
				}
			}
			break;
	}
	return false;
}

function firstcap(val){
	return val.substring(0,1).toUpperCase()+val.substring(1,val.length).toLowerCase();
}

function firstcapitems(arr){
	var out = new Array();
	for(var i=0;i<arr.length;i++){
		out.push(firstcap(arr[i]));
	}
	return out;
}

function capitalize(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var val = killMultiSpaces(el.value);
	var out = firstcapitems(val.split(' '));
	val = out.join(" ");
	out = firstcapitems(val.split('-'));
	el.value = out.join("-");
	el.value = killMultiSpaces(el.value);
}

function decapitalize(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	el.value = el.value.toLowerCase();
}

function initials(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var val = el.value.split('');
	el.value = val.join(".").toUpperCase();
	if(el.value!='') el.value += ".";
	var multipledots = /(\.)+/g;
	el.value = killSpaces(el.value);
	el.value = el.value.replace(multipledots,'.');
}

function formatBedrag(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	el.value = convOutBedrag(parseFloat(convInBedrag(el.value)).toFixed(2));
}


function ajaxPostcode(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var fs = getParentByTagName(el,"fieldset");
	doAjaxPostCode(fs);
	
	// console.debug(e)
}

function doAjaxPostCode(fs){
	var pccheckfields = $C("pccheckfield",null,fs);
	var postcode = $C("postcodecheck",null,fs);
	var ajaxRequest = new AjaxRequest($("pcchecklink").href);
	var i,el;
	for(i=0;i<pccheckfields.length,el=pccheckfields[i];i++){
		if(el.id.toLowerCase().split('huisnummer').length>1){
			ajaxRequest.addNameValuePair("huisnummer", el.id);	
			ajaxRequest.addNameValuePair("huisnummervalue", el.value);	
		}
		if(el.id.toLowerCase().split('straat').length>1){
			ajaxRequest.addNameValuePair("straat", el.id);	
		}
		if(el.id.toLowerCase().split('plaats').length>1){
			ajaxRequest.addNameValuePair("woonplaats", el.id);	
		}
	}
	for(i=0;i<postcode.length,el=postcode[i];i++){
		if(el.id.toLowerCase().split('postcode').length>1){
			el.value = killSpaces(el.value);
			el.value = el.value.toUpperCase();
			ajaxRequest.addNameValuePair("postcode", el.id);
			ajaxRequest.addNameValuePair("postcodevalue", el.value);
			
		}
	}
	ajaxRequest.sendRequest();
	// console.debug(postcode)
}

function initFreeMinVals(arr, form){
	addEvent(arr,"blur",checkFreeRadioMinValue);
	addEvent(arr,"focus",setRadioOption);
	
	for(var i=0,rd;i<arr.length,rd=arr[i];i++){
		var chk = form[rd.name.split("_free")[0]];
		for(var j=0;j<chk.length;j++){
			if(chk[j].value != 'ANDERS'){
				addEvent(new Array(chk[j]),"click",setFreeValFromRadio);
			}
		} 
	}
}

function setMinVals(arr){
	for(var i=0,el,frq,chk;i<arr.length,el=arr[i];i++){
		frq = getBetaalFreq();
		if(frq!=0 && !hasClass(el,"vrijbedrag")){
			chk = $(el.id+"_CHECKBEDRAG");
			el.value = convOutBedrag(parseFloat((chk.value/100)/frq).toFixed(2));
		}
	}
}

function showWarningMessage(e){
	if($("showwarning").value == 0) return;
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var tstval = parseFloat(convInBedrag(el.value));
	var chkval = parseFloat($("warningvalue").value);
	if(chkval && tstval<chkval){
		el.blur();
		alert($("warningmessage").value);
	};
}

function setFreeValFromRadio(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var rd = $(el.name+"_free");
	el = parseFloat(convInBedrag(el.value));
	rd.value = convOutBedrag(el.toFixed(2));
}

function setRadioOption(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var rd = $(el.name.split("_free")[0] + "_ANDERS");
	rd.checked = true;
}

function ajaxPostcode(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var fs = getParentByTagName(el,"fieldset");
	doAjaxPostCode(fs);
}


function checkFreeRadioMinValue(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	if(el.value!=""){
		checkMinValue(e);
	}
}

function checkMinValue(e){
	if(!e) e = window.event;
	/*console.debug("testing");*/
	var el = getTargetElement(e);
	var chk = $(el.id+"_CHECKBEDRAG");
	
	var orgval = parseFloat(convInBedrag(el.value))*100;
	var testval = parseFloat(chk.value);
	var betfreq = getBetaalFreq();
	testval = (betfreq==0) ? 0 : (testval/betfreq);
	if(betfreq!=0 && orgval<testval){
		testval = testval/100;
		alert(getMsgByClassName(el, convOutBedrag(testval.toFixed(2))));
		el.value = convOutBedrag(testval.toFixed(2));
	}
	else {
		if(parseFloat(convInBedrag(el.value))){
			el.value = convOutBedrag(parseFloat(convInBedrag(el.value)).toFixed(2));
		}
	}
}

function getBetaalFreqDivisor(el){
	switch(el.value){
		case "E":
		case "J":
			return 1;
			break;
		case "H":
			return 2;
			break;
		case "K":
			return 4;
			break;
		case "M":
			return 12;
			break;
		default:
			return 0;	
	}
}

function getBetaalFreq(){
	var form = getParentByTagName($("btnsubmit"),"form");
	for(var i=0,el,nm;i<form.elements.length,el=form.elements[i];i++){
		if(el.name){
			nm=el.name.toLowerCase().split("ovkbetaalfrequentie");
			if(nm.length > 1){
				return getBetaalFreqDivisor(el);
			}
		}
	}
}

function updateTotaalBedrag(e){
	var prods = $C("productaantal");
	for(var i=0,el,prijs,totaal=0;i<prods.length,el=prods[i];i++){
		prijs = parseFloat($("prijs"+el.name.split("aantal")[1]).value);
		totaal += prijs*el.value;
	}
	if(totaal > 0){ totaal += parseFloat($("verzendkosten").value);}
	if($("bedrag") && prods.length) {
		if(totaal == 0){ $("bedrag").value = "";}
		else {$("bedrag").value = convOutBedrag(totaal.toFixed(2));}
	}
	// alert(sel);
}

function checkTermijnBedrag(val){
	var minbedrag = parseFloat(getMinBedrag());
	var val = parseFloat(convInBedrag(val))*getBetaalFreqDivisor($("periode"));
	return (val >= minbedrag);
}

function getMinBedrag(){
	var orgbedrag = $("orgbedrag").value*getBetaalFreqDivisor($("orgperiode"));
	var minbedrag = $("minbedrag").value;
	return ((orgbedrag < minbedrag) ? minbedrag : orgbedrag);
}

function wijzigTermijnBedrag(e){
	if(!e) e = window.event;
	var el = getTargetElement(e);
	var bedrag = convInBedrag($("bedrag").value);
	switch(el.tagName.toLowerCase()){
		case "input":
			/*if(!checkTermijnBedrag(bedrag)){
				var minbedrag = getMinBedrag();
				$("bedrag").value = convOutBedrag(minbedrag/getBetaalFreqDivisor($("periode")));
			}*/
			break;		
		case "select":
			var nbedrag = (bedrag*getBetaalFreqDivisor($("prevperiode")))/getBetaalFreqDivisor($("periode"));
			$("prevperiode").value = $("periode").value;
			$("bedrag").value = nbedrag;
			bedrag = nbedrag;
			break;
	}
	if($("bedrag").value != ''){
		$("bedrag").value = convOutBedrag(parseFloat(bedrag).toFixed(2));
	}
	// alert(el.tagName);
	// $("bedrag").value = convOutBedrag(parseFloat($("bedrag").value).toFixed(2));
	/*console.debug(minbedrag);
	console.debug(orgbedrag);
	console.debug(tstbedrag);*/
	/*alert(e);*/
}

function convOutBedrag(bedrag){
	var bedrag = bedrag.toString();
	return bedrag.split(".").join(",");
}

function convInBedrag(bedrag){
	var bedrag = bedrag.toString();
	return bedrag.split(",").join(".");
}


function getMsgByClassName(el, val){
	var cl = el.className.split(" ");
	var msg = "Het minimum bedrag is: \u20AC " + val;
	var msgfound = false;
	for(var i=0,c;i<cl.length,c=cl[i];i++){
		switch(c){
			case "giftbedrag":
				msg = "Vanwege de kosten voor de verwerking van uw gift is de minimale donatie 5 euro";
				msgfound = true;
				break;
		}
		if(msgfound) break;
	}
	return msg;
}

function getPCField(elid){
	var pcfields = new Array("straat","woonplaats","netnummer","huisnummer");
	for(var i=0,str,tst;i<pcfields.length,str=pcfields[i];i++){
		tst = elid.split(str);
		if(tst.length>1){
			return str;
		}
	}
	return;
}

function checkRx(frm){
	var rxErrorArray = new Array();
	var rxVal = new rxValidator();
	for(var i=0,el;i<frm.elements.length,el=frm.elements[i];i++){
		if(hasClass(el,"required-if-active")) {
			/*console.debug(el.id + ":" + isActive(el));*/
			if(!isActive(el)) continue;
		}
		
		if(isTrimmable(el)){
			doSmartTrim(el);
		}
		if(!rxVal.validateElementByClass(el)){
			if(hasClass(el,"splitdate") || hasClass(el,"datumcontrole")){
				el = getParentByTagName(el, "div");
			}
			else{
				if(hasClass(el,"mobnummer") || hasClass(el,"telnummer") || hasClass(el,"algnummer")){
					el.id = el.id.split("_")[0];	
				}
			}
			rxErrorArray.push(el.id);
		}
		else {
			if(hasClass(el,"splitdate") || hasClass(el,"datumcontrole")){
				var div = getParentByTagName(el, "div");
				errel = $(div.id + "_RXERROR");
			}
			else{
				var elid = el.id;
				var errel;
				errel = $(elid + "_RXERROR");
			}
			if(errel){
				/*console.debug(errel);*/
				errel.style.display = 'none';
			}
		}
	}
	return rxErrorArray;
}

function checkRequired(e){
	if(!e) e = window.event;
	cancelEvent(e);
	var rxVal = new rxValidator();
	var form = getTargetElement(e);
	var requireds = $C("required", "", form);
	var allIsOK = true;
	var errorArray = new Array();
	for(var i=0,el;i<requireds.length,el=requireds[i];i++){
		if(hasClass(el,"required-if-active")) {
			/*console.debug(el.id + ":" + isActive(el));*/
			if(!isActive(el)) {
				/*console.debug("continuing");*/
				continue;
			}
		}
		
		if(rxVal.isIdealBetaling(el)){
			// hack for idealbetaling, skips banknr required check 
			var elid = el.id;
			var errel = $(elid + "_ERROR");
			if(errel){
				errel.style.display = 'none';
			}
			var errel = $(elid + "_RXERROR");
			if(errel){
				errel.style.display = 'none';
			}
			continue;
		}
		
		switch(el.tagName.toLowerCase()){
			case "input":
			case "select":
			case "textarea":
				isOK = hasValue(el);
				if(!isOK){
					allIsOK = false;
					var idsplit = el.id.split("_");
					if(idsplit.length>1 && (idsplit[1]=="huisnummer" || idsplit[1]=="kiesnummer" || idsplit[1]=="netnummer")){
						errorArray.push(idsplit[0]);
					}
					else{
						if(el.type.toLowerCase() == 'checkbox' || el.type.toLowerCase() == 'radio'){
							errorArray.push(el.name);
						}
						else{
							errorArray.push(el.id);
						}
					}
				}
				else{
					var elid = el.id;
					var errel;
					var idsplit = el.id.split("_");
					if(idsplit.length>1){
						errel = $(idsplit[0] + "_ERROR");
					}
					else{
						if(el.type.toLowerCase() == 'checkbox' || el.type.toLowerCase() == 'radio'){
							errel = $(el.name + "_ERROR");
						}
						else {
							errel = $(elid + "_ERROR");
						}
					}
					if(errel){
						errel.style.display = 'none';
					}
				}
				break;
			default:
				var childels = new Array();
				childels.push(el.getElementsByTagName("input"));
				childels.push(el.getElementsByTagName("select"));
				for(var j=0,els;j<childels.length,els=childels[j];j++){
					for(var k=0,curel;k<els.length,curel=els[k];k++){
						isOK = hasValue(curel);
						if(!isOK){
							allIsOK = false;
							errorArray.push(el.id);
						}
						else{
							var elid = el.id;
							var errel;
							errel = $(elid + "_ERROR");
							if(errel){
								errel.style.display = 'none';
							}
						}
					}
				}
		}
	}
	/*
	 * hard gecodeerd wachtwoord opties voor MijnWNF wijzig gebruikersgegevens 
	 */
	var passwords = $C("password");
	var pwmessage = new Array();
	
	for(var i=0,pwid,el,el2;i<passwords.length,el=passwords[i];i++){
		pwid = el.id;
		el2 = $(pwid + "_CHECK").value;
		if(pwid=='wachtwoord_oud'){
			var reqel1 = $(pwid + "_ERROR");
			var reqel2 = $(pwid + "_CHECK_ERROR");
			if(reqel1){reqel1.style.display = 'none';}
			if(reqel2){reqel2.style.display = 'none';}
			var chkval = hex_md5(el.value);
			if(chkval.toLowerCase()!=el2.toLowerCase() && el.value != ''){
				pwmessage.push( $(pwid + "_CHECK"));
				allIsOK = false;
			}
			else {
				var errel = $(pwid + "_CHECK_PASSWORDERROR");
				if(errel){
					errel.style.display = 'none';
				}
			}
			continue;
		}
		if($("nieuwwachtwoord").style.display!='none'){
			/* wachtwoordfieldset is actief */
			if(el.value!=''){
				var reqel1 = $(pwid + "_ERROR");
				var reqel2 = $(pwid + "_CHECK_ERROR");
				if(reqel1){reqel1.style.display = 'none';}
				if(reqel2){reqel2.style.display = 'none';}
				el = (hasClass($(pwid + "_CHECK"),'hash')) ? hex_md5(el.value) : el.value;
				/*console.debug(el);*/
				if(el.toLowerCase()!=el2.toLowerCase() && el != ''){
					pwmessage.push( $(pwid + "_CHECK"));
					allIsOK = false;
				}
				else {
					var errel = $(pwid + "_CHECK_PASSWORDERROR");
					if(errel){
						errel.style.display = 'none';
					}
				}
			}
			else {
				errorArray.push( pwid);
				if(el2==''){
					errorArray.push(pwid + "_CHECK");
				}
				allIsOK = false;
			}
			/*alert(el);*/
		}
		else {
			/* reset foutmeldingen + wachtwoorden als wachtwoordtab niet actief is */
			var reqel1 = $(pwid + "_ERROR");
			var reqel2 = $(pwid + "_CHECK_ERROR");
			var reqel3 = $(pwid + "_CHECK_PASSWORDERROR");
			if(reqel1){reqel1.style.display = 'none';}
			if(reqel2){reqel2.style.display = 'none';}
			if(reqel3){reqel3.style.display = 'none';}
			pwid.value = "";
			$(pwid + "_CHECK").value = "";
		}
	}
	/* 
	 * einde: hard gecodeerd wachtwoord opties voor MijnWNF wijzig gebruikersgegevens 
	 */
	
	var rxErrorArray = checkRx(form);
	if(rxErrorArray.length>0) allIsOK = false;
	
	if(!allIsOK){
		for(var i=0,elid,el;i<errorArray.length,elid=errorArray[i];i++){
			el = $(elid + "_ERROR");
			if(!el){
				/*alert(elid);*/
			}
			else{
				var hide = false;
				if($(elid) && hasClass($(elid),"readonly")){
					hide = true;
				}
				if(!hide) {
					el.style.display = 'inline';
				}
			}
		}
		for(i=0,el,el2;i<pwmessage.length,el=pwmessage[i];i++){
			el2 = $(el.id + "_PASSWORDERROR");
			// alert(el2);
			el2.style.display = 'inline';
		}
		
		for(var i=0,elid,el;i<rxErrorArray.length,elid=rxErrorArray[i];i++){
			var chkel = $(elid + "_ERROR");
			var rxErr = true;
			if(chkel && chkel.style.display == 'inline') {
				rxErr = false;
			}
			el = $(elid + "_RXERROR");
			if(rxErr){
				if(!el){
					// alert(elid);
				}
				else{
					el.style.display = 'inline';
				}
			}
			else {
				if(el){
					el.style.display = 'none';
				}
			}
		}
		alert("Er zijn 1 of meerdere velden niet (correct) ingevuld. Controleer uw invoer.");
		
		
		if(evdebug && console){
			console.debug("test");
			console.debug(errorArray);
			console.debug(rxErrorArray);
		}
	}
	else {
		form.submit();
	}
}


function isActive(el){
	if(hasClass(el,"persoon[0-9]{2}")){
		if(hasClass(el,"persoon17")){
			if($("nawtype17").value == "persoon") return true;
			else return false;
		}
		if(hasClass(el,"persoon18")){
			if($("nawtype18").value == "persoon") return true;
			else return false;
		}
		if(hasClass(el,"persoon21")){
			if($("nawtype21").value == "persoon") return true;
			else return false;
		}
	}
	
	if(hasClass(el,"organisatie[0-9]{2}")){
		if(hasClass(el,"organisatie17")){
			if($("nawtype17").value == "organisatie") return true;
			else return false;
		}
		if(hasClass(el,"organisatie18")){
			if($("nawtype18").value == "organisatie") return true;
			else return false;
		}
		if(hasClass(el,"organisatie21")){
			if($("nawtype21").value == "organisatie") return true;
			else return false;
		}
	}
	
}

// isActive("testveld");
var addEvent;
if(addEvent) addEvent(window,"load",initFormWidgets);
