ModalEditable = Class.create();
ModalEditable.prototype = {
    data:           {},
    validations:    {},
    validFields:    [],
    template:       {},

    initialize: function () {
        this.cookieJar = new CookieJar({
            expires: 3600 * 24 * 7, // 7 days
            path: '/'
        });

        this.retrieveCookie();
    },

    addValidations: function () {
        this.form.onsubmit = this.checkValid.bindAsEventListener(this);

        for (var fieldName in this.validations) {
            var field = this.form.down('*[name="'+ fieldName +'"]');

            if (!field.validation) {
                var label = field.previous('strong');

                if (this.validations[fieldName].member(Validate.Presence)) {
                    label.select('span.required').invoke('remove');
                    label.insert('<span class="required">*</span>');
                }

                this.addFieldValidations(field);
            }
        }

    },

    addFieldValidations: function (field) {
        if (field.up('li').visible()) {
            var parent      = this;
            var fieldName   = field.name;

            if (this.validations[fieldName]) {
                field.validation = new LiveValidation(field, {
                    onlyOnSubmit: true,
                    onValid: function () {
                        this.addFieldClass();
                        parent.addValid(this.element.name);
                    },
                    onInvalid: function () {
                        this.addFieldClass();
                        parent.removeValid(this.element.name);
                    }
                });

                this.validations[fieldName].each(function (validation) {
                    field.validation.add(validation);
                });
            }
        }
    },

    destroyValidations: function () {
        for (var field in this.validations) {
            field = this.form.down('*[name="'+ field +'"]');
            if (field.validation) {
                field.validation.destroy();
            }
        };
    },

    populateForm: function () {
        this.validFields = [];

        for (var fieldName in this.data) {
            var field = this.form.down('*[name="'+ fieldName +'"]');
            if (field) {
                field.value = this.data[fieldName];

                if (field.validation) {
                    field.validation.doValidations();
                }
            }
        }
    },

    update: function (data) {
        if (data) {
            for (var field in data) {
                this.data[field] = data[field];
            }
        }

        this.storeCookie();
    },

    storeCookie: function () {
        this.cookieJar.put(this.name, this.data);
    },

    retrieveCookie: function () {
        var data = this.cookieJar.get(this.name);
        if (data) {
            for (var field in data) {
                if (data[field] && this.validations[field]) {
                    this.addValid(field, true);
                }
            }
            this.data = {};
            this.update(data);
        }
    },

    /**
     * Adds a field to the valid array and checks if validation completed
     */
    addValid: function (field) {
        if (this.validFields.indexOf(field) == -1) {
            this.validFields.push(field);
        }
    },

    /**
     * Removes a field from the valid array and checks if validation completed
     */
    removeValid: function (field) {
        if (this.validFields.indexOf(field) != -1) {
            this.validFields.remove(this.validFields.indexOf(field));
        }

    },

    /**
     * Checks if all fields have been validated and calls update
     */
    checkValid: function () {
        if (this.isValid()) {
            var serialize = this.form.serialize(true);
            var data      = this.data;
            for (var field in serialize) {
                data[field] = serialize[field];
            }

            this.dialog.close();
            this.update(data);
        }
    },

    isValid: function () {        
        var ret     = true;
        var parent  = this;
        
        if (this.form) {
            LiveValidationForm.getInstance(this.form).fields.each(function (field) {
                if (field.validationFailed) {
                    ret = false;
                }
            });            
        } else {
            var size = 0;
            $H(this.validations).keys().each(function (field) {
                if ($('invoice-' + parent.name + '-' + field)) {
                    if ($('invoice-' + parent.name + '-' + field).visible()) {
                        size++;
                    }
                }
            });

            ret = (this.validFields.size() >= size);
        }
        return ret;
    }
}



