/**
 * @author albanjub
 * Verification de formulaire
 * Nécessite prototype.js
 */
var formChecker = Class.create({
    initialize: function(form, options){
        this.form = $(form);
        this.options = Object.extend({
            className: "field_error",
            mark_required_fields_labels: "",
            fields: []
        }, options ||
        {});
        Event.observe(this.form, "submit", this.check.bindAsEventListener(this));
        this.options.fields.each(function(field, index){
            var element = $(field.name);
            if (this.options.mark_required_fields_labels != "" && typeof(field.required) != "undefined" && field.required == true) {
                var label = this.form.select('label[for="' + field.name + '"]');
                if (label.size()) {
                    label[0].insert({
                        bottom: this.options.mark_required_fields_labels
                    });
                }
            }
        }, this);
    },
    
    check: function(e){
        var formIsOK = true;
        this.invalidFields = [];
        this.options.fields.each(function(field, index){
            var element = $(field.name);
            if (!element) { // try to find the element with its name in the form
                var elements = this.form.select('[name="' + field.name + '"]');
                element = elements[0];
            }
            if (element) {
                element.removeClassName(this.options.className); // reset initial style
                if (typeof(field.callback) == "function") {
                    if (!field.callback(this.form, field)) {
                        formIsOK = false;
                        this.markAsInvalid(field);
                        return;
                    }
                }
                if (typeof(field.required) != "undefined" && field.required == true) {
                    switch (element.type.toLowerCase()) {
                        case 'checkbox':
                            if (!element.checked) {
                                formIsOK = false;
                                this.markAsInvalid(field);
                                return;
                            }
                            return;                            break;
                        case 'radio':
                            if (!this.form.getInputs('radio', field.name).find(function(re){
                                return re.checked;
                            })) {
                                formIsOK = false;
                                this.markAsInvalid(field);
                                return;
                            }
                            return;                            break;
                        default:
                            if ($F(field.name).empty()) {
                                formIsOK = false;
                                this.markAsInvalid(field);
                                return;
                            }
                    }
                }
                if (!$F(field.name).empty() && typeof(field.type) != "undefined") {
                    switch (field.type) {
                        case 'text':
                            if (!$F(field.name).match(/.+/)) {
                                this.markAsInvalid(field);
                                formIsOK = false;
                                return;
                            }
                            else {
                                if (typeof(field.min) != "undefined" && $F(field.name).length < field.min) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                                if (typeof(field.max) != "undefined" && $F(field.name).length > field.max) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                            }
                            break;
                        case 'numeric':
                            if (!$F(field.name).match(/^-?\d+$/)) {
                                this.markAsInvalid(field);
                                formIsOK = false;
                                return;
                            }
                            else {
                                if (typeof(field.min) != "undefined" && parseInt($F(field.name), 10) < field.min) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                                if (typeof(field.max) != "undefined" && parseInt($F(field.name), 10) > field.max) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                            }
                            break;
                        case 'double':
                            if (!$F(field.name).match(/^-?[0-9]*(\.|,)?[0-9]+([eE]\-[0-9]+)?$/)) {
                                this.markAsInvalid(field);
                                formIsOK = false;
                                return;
                            }
                            else {
                                if (typeof(field.min) != "undefined" && parseFloat($F(field.name)) < field.min) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                                if (typeof(field.max) != "undefined" && parseFloat($F(field.name)) > field.max) {
                                    this.markAsInvalid(field);
                                    formIsOK = false;
                                    return;
                                }
                            }
                            break;
                        case 'phone':
                            if (!$F(field.name).match(/^[(]?[+]{0,2}[0-9-.\s\/()]+$/)) {
                                this.markAsInvalid(field);
                                formIsOK = false;
                                return;
                            }
                            break;
                        case 'email':
                        	$(field.name).value = $(field.name).value.replace(/^\s+/, '');
                        	$(field.name).value = $(field.name).value.replace(/\s+$/, '');
                            if (!$F(field.name).match(/^[\w\.-]+@[\w\.-]+\.\w+$/i) || $F(field.name).length < 5) {
                                this.markAsInvalid(field);
                                formIsOK = false;
                                return;
                            }
                            break;
                    }
                }
                
            }
        }, this);
        if (!formIsOK) {
            Event.stop(e);
            (this.options['onError'] ||
            Prototype.emptyFunction)(this.invalidFields);
        }
        else {
			if (this.options['onSuccess']) {
				Event.stop(e);
				this.options['onSuccess']();
			}
        }
    },
    
    markAsInvalid: function(field){
        var element = $(field.name);
        if (element) 
            element.addClassName(this.options.className);
        this.invalidFields.push(field);
    }
});
