vanilla.namespace('wisy');
wisy = 
{
    ENCODED_URL	    : null,
    
    /**
     * Renvoie une url formatée dans le contexte du site.
     * Cette méthode utilise la variable ENCODED_URL si elle est définie qui pointe sur la racine du site.
     * Elle en déduit alors le numéro de session (TODO) et les élements ajoutés devant l'url
     */
    toURL : function(value)
    {
	if ( !value || !this.ENCODED_URL )
	{
	    return value;
	}

	var prefix = '';
	var index = this.ENCODED_URL.lastIndexOf('/');
	if ( index > 0 )
	{
	    prefix = this.ENCODED_URL.substring(0, index);
	}

	if ( value.charAt(0) != '/' )
	{
	    value = '/' + value;
	}

	return (prefix + value);
    }
};

vanilla.namespace("wisy.localisation");
// la version javascript de la localisation n'accepte pas les
// formes plurielles, ni la notion de library
wisy.localisation =
{
    translations : new Array(),
    
    addTranslation : function(original, value)
    {
	this.translations[original] = value;
    },

    translate : function(original/*, parameters*/)
    {
	var t = this.translations[original];
	if ( !t ) 
	{
	    t = original;
	}

	for ( var i = 1	; i < arguments.length ; t = vanilla.text.replaceAll(t, "%1%", arguments[i++]) );

	return t;
    }
};

__  = function()
{
    return wisy.localisation.translate.apply(wisy.localisation, arguments);
}

vanilla.namespace('wisy.form');
wisy.form =
{
    // le prefix est optionnel
    _getField : function(form, f, prefix)
    {
	if ( typeof(f) == 'string' )
	{
	    f = form[prefix ? prefix + f : f];
	}

	return f;
    },

    _getFieldTitle : function(field)
    {
	return (field.title ? field.title : field.name);
    },

    checkMandatoryFields : function(form, mandatoryFields, prefix)
    {
	var emptyFields = [];
	var v, f;

	for ( var i = 0 ; i < mandatoryFields.length ; i++ )
	{
	    f = this._getField(form, mandatoryFields[i], prefix);
	    if ( !f )
	    {
		continue;
	    }

	    v = vanilla.html.Form.getFieldValue(f);
	    v = vanilla.text.trim(v);

	    if ( v == null || v.length == 0 )
	    {
		emptyFields.push(f);
		vanilla.html.DOM.addClassName(f, 'invalid');
	    }
	    else
	    {
		vanilla.html.DOM.removeClassName(f, 'invalid');
	    }
	}

	if ( emptyFields.length <= 0 )
	{
	    return true;
	}

	var s = __("Les champs suivant sont obligatoires :");
	for ( var i = 0 ; i < emptyFields.length ; i++ )
	{
	    s += "\n\t" + this._getFieldTitle(emptyFields[i]);
	}

	alert(s);
	this._focusFirstVisibledField(emptyFields);

	return false;
    }, 

    checkAtLeastOneOfFields : function(form, mandatoryFields, prefix)
    {
	var fields = [];
	var empty = true;
	var v, f;

	for ( var i = 0 ; i < mandatoryFields.length ; i++ )
	{
	    f = this._getField(form, mandatoryFields[i], prefix);
	    if ( !f )
	    {
		    continue;
	    }

	    v = vanilla.html.Form.getFieldValue(f);
	    v = vanilla.text.trim(v);

	    if ( v != null && v.length > 0 )
	    {
		empty = false;
	    }

	    fields.push(f);
	}

	if ( !empty )
	{
	    return true;
	}

	var s = __("Au moins un des champs suivant est obligatoire :");
	for ( var i = 0 ; i < fields.length ; i++ )
	{
	    s += "\n\t" + this._getFieldTitle(fields[i]);
	}

	alert(s);
	this._focusFirstVisibledField(fields);

	return false;
    }, 

    checkDateFields : function(form, dateFields, format, prefix)
    {
	var invalidFields = [];
	var v, f;

	for ( var i = 0 ; i < dateFields.length ; i++ )
	{
	    f = this._getField(form, dateFields[i], prefix);
	    if ( !f )
	    {
		continue;
	    }

	    v = vanilla.html.Form.getFieldValue(f);
	    if ( v == null || v.length == 0 )
	    {
		continue;
	    }

	    if ( vanilla.text.parseDate(v, format) == null )
	    {
		invalidFields.push(f);
		vanilla.html.DOM.addClassName(f, 'invalid');
	    }
	    else
	    {
		vanilla.html.DOM.removeClassName(f, 'invalid');
	    }
	}

	if ( invalidFields.length <= 0 )
	{
	    return true;
	}

	var s = __("Les dates (%1%) suivantes sont invalides :", format);
	for ( var i = 0 ; i < invalidFields.length ; i++ )
	{
	    s += "\n\t" + this._getFieldTitle(invalidFields[i]);
	}

	alert(s);
	this._focusFirstVisibledField(invalidFields);

	return false;
    },
    
    checkIntFields : function(form, intFields, prefix)
    {
	var invalidFields = [];
	var v, f;

	for ( var i = 0 ; i < intFields.length ; i++ )
	{
	    f = this._getField(form, intFields[i], prefix);
	    if ( !f )
	    {
		continue;
	    }

	    v = vanilla.html.Form.getFieldValue(f);
	    if ( v == null || v.length == 0 )
	    {
		continue;
	    }

	    v = parseInt(v, 10);
	    if ( isNaN(v) )
	    {
		invalidFields.push(f);
		vanilla.html.DOM.addClassName(f, 'invalid');
	    }
	    else
	    {
		vanilla.html.DOM.removeClassName(f, 'invalid');
	    }
	}

	if ( invalidFields.length <= 0 )
	{
	    return true;
	}

	var s = __("Les champs suivants doivent être des entiers :");
	for ( var i = 0 ; i < invalidFields.length ; i++ )
	{
	    s += "\n\t" + this._getFieldTitle(invalidFields[i]);
	}

	alert(s);
	this._focusFirstVisibledField(invalidFields);

	return false;
    },

    checkEmailFields : function(form, emailFields, prefix)
    {
	var invalidFields = [];
	var v, f;

	var localname	= "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
	var domain	= "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
	var regex	= new RegExp("^"+localname+"\@"+domain+"$");

	for ( var i = 0 ; i < emailFields.length ; i++ )
	{
	    f = this._getField(form, emailFields[i], prefix);
	    if ( !f )
	    {
		continue;
	    }

	    v = vanilla.html.Form.getFieldValue(f);
	    if ( v == null || v.length == 0 )
	    {
		continue;
	    }

	    if ( !regex.test(v) )
	    {
		invalidFields.push(f);
		vanilla.html.DOM.addClassName(f, 'invalid');
	    }
	    else
	    {
		vanilla.html.DOM.removeClassName(f, 'invalid');
	    }
	}

	if ( invalidFields.length <= 0 )
	{
	    return true;
	}

	var s = __("Les champs suivants doivent être des adresses électroniques :");
	for ( var i = 0 ; i < invalidFields.length ; i++ )
	{
	    s += "\n\t" + this._getFieldTitle(invalidFields[i]);
	}

	alert(s);
	this._focusFirstVisibledField(invalidFields);

	return false;
    },
    
    checkPasswordField : function(form, passwordField, confirmationField, minSize, prefix)
    {
        if ( !minSize || minSize < 0 )
        {
            minSize = 6;
        }

        var pf = this._getField(form, passwordField, prefix);
        var cf = this._getField(form, confirmationField, prefix);

        if ( !pf )
        {
            return true;
        }

	vanilla.html.DOM.removeClassName(pf, 'invalid');
	if ( cf )
	{
	    vanilla.html.DOM.removeClassName(cf, 'invalid');
	}

        /*
         * Password
         */

        var pv = vanilla.html.Form.getFieldValue(pf);
        if ( !pv )
        {
            return true;
        }

        if ( pv.length < minSize )
        {
            var s = __("Le champ suivant est trop court, il doit comporter au minimum %1% caractères :", minSize);
            s += "\n\t" + this._getFieldTitle(pf);

	    vanilla.html.DOM.addClassName(pf, 'invalid');

            alert(s);
            this._focusFirstVisibledField([pf]);

            return false;
        }

        /*
         * Confirmation
         */

        if ( cf )
        {
            var cv = vanilla.html.Form.getFieldValue(cf);
            if ( cv != pv )
            {
        	var s = __("Les champs suivants sont différents :");
        	s += "\n\t" + this._getFieldTitle(pf);
        	s += "\n\t" + this._getFieldTitle(cf);

		vanilla.html.DOM.addClassName(pf, 'invalid');
		vanilla.html.DOM.addClassName(cf, 'invalid');

        	alert(s);
        	this._focusFirstVisibledField([pf, cf]);

        	return false;
            }
        }

        return true;
    },

    _focusFirstVisibledField : function(fields)
    {
	for ( var i = 0 ; i < fields.length ; i++ )
	{
	    if ( fields[i].type != "hidden" )
	    {
		fields[i].focus();
		// TODO scroll to
		return;
	    }
	}
    }
};

