function Auth(params){
    this.login_url = params.login_url;
    this.logout_url = params.logout_url;
    this.register_url = params.register_url;
    this.passwd_remind_url = params.passwd_remind_url;
    this.rules_url = params.rules_url;
    this.popup = $('#'+params.popup_id);
    this.login_button_id = params.login_button_id || 'login-button';
    this.logout_button_id = params.logout_button_id || 'logout-button';
    this._auth_forms = null;
    this.draw_buttons();
};

function on_error(xhr) {
    if (xhr.status == 402) {
        $('div.popup').addClass('hide');
        popup.clear();
        popup.set_header('Ошибка');
        popup.set_message('Слишком много запросов с одного ip');
        popup.show(function(){
            $('div.popup').removeClass('hide');
        });
    } else {
        $('div.popup').addClass('hide');
        popup.clear();
        popup.set_header('Ошибка');
        popup.set_message(xhr.status);
        popup.show(function(){
            $('div.popup').removeClass('hide');
        });
    };
}

Auth.prototype.login = function(login_form) {
    var that = this;
    var email = login_form.email.value;
    var password = login_form.password.value;
    $.ajax({
        'url':this.login_url, 
        'success':function(data, text_status, xhr){
            $(login_form.email).removeClass('error');
            $(login_form.password).removeClass('error');
            data = JSON.parse(data);
            if (data.status && data.status == 'OK') {
                that._auth_forms.addClass('hide');
                login_form.reset();
                that.draw_buttons();
            } else if (data.status && data.status == 'FAIL') {
                $(login_form.email).addClass('error');
                $(login_form.password).addClass('error');
            }
        },
        'type':'POST',
        'data':encodeURI('email='+email+'&password='+password),
        'error':on_error
    });
};

Auth.prototype.register = function(register_form) {
    var that = this;
    $.ajax({
        'url':this.register_url, 
        'success':function(data, text_status, xhr){
            data = JSON.parse(data);
            popup.clear();
            if (data.status && data.status == 'OK') {
                that._auth_forms.addClass('hide');
                register_form.reset();
                that.draw_buttons();
                popup.set_message(data.warning);
                popup.show();
            } else if (data.status && data.status == 'FAIL') {
                var reg_form = document.getElementById('registration-form');
                $('#registration-form input').removeClass('error');
                $('div.popup').addClass('hide');
                var message = '';
                var focus_field = null;
                for (var field in data.errors) {
                    if (!message){
                        message = message + '  ' + data.errors[field];
                        focus_field = field;
                    }
                    if (field == 'password') {
                        field = 'password.conf';
                    }
                    if (field in reg_form){
                        $(reg_form[field]).addClass('error');
                    }
                }
                popup.set_header('Ошибка');
                popup.set_message(message);
                popup.show(function(){
                    $('div.popup').removeClass('hide');
                    if (focus_field){
                        reg_form[focus_field].focus();
                    }
                });
            }
        },
        'type':'POST',
        'data':$(register_form).serialize(),
        'error':on_error
    });
};

Auth.prototype.logout = function() {
    var that = this;
    $.ajax({
        'url':this.logout_url, 
        'success':function(data, text_status, xhr){
            data = JSON.parse(data);
            if (data.status && (data.status == "OK")) {
                that.draw_buttons();
            } else {
                //TODO: popup with data.message
            }
        },
        'error':on_error
    });
};


Auth.prototype._auth_form_apearance = function(){
    $('.tabs a').click(function(){
        if ($(this).hasClass('registration')) {
            $('.tabs a').removeClass('this');
            $(this).addClass('this');
            $('.tabs-content').children('div').removeClass('this');
            $('.tabs-content-registration').addClass('this');
        }
        if ($(this).hasClass('login')) {
            $('.tabs a').removeClass('this');
            $(this).addClass('this');
            $('.tabs-content').children('div').removeClass('this');
            $('.tabs-content-login').addClass('this');
        }
        if ($(this).hasClass('close')) {
            $('div.popup').addClass('hide');
        }
        return false;
    });
}

Auth.prototype._auth_form_handlers = function(){
    var that = this;
    $('#registration-button').click(function(){
        $('#registration-form').submit()
        return false;
    });
    $('#login-button').click(function(){
        $('#login-form').submit()
        return false;
    });
    $('#login-form').submit(function() {
        that.login(this);
        return false;
    });
    $('#registration-form').submit(function() {
        that.register(this);
        return false;
    });
    $('#rules-button').click(function() {
        window.open(that.rules_url);
        return false;
    });
    $('#passwd-reminder').click(function() {
        $('#login-form').addClass('remove');
        $('#forgot-pass').removeClass('remove');
        return false;
    });
    $('#hide-reminder').click(function() {
        $('#login-form').removeClass('remove');
        $('#forgot-pass').addClass('remove');
        return false;
    });
    $('#forgot-pass').submit(function() {
        that.remind_passwd(this);
        return false;
    });
}

Auth.prototype.login_popup = function() {
    var that = this;
    if (this._auth_forms == null) {
        $.ajax({
            'async':false,
            'url':_js_cfg.login_forms_url,
            'success':function(data, text_status){
                $(document.body).append(data);
                that._auth_forms = $('div.popup');
                that._auth_form_apearance();
                that._auth_form_handlers();
            },
            'error':on_error
        });
    } else {this._auth_forms.removeClass('hide');}
};

Auth.prototype.manage_link = function(attrs, handler) {
    var _link = document.createElement('a');
    _link.href = attrs.href || '#';
    _link.className = attrs.className || '';
    var _span = document.createElement('span');
    _span.id = attrs.span_id;
    _span.innerHTML = attrs.text;
    _link.appendChild(_span);
    if (handler != undefined) {
        var that = this;
        $(_link).click(function(){
            handler.apply(that);
            return false;
        });
    }
    return _link;
}

Auth.prototype.draw_buttons = function() {
    var name = $.cookie('name');
    var url = $.cookie('url');
    var panel = $('#div-manage-bottom');
    panel.empty();
    if (name != null) {
        var profile_link = this.manage_link({
            'href':url, 
            'text':name.toUpperCase(), 
            'span_id':'span-manage-name'
        });
        var logout_link = this.manage_link({
            'href':this.logout_url, 
            'text':'выйти', 
            'span_id':'span-manage-exit'
        }, this.logout);
        panel.append(profile_link);
        panel.append(logout_link);
    } else {
        var register_link = this.manage_link({
            'href':_js_cfg.register_url, 
            'text':'регистрация', 
            'span_id':'span-manage-exit'
        }, function() {
            this.login_popup();
            $('div.popup a.registration').click();
        });
        var login_link = this.manage_link({
            'href':_js_cfg.login_url, 
            'text':'войти', 
            'className':'login',
            'span_id':'span-manage-exit'
        }, function() {
            this.login_popup();
            $('div.popup a.login').click();
        });
        panel.append(login_link);
        panel.append(register_link);
    }
};


Auth.prototype.remind_passwd = function(passwd_form) {
    var that = this;
    $.ajax({
        'url':this.passwd_remind_url, 
        'success':function(data, text_status, xhr){
            data = JSON.parse(data);
            popup.clear();
            if (data.status && data.status == 'OK') {
                that._auth_forms.addClass('hide');
                var passwd_form = document.getElementById('forgot-pass');
                passwd_form.reset();
                $(passwd_form).addClass('remove');
                $('#login-form').removeClass('remove');
                that.draw_buttons();
                popup.set_message(data.warning);
                popup.show();
            } else if (data.status && data.status == 'FAIL') {
                var passwd_form = document.getElementById('forgot-pass');
                $('#forgot-pass input').removeClass('error');
                $('div.popup').addClass('hide');
                var message = '';
                var focus_field = null;
                for (var field in data.errors) {
                    if (!message){
                        message = message + '  ' + data.errors[field];
                        focus_field = field;
                    }
                    if (field in passwd_form){
                        $(passwd_form[field]).addClass('error');
                    }
                }
                popup.set_header('Ошибка');
                popup.set_message(message);
                popup.show(function(){
                    $('div.popup').removeClass('hide');
                    if (focus_field){
                        passwd_form[focus_field].focus();
                    }
                });
            }
        },
        'type':'POST',
        'data':$(passwd_form).serialize(),
        'error':on_error
    });
};



$(document).ready(function() {
    var auth = new Auth({
        login_url:_js_cfg.ajax_login_url,
        logout_url:_js_cfg.ajax_logout_url,
        register_url:_js_cfg.ajax_register_url,
        passwd_remind_url:_js_cfg.passwd_remind_url,
        rules_url:_js_cfg.rules_url,
        popup_id:'login-popup'
    });
});

