
 /** <P>Class javascript qui effectue les tests de saisies de formulaire</P>
 * @fullName	TestForm
 * @author	Baptiste Benoit
 * @version	1.0
 * @type	class
 */
var TestForm=Class.create()
TestForm.prototype = {
    /** Constructeur @fullName	TestForm.initialize @param	id	string id d'une balise qui contient toute les balises de formulaire à verifier*/
    initialize: function(JSONParams) {
        this.formu = document.body.getElementsByTagName('FORM')[0];
        //this.container = JSONParams.id ? $(JSONParams.id) : this.formu;
        this.container = JSONParams.id

        this.formu.onsubmit = JSONParams.onSubmit ? JSONParams.onSubmit : function() { return this.testFormulaire(); } .bind(this);
        this.useBlurEvent = JSONParams.useBlurEvent ? JSONParams.useBlurEvent : true

        this.testType = ['IsEmpty', 'IsDate', 'IsNumber', 'IsMail', 'IsSelected', 'IsMail', 'IsGoodLogin', 'IsGoodMail', 'IsMailVerif', 'IsPwdVerif', 'IsSize']
        this.className = JSONParams.className ? JSONParams.className : 'champcontact';
        this.errorClassName = JSONParams.errorClassName ? JSONParams.errorClassName : 'champerreur';

        if (JSONParams.button) {
            $(JSONParams.button).observe('click', function(e) { return this.testFormulaire(); } .bind(this))
        }
        this.items = new TestFormItems(this)
        this.getItems()

    },

    /** Recupere l'ensemble des controles necessitant un test
    * @fullName	TestForm.getItems
    * @type	sub
    */
    getItems: function() {
        for (var i = 0; i < this.testType.length; i++) {
            if (typeof eval(this.testType[i]) == 'function') {
   //             for (var z = 0; z < this.container.length; z++) {
                    var t = $(this.container).getElementsByClassName(this.testType[i])
                    if (t.length > 0) {
                        for (var y = 0; y < t.length; y++) {
                            var d = this.items.addItem(t[y], eval(this.testType[i]), this.container)
                        }
                    }
                }
     //       }
        }
    },

    /** Test l'ensemble des champs de saisie du formulaire. 
    * @fullName	TestForm.testFormulaire
    * @type	function
    * @return	boolean		Retourne vrai si tout les champs sont ok
    */
    testFormulaire: function() {
        var retour = true
        // for (var y = 0; y < this.container.length; y++) {

        for (var i = 0; i < this.items.length; i++) {
            if ($(this.items[i].cont).getStyle('display') != 'none') {
                if (!this.items[i].test(this.items[i])) { retour = false; }
            } else {
            this.items[i].removeError()
            }
        }
        if (this.onSubmit) { this.onSubmit(retour); }

        // }
        return retour
    }

}

var TestFormItems = Class.create()
TestFormItems.prototype = {
    initialize: function(parent) {
        var a = new Array()
        Object.extend(this, $A(a))
        this['push'] = a['push']
        this['length'] = a['length']
        this['indexOf'] = a['indexOf']
        this['splice'] = a['splice']
        if (parent) this.parent = parent
       /* if (JSONParams) {
            for (var i = 0; i < JSONParams.length; i++) {
                this.addLabel(JSONParams[i]);
            }
        }*/
    },

    addItem: function(JSONitem,test,cont) {
    var r = new TestFormItem(JSONitem, test, this.parent, cont);
        this.push(r);
        return r;
    },

    removeItem: function(la) {
        var i = this.getIndex(la);
        this.splice(i, 1);
    },

    getIndex: function(la) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] == la) { return i; }
        }
        return
    }

}
var TestFormItem=Class.create()
TestFormItem.prototype = {
	/** Constructeur @fullName	TestForm.initialize @param	id	string id d'une balise qui contient toute les balises de formulaire à verifier*/
        initialize: function(element, test, parent, cont) {
        this.cont=cont
		this.element=element;
		this.parent=parent
		this.test=test;
		this.className=this.element.getAttribute('className')?this.element.getAttribute('className'):this.parent.className;
		this.errorClassName=this.element.getAttribute('errorClassName')?this.element.getAttribute('errorClassName'):this.parent.errorClassName;
		if(this.element.getAttribute('idError')){
		    this.idError = this.element.getAttribute('idError')
		    $(this.idError).hide()
		}else{
		    this.idError=null;
		}
		this.msg= this.element.getAttribute('msg') ? this.element.getAttribute('msg'):null;
		if(this.parent.useBlurEvent){
			this.element.observe('blur',function(e){
				this.test(this)
			}.bind(this));
		}
	
	},
	
	addError:function(msg){
		if(this.msg){
			if(this.msg){
			    if (this.idError) {
			        var e = $(this.idError)
				    e.update(this.msg)
				    e.show()
				//	Effect.Appear(e,{duration: 0.2});
				}
			}
		}else{
			 if (this.idError) {
		            var e = $(this.idError)
		            e.update(msg)
		           e.show()
				//	 Effect.Appear(e,{duration: 0.2});
			}
		}
		this.element.addClassName(this.errorClassName);
		this.element.removeClassName(this.className);
	},
	
	removeError:function(){
		if(this.idError){
		    var e = $(this.idError)
		    e.update('')
		    e.hide()
		//	e.fade({duration: 0.2});
		}
		this.element.addClassName(this.className);
		this.element.removeClassName(this.errorClassName);
	}
	
	
}

	/**
	* Cette function teste si un input est vide
	* @fullName	IsEmpty
	* @author	Baptiste Benoit
	* @type		function
	* @param	it			string id de l'element a verifier
	* @return	Boolean 
	*/
	function IsEmpty(it){
		var id=it.element
		var err='Le champ est vide';
		if (!id.getValue()){
			it.addError(err)
			return false;
		}else{
			it.removeError()
			return true;
		}
	}

	/**
	* Cette function teste si la valeur d'un input est bien une adresse email valide
	* @fullName	IsMail
	* @author	Baptiste Benoit
	* @type		function
	* @param	id			string id de l'element a verifier
	* @param	idError		string Optionnel id de l'element ou sera afficher l'erreur
	* @param	msg			string Optionnel 'message d'erreur personalisé
	* @return	Boolean 
	*/
	function IsMail(it){
		//var idError=id.getAttribute('idError')?id.getAttribute('idError'):null;
		//var msg=id.getAttribute('msg')?id.getAttribute('msg'):null;
		var id=it.element
		var err='Adresse invalide';

		if (!IsEmpty(it)) {
			//it.addError(err)
			return false;
		}else{
			if(id.getValue().search(/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/) == -1){
				it.addError(err)
				return false;
			}else{
				it.removeError()
				return true;
			}
		}
	}
	
	/**
	* Cette function teste si la valeur d'un input est bien un nombre
	* @fullName	IsNumber
	* @author	Baptiste Benoit
	* @type		function
	* @param	id			string id de l'element a verifier
	* @return	Boolean 
	*/
	function IsNumber(it){
		var id=it.element
        
		if (!IsEmpty(it)) {
			return false;
		}else{
			if((isNaN(id.getValue()))){
				it.addError('Ceci n\'est pas un nombre')
				return false;
			}else{
				it.removeError()
				return true;
			}
		}
	}

    function IsSize(it){
        var id=it.element
        var l=parseInt(it.element.getAttribute('minSize'))
        if (!IsEmpty(it)) {
			return false;
		}else{
			if(id.getValue().toString().length<l){
				it.addError('Ce champs doit faire au moins '+l+' caract&egrave;res')
				return false;
			}else{
				it.removeError()
				return true;
			}
		}
    }
    
	function IsMailVerif(it) {
	    var v=$(it.element.getAttribute('idMail'))
	    if (!IsEmpty(it)) {
	        return false;
	    } else {
	        if(!IsMail(it)){
	            return false;
	        }else{
	            if(v.getValue()!=it.element.getValue()){
	                it.addError('La confimation de l\'email est diff&eacute;rente')
	                return false;
	            }else {
	                it.removeError()
	                return true;
	            }
	        }
	        

	}}

	function IsPwdVerif(it) {
	    var v = $(it.element.getAttribute('idPwd'))
	    if (!IsEmpty(it)) {
	        return false;
	    } else {
	        if (!IsSize(it)) {
	            return false;
	        } else {
	            if (v.getValue() != it.element.getValue()) {
	                it.addError('La confimation du mot de passe est diff&eacute;rente')
	                return false;
	            } else {
	                it.removeError()
	                return true;
	            }
	        }
	    }
	}
	/**
	* Cette function teste si une valeur d'une balise de type select a été selectionnez (getValue() different de 0)
	* @fullName	IsSelected
	* @author	Baptiste Benoit
	* @type		function
	* @param	id			string id de l'element a verifier
	* @return	Boolean 
	*/
	function IsSelected(it) {
		var id=it.element
		var err='Veuillez s&eacute;lectionner une valeur';
		if (!id.getValue()) {
			it.addError(err)
			return false;
		}
		else {
			if (id.getValue() == '0') {
				it.addError(err)
				return false;
			} else {
				it.removeError()
				return true;
			}
		}
	}
	
	/**
	* Cette function teste si la valeur d'un input est bien une date valide
	* @fullName	IsDate
	* @author	Baptiste Benoit
	* @type		function
	* @param	id			string id de l'element a verifier
	* @return	Boolean 
	*/
	function IsDate(it) {
		var id=it.element
		var d=id.getValue()
		var amin=1900; // année mini
		var amax=2008; // année maxi
		var separateur="/"; // separateur entre jour/mois/annee
		var j=parseInt((d.substring(0,2)));
  		var m=parseInt((d.substring(3,5)));
  		var a=parseInt((d.substring(6)));
		//it.removeError()
		var ok=true;
		it.removeError('&nbsp;')
		id.removeClassName(it.errorClassName);
		id.addClassName(it.className);
		if(((isNaN(j+''))||(j<1)||(j>31)) && (ok==true)){
			it.addError('La date n\'est pas correcte.')
			ok = false;
			return ok;
		}
		if(((isNaN(m+''))||(m<1)||(m>12)) && (ok==true)){
			it.addError('Le mois n\'est pas correct.')
			ok = false;
			return ok;
		}
		if(((isNaN(a+''))||(a<amin)||(a>amax)) && (ok==true)){
		    it.addError('L\'ann&eacute;e n\'est pas correcte.')
			ok = false;
			return ok;
		}
		if(((d.substring(2,3)!=separateur)||(d.substring(5,6)!=separateur)) && (ok==true)){
			it.addError("Les s&eacute;parateurs doivent &ecirc;tre des "+separateur)
			ok = false;
			return ok;
		}
		if (ok==true) {
			 var d2=new Date(a,m-1,j);
			 j2=d2.getDate();
			 m2=d2.getMonth()+1;
			 a2=d2.getFullYear();
			 if (a2<=100){a2=1900+a2}
			 if ( (j!=j2)||(m!=m2)||(a!=a2) ) {
			 	it.addError('La date '+d+' n\'existe pas !')
			 	ok = false;
			 	return ok;
			 }
		  }
		  return ok;
    }

    function IsGoodLogin(it) {
        var id = it.element
        var retour=true
        if (!IsEmpty(it)) {
            retour=false;
        } else {
            var a = new Ajax.Request('AJAXInscription.ajax', {
                method: 'POST',
                asynchronous:false,
                postBody: 'pseudo=' + id.getValue(),
                onComplete: function(transport) {
                    var rsp = transport.responseJSON;
                    if (rsp.result == true) {
                        it.removeError()
                    } else {
                        it.addError('Ce login existe dej&agrave;')
                        retour=false;
                    }
                }
            });
        }
        return retour
    }

    function IsGoodMail(it) {
        var id = it.element
        var retour = true
        if (!IsMail(it)) {
            retour = false;
        } else {
       
            var a = new Ajax.Request('AJAXInscription.ajax', {
                method: 'POST',
                asynchronous: false,
                postBody: 'mail=' + id.getValue(),
                onComplete: function(transport) {
                    var rsp = transport.responseJSON;
                    if (rsp.result == true) {
                        it.removeError()
                    } else {
                        it.addError('Ce mail existe dej&agrave;')
                        retour = false;
                    }
                }
            });
        }
        return retour
    }
