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

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

    if( formname )
    {
        this.formname = formname;
    }
    $jQ.includeOnce('jquery-form.js');
}

 cValidator.prototype.set = function(name, value)
{
    this.config[name] = value;
}

cValidator.prototype.get = function(name)
{
    return this.config[name];
}

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

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


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

cValidator.prototype.getField = function(name)
{
	var e_field=$jQ('#'+this.formname+' #'+name);
	if( e_field.length == 0 ) return '';	
	return e_field[0];
}
cValidator.prototype.getFieldValue = function(e_field)
{
	return Trim($jQ(e_field).fieldValue()[0]);	
}

/**
* @desc Valide un champs sur le submit d'un formulaire.
*/
cValidator.prototype.validateField = function(v, type, error)
{
        var is_error = false;
          
		var e_field=this.getField(v['name']);
		if( !e_field ) return;
        
        var value = this.getFieldValue(e_field);

        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'];
                        var e_field_country=this.getField(field_country);
						if( e_field_country )
						{
	                        switch( this.getFieldValue(e_field_country) )
	                        {
	                            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'];
                    var e_field_country=this.getField(field_country);
					if( e_field_country )
					{
                        switch( this.getFieldValue(e_field_country) )
	                    {
	                        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.getFieldValue(e_field_country) == '32' )
	                        {
	                            value = value.toUpperCase();
	                            value = value.substr(0,3) + ' ' + value.substr(value.length-3,3);
	                            $jQ(e_field).val(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 en erreir.
        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
            {
            	var is_there=false;
            	for( var i = 0;i < this.msg_error.length;i++ )
            	{
            		if(this.msg_error[i]==error)
            		{
            			is_there = true;
            		}
            	}
                if( !is_there )
                {
                    this.msg_error.push(error);
                }
                this.err_flds[v['name']] = 'formfield_error';
            }
        }
        else
        {
        	$jQ(e_field).removeClass('formfield_error');            
        }
}

/**
* @desc Affiche les message d'erreur.
*/
cValidator.prototype.showErrorMessages = function()
{
    if( $jQ('#div_'+this.formname+'_msg_error').length )
    {
        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>";
        }
        $jQ('#div_'+this.formname+'_msg_error').html(html);
        $jQ('#div_'+this.formname+'_msg_error').scrollIntoView();

        pwAdjustIFrame();
    }
}

/**
* @desc Ajoute la class d'erreur au champs du formulaire.
*/
cValidator.prototype.addErrorClass = function()
{
	var e_field;
    for( var i in this.err_flds )
    {
        //$($(this.formname).elements[i]).addClass(this.err_flds[i]);
        e_field=this.getField(i);
        if(e_field) $jQ(e_field).addClass(this.err_flds[i]);
    }
}

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

/**
* @desc Exécution sur l'envoie du formulaire.
*/
cValidator.prototype.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;
}
