// JavaScript Document
/* class Verif_form v1.04
* params:
* - form = le formulaire
* - msg =  le message d'erreur par defaut
* methodes:
* - add_object(name,type,option,msg) = ajoute l'element "name" en verification, "type" est le type de v&eacute;rif &agrave; effectuer, "option" les options de verif, "msg" le message d'alerte personalis&eacute;
Types de v&eacute;rifications existants:

"vide" : teste si le champ est vide
options: aucune

"string" : test sur des champs de caract&egrave;res
options:
"long:valeur" - la chaine doit comporter au mini la longueur = &agrave; valeur
"max:valeur" - la chaine doit comporter au maxi la valeur = &agrave; valeur

"mail" : teste si un mail est valide
options: aucune

"num" : teste si c'est un nombre
options:
"min:valeur" - le nombre doit etre au mini = a valeur
"max:valeur" - le nombre doit etre au max = a valeur
"long:valeur" - le nombre doit comporter au mini la longueur = &agrave; valeur

"value" : comparaison de valeurs
options:
"egal:valeur" - erreur si egal a valeur
"diff:valeur" - erreur si diff&eacute;rent de valeur

"checkbox" : teste si un checkbox est coch&eacute;
options: aucune

"group_check" : teste si au moins un checkbox parmis le tableau pass&eacute; en option est coch&eacute;;
options: la liste des checkbox a v&eacute;rifier
note: le param nom doit etre vide

"group" : teste si un radio d'un group est coch&eacute;
options: aucune

"regexp" : teste une expression reguli&egrave;re
options: l'expression
exemple:
var reg = '^[a-zA-Z0-9]{3,8}$/g';
vf.add_object("reg","regexp",reg,null);
l'option de l'expression est pass&eacute;e apr&egrave;s le dollar(comme "$g")
quelques expressions sont int&eacute;gr&eacute;es comme:
code_postal = exige 64200
date = exige 12/1259
full_date = exige 01/12/1598
pour les utiliser :
vf.add_object("reg","regexp",vf.code_postal,null); 
* - colore (oldcolor,newcolor) = affecte les propriet&eacute;s de changement de couleur
* - control() = controle le formulaire, retourne un boleen
* propri&eacute;t&eacute;s:
* - color = la couleur de coloration des champs v&eacute;rifi&eacute;s
*/
//-- constructeur
function Verif_form (form,msg){
	//----------------- private properties
    this.form = form;// le formulaire cible
	this.msg = msg;
    this.arr_obj = new Array();// array des objet a verifier
	this.colored; // booleen, colore les champs v&eacute;rifi&eacute;s si true
	this.new_color; // la couleur de coloration des champs v&eacute;rifi&eacute;s
	this.old_color; // la couleur de coloration des champs d'origine
	this.new_col; // la couleur de coloration du texte des champs v&eacute;rifi&eacute;s
	this.old_col; // la couleur de coloration du texte des champs d'origine
	//----------------- public properties
	this.code_postal = "^([0-9]{2})[ ]?([0-9]{3})$";// 64200 ou 64 200
	this.date = "^([0-9]{2})+([/]{1})+([0-9]{4})$";// date 02/2005
	this.full_date = "^([0-9]{2})+([/]{1})+([0-9]{2})+([/]{1})+([0-9]{4})$";// date 01/02/2005
	this.tel_fr = "^([0-9]{2})[ ]?([0-9]{2})[ ]?([0-9]{2})[ ]?([0-9]{2})[ ]?([0-9]{2})$";// tel 05 59 03 21 97 ou 0559032197
}
//-----------------------------------------------
//----------------------------------------------- public methods
//-----------------------------------------------
//-- ajoute un objet du form en ecoute
Verif_form.prototype.add_object = function(name,type,option,msg){
	if(this.form.elements[name] || option!=null){
		var nb = this.arr_obj.length;
		this.arr_obj[nb] = new Array();
		this.arr_obj[nb]["name"] = name;// nom de l'objet
		this.arr_obj[nb]["type"] = type;// type de verif
		this.arr_obj[nb]["option"] = (option!=null)?option:null;// options
		this.arr_obj[nb]["msg"] = (msg!=null)?msg:null;// message d'alertes
	}
}
//-- appel du controle du formulaire
Verif_form.prototype.control = function(){
	var nb = this.arr_obj.length;// nombre d'objets a v&eacute;rifier
	for (var i =0;i<nb ; i++){
		switch (this.arr_obj[i]["type"]){
			case "mail"://--------------------------------- verif mail
				if(this.is_mail(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;
			case "regexp"://--------------------------------- verif expressions reguli&egrave;res
				if(this.is_regexp(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;
			case "vide": //------------------------------ verif champ vide
				if(this.is_vide(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;
			case "string": //------------------------------ verif chaine de caract&egrave;res
				if(this.is_string(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;
			case "value": //------------------------------ verif chaine de caract&egrave;res
				if(this.is_value(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;
			case "num": //------------------------------- verif nombre
				if(this.is_num(i,this.form[this.arr_obj[i]["name"]].value))return false;
			break;

			case "checkbox": //------------------------------- verif checkbox
				if(this.is_checkbox(i))return false;
			break;
			case "group_check": //------------------------------- verif groupe checkbox
				if(this.is_group_check(i))return false;
			break;
			case "group": //------------------------------- verif groupe radio
				if(this.is_group(i))return false;
			break;
		}
		this.setColor(i,false);
	}
	return true;
}
//-- affecte les propriet&eacute;s de changement de couleur
Verif_form.prototype.colore = function(oldcolor,newcolor){
	this.colored = true; // booleen, colore les champs v&eacute;rifi&eacute;s si true
	this.new_color = newcolor; // la couleur de coloration des champs v&eacute;rifi&eacute;s
	this.old_color = oldcolor; // la couleur de coloration des champs d'origine
}


Verif_form.prototype.colorText = function(oldcol,newcol){
	//this.colored = true; // booleen, colore les champs v&eacute;rifi&eacute;s si true
	this.new_col = newcol; // la couleur de coloration texte des champs v&eacute;rifi&eacute;s
	this.old_col = oldcol; // la couleur de coloration texte des champs d'origine
}


//-----------------------------------------------
//----------------------------------------------- private methods
//-----------------------------------------------
//-- gestion des expressions reguli&egrave;res
Verif_form.prototype.is_regexp = function(i,value){
	var option = this.arr_obj[i]["option"];
	if(option!= null){// si il y a une option
	var op = option.split("$");
		if(!this.testreg(op[0]+"$",op[1],value)){
			this.is_false (i);
			return true;
		}
	}
}
//-- test expression reguli&egrave;res
Verif_form.prototype.testreg = function(ex,op,value){
	var exp=new RegExp(ex,op);
	return (exp.test(value))?true:false;
}
//-- gestion des caract&egrave;res
Verif_form.prototype.is_string = function(i,value){
	var option = this.arr_obj[i]["option"];
	if(option!= null){// si il y a une option
		var op = option.split(":");
		switch(op[0]){
			case "long":// longueur de chaine
				if(value.length < Number(op[1])){
					this.is_false (i);
					return true;
				}
			break;
			case "max":// longueur de chaine max
				if(value.length > Number(op[1])){
					this.is_false (i);
					return true;
				}
			break;
		}// end switch
	}
}
//-- gestion des valeurs compar&eacute;es
Verif_form.prototype.is_value = function(i,value){
	var option = this.arr_obj[i]["option"];
	if(option!= null){// si il y a une option
		var op = option.split(":");
		switch(op[0]){
			case "egal":// egalit&eacute; de valeur
				if(value == op[1]){
					this.is_false (i);
					return true;
				}
			break;
			case "diff":// diff&eacute;rence de valeur
				if(value != op[1]){
					this.is_false (i);
					return true;
				}
			break;
		}// end switch
	}
}
//-- gestion des nombres
Verif_form.prototype.is_num = function(i,value){
	var option = this.arr_obj[i]["option"];
	if (isNaN(value) || value==""){// si ce n'est pas un nombre
		this.is_false (i);
		return true;
	}
	if(option!= null){// si il y a une option
		var op = option.split(":");
		switch(op[0]){
			case "long":// longueur de chaine
				if(!this.testreg("^[0-9]{"+Number(op[1])+",}$","",value)){
					this.is_false (i);
					return true;
				}
			break;
			case "min":// nombre mini
				if(value < Number(op[1])){
					this.is_false (i);
					return true;
				}
			break;
			case "max":// nombre max
				if(value > Number(op[1])){
					this.is_false (i);
					return true;
				}
			break;
		}// end switch
	}
}
//-- gestion des groupes radio
Verif_form.prototype.is_group = function(i){
	var group = this.form[this.arr_obj[i]["name"]];

	var l = group.length;
   var sel=0;
   for (var a=0;a<l;a++){
      if(group[a].checked==true)sel =1;
   }
   if(sel==0){
    this.is_false (i);
		return true;
   }
}
//-- gestion des checkbox
Verif_form.prototype.is_checkbox = function(i){
	if (!this.form[this.arr_obj[i]["name"]].checked){
		this.is_false (i);
		return true;
	}
}
//-- gestion des groupes de checkbox
Verif_form.prototype.is_group_check = function(i){
	var group = this.arr_obj[i]["option"];
	var l = group.length;
   var sel=0;
   for (var a=0;a<l;a++){
      if(this.form[group[a]].checked==true)sel =1;
   }
    if(sel==0){
    this.is_false (i);
		return true;
   }
}
//-- gestion des mail
Verif_form.prototype.is_mail = function(i,value){
	if (!this.testreg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$","",value)){
			this.is_false (i);
			return true;
	}
}
//-- gestion des champs vide 
Verif_form.prototype.is_vide = function(i,value){
	value=value.replace(/(^\s*)|(\s*$)/g,''); 
	
	if (value==""){
			this.is_false (i);
			return true;
	}
}
//-- gestion des erreurs
Verif_form.prototype.is_false = function(i){
	this.setColor(i,true);
	(this.arr_obj[i]["msg"]!=null)?alert (this.arr_obj[i]["msg"]):alert (this.msg);
}
//-- gestion des couleur des champs
Verif_form.prototype.setColor = function(i,etat){
	if(this.colored && this.arr_obj[i]["type"]!="group" && this.arr_obj[i]["type"]!="group_check"){// si l'on doit colorer
		this.form[this.arr_obj[i]["name"]].style.backgroundColor = (etat)?this.new_color:this.old_color;
		this.form[this.arr_obj[i]["name"]].style.color = (etat)?this.new_col:this.old_col;
		(etat)?this.form[this.arr_obj[i]["name"]].focus():false;
	}
}

