
 /** <description>Class javascript qui effectue les tests de saisies de formulaire</description>
 * <fullName>TestForm</fullName>
 * <author>Baptiste Benoit</author>
 * <version>1.0</version>
 * <type>class</type>
 */
var TestForm=Class.create()
TestForm.prototype = {
    /** <description>Constructeur</description>
    <fullName>TestForm.initialize</fullName>
    <param name="JSONParams">string id d'une balise qui contient toute les balises de formulaire à verifier</param>
    */
    initialize: function(JSONParams) {
    this.testType = ['IsEmpty', 'IsDate', 'IsNumber', 'IsSelected', 'IsMail', 'IsMailVerif', 'IsPwdVerif', 'IsSize', 'IsChecked']
        this.formu = document.body.getElementsByTagName('FORM')[0];
        this.groupe = JSONParams.groupe ? JSONParams.groupe : this.formu.id

        this.formu.onsubmit = JSONParams.onSubmit ? JSONParams.onSubmit : function() {
            if (window.isFormOk == true) {
                return true
            } else {
                window.isFormOk = true
                return false
            }
        } .bind(this);
        
        window.isFormOk = true

        this.useBlurEvent = JSONParams.useBlurEvent ? JSONParams.useBlurEvent : true
        this.className = JSONParams.className ? JSONParams.className : 'champcontact';
        this.errorClassName = JSONParams.errorClassName ? JSONParams.errorClassName : 'champerreur';

        if (JSONParams.button) {
                if (JSONParams.onClick) {
                    this.onClick = JSONParams.onClick
                    $(JSONParams.button).observe('click', function(e) {
                    window.isFormOk = this.testFormulaire();
                    if (window.isFormOk == true) { window.isFormOk = eval(this.onClick)(); } 
                } .bind(this))
            } else {
                $(JSONParams.button).observe('click', function(e) { window.isFormOk = this.testFormulaire(); } .bind(this))
            }
        }

        if (JSONParams.addTestType) {
            this.testType.concat(JSONParams.addTestType)
        }

        this.items = new TestFormItems(this)
        this.getItems()

    },

    /**<description>Recupere l'ensemble des controles necessitant un test</description>
    * <fullName>TestForm.getItems</fullName>
    * <type>property</type>
    */
    getItems: function() {
        for (var i = 0; i < this.testType.length; i++) {
            if (typeof eval(this.testType[i]) == 'function') {
                var t = $(this.groupe).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.groupe)
                    }
                }
            }
        }
    },

    /** <description>Test l'ensemble des champs de saisie du formulaire. </description>
    * <fullName>TestForm.testFormulaire</fullName>
    * <type>function</type>
    * <return>boolean : Retourne vrai si tout les champs sont ok</return>
    */
    testFormulaire: function() {
        var retour = true
        for (var i = 0; i < this.items.length; i++) {
            //  if ($(this.items[i].groupe).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
    },

    addItem: function(JSONitem, test, groupe) {
    var r = new TestFormItem(JSONitem, test, this.parent, groupe);
        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, groupe) {
        this.groupe = groupe
		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.idError) {
                var e = $(this.idError)
                e.update(this.msg)
                e.show()
            }
		}else{
			 if (this.idError) {
                var e = $(this.idError)
                e.update(msg)
                e.show()
			}
		}
		this.element.addClassName(this.errorClassName);
		this.element.removeClassName(this.className);
	},
	
	removeError:function(){
		if(this.idError){
		    var e = $(this.idError)
		    e.update('')
		    e.hide()
		}
		this.element.addClassName(this.className);
		this.element.removeClassName(this.errorClassName);
	}
	
}

	/*
	* <description>Cette function teste si un input est vide</description>
	* <fullName>TestForm.IsEmpty</fullName>
	* <author>Baptiste Benoit</author>
	* <type>function</type>
	* <param name="it">string id de l'element a verifier</param>
	* <return>Boolean</return>
	*/
	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 id=it.element
		var err='Adresse invalide';
		if (!IsEmpty(it)) {
			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;
			}
		}
	}

	function IsChecked(it) {
	
	    var id = it.element
	    var inp = $(it.groupe).getElementsByTagName('INPUT')
	    var ok = false;
	    for (var i = 0; i < inp.length; i++) {
	        if (inp[i].checked == true) {
	            ok = true;
	        }
	    }
	    if (ok == true) {
	        it.removeError()
	        return true;
	    } else {
	        it.addError('veuillez cochez au moins une case')
	        return false;
	    }
	}
	
	
	/*
	* 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 pp = d.split("/")
	    var j = parseInt(pp[0], 10);
	    var m = parseInt(pp[1], 10);
	    var a = parseInt(pp[2], 10);

	    //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;
	}
