/*
 * Компонент FormSender, обеспечивающий лёгкое управление формами, путём html-разметки
 * Параметры:
 * name - уникальное имя экземпляра класса
 * url - url на который шлётся запрос
 * timeout - время на которое появляется сообщение об ошибке или успешной отправки информации
 * onsuccess - действие, которое необходимо выполнить при успешной отправке формы, варианты:
 *           update  - обновить статусное сообщение
 *           replace - скрыть форму и заменить её новым содержимым
 *           refresh - перезагрузить страницу (необходимо для реализации функциональности типа login/logout 
 * before_send - функция, вызывающаяся перед отправкой формы
 * success - функция, вызывающаяся после успешной отправки формы
 * 
 * Элементы формы:
 * name__form    - сама форма
 * name__sender  - элемент по клику на который должна отправляться форма
 * name__message - элемент в который должны выводится статусные сообщения
 * 
 * Компонент поддерживает интеграцию с компонентом Validator
 */
FormSender = function(params) {
    var default_params = $H({
        name: 'form',
        url: 'esferto/object/save',
        timeout: 2000,
        onsuccess: 'update',
        before_send: function() {},
        success: function() {}
    });
    
    this.params = default_params.merge(params).toObject();
    this.params.prefix = this.params.name + '__';
    
    this.name = this.params.name;
    
    this.form = $(this.params.prefix + 'form');
    
    if (!this.form) return;
    
    this.sender = $(this.params.prefix + 'sender');
    this.message = $(this.params.prefix + 'message');
    this.replace = $(this.params.prefix + 'replace');
    
    this.messageTimer = false;
    
    this.ready_status = true;
        
    if (this.sender) {
        this.sender.on('click', this.send.bind(this));
    }
    this.form.onsubmit = this.send.bind(this);
}

FormSender.prototype.send = function() {
    if (!this.ready_status) return;
    
    if ((window.Validator != undefined) && !Validator.validate(this.form)) {
        this.showMessage(Validator.error_message, false);
        return false;
    }
    
    this.ready_status = false;
    this.params.before_send();
    this.request();
    
    return false;
}

FormSender.prototype.request = function() {
    request(this.params.url, this.form.serialize(true), this.onSuccess.bind(this));
}

FormSender.prototype.showMessage = function (message, status) {
    var add_class = 'error', remove_class = 'ok';
    if (status) {add_class = 'ok', remove_class = 'error';}
    
    this.message.removeClassName(remove_class);
    this.message.addClassName(add_class);
    
    clearTimeout(this.messageTimer);
    this.message.update(message);
    this.messageTimer = setTimeout(this.hideMessage.bind(this), this.params.timeout);
}

FormSender.prototype.hideMessage = function(response) {
    this.message.update('');
}

FormSender.prototype.onSuccess = function(transport) {
    var response = transport.responseText.evalJSON();
    
    if (response.status) {
        if (this.params.onsuccess == 'refresh') {
            location.reload(); return;
        }
        else if (this.params.onsuccess == 'update') {
            this.showMessage(response.message, response.status);
        }
        else if (this.params.onsuccess == 'replace') {
            this.form.hide();
            this.replace.update(response.message);
        }
        
        this.params.success(response);
    }
    else {
        this.showMessage(response.message, response.status);  
    }
    this.ready_status = true;
}

function request(url, parameters, callback) {
    new Ajax.Request(url, {parameters: parameters, onSuccess: callback} );
}
