/**
 @desc Classe de validation de champs formulaire Javascript
 @author PenseWeb.com
 @version GF, 2008-04-18
*/

var cValidator = new Class(
{
    initialize : function(formname)
    {
        this.alert_mode = false;
        this.msg_error = new Array();
        this.err_flds = new Object();
        this.config = new Object();

        if( formname )
        {
            this.formname = formname;
        }
    },

    set: function(name, value)
    {
        this.config[name] = value;
    },
    get: function(name)
    {
        return this.config[name];
    },

    // Met / enlève la validation en mode alert.
    isAlert: function(alert_mode)
    {
        if( typeof alert_mode == 'undefined' ) alert_mode = false;
        this.alert_mode = is_alert;
    },

    // Remet à zéro l'objet de validation.
    reset: function()
    {
        this.msg_error = new Array();
        this.err_flds = new Object();
    },


	  // retourne true ou false si la variable est numerique
		is_numeric: function(mixed_var) 
		{
	    if (mixed_var === '') {
	        return false;
	    }
	    return !isNaN(mixed_var * 1);
		},

    /**
    * @desc Valide un champs sur le submit d'un formulaire.
    */
    validateField: function(v, type, error)
    {
	        var is_error = false;

	        $($(this.formname).elements[v['name']]);

	        if ( !($(this.formname).elements[v['name']].id ))
	        {
	        		return;
	        }
        
	        var value = Trim($(this.formname).elements[v['name']].value);
	
	        if( type == 'mandatory' )
	        {
	            if( value == "" || value.length == 0 )
	            {
	                is_error = true;
	            }
	        }

	        else if( type == 'not_zero' )
	        {
							var decvalue = value.replace (',', '.');		// tester aussi le zero sur les decimaux	
	            if( value == "" || value.length == 0 || (this.is_numeric(decvalue) && (decvalue * 1) == 0))
	            {
	                is_error = true;
	            }
	        }

	        else if( value != '' )
	        {
	            switch(type)
	            {
	                case 'phone':
	                {
	                    // Validation selon le pays.
	                    var reg;
	                    if( this.formname )
	                    {
	                        var field_country = 'fkcountries';
	                        if( error['field_country'] ) field_country = error['field_country'];
							if( $(this.formname).elements[field_country] )
							{
		                        switch( $(this.formname).elements[field_country].value )
		                        {
		                            case '32': //Canada
		                            case '183': //Etats-Unies
		                                reg = /^\d?[\-\s]?\(?\d{3}\)?[\-\s]?\d{3}[\-\s]?\d{4}\s?([\s\-\#]?\d{1,5})?$/;
		                                break;
		                            case '61':
		                                 //reg = /^\d?[\-\s]?[\d{2}[\-\s\.]]{5}$/;
		                                   // break;
		                            default:
		                                break;
		                        }
							}
	                        if( reg )
	                        {
	                            if( !reg.exec(value) )
	                            {
	                                is_error = true;
	                            }
	                        }
	                    }
	                }
	                break;
	                case 'email':
	                {
	                    reg = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/i;
	                    if( !reg.exec(value) )
	                    {
	                        is_error = true;
	                    }
	                }
	                break;
	                case 'postalcode':
	                {
	                    // Validation selon le pays.
	                    var field_country = 'fkcountries';
	                    if( error['field_country'] ) field_country = error['field_country'];
						if( $(this.formname).elements[field_country] )
						{
		                    switch( $(this.formname).elements[field_country].value )
		                    {
		                        case '32' : // Canada
		                            reg = /^([a-z]\d[a-z]\s*\d[a-z]\d)$/i;
		                            //reg = /^([a-z]\d){3}$/i;
		                            break;
		                        case '61': // France
		                        	reg = /^\d{4,10}$/;
		                        	break;
		                        case '183': // États-Unis
		                            reg = /^\d{5}$|^\d{5}-\d{4}$/;
		                            break;
		                        default:
		                            reg = /^.{0,10}$/;
		                            break;
		                    }
	
		                    if( reg.exec(value) )
		                    {
		                        //Formatage du code postal.
		                        if( $(this.formname).elements[field_country].value == '32' )
		                        {
		                            value = value.toUpperCase();
		                            value = value.substr(0,3) + ' ' + value.substr(value.length-3,3);
		                            $(v['name']).value = value;
		                        }
		                    }
		                    else
		                    {
		                        is_error = true;
		                    }
						}
	                }
	                break;
	                case 'minlength':
	                {
	                    var min = error;
	                    if( typeof(error) == 'object' ) min = error['min'];
	                    if( value.length < min )
	                    {
	                        is_error = true;
	                    }
	                }
	                break;
	                case 'maxlength':
	                {
	                    var max = error;
	                    if( typeof(error) == 'object' ) max = error['max'];
	                    if( value.length > max )
	                    {
	                        is_error = true;
	                    }
	                }
	                break;
	                case 'length':
	                {
	                    if( typeof error == 'object' )
	                    {
	                        var min = error['min'];
	                        var max = error['max'];
	                    }
	                    else if( error.test(/-/) )
	                    {
	                        var a = error.split(/-/);
	                        if( a[0] > a[1] )
	                        {
	                            var min = a[1];
	                            var max = a[0];
	                        }
	                        else
	                        {
	                            var min = a[0];
	                            var max = a[1];
	                        }
	                    }
	
	                    if( value.length < min ||  value.length > max )
	                    {
	                        is_error = true;
	                    }
	                }
	                break;
	                // La valeur doit être numeric ( integer ).
	                case 'numeric':
	                {
						var reg = /^[\-?0-9]+$/;
	                    if( !reg.exec(value) )
	                    {
	                        is_error = true;
	                    }
		                if ( !is_error )
						{
							if( typeof error == 'object' )
		                    {
		                        var min = error['min'];
		                        var max = error['max'];
		                    }
		                    else if( error.test(/-/) )
		                    {
		                        var a = error.split(/-/);
		                        if( a[0] > a[1] )
		                        {
		                            var min = a[1];
		                            var max = a[0];
		                        }
		                        else
		                        {
		                            var min = a[0];
		                            var max = a[1];
		                        }
		                    }
		
		                    if( value < min ||  value > max )
		                    {
		                        is_error = true;
		                    }
						}
	                }
	                break;
	
	                // La valeur doit être décimal / numeric.
	                case 'decimal':
	                case 'double':				// EDL
	                {
	                	value.replace(/,/, ".");
	                    //var reg = /^[0-9]+(\,|\.)?[0-9]?$/;	                    
	                    var reg = /^[\-?0-9]+(\,|\.)?[0-9]{0,}?$/;		// EDL
	                    if( !reg.exec(value) )
	                    {
	                        is_error = true;
	                    }
		                if ( !is_error )
						{							
							if( typeof error == 'object' )
		                    {
		                        var min = error['min'];
		                        var max = error['max'];
		                    }
		                    else if( error.test(/-/) )
		                    {
		                        var a = error.split(/-/);
		                        if( a[0] > a[1] )
		                        {
		                            var min = a[1];
		                            var max = a[0];
		                        }
		                        else
		                        {
		                            var min = a[0];
		                            var max = a[1];
		                        }
		                    }
		
		                    if( value < min ||  value > max )
		                    {
		                        is_error = true;
		                    }
						}
	                }
									break;
									// EDL
	                // La valeur doit être boolean.
	                case 'boolean':
	                {
	                    var reg = /^(1|0|true|false)?$/;		// EDL TODO
	                    if( !reg.exec(value.toLowerCase()) )
	                    {
	                        is_error = true;
	                    }
	                }
									break;
	
	            }
	        }
	
	        // Si le champs est erronné.
	        if( is_error )
	        {
	            // Si l'erreur est un tableau.
	            if( typeof(error) == 'object' )
	            {
	                error = error['label'];
	            }
	            if( this.alert_mode == true )
	            {
	                alert(error);
	                // Met le champs comme premier a avoir une erreur afin de lui donner le focus.
	                if( !this.get('err_fld') ) this.set('err_fld', v['name']);
	            }
	            else
	            {
	                if( !this.msg_error.contains(error) )
	                {
	                    this.msg_error.push(error);
	                }
	                this.err_flds[v['name']] = 'formfield_error';
	            }
	        }
	        else
	        {
	            $(this.formname).elements[v['name']].removeClass('formfield_error');
	        }
    },

    /**
    * @desc Affiche les message d'erreur.
    */
    showErrorMessages: function()
    {
        if( $('div_'+this.formname+'_msg_error') )
        {
            var html = '';
            for( var i = 0;i < this.msg_error.length;i++ )
            {
                html+= this.msg_error[i]+'<br />';
            }
            if( html != '' )
            {
                html = "<p class='negativ'><b>"+html+"</b></p>";
            }
            $('div_'+this.formname+'_msg_error').innerHTML = html;

            pwAdjustIFrame();
        }
    },

    /**
    * @desc Ajoute la class d'erreur au champs du formulaire.
    */
    addErrorClass: function()
    {
        for( var i in this.err_flds )
        {
            $($(this.formname).elements[i]).addClass(this.err_flds[i]);
        }
    },

    /**
    * @desc Vérifie s'il y a eu des erreurs lors du submit du formulaire.
    */
    isError: function()
    {
        if( this.msg_error.length > 0 )
        {
            return true;
        }
        return false;
    },

    /**
    * @desc Exécution sur l'envoie du formulaire.
    */
    onSubmitForm: function()
    {
        // Mode alert activé.
        if( this.isError() )
        {
            if( this.alert_mode == true )
            {
                // Donne le focus au premier champs a avoir une erreur.
                setTimeout('pwSetFocus("'+this.formname+'","'+  +'");', 1);
            }
            else
            {
                // Si un message d'erreur.
                this.showErrorMessages();

                // Ajoute les classe d'erreur sur les champs.
                this.addErrorClass();

                // Positionne l'écran sur les messages d'erreur.

                //new Fx.Scroll(window, {wait: false, duration: 0 }).toElement($('div_'+this.formname+'_msg_error'));
            }

            return false;
        }

        return true;
    }
});

function pwSetFocus(formname, elname)
{
    if( formname != '' && elname != ''  )
    {
    	try{
    	document.forms[formname].elements[elname].focus();
		}catch(e){}
    }
}
