/*
Управления авторизацией
2007 - Magic Wand
*/

/*
Визуальные эффекты реализованы с помощью библиотеки Interface elements for jQuery 
http://interface.eyecon.ro/
*/

function reload_page() {
    location.href = location.href;
}

/*
Класс управления окном
*/
function SlideWin(id, act) {
    this.winEl = $('#' + id);
    this.act = false;
    if(act) this.show();
}
SlideWin.prototype.toggle = function() {
    this.winEl.SlideToggleUp(500);
    this.act = !this.act;
}
SlideWin.prototype.hide = function() {
    if(this.act) this.toggle();
}
SlideWin.prototype.show = function() {
    if(!this.act) this.toggle();
}
SlideWin.prototype.getAct = function() {
    return this.act;
}
SlideWin.prototype.isSlideWin = function() {
    return true;
}

/*
Класс коллекции окон
*/
function WinCollection() {
    this.wins = new Array();
}
WinCollection.prototype.add = function(name, win) {
    this.wins[name] = win;
}
WinCollection.prototype.each = function(func) {
    for(var name in this.wins) {
        var win = this.wins[name];
        if(win.isSlideWin && win.isSlideWin()) func(win);
    }
}
WinCollection.prototype.get = function(name) {
    return this.wins[name];
}

WinUtils = {
    hideWin: function(win) {
        win.hide();
    },
    
    hideAllWins: function(collect) {
        collect.each(WinUtils.hideWin);
    },
    
    toggleWin: function(collect, name) {
        var win = collect.get(name);
        var act = win.getAct();
        WinUtils.hideAllWins(collect);
        if(!act) win.show();
    }
}

FormUtils = {
    // возвращает true, если все поля формы заполнены
    allFilled: function(form) {
        return $('input:blank', form).length == 0;
        //return $('input:text', form).add('input:password').filter(function(index) {return !$.trim(this.value)}).length == 0;
    },
    
    hasFilled: function(form) {
        return $('input:filled', form).not(':submit').length != 0;
    }
}

LoginUtils = {
    // настройка формы
    adjustForm: function() {
        var lform = $('#login_form');
        lform.ajaxForm({
                beforeSubmit: function(data, form, opts) {
                    if(!FormUtils.allFilled(form)) return false;
                    $('#login_control').hide();
                    $('#login_response').html('<img src="/i/searching.gif"/>');
                    return true;
                },
                
                success: function(response) {
                    $('#login_control').show();
                    var user_id = parseInt($('user_id', response).text());
                    var blocked = parseInt($('blocked', response).text());
                    if(blocked == 1) $('#login_response').html('<span class="error">Аккаунт временно заблокирован</span>');
                    else if(user_id > 0) {
                        $('#login_response').html('Доступ разрешен');
                        reload_page();
                    } else $('#login_response').html('<span class="error">Доступ запрещен</span>');
                }
        });
        $('input[@name="login"]', lform).add('input[@name="password"]').keyup(LoginUtils.allowSubmitHandler).blur(LoginUtils.allowSubmitHandler);
        $(':submit', lform).attr('disabled', 'yes');
    },
    
    allowSubmitHandler: function(event) {
        var lform = $('#login_form');
        var enable_submit = FormUtils.allFilled(lform);//login && password;
        $(':submit', lform).each(function() {this.disabled = !enable_submit});
    }
}

RecoverUtils = {
    // настройка формы
    adjustForm: function() {
        var lform = $('#recover_form');
        lform.ajaxForm({
                beforeSubmit: function(data, form, opts) {
                    if(!FormUtils.hasFilled(form)) return false;
                    $('#recover_control').hide();
                    $('#recover_response').html('<img src="/i/searching.gif"/>');
                    return true;
                },
                
                success: function(response) {
                    $('#recover_control').show();
                    var result = $('//result', response).attr('value');
                    if(result == 'ok') $('#recover_response').html('Данные для восстановления высланы на указанный e-mail');
                    else $('#recover_response').html('<span class="error">Пользователь не найден</span>');
                }
        });
        $('input[@name="login"]', lform).add('input[@name="email"]').keyup(RecoverUtils.allowSubmitHandler).blur(RecoverUtils.allowSubmitHandler);
        $(':submit', lform).attr('disabled', 'yes');
    },
    
    allowSubmitHandler: function(event) {
        var lform = $('#recover_form');
        var enable_submit = FormUtils.hasFilled(lform);
        $(':submit', lform).each(function() {this.disabled = !enable_submit});
    }
}

PasswordUtils = {
    // настройка формы
    adjustForm: function() {
        var lform = $('#password_form');
        lform.ajaxForm({
                beforeSubmit: function(data, form, opts) {
                    if(!PasswordUtils.allowSubmit(form)) return false;
                    $('#password_control').hide();
                    $('#password_response').html('<img src="/i/searching.gif"/>');
                    return true;
                },
                
                success: function(response) {
                    $('#password_control').show();
                    var result = $('//result', response).attr('value');
                    if(result == 'done') $('#password_response').html('Пароль изменен');
                    else if(result == 'noauth') $('#password_response').html('<span class="error">Вы неавторизованы</span>');
                    else if(result == 'badpass') $('#password_response').html('<span class="error">Неверный пароль</span>');
                    else $('#password_response').html('<span class="error">Произошла ошибка при изменении пароля</span>');
                }
        });
        $('input', lform).not(':submit').keyup(PasswordUtils.allowSubmitHandler).blur(PasswordUtils.allowSubmitHandler);
        $(':submit', lform).attr('disabled', 'yes');
    },
    
    // возвращает true, если форма заполнена корректно
    allowSubmit: function(form) {
        return FormUtils.allFilled(form) && PasswordUtils.compareNewPasswords(form);
    },
    
    // сравнение новых паролей (true - если пароли совпадают)
    compareNewPasswords: function(form) {
        var pswd_field1 = $('input[@name="new_pswd1"]', form);
        var pswd_field2 = $('input[@name="new_pswd2"]', form);
        if(pswd_field1.val() != pswd_field2.val()) {
            pswd_field2.addClass('login_error');
            return false;
        }
        pswd_field2.removeClass('login_error');
        return true;
    },
    
    allowSubmitHandler: function(event) {
        var lform = $('#password_form');
        var enable_submit = PasswordUtils.allowSubmit(lform);
        $(':submit', lform).each(function() {this.disabled = !enable_submit});
    }
}

RegUtils = {
    checkInterval: null,
    validator: null, 
    
    adjustForm: function() {
        var form = $('#profile_form');
        RegUtils.validator = form.validate({
                submitHandler: function(form) {
                    $('#profile_control').hide();
                    $('#profile_response').html('<img src="/i/searching.gif"/>');
                    $(form).ajaxSubmit({
                            success: function(response) {
                                $('#profile_control').show();
                                var reg_result = $('result', response).attr('value');
                                if(reg_result == 'ok') {
                                    $('#profile_response').html('Регистрация выполнена');
                                    reload_page();
                                } else RegUtils.showErrors(response, RegUtils.validator);
                            }
                    });
                },
                
                rules: {
                    user_company: 'required',
                    user_real_name: 'required',
                    user_address: 'required',
                    user_phone: 'required',
                    email: {
                        required: true,
                        email: true
                    },
                    login: 'required'
                }
        });
        $('input[@name="login"]', form).keyup(RegUtils.initCheckUserExists).blur(RegUtils.initCheckUserExists);
    },
    
    // отображение допущенных ошибок при регистрации
    showErrors: function(response, validator) {
        var msgs = {};
        $('#profile_response').html('<span class="error">Произошла ошибка</span>');
        $('//fields/field', response).each(function() {
                var name = $(this).attr('name');
                $.log(name);
                var msg = $(this).text();
                msgs[name] = msg;
        });
        validator.showErrors(msgs);
    },
    
    getLoginField: function() {
        return $('#profile_form input[@name="login"]');
    },
    
    getLoginVal: function() {
        return RegUtils.getLoginField().val();
    },
    
    initCheckUserExists: function() {
        if(RegUtils.checkInterval != null) {
            //$.log('cancel wait');
            clearTimeout(RegUtils.checkInterval);
        }
        if($.trim(RegUtils.getLoginVal())) {
            //$.log('wait 1 sec');
            RegUtils.checkInterval = setTimeout(RegUtils.requestUserExists, 1000);
        }
    },
    
    requestUserExists: function() {
        RegUtils.checkInterval = null;
        //$.log('begin_request');
        $.post('/user/exists/', { login: RegUtils.getLoginVal() }, 
            function(response) {
                var user = $('exists', response).text();
                //$.log('user id: ' + user);
                var login_field = RegUtils.getLoginField();
                if(user > 0) login_field.addClass('login_error');
                else login_field.removeClass('login_error');
        });
    }
}

ProfileUtils = {
    validator: null, 
    
    adjustForm: function() {
        var form = $('#profile_form');
        ProfileUtils.validator = form.validate({
                submitHandler: function(form) {
                    $('#profile_control').hide();
                    $('#profile_response').html('<img src="/i/searching.gif"/>');
                    $(form).ajaxSubmit({
                            success: function(response) {
                                $('#profile_control').show();
                                var edit_result = $('result', response).attr('value');
                                if(edit_result == 'ok') {
                                    $('#profile_response').html('Данные изменены');
                                } else if(edit_result == 'no_auth') $('#profile_response').html('Вы не авторизованы');
                                else RegUtils.showErrors(response, ProfileUtils.validator);
                            }
                    });
                },
                
                rules: {
                    user_company: 'required',
                    user_real_name: 'required',
                    user_address: 'required',
                    user_phone: 'required',
                    email: {
                        required: true,
                        email: true
                    }
                }
        });
    }
}

var authWins = new WinCollection();

