// Module de validation Javascript par PM.
function omValidator(){
	this.type = "alert";
	
	//RegEx preetablies :
	this.rules = new Object();
	this.rules.email = /^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z.]*[a-zA-Z]$/;
	this.rules.url = /^https?\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?$/;
	this.rules.phone = /^((\d{3}|\(\d{3}\))([ -]?))?(\d{3})([ -]?)(\d{4})$/;
	
	//est-ce que le champ est vide?
	this.Empty = function(errMsg,nmin,nmax){
		if(inp.value=="" || !this.vChars(nmin,nmax)) return this.msg(errMsg);
		return true;
	};
	
	//est-ce que c'est un chiffre?
	this.No = function(errMsg,obg,nmin,nmax){
		if(inp.value==""&&!obg) return true;
		if(isNaN(parseInt(inp.value)) || !this.vChars(nmin,nmax)) return this.msg(errMsg);
		return true;
	};
	
	//est-ce que c'est un nombre entre nmin et nmax?
	this.Nbr = function(errMsg,obg,nmin,nmax){
		if(inp.value==""&&!obg) return true;
		if(isNaN(parseFloat(inp.value)) || !(parseFloat(inp.value)>=nmin && parseFloat(inp.value)<=nmax)) return this.msg(errMsg);
		return true;
	};
	
	//est-ce que l'element match la RegEx?
	this.Reg = function(errMsg,obg,rule){
		if(inp.value==""&&!obg) return true;
		var check = this.rules[rule];
		if(!check) check = rule;
		var look = new RegExp(check);
		if(!look.test(inp.value)) return this.msg(errMsg);
		return true;
	};
	
	//valide le nombre de characteres
	this.vChars = function(nmin,nmax){
		if(nmin==-1 && nmax==-1) return true;
		if(nmin==-1 || nmax==-1){
			if(nmin==-1) if(inp.value.length<=nmax) return true;
			if(nmax==-1) if(inp.value.length>=nmin) return true;
		}
		if(inp.value.length>=nmin && inp.value.length<=nmax) return true;
		return false;
	};
	
	//trouve le span d'erreur et l'efface
	this.delSpan = function(){
		var childs = inp.parentNode.childNodes;
		for(c=0;c<childs.length;c++){
			if(childs[c].tagName=="SPAN") if(childs[c].className=="omError") inp.parentNode.removeChild(childs[c]);
		}

	};
	
	//fonction d'affichage de l'erreur
	this.msg = function(errMsg){
		if(this.type=="alert"){
			alert(errMsg);
			inp.select();
			if(inp.className.indexOf("omInvalid")==-1) inp.className += " omInvalid";
			return false
		}else if(this.type=="spans"){
			var mess = document.createElement('span');
			mess.className = "omError";
			mess.innerHTML = errMsg;
			this.delSpan();
			inp.parentNode.appendChild(mess);
			if(inp.className.indexOf("omInvalid")==-1) inp.className += " omInvalid";
		}
		
	};
	
	//fonction qui simule le click d'un input "submit" encapsule dans un lien
	this.sim = function(lnk){
		lnk.childNodes[0].click();
	}
	
	//fonction generale de validation et d'envoi du formulaire :
	//doit etre place dans le onsubmit du form ainsi : onsubmit="return omv.send(this);"
	this.send = function(form,errMsg){
		var err = false;
		var tags = new Array("INPUT","SELECT","TEXTAREA");
		for(i=0;i<tags.length;i++){
			var inputs = form.getElementsByTagName(tags[i]);
			for(j=0;j<inputs.length;j++){if(inputs[j].className.indexOf("omInvalid")>-1) inputs[j].className = inputs[j].className.replace("omInvalid","");}
			for(j=0;j<inputs.length;j++){
				inp = inputs[j];
				//le try s'assure que la fonction existe, si elle n'existe pas
				//il n'y aura simplement pas de validation
				try{iEval = eval(inp.accept);}catch(err){iEval = true;}
				
				if(this.type=="alert"){
					if(inp.accept) if(!iEval) return false;
					if(inp.className.indexOf("omInvalid")>-1) inp.className = inp.className.replace("omInvalid","");
				}else if(this.type=="spans"){
					if(inp.accept) if(!iEval){err=true;}else{this.delSpan();}
				}
			}
		}
		if(err){
			alert(errMsg);
			return false;
		}
		return true;
	};
}

var omv = new omValidator();