var formManager = Class.create();
formManager.prototype = Object.extend(new dataManager(), {

    // конструктор
    initialize: function(params) {
        this.method = 'post';       // Метод отправки данных.
        this.backendScript = false; // Путь к бекенд-скрипту.
        this.components = {};       // Компоненты (компоненты формы)
        this.loadData = {};         // Данные, загруженные из бекенда. Формат {id: {key:value, key1:value1}}
        this.mode = 'a';            // Текущий режим работы датаменеджера

        // значения по умолчанию
        // как правило это кнопка, вызывающая метод sendData
        this.sendCaller = false;
        // показывать, что идет передача данных
        // если указать false, также кнопка не будет становиться disabled на время передачи данных
        this.showLoading = true;
        // элемент, показывающий, что идет передача данных
        this.loading = false;
        // сообщение (alert) о наличие ошибок в форме
        // если cmpErrorsAlert установить в false, то сообщение не будет выдаваться
        this.cmpErrorsAlert = '';
        // сообщение об удачном добавлении
        this.appendAlert = false;
        // сообщение об удачном обновлении
        this.updateAlert = false;
        // сообщение о вызове на редактирование
        this.fillAlert = false;
        // Элемент html-страницы, в котором отображаются добавленные записи
        this.tabView = false;
        // Элемент, в котором показывается сообщение, что данные успешно переданы
        this.resultView = false;
        // скрыть форму в случае успешной передачи данных
        this.hideFormOnSuccess = false;

        Object.extend(this, params);
        if (!this.sendSuccessFunc)
            this.sendSuccessFunc = [];

        if (this.formPlacementId)
            this.formPlacement = $(this.formPlacementId);

        // если указаны элементы, которые следует показывать только
        // в определенных режимах отображения формы, то сначала необходимо все их скрыть
        if (this.toggleElements)
            this.toggleElementsHide();

        this.loading = $(this.loading);
        this.addButton = $(this.addButton);
        this.updateButton = $(this.updateButton);
        this.hideOnSuccess = $(this.hideOnSuccess);
        this.switchButtons(true, false);
    },

    hideForm: function() {
        this.toggleElementsHide();
        if (this.formPlacement)
            this.formPlacement.hide();
    },

    showForm: function(mode) {
        this.toggleElementsHide();
        if (mode) {
            this.toggleElements[mode].each(function(elementId) {
                if ($(elementId))
                    $(elementId).show();
            });
        }
        if (this.formPlacement)
            this.formPlacement.show();
    },

    // скрыть toggle элементы
    toggleElementsHide: function() {
        for (modeElements in this.toggleElements)
            this.toggleElements[modeElements].each(function(elementId) {
                if ($(elementId))
                    $(elementId).hide();
            });
    },

    // выполняется перед передачей данных бэкенду
    onSend: function() {
        if (this.showLoading)
            this.switchLoading(true);
    },

    // выполняется, если бэкенд успешно принял данные
    onSendSuccess: function () {
        // загруженные данные показать в tabView
        if ((this.loadData) && (this.mode != 'f')) {
            if (this.tabView) {
                this.tabView.data = this.loadData;
                this.tabView.fill();
            }
        }
        // очистить компоненты, если это не вызов на редактирование
        if (this.mode != 'f')
            this.clearFields();

        // закрываем сообщение о передаче данных, активируем кнопку
        if (this.showLoading)
            this.switchLoading(false);

        // выполнить пользовательские функции, если они описаны
        if (this.sendSuccessFunc) {
            this.sendSuccessFunc.each(function(f){
                f.func(f.params);
            });
        }
        switch (this.mode)
        {
            case 'a':
                // если это указано, то спрятать форму
                if (this.hideFormOnSuccess)
                    this.hideForm();
                if (this.appendAlert)
                    alert(this.appendAlert);
                break;
            case 'u':
                if (this.hideFormOnSuccess)
                    this.hideForm();
                this.switchButtons(true, false);
                if (this.updateAlert)
                    alert(this.updateAlert);
                break;
            case 'd':
                break;
            case 'f':
                this.switchButtons(false, true);
                if (this.fillAlert)
                    alert(this.fillAlert);
                break;
            case 'l':
                break;
        }
    },

    // выключатель информера загрузки
    // включить: on=true, выключить: on=false
    switchLoading: function(on) {
        if (on) {
            var caller = this.sendCaller;
            // сообщение о том, что идет передача данных на сервер
            // появляется под кнопкой (или элементом), которая(-ый) делает сабмит формы
            if (this.loading) {
                this.loading.style.position = 'absolute';
                var cH = (caller) ? caller.clientHeight: 0;
                Position.clone(caller, this.loading, {setWidth: false, setHeight: false, offsetTop: cH});
                this.loading.show();
            }
            // во время передачи данных, кнопку делаем недоступной (disabled)
            if (caller)
                caller.disabled = true;
        } else {
            // закрываем сообщение о передаче данных, активируем кнопку
            if (this.loading)
                this.loading.hide();
            this.sendCaller.disabled = false;
        }
    },

    // клик по пейджингу
    loadPage: function(pageNum) {
        this.sendData('l', {pageNum:pageNum})
    },

    switchButtons: function(add, upd) {
        if (this.addButton)
            add ? this.addButton.show() : this.addButton.hide();
            //this.addButton.disabled = !add;
        if (this.updateButton)
            upd ? this.updateButton.show() : this.updateButton.hide();
            //this.updateButton.disabled = !upd;
     },

    // ошибки в зачениях компонентов
    onSendError: function() {
        // пользовательские функции
        if (this.sendErrorFunc) {
            this.sendErrorFunc.each(function(f){
                f.func(f.params);
            });
        }
        if (this.showLoading)
            this.switchLoading(false);

        if (this.cmpErrorsAlert && !this.errors.backend_error)
            alert(this.cmpErrorsAlert);
    },

    onFailure: function() {
        if (this.sendFailureFunc) {
            this.sendFailureFunc.each(function(f){
                f.func(f.params);
            });
        }
        if (this.showLoading)
            this.switchLoading(false);
        alert('Ошибка передачи данных');
    },

    // выполниь после очистки формы
    onClearForm: function() {
        this.switchButtons(true, false);
    }
});
