/*
    Utils - FormUtils 1.1
    ===========================
    developed by Core Engine
    http://www.core-engine.com/
*/



var FormUtils = new Class({
    
    scroll: null,
    messages: {
        'required': "Ce champ est requis.",
        'alpha': "Ce champ n'accepte que des caractères alphabétiques sans accents.",
        'alphanum': "Ce champ n'accepte que des caractères alphanumériques.",
        'nodigit': "Ce champ n'accepte pas les chiffres.",
        'digit': "Ce champ n'accepte que les chiffres.",
        'digitmin': "Cette valeur doit être au minimum {value1}.",
        'digitltd': "Cette valeur doit être comprise entre {value1} et {value2}.",
        'number': "Ce champ n'accepte qu'un nombre.",
        'email': "Veuillez entrer une adresse email valide.",
        'phone': "Veuillez entrer un numéro de téléphone valide.",
        'url': "Veuillez entrer une adresse de site internet valide.",
        'confirm': "Ce champ est différent de \"{value1}\".",
        'differs': "Ce champ doit être différent de \"{value1}\".",
        'length_str': "La longueur doit être comprise entre {value1} et {value2} caractères.",
        'length_fix': "La longueur doit être de {value1} caractères exactement.",
        'length_max': "La longueur doit être au maximum de {value1} caractères.",
        'length_min': "La longueur doit être au minimum de {value1} caractères.",
        'checkbox': "Merci de cocher la case.",
        'radios': "Merci de choisir une valeur.",
        'select': "Merci de choisir une valeur dans la liste."
    },
    
    
    
    initialize: function() {
        /*
        initialize
        ------------------------------------
        */
        
        this.scroll = new Fx.Scroll(window, {
            'duration': 300,
            'link': 'cancel'
        });
    },
    
    
    
    check: function(f, cb) {
        /*
        Check a form
        ------------------------------------
            f : form
            cb : callback (optional)
        */
        
        if(!f) return;
        $$('.tooltip-formcheck').each(function(tooltip){
            tooltip.id='tooltip-temp';
            tooltip.hide();
        });
        
        var valid = true;
        var fields = f.getElements("[class*=check\[]");
        for (var i = 0; i < fields.length; i++) {
            var field_valid = this.validate(fields[i], f);
            if(field_valid != true) {
                valid = false;
                var errors = [];
                field_valid.each(function(error) {
                    var message = formutils.messages[error.type];
                    errors.push(message.substitute(error.args));
                });
                var tip = new ToolTip({
                    'link': fields[i],
                    'class': 'tooltip-formcheck',
                    'anchor': 'right',
                    'content': errors.join('<br />')
                });
                this.scroll.start(
                    fields[i].getPosition().x - 100,
                    fields[i].getPosition().y - 100
                );
                break;
            };
        };
        if(valid) {
            if(cb) cb.attempt();
            else f.submit();
        };
    },
    
    
    
    validate: function(e, f) {
        /*
        Validate an element
        ------------------------------------
            e : element
            f: form
        */
        
        var errors = [];
        var checks = e.className.match(/check(\[.+\])/);
        if(!checks) return true;
        checks = JSON.decode(checks[1]);
        checks.each(function(c) {
            var args = c.match(/^.+(\(.+\))$/);
            if(args) {
                c = c.match(/^\w+\w/)[0];
                args = args[1];
                args = args.slice(1, args.length - 1).split('|');
                
            }
            else args = [];
            if(!(formutils['__' + c].bind(f)(e.value, args))) {
                var params = {};
                args.each(function(item, index) {
                    params['value' + (index + 1)] = item;
                });
                errors.push({'type': c, 'args': params});
            }
        });
        return (errors.length > 0) ? errors : true; 
    },
    
    
    
    __required: function(v) { return (v != ''); },
    
    __nospace: function(v) { return (v.match(/([ \t])/i)) ? false : true; },
    
    __alpha: function(v) { return v.match(/^[a-z ._-]+$/i); },
    
    __alphanum: function(v) { return v.match(/^[\u0000-\u1999\w._\s-]+$/i); },
    
    __nodigit: function(v) { return v.match(/^[^0-9]+$/); },
    
    __digit: function(v) { return v.match(/^[-+]?[0-9]+$/); },
    
    __digitmin: function(v, args) { return (v.toInt()>=args[0].toInt()); },
    
    __digitltd: function(v, args) { return (v.toInt()>=args[0].toInt() && v.toInt()<=args[1].toInt()); },
    
    __number: function(v) { return v.match(/^[-+]?\d*\.?\d+$/); },
    
    __email: function(v) { return v.match(/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i); },
    
    __phone: function(v) { return v.match(/^[\d\s ().-]+$/); },
    
    __url: function(v) { return v.match(/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i); },
    
    __confirm: function(v, args) { return ((args[0] in this) && v==this[args[0]].value); },
    
    __differs: function(v, args) { return ((args[0] in this) && v!=this[args[0]].value); },
    
    __length_str: function(v, args) { return (v.length>=args[0].toInt() && v.length<=args[1].toInt()); },
    
    __length_fix: function(v, args) { return (v.length==args[0].toInt()); },
    
    __length_max: function(v, args) { return (v.length<=args[0].toInt()); },
    
    __length_min: function(v, args) { return (v.length>=args[0].toInt()); }
    
});
