/* ### FORMULIEREN ### */
/* Laat een hint bij een veld zien */
function showHint(veld){
	// alle hints weghalen
	$$('.hintWindow').invoke('remove');
	
	// hint tonen
	var xy = $(veld).cumulativeOffset();
	var cwidth = $$('div.container')[0].getWidth();
	var vp = document.viewport.getDimensions();
	
	// corigeren voor 1024x768 en kleiner
	var xcorrectie = vp.width < 1024 ? -60 : 0; // hints iets naar binnen brengen bij schermbreedte kleiner dan 1024

	// indien er een overlay over de pagina ligt (fixed)
	var boxed = $(document.body).hasClassName('boxed');
	
	// positie berekenen
	var table = $(veld).up('div');
	var td = $(veld).up('td');
	var tdxy = td.cumulativeOffset();
	var tablexy = table.cumulativeOffset();
	var x = tablexy.left + table.getWidth() + xcorrectie;

	// DOM
	var tekst = $(veld.id+"_hint").innerHTML;
	var inner = new Element('div').update(tekst);
	var hint = new Element('div',{'class':'hintWindow'});
	hint.appendChild(inner);
	document.body.appendChild(hint);
	var hintheight = hint.getHeight();
	var y = Math.round(tdxy.top - (hintheight/2)) + 15;
		
	// CSS
	hint.setStyle({
		'position':(boxed ? 'fixed' : 'absolute'),
		'left':x+'px',
		'top':y+'px',
		'zIndex':10000
	});
	
	// Verbergen na 2 seconden
	setTimeout(function(){
		$$('.hintWindow').invoke('remove');
	},2000);
}

/* Verberg Alle hints */
function removeHint(veld){
	$$('.hintWindow').invoke('remove');
}

/* Highlight een veld */
function formAddHighlight(field){
	Element.addClassName(field,"form_actief");	
}

/* Onthighlight een veld */
function formAddHighlight(field){
	Element.removeClassName(field,"form_actief");	
}

/* inline valideren */
function formInlineValidate(veld,verplicht,type){
	veld = $(veld);
	var fout = false;	
	var id = veld.id;
	var value = veld.value;
	var mess = '';
	
	// verwijder alle hints
	/*
	$$('div.hint').each(function(hint){
		if(hint.visible()){
			new Effect.SlideUp(hint,{duration:0.3});
		}
	});
	$$('td.veld.hint').invoke('removeClassName','hint'); //NIEUW WEG 
	*/
	
	// Type checken (wie weet is het een checkbox oid)
	var veldtype = veld.getAttribute('type');
	if(veldtype == 'checkbox'){
		/* Het is een checkbox */
		id = id.replace('[]','');
		
		var inputs = $A(document.getElementsByClassName('checkbox'));
		var res = inputs.any(function(input){
			if(input.id.indexOf(id)!=-1){
				// deze heeft het goede id
				return(input.checked);
			}
		});
		fout = !res;
		if(fout){
			mess = 'U dient in ieder geval één van de opties te selecteren.';	
		}
	}else{
		/* Het is een standaard string */
		// whitespace weghalen
		value = value.strip();
		
		// lang genoeg?
		if(value.length==0){
			if(verplicht){
				fout = true;
				mess = 'Dit veld is verplicht.';
			}
		}else{
			// check voor bepaalde types
			
			// email
			if(type == 'email'){
				fout = !formCheckEmail(value);
				if(fout){
					mess = 'Dit e-mail adres is niet correct opgemaakt.';
				}
			}
			
			// postcode
			if(type == 'postcode'){
				value = value.replace(' ','');
				value = value.toUpperCase();
				fout = !formCheckPostcode(value);
				if(fout){
					mess = 'Deze postcode is niet in een vorm als 1234AB.';
				}else{
					veld.value = value;
				}
			}
			
			// telefoon
			if(type == 'telefoon'){
				//value = value.replace(' ','');
				//value = value.toUpperCase();
				fout = !formCheckTelefoon(value);
				if(fout){
					mess = 'Dit telefoonnummer is niet juist.';
				}else{
					veld.value = value;
				}
			}
			
			// datum
			if(type == 'datum'){
				fout = !formCheckDatum(value);
				if(fout){			
					mess = 'Voer een geldige datum in.';
				}else{
					veld.value = value;
				}
			}	
			
			// sofinummer
			if(type == 'sofinummer'){
				fout = !formCheckSofinummer(value);
				if(fout){
					mess = 'Deze waarde is niet geldig.';
				}
			}
		}
	}
	
	// fouten nieuwe stijl
	var label = veld.up('tr').down('label');
	if(fout){
		if(mess.length > 0){
			$(veld.id+'_hint').update('<p>'+mess+'</p>');
			showHint(veld);
		}
		label.addClassName('form_veld_error');
		label.removeClassName('form_veld_ok');
	}else{
		label.addClassName('form_veld_ok');
		label.removeClassName('form_veld_error');
	}
	
	// fouten kenbaar maken
	/*
	var validate = $('inline_validate_'+id);
	if(fout){
		validate.removeClassName('form_inline_validate_ok');	
		validate.addClassName('form_inline_validate_fout');		
		
		// boodschap tonen
		if(mess.length > 0){
			var hint = veld.id+'_hint';
			Element.update(hint,'<p>'+mess+'</p>');
			showHint(veld);
		}
	}else{
		validate.removeClassName('form_inline_validate_fout');				
		validate.addClassName('form_inline_validate_ok');	
	}
	*/
}

/* Nieuwe stijl */
var formKoppelingHints = true;
var formKoppelingUrlPrefix = '';
function formKoppeling(type, details){
	// variabelen?
	var bronnen = [];
	var targets = [];
	var vars = [];
	
	var url = formKoppelingUrlPrefix+'ajaxServices.php?return=koppeling&mode=';	
	
	// listeners instellen
	switch(type){
		case 'agentschapnummer':
			bronnen = [details.klantnummer];
			//targets = ['bedrijfsnaam','straatnaam','huisnummer','postcode','plaats'];
		break;
		case 'postcode':
			bronnen = [details.postcode, details.huisnummer];
			//targets = ['straatnaam','plaats'];
		break;
		default:
	}
	
	// tijdelijke boodschap in de targets zetten
	$H(details).each(function(target){
		if($(target[1])){
			if(bronnen.indexOf(target[1])==-1){
				if(formKoppelingHints){
					$(target[1]).value = 'Dit veld wordt automatisch voor u ingevuld';
					$(target[1]).setStyle({'color':'#BBBBBB'});
				}
			}
			
			new Event.observe($(target[1]),'focus',function(){	
				if($(target[1]).value == 'Dit veld wordt automatisch voor u ingevuld'){
					$(target[1]).value = '';
					$(target[1]).setStyle({'color':'#000'});
				}		
			});
		}
	});
	
	// check de bronnen op een wijziging
	bronnen.each(function(bron){
	
		new Event.observe($(bron),'blur',function(){
			var link = url;
			var fout = false;
			
			// valideer & url maken
			switch(type){
				case 'agentschapnummer':
					// check het nummer - moet van 'bron' zijn
					fout = !(parseInt($F(bron)) > 0);
					mess = 'Even geduld, de bedrijfsnaam voor u opgezocht';
					errmess = 'Het door u ingevoerd agentschapsnummer is bij ons niet bekend.';
					link += 'agentschapsnummer';
				break;
				case 'postcode':
					var pc = $F(details.postcode).toUpperCase().replace(' ','');
					// check postcode en huisnummer				
					if(!formCheckPostcode(pc)){
						fout = true;
					}
					if($F(details.huisnummer).length == 0){
						fout = true;
					}	
					mess = 'Even geduld, straatnaam en plaats worden voor u opgezocht';
					errmess = 'De door u ingevoerde combinatie van huisnummer en postcode is bij ons niet bekend';
					link += 'postcode';			
				break;
				default:
			}		
			
			// data ophalen
			if(!fout){
				// targets disabelen	
				var targets = $H(details);		
				var first = true;
				var hint;
				var target1;
				targets.each(function(target){
					if($(target[1])){
						if(first && formKoppelingHints){
							target1 = $(target[1]);
							hint = target[1]+'_hint';
							Element.update(hint,'<p>'+mess+'</p>');
							showHint(target1);						
							first = false;
							$(target[1]).disable();
						}
					}
				});

				
				// url opbouwen
				switch(type){
					case 'agentschapnummer':
						link += '&agentschapsnummer=' + $F(details.klantnummer);
					break;
					case 'postcode':
						link += '&pc=' + $F(details.postcode);
						link += '&hn=' + $F(details.huisnummer);
						
						// bij straat en plaats een boodschap plaatsen 'Dit veld wordt automatisch voor u ingevuld';
						//$(details.plaats).value = 'Dit veld wordt automatisch voor u ingevuld';	
						//$(details.straatnaam).value = 'Dit veld wordt automatisch voor u ingevuld';	
					break;
					default: 
					
				};
					
				// ajax call 
				new Ajax.Request(link, { 
					method: 'get', 
					onSuccess: function(transport){
						var json = transport.responseText.evalJSON(true);
						// kleur weer corrigeren voor alle velden
						$H(details).each(function(target){
							if($(target[1])){
								$(target[1]).setStyle({'color':'#000'});
							}
						});						
						
						// is het ook gevonden?
						if(json.error==false){
							if(formKoppelingHints){
								removeHint(target1);
							}
							switch(type){
								case 'agentschapnummer':
									if($(details.bedrijfsnaam)){
										$(details.bedrijfsnaam).value = json.Bedrijfsnaam;
									}
									if($(details.straatnaam)){
										$(details.straatnaam).value = json.Straat;
									}
									if($(details.huisnummer)){
										$(details.huisnummer).value = json.Huisnummer;
									}
									if($(details.postcode)){
										$(details.postcode).value = json.Postcode;
									}
									if($(details.plaats)){
										$(details.plaats).value = json.Plaats;
									}
								break;
								case 'postcode':
									$(details.straatnaam).value = json.Straatnaam;
									$(details.plaats).value = json.Woonplaats;								
								break;
								default:
							}
						}else{
							if(formKoppelingHints){
								Element.update(hint,'<p>'+errmess+'</p>');
							}
							switch(type){
								case 'postcode':
									$(details.plaats).value = '';	
									$(details.straatnaam).value = '';									
								break;
								default:
							}
						}

						targets.each(function(target){
							$(target[1]).enable();
						});
					}
				});	
		
			}else{
				//cLog('niet gevalideerd');
			}	
		});
	});
}


/* Functies voor de formlisteners */
function formListen(type, bronnen, targets){
	// observeer de laatste bron
	Event.observe($(bronnen[bronnen.length - 1]),'blur',function(){
		// variabelen
		var fout = false;
		var mess = '';
		var errmess = '';
		var url = 'ajaxServices.php?return=listener&mode=';
		var respKeys = [];
		var values = [];
		
		// values uit bronnen halen
		var i = 0;
		bronnen.each(function(bron){
			values[i++] = $F(bron);
		});

		// afhankelijk van mode	
		// 0. Postcode
		if(type == 'postcode'){
			if(!formCheckPostcode(values[1])){
				fout = true;
			}
			if(values[0].length == 0){
				fout = true;
			}
			mess = 'Even geduld, straatnaam en plaats worden voor u opgezocht';
			errmess = 'De door u ingevoerde combinatie van huisnummer en postcode is bij ons niet bekend';
			respKeys = ['Straatnaam','Woonplaats'];
			url += 'postcode';
		}
		// 1. Agentschapsnummer
		if(type == 'agentschapsnummer'){
			fout = values[0] + 0 == 0;
			mess = 'Even geduld, de bedrijfsnaam voor u opgezocht';
			errmess = 'Het door u ingevoerd agentschapsnummer is bij ons niet bekend.';
			respKeys = ['Bedrijfsnaam','Straat','Huisnummer','Postcode','Plaats'];
			url += 'agentschapsnummer';
		}
		
		// actie uitvoeren
		if(!fout){
		
			// targets disabelen
			targets.each(function(target){
				$(target).disable();
			});
			var target1 = $(targets[0]);
			
			// boodschap tonen
			var hint = target1.id+'_hint';
			Element.update(hint,'<p>'+mess+'</p>');
			showHint(target1);
			
			// url opbouwen
			values.each(function(value){
				url += '&values[]=' + value;
			});
						
			// ajax call 
			new Ajax.Request(url, { 
				method: 'get', 
				onSuccess: function(transport){
					var json = transport.responseText.evalJSON(true);
					
					if(json.error==false){
						removeHint(target1);
					}else{
						Element.update(hint,'<p>'+errmess+'</p>');
					}
					
					var c = 0;
					targets.each(function(target){
						if(json.error==false){
							$(target).value = eval('json.' + respKeys[c]);
						}else{
							
						}
						$(target).enable();
						c++;
					});
				}
			});		
		
		
		}else{
			//cLog('FOUT');
		}
	});
}

/* Checkfuncties voor formulier */
function formCheckEmail(value){
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	var res = filter.test(value);
	return res;
}

function formCheckPostcode(value){
	var filter = /^[1-9]{1}[0-9]{3}[A-Z]{2}$/;
	var res = filter.exec(value);
	return res;
}

function formCheckTelefoon(value){
	var filter = /([0]{1}[6]{1}[-s]*[1-9]{1}[s]*([0-9]{1}[s]*){7})|([0]{1}[1-9]{1}[0-9]{1}[0-9]{1}[-s]*[1-9]{1}[s]*([0-9]{1}[s]*){5})|([0]{1}[1-9]{1}[0-9]{1}[-s]*[1-9]{1}[s]*([0-9]{1}[s]*){6})/;
	var res = filter.exec(value);
	return res;
}

function formCheckDatum(value){
	//var filter = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/;
	//var res = filter.exec(value);
	var spl = value.split('-');
	var fout = false;
	if(spl.length == 3){
		var dag = spl[0];
		var maand = spl[1];
		var jaar = spl[2];
		if(!formCheckNummer(dag) || parseFloat(dag) < 1 || parseFloat(dag) > 31){
			fout = true;
		}		
		if(!formCheckNummer(maand) || parseFloat(maand) < 1 || parseFloat(maand) > 12){
			fout = true;
		}
		if(!formCheckNummer(jaar) || parseFloat(jaar) < 1900 || parseFloat(jaar) > 2100 || jaar.length < 4){
			fout = true;
		}	
	}else{
		fout = true;	
	}
	return !fout;
}

function formCheckNummer(value){
	if (isNaN(parseFloat(value))){
		return false;
	}else{
		return true;	
	}
}

function formCheckSofinummer(value){
	// verwijder alle tekens die geen cijfers zijn
	value = value.replace(/\D/, "");
		
	// loop door de 9 cijfers met de 11 proef formule
	var som = 0;
	for (i=1; i<10; i++) {
		som += value.charAt(i-1) * (10-i);
	} 
	
	// geef resultaat van check terug
	return (som % 11==0 && value.length == 9);
}
