$(document).ready(function(){
	addValidation();
});

$(document).unload(function(){
	$('form').each(function(i){
		removeValidation($(this)[0]);
	});
});

function addValidation(form){
	if(typeof no_validation != 'undefined') return;
	
	$('input[@type!=radio],textarea,select').each(function(){
		var element = this;
		var element_validators = element.className.split(' ');
		var element_advanced_validators = new Array();
		for(var y=0;y<element_validators.length;y++){
			if(!validators[element_validators[y]]){
				for(var z in advanced_validators){
					var test = advanced_validators[z].regExp.exec(element_validators[y]);
					if(test){
						var validator = new Object();
						validator.name = z;
						validator.param = test[1];
						element_advanced_validators.push(validator);
					}
				}
				element_validators.splice(y,1);
				y--;
			}
		}
		if(element_validators.length){
			element.validators = element_validators;
			$(element).bind('blur',validate);
		}
		if(element_advanced_validators.length){
			element.advanced_validators = element_advanced_validators;
			$(element).bind('blur',validate);
		}
	});
}

function validate(){
	var elm = this;
	
	var validate_text = '';
	var validator_name = '';
	var validator_num = -1;
	for(var x in elm.validators){
		var validator = validators[elm.validators[x]];
		if(!validator['functie'](elm.value)){
			validate_text = validator['message'];
			validator_num = x;
			validator_name = elm.validators[x];
			break;
		}
	}
	for(var x in elm.advanced_validators){
		var validator = advanced_validators[elm.advanced_validators[x].name];
		if(!validator['functie'](elm.value,elm.advanced_validators[x].param)){
			validate_text = validator['message'];
			validator_num = x;
			validator_name = elm.advanced_validators[x].name;
			break;
		}
	}
	
	if(elm.validation_error != validator_name/*elm.validators[validator_num]*/){
		if(elm.validation_error){
			var id = '#' + elm.id + '_validation_error';
			if($.browser.msie && $.browser.version == '6.0'){
				if(validate_text == ''){
					$(id).remove();
				}else{
					$(id).empty();
					$(id).append(validate_text.replace('{NAME}',elm.title));
				}
			}else{
				$(id).fadeTo("fast",0,function(){
					if(validate_text == ''){
						$(id).remove();
					}else{
						$(id).empty();
						$(id).append(validate_text.replace('{NAME}',elm.title));
						$(id).fadeTo("normal",1);
					}
				});
			}
		}else if(validate_text != ''){ //voeg eerste keer in
			var id = elm.id + '_validation_error';
			$(elm).after('<span class="validation-error" id="' + id + '">' + validate_text.replace('{NAME}',elm.title) + '</span>');
			id = '#' + id;
			if(!($.browser.msie && $.browser.version == '6.0')){
				$(id).css({'opacity':'0.0'});
				$(id).fadeTo("normal",1);
			}
		}
	}
	if(validate_text == ''){
		elm.validation_error = null;
	}else{
		elm.validation_error = validator_name;
	}
}

function deleteValidation(form){
	var	elements = form.getElementsByTagName('input');
	for(var x in elements){
		var element = elements[x];
		if(elements[x].type == 'text'){
			element.validators = null;
			this.validation_error = null;
			$(element).unbind('blur',validate);
		}
	}
}

var validators = {
	'validate-exists'		: {message : '{NAME} is niet ingevuld.'					, functie : function(v){return v.length != 0}															},
	'validate-numeric'		: {message : 'Gebruik AUB alleen getallen (0-9)'		, functie : function(v){return /^[\d]*$/.test(v)}														},
	'validate-doublenumeric': {message : 'Gebruik AUB alleen getallen (0-9.,)'		, functie : function(v){return /^((\d+)|((\d+)(\.|\,)(\d+)))$/.test(v)}										},
	'validate-valuta'		: {message : 'Vul AUB een geldig bedrag in.'			, functie : function(v){return /^([\s]*(€[\s]*)?\d+((,|\.)(\d{2}|-))?([\s]*€)?[\s]*)?$/.test(v)}									},
	'validate-email'		: {message : 'Vul AUB een geldig e-mail adres in.'		, functie : function(v){return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.((\w\w)|com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/.test(v) || v.length==0}			},
	'validate-postcode'		: {message : 'Vul AUB een geldige postcode in'			, functie : function(v){return /^[\d]{4}[ |-]?[a-z|A-Z]{2}$/.test(v) || v.length==0}					},
	'validate-telefoon' 	: {message : 'Vul AUB een geldig telefoonnummer in'		, functie : function(v){return /^[\d]*$/.test(v.replace(/ /g,'').replace(/-/g,'').replace(/\+/,'00'));}	},
	'validate-alphanumeric'	: {message : 'Gebruik AUB alleen getallen en letters'	, functie : function(v){return /^[\d|a-z|A-Z]*$/.test(v)}												},
	'validate-selected'		: {message : '{NAME} is niet ingevuld.'					, functie : function(v){return v != 0}																	},
	'validate-isnull'		: {message : '{NAME} mag niet 0 zijn.'					, functie : function(v){return !/^(0((,|\.)(00|-))?)?$/.test(v)}}
};

var advanced_validators = {
	'validate-equals'	: {message : '{NAME} komt niet overeen'			, regExp : /validate-equals-(.*)/ 	, functie : function(v,p){return v == $('#' + p).val();}},
	'validate-length'	: {message : '{NAME} is te lang'				, regExp : /validate-length-(.*)/	, functie : function(v,p){return v.length <= p;}		}
};

/**
 * Wachtwoord kwaliteit check
 */
function onChangePassword(){
	var password = $('#UserVO_password').val();
	
	//length of the password
	var pwlength=(password.length);
	if (pwlength>8)
		pwlength=8;

	//numbers in the password
	var numnumeric = password.replace (/[0-9]/g, "");
	var numeric=(password.length - numnumeric.length);
	if (numeric>3)
		numeric=3;

	//symbols in the password
	var numsymbols = password.replace (/(\W|_)/g, "");
	var symbols=(password.length - numsymbols.length);
	if (symbols>3)
	symbols=3;

	//uppercase in the password
	var numupper = password.replace (/[A-Z]/g, "");
	var upper=(password.length - numupper.length);
	if (upper>3)
		upper=3;

	var pwstrength = ((pwlength*5)-10) + (numeric*10) + (symbols*20) + (upper*9);
	if(pwstrength < 0){
		pwstrength = 0;
	}else if(pwstrength > 100){
		pwstrength = 100;
	}
	
	if(pwlength == 0){
		$('#password_quality').animate({width : 0},100);
		
		$('#password_quality_text').html('');
	}else{
		var red = 22 - Math.floor(pwstrength * 15 / 100);
		if(red > 15){
			red = 15;
		}
		red = red.toString(16);
		var green = Math.floor(pwstrength * 15 / 100).toString(16);
		var color = '#' + red + green + '0';
		$('#password_quality').animate({width : pwstrength},100);
		$('#password_quality').css('backgroundColor',color);
		
		if(pwstrength <= 33){
			$('#password_quality_text').html('Matig');
		}else if(pwstrength == 100){
			$('#password_quality_text').html('Perfect');
		}else if(pwstrength >= 66){
			$('#password_quality_text').html('Goed');
		}else{
			$('#password_quality_text').html('Gemiddeld');
		}
	}
	
	return pwstrength;
}