/**
 * Form Validator
 * Individual form fields will be uniquely checked against a given ruleset.
 * Fires an event to 
 */

meld.form.Validator = Class.create({
        initialize: function(form, validators) {
            this._form = $(form);
            this._validators = validators;
            for(var i=0;i<this._form.elements.length;i++) {
                $(this._form.elements[i]);
                this._form.elements[i].valid = true;
                if(this._form.elements[i].nodeName != "fieldset") {
                    this._form.elements[i].observe("blur", this.handleBlur.bind(this));
                }
            }
        },

        getValidator: function(id) {
            try {
                return this._validators[id].re;
            } catch(e) {
                // Do nothing
            }
        },

        getMessage: function(id) {
            return this._validators[id].msg;
        },

        isFormValid: function() {
            var valid = true;
            for(var i=0;i<this._form.elements.length;i++) {
                this.validate(this._form.elements[i]);
                if(!this._form.elements[i].valid) valid = false;
            }
            return valid;
        },
        
        handleBlur: function(event) {
            this.validate(event.element());
        },

        validate: function(el) {
            //console.info(el.name);
            var re = this.getValidator(el.name);

            if(re) {
                if(!re.match(el.value)) {
                    el.valid = false;
                    if(el.msgBox == null) {
                        this.createMessaging(el);
                    }
                    el.addClassName("error");
                } else {
                    el.valid = true;
                    try {
                        el.parentNode.removeChild(el.msgBox);
                        el.msgBox = null;
                    } catch(e) {
                        //console.error(e);
                    }
                    el.removeClassName("error");
                }
            }
        },

        createMessaging: function(el) {
            var message = this.getMessage(el.name);
            message = (message) ? message : "Error";

            var msgBox = new Element("div");
            msgBox.style.left = el.positionedOffset().left + el.getWidth() + 10 + "px";
            
            msgBox.style.top = el.positionedOffset().top + "px";
            msgBox.style.position = "absolute";

            msgBox.innerHTML = message;
            msgBox.addClassName("errorBox");
            
            el.parentNode.appendChild(msgBox);

            el.msgBox = msgBox;
        }
    });
