/* Struct of validator functions */
ENS.Validators = {};

ENS.Validators["required"] = function(value, element){
	var el = ENS.$(element);
	var ok = false;
	switch(el.tagName.toLowerCase()){
		case "input":
			switch(el.type){
				case "radio":
				case "checkbox":
					var name = el.name;
					var frm = ENS.getParentByTagName(el, "form");
					for(var i=0;i<frm[name].length;i++){
						if(frm[name][i].checked){
							ok = true;
							break;
						}
					}
					break;
				default:
					ok = (value!="");
			}
			break;
		case "select":
		case "textarea":
			ok = (value!="");
			break;
	}
	return ok;
};

ENS.Validators["rekeningnummer"] = function(value, element){
	if(value=="") return true;
	var value=parseInt(value.replace(/\D/, ""));
	var ok = false;
	if(value<Math.pow(10,9)){
		if(value>=Math.pow(10,8)){
			var s=0,i,n=10,value=value.toString().split("");
			while(i=value.shift()){s+=i*(--n);}
			ok = (s%11==0);
		}
		if(value<=(9.7*Math.pow(10,6)) && value>=Math.pow(10,1)) ok = true; // geldig gironummer
	}
	return ok;
};

ENS.Validators["email"] = function(value, element){
	if(value=="") return true; // empty values should be handled by the required validator
	
	var isValidEmail = function (mail_address){
		// check if the address contains a " "
		if(mail_address.indexOf(' ')!=-1) return false;
		
		// check if the address contains only 1 "@"
		mail_address = mail_address.split('@');
		if(mail_address.length!=2) return false;
		
		// Init vars for reading purposes
		var firstPart,lastPart;
		firstPart = mail_address[0];
		lastPart = mail_address[1];
		
		// check if both parts of the mail-address contain only valid characters 
		// and also if the '@' is not the first or the last char in the address
		if(!stringCheck(firstPart) || !stringCheck(lastPart)) return false;
		
		// check if the last part of the address contains a "."
		lastPart = lastPart.split('.');
		if(lastPart.length<2) return false;
		
		// check if the address doesn't contain ".." and check extension
		for(var i=0;i<lastPart.length;i++){
			// check for ".."
			if(lastPart[i].length==0) return false;
			// check extension
			if(i==lastPart.length-1 && !extensionCheck(lastPart[i])) return false;
		}
		
		// check if the first part of the address doesn't contain ".."
		firstPart = firstPart.split('.');
		for(var i=0;i<firstPart.length;i++){
			if(firstPart[i].length==0) return false;
		}
		
		return true;
	}
	
	var stringCheck = function (mailpart){
		// A zero-length string indicates that the @ is the first or the last character in the given email-address
		if(mailpart.length==0) return false;
		
		// check on the chars used in the address
		var validChars = "@abcdefghijklmnopqrstuvwxyz0123456789.-+_";
		for(var i=0;i<mailpart.length;i++){
			if(validChars.indexOf(mailpart.charAt(i).toLowerCase())==-1) return false;
		}
		
		return true;
	}
	
	var extensionCheck = function (extension){
		var validExtensions = new Array('com','org','int','gov','edu','net','info','biz','aero','coop','mil','museum','net','ac','ad','ae','af','ag','ai','al','am','an','ao','aq','ar','as','at','au','aw','az','ba','bb','bd','be','bf','bg','bh','bi','bj','bm','bn','bo','br','bs','bt','bv','bw','by','bz','ca','cc','cd','cf','cg','ch','ci','ck','cl','cm','cn','co','cr','cu','cv','cx','cy','cz','de','dj','dk','dm','do','dz','ec','ee','eg','eh','er','es','et','eu','fi','fj','fk','fm','fo','fr','ga','gd','ge','gf','gg','gh','gi','gl','gm','gn','gp','gq','gr','gs','gt','gu','gw','gy','hk','hm','hn','hr','ht','hu','id','ie','il','im','in','io','iq','ir','is','it','je','jm','jo','jp','ke','kg','kh','ki','km','kn','kp','kr','kw','ky','kz','la','lb','lc','li','lk','lr','ls','lt','lu','lv','ly','ma','mc','md','mg','mh','mk','ml','mm','mn','mo','mp','mq','mr','ms','mt','mu','mv','mw','mx','my','mz','na','nc','ne','nf','ng','ni','nl','no','np','nr','nu','nz','om','pa','pe','pf','pg','ph','pk','pl','pm','pn','pr','ps','pt','pw','py','qa','re','ro','ru','rw','sa','sb','sc','sd','se','sg','sh','si','sj','sk','sl','sm','sn','so','sr','st','sv','sy','sz','tc','td','tf','tg','th','tj','tk','tm','tn','to','tp','tr','tt','tv','tw','tz','ua','ug','uk','um','us','uy','uz','va','vc','ve','vg','vi','vn','vu','wf','ws','ye','yt','yu','za','zm','zr','zw');
		for(var i=0;i<validExtensions.length;i++){
			if(validExtensions[i]==extension) return true;
		}
		return false;
	}
	
	return isValidEmail(value);
}


ENS.Validators["number"] = function(value, element) {
	if(value=="") return true;
	var parsedvalue = parseInt(value.replace(/\D/, ""));
	return (parsedvalue==value);
}

ENS.Validators["amount"] = function(value, element) {
	if(value=="") return true;
	var value = value.split(",").join(".");
	var test = value.split(".");
	if(test.length>2) return false;
	var parsedvalue = parseInt(test[0].replace(/\D/, ""));
	if(test[0]!=parsedvalue) return false;
	if(test.length>1){
		var parsedvalue = parseInt(test[1].replace(/\D/, ""));
		if(test[1]!=parsedvalue || test[1].length>2) return false;
	} 
	// element.value = value;
	return true;
}

ENS.Validators["zip"] = function(value, element) {
	if(value=="") return true;
	var land = ENS.$("land");
	if(!land || land.value=='NL'){
		var parsedvalue = value.replace(/\s/g, "").toUpperCase();
		var _postcode = /[1-9]{1}[0-9]{3}[a-z]{2}/i;
		if(_postcode.test(parsedvalue)){
			element.value = parsedvalue;
			return true;
		}
		return false;
	}
	return true;
}

ENS.Validators["date"] = function(value, element) {
	if(value=="") return true;
	var test = value.split("-");
	if(test.length!=3) return false;
	return ENS.isDate(test[2],test[1],test[0]);
}

ENS.Validators["optiontext"] = function(value, element){
	var c = element.className.split(" "), check_element;
	for(var i=0,cl;i<c.length;i++){
		cl=c[i].split("option:");
		if(cl.length>1){
			check_element = ENS.$(cl[1]);
			if(check_element && check_element.checked && value==""){
				return false;
			}
		}
	}
	return true;
}

ENS.Validators["minimumcontributie"] = function(value, element){
	if(value=="") return true;
	var v = parseFloat(ENS.LSParseFloatValue(value));
	if(!v || v!=ENS.LSParseFloatValue(value)) return false;
	return ENS.compare(v,24.50) > -1;
}

ENS.Validators["minimumgift"] = function(value, element){
	if(value=="") return true;
	var v = parseFloat(ENS.LSParseFloatValue(value));
	if(!v || v!=ENS.LSParseFloatValue(value)) return false;
	return ENS.compare(v,1) > -1;
}

ENS.Validators["simpleminvaluecheck"] = function(value, element){
	if(value=="") return true;
	var v = parseFloat(ENS.LSParseFloatValue(value));
	if(!v || v!=ENS.LSParseFloatValue(value)) return false;
	
	var chk = ENS.$(element.id+"_CHECKBEDRAG");
	var testval = parseFloat(chk.value);

	return ENS.compare(v,testval) > -1;
}

ENS.Validators["alpha"] = function (value, element){
	if(value=="") return true;
	var regexp = new RegExp("[a-zA-Z]+");
	return regexp.test(value);
}

ENS.Validators["nickname"] = function (value, element){
	if(value=="") return true;
	var regexp = new RegExp("^[a-zA-Z0-9*_@+]{4,15}$");
	return regexp.test(value);
}

ENS.Validators["telefoonnummer"] = function (value, element){
	if(value=="") return true;
	var regexp = new RegExp("^[0-9]{10}$");
	return regexp.test(value);
}

ENS.Validators["password"] = function (value, element){
	if(value=="") return true;
	var regexp = new RegExp("^[a-zA-Z0-9*_@+]{4,}$");
	return regexp.test(value);
}
