var REDIRECT_TIMEOUT = 7000;

var email_regexp = "^[_A-Za-z0-9\\-\\+]+(\\.[_A-Za-z0-9\\-\\+]+)*@[_A-Za-z0-9\\-]+(\\.[_a-zA-Z0-9\\-]+)*\\.[A-Za-z]{2,3}$";

function InitAuthComponent(options) {

    if (typeof(options) == 'undefined') {
        var options = new Object;
    }
    var opts = new Object;
    opts.messageInvalidEmail = options.messageInvalidEmail || "Проверьте правильность ввода адреса электронной почты";
    opts.messageEmptyFields = options.messageEmptyFields || "Пожалуйста, заполните все необходимые поля";
    opts.messageAccessDenied = options.messageAccessDenied || "Неправильный адрес электронной почты или пароль";
    opts.messagePasswordMismatch = options.messagePasswordMismatch || "Указанные пароли не совпадают";
    opts.messageAlreadyExists = options.messageAlreadyExists || "Пользователь с таким адресом эл. почты уже зарегистрирован! <a href='#'>Напомнить пароль.</a>";
    opts.messageAccountCreated = options.messageAccountCreated || "Учетная запись успешно создана";
    opts.messagePasswordSent = options.messagePasswordSent || "Мы выслали Вам новый пароль по адресу <b>%</b>. Используйте его для входа!";
    opts.messageInvalidUser = options.messageInvalidUser || "Пользователь с таким адресом эл. почты не зарегистрирован!";
    opts.messageInputText = options.messageInputText || "Введите, пожалуйста, текст ошибки.";

    var login = $("#id_login_dialog");
    var auth = $("#id_auth_dialog");
    var forgot = $("#id_forgot_dialog");
    var fader = $("#fader");

    if (login.length || auth.length || forgot.length)
    {
    // Error output container
        var login_error = login.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
        var auth_error = auth.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
        var forgot_error = forgot.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
        var login_success = login.find("div.text_enter > div.text_enter_forma > div.success_enter > div.success_enter_2");
        var auth_success = auth.find("div.text_enter > div.text_enter_forma > div.success_enter > div.success_enter_2");
        var forgot_success = forgot.find("div.text_enter > div.text_enter_forma > div.success_enter > div.success_enter_2");
        auth_error.hide();
        login_error.hide();
        login_success.hide();
        auth_success.hide();
        forgot_success.hide();

        $(".login_link, #id_login_link").click(function(e) {
            e.preventDefault();
            fader.css("display", "block").fadeTo(0, 0.5);
            login.css("display", "block");
            login.find("div.enter_forma > table > tbody > tr:last > td:last > :password").val("");
        });

        $(".id_register_link").click(function(e) {
            e.preventDefault();
            fader.css("display", "block").fadeTo(0, 0.5);
            auth.css("display", "block");
            register_with_email($(this).attr('href'));
        });

        $("#id_forgot_link").click(function(e) {
            e.preventDefault();
            fader.css("display", "block").fadeTo(0, 0.5);
            forgot.css("display", "block");
        });

    /*** LOGIN ***/
        login.hide();

        $("#id_login_close").click(function(e) {
            e.preventDefault();
            login.hide();
            fader.hide();
        });

        $('#id_login_dialog input').keyup(
            function()
            {
                login_error.css("display", "none");
            }
        );

        $('#id_auth_dialog input').keyup(
            function()
            {
                auth_error.css("display", "none");
            }
        );


        $('#id_forgot_dialog input').keyup(
            function()
            {
                forgot_error.css("display", "none");
            }
        );

    // Login submit
        login.find("div.right_pass > :button").click(function(e) {

        // Retrieving input data
            var mail = login.find("div.enter_forma > table > tbody > tr:first > td:last > :text");
            var pass = login.find("div.enter_forma > table > tbody > tr:last > td:last > :password");

        // Validating data
            login_error.html("");
            var valid = true;
            m1 = mail.closest("td").prev("td").find("span");
            m2 = pass.closest("td").prev("td").find("span");
            if (mail.val() == '') {
                m1.addClass("invalid");
                login_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else  {
                m1.removeClass("invalid");
            }

            if (pass.val() == '')  {
                m2.addClass("invalid");
                login_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else {
                m2.removeClass("invalid");
            }

            var pattern = new RegExp(email_regexp);
            if (valid && !pattern.test(mail.val())) {
                m1.addClass("invalid");
                login_error.html(opts.messageInvalidEmail).css("display", "block");
                valid = false;
            } else {
                m1.removeClass("invalid");
            }

            if (!valid) {
                return;
            }

           login.find("div.right_pass > :button").attr('disabled', 'disabled');

        // Sending request
            $.post(
                "/ajax/user_login/",
                {email: mail.val(), password: pass.val(), login: 0},
                function(data) {
                    if (data.length > 0) {
                        pieces = data.split(":", 2);
                        if (pieces[0] == 'OK') {
                            login_success.html(pieces[1]).css("display", "block");
                            redirect_time_out('/');
                        } else if (pieces[0] == 'OK_FIRST_LOGIN') {
                            login_success.html(pieces[1]).css("display", "block");
                            redirect_time_out('/users/edit/');
                        } else if (pieces[0] == 'ERROR') {
                            login_error.html(pieces[1]).css("display", "block");
                        }
                    }
                    login.find("div.right_pass > :button").removeAttr('disabled');
                }
            );
        });

        login.find("input").keyup(function(e) {
            if (e.keyCode == 13) {
    //            login.find("div.right_pass > :button").click();
            }
            return true;
        });

    // Login - remember password
        login.find("div.text_enter > div.password_enter > div.left_pass > ul > li:first").click(function(e) {
            e.preventDefault();
            login.hide();
            forgot.css("display", "block");
            forgot.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(login.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val());
        });

    // Login - register
        login.find("div.text_enter > div.password_enter > div.left_pass > ul > li:last").click(function(e) {
            e.preventDefault();
            login.hide();
            auth.css("display", "block");
            auth.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(login.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val());
        });

    /*** Auth ***/
        auth.hide();

        $("#id_auth_close").click(function(e) {
            e.preventDefault();
            auth.hide();
            fader.hide();
        });

        auth.find("div.right_pass > :button").click(function(e) {

        // Retrieving input
            var mail = auth.find("div.enter_forma > table > tbody > tr:first > td:last > :text");
            var pass1 = auth.find("div.enter_forma > table > tbody > tr:eq(1) > td:last > :password");
            var pass2 = auth.find("div.enter_forma > table > tbody > tr:last > td:last > :password");

        // Validating data
            valid = true;
            auth_error.html("");
            m = mail.closest("td").prev("td").find("span");
            if (mail.val() == '') {
                m.addClass("invalid");
                auth_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else {
                m.removeClass("invalid");
            }

            m = pass1.closest("td").prev("td").find("span");
            if (pass1.val() == '') {
                m.addClass("invalid");
                auth_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else {
                m.removeClass("invalid");
            }

            m2 = pass2.closest("td").prev("td").find("span");
            if (pass2.val() == '') {
                m2.addClass("invalid");
                auth_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else {
                m2.removeClass("invalid");
            }

            if (pass1.val() != pass2.val()) {
                m.addClass("invalid");
                m2.addClass("invalid");
                auth_error.html(auth_error.html() + (auth_error.html() ? '<br>' : '') + opts.messagePasswordMismatch).css("display", "block");
                valid = false;
            } else if (valid) {
                m.removeClass("invalid");
                m2.removeClass("invalid");
            }

            m = mail.closest("td").prev("td").find("span");
            var pattern = new RegExp(email_regexp);
            if (!pattern.test(mail.val())) {
                m.addClass("invalid");
                auth_error.html(auth_error.html() + (auth_error.html() ? '<br>' : '') + opts.messageInvalidEmail).css("display", "block");
                valid = false;
            } else {
                m.removeClass("invalid");
            }

            if (!valid) {
                return;
            }

            auth.find("div.right_pass > :button").attr('disabled', 'disabled');
        // Sending request
            $.post(
                "/ajax/user_register/",
                {email: mail.val(), password: pass1.val(), password_confirm: pass2.val(), register: 0},
                function(data) {
                    if (data.length > 0) {
                        pieces = data.split(":", 2);
                        if (pieces[0] == 'OK') {
                            auth_success.html(pieces[1]).css("display", "block");
                            redirect_time_out('/users/edit/');
                        } else if (pieces[0] == 'ERROR') {
                            auth_error.html(pieces[1]).css("display", "block");
                        }
                    }
                    auth.find("div.right_pass > :button").removeAttr('disabled');
                }
            );
        });

        auth.find("input").keyup(function(e) {
            if (e.keyCode == 13) {
    //            auth.find("div.right_pass > :button").click();
            }
            return true;
        });

        $('.goto_pass_reset').live('click',
            function()
            {
                login.hide();
                auth.hide();
                forgot.show();
                forgot.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val(
                    auth.find("div.enter_forma > table > tbody > tr:first > td:last > :text").val()
                );
                fader.css("display", "block").fadeTo(0, 0.5);
                return false;
            }
        );


    /*** FORGOT ***/
        forgot.hide();

        $("#id_forgot_close").click(function(e) {
            e.preventDefault();
            forgot.hide();
            fader.hide();
        });

        forgot.find("div.right_pass > :button").click(function(e) {
        // Retrieving input
            var mail = forgot.find("div.enter_forma > table > tbody > tr:first > td:last > :text");

        // Validating data
            valid = true;
            m = mail.closest("td").prev("td").find("span");
            if (mail.val() == '') {
                m.addClass("invalid");
                forgot_error.html(opts.messageEmptyFields).css("display", "block");
                valid = false;
            } else {
                m.removeClass("invalid");
            }

            var pattern = new RegExp(email_regexp);
            if (valid) {
                if (!pattern.test(mail.val())) {
                    m.addClass("invalid");
                    forgot_error.html(opts.messageInvalidEmail).css("display", "block");
                    valid = false;
                } else {
                    m.removeClass("invalid");
                }
            }

            if (!valid) {
                return;
            }

            forgot.find("div.right_pass > :button").attr('disabled', 'disabled');
        // Sending request
            $.post(
                "/ajax/user_password_reset/",
                {email: mail.val(), reset: 0},
                function(data) {
                    if (data.length > 0) {
                        pieces = data.split(":", 2);
                        if (pieces[0] == 'OK') {
                            forgot_success.html(pieces[1]).css("display", "block");
                            redirect_time_out('/', REDIRECT_TIMEOUT);
                        } else if (pieces[0] == 'ERROR') {
                            forgot_error.html(pieces[1]).css("display", "block");
                        }
                    }
                    forgot.find("div.right_pass > :button").removeAttr('disabled');
                }
            );
        });

        forgot.find("input").keyup(function(e) {
            if (e.keyCode == 13) {
    //            forgot.find("div.right_pass > :button").click();
            }
            return true;
        });

        $("a[href^='/#']").click(function(event){
            register_with_email($(this).attr('href'));
        });
    }
//PROBLEM
    var problem = $("#id_problem_dialog");
    var problem_error = problem.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
    var problem_success = problem.find("div.text_enter > div.text_enter_forma > div.success_enter > div.success_enter_2");
    problem_error.hide();
    problem_success.hide();
    $("#id_problem_link").click(function(e) {
        e.preventDefault();
        fader.css("display", "block").fadeTo(0, 0.5);
        problem.css("display", "block");
    });
    $(document).keyup(
        function (e)
        {
            if (e.keyCode == 27) {
                $("#id_login_close").click();
                $("#id_auth_close").click();
                $("#id_forgot_close").click();
                $("#id_problem_close").click();
                $("#id_bad_object_close").click();
            }
        }
    );
    $('#id_problem_dialog input').keyup(
        function()
        {
            problem_error.css("display", "none");
        }
    );
    problem.hide();

    $("#id_problem_close").click(function(e) {
        e.preventDefault();
        problem.hide();
        fader.hide();
    });

    problem.find("div.right_pass > :button").click(function(e) {

    // Retrieving input
        var mail = problem.find("#problem_email");
        var text = problem.find("#problem_text");
        var page = problem.find("#problem_page");

    // Validating data
        problem_error.html("");
        m = $('#problem_text_label');
        if (text.val() == '') {
            m.addClass("invalid");
            problem_error.html(opts.messageInputText).css("display", "block");
        } else {
            m.removeClass("invalid");
        }

        m = $('#email_label');
        var pattern = new RegExp(email_regexp);
        if (mail.val() && !pattern.test(mail.val())) {
            m.addClass("invalid");
            problem_error.html(problem_error.html() + (problem_error.html() ? '<br>' : '') + opts.messageInvalidEmail).css("display", "block");
        } else {
            m.removeClass("invalid");
        }

        if (problem_error.html()) {
            return;
        }
        else
        {
            problem_error.hide();
        }

        problem.find("div.right_pass > :button").attr('disabled', 'disabled');
    // Sending request
        $.post(
            "/ajax/submit_problem/",
            {email: mail.val(), text: text.val(), page: page.val()},
            function(data) {
                if (data.length > 0) {
                    pieces = data.split(":", 2);
                    if (pieces[0] == 'OK') {
                        problem_success.html(pieces[1]).css("display", "block");
                    } else if (pieces[0] == 'ERROR') {
                        problem_error.html(pieces[1]).css("display", "block");
                    }
                }
                problem.find("div.right_pass > :button").removeAttr('disabled');
            }
        );
    });
    problem.find("input, textarea").keyup(function(e) {
        if (e.keyCode == 13) {
            return false;
        }
        return true;
    });
//BAD OBJECTS
    var bad_object = $("#id_bad_object_dialog");
    var bad_object_error = bad_object.find("div.text_enter > div.text_enter_forma > div.error_enter > div.error_enter_2");
    var bad_object_success = bad_object.find("div.text_enter > div.text_enter_forma > div.success_enter > div.success_enter_2");
    bad_object_error.hide();
    bad_object_success.hide();
    $(".bad-object").click(function(e) {
        e.preventDefault();
        fader.css("display", "block").fadeTo(0, 0.5);
        bad_object.css("display", "block");
    });
    $('#id_bad_object_dialog input').keyup(
        function()
        {
            bad_object_error.css("display", "none");
        }
    );
    bad_object.hide();

    $("#id_bad_object_close").click(function(e) {
        e.preventDefault();
        bad_object.hide();
        fader.hide();
    });
    bad_object.find("input, textarea").keyup(function(e) {
        if (e.keyCode == 13) {
            return false;
        }
        return true;
    });

    bad_object.find("div.right_pass > :button").click(function(e) {

    // Retrieving input
        var mail = bad_object.find("#bad_object_email");
        var text = bad_object.find("#bad_object_text");
        var object = bad_object.find("#bad_object_id");
        var user = bad_object.find("#bad_object_user_id");
        var option = bad_object.find("input:radio[name='bad_object_option']:checked");

    // Validating data
        bad_object_error.html("");
        m = $('#email_label');
        var pattern = new RegExp(email_regexp);
        if (mail.val() && !pattern.test(mail.val())) {
            m.addClass("invalid");
            bad_object_error.html(bad_object_error.html() + (bad_object_error.html() ? '<br>' : '') + opts.messageInvalidEmail).css("display", "block");
        } else {
            m.removeClass("invalid");
        }

        if (bad_object_error.html()) {
            return;
        }
        else
        {
            bad_object_error.hide();
        }

        bad_object.find("div.right_pass > :button").attr('disabled', 'disabled');
    // Sending request
        $.post(
            "/ajax/submit_bad_object/",
            {
                email: mail.val(), text: text.val(), object_id: object.val(),
                user_id: user.val(), bad_option: option.val()
            },
            function(data) {
                if (data.length > 0) {
                    pieces = data.split(":", 2);
                    if (pieces[0] == 'OK') {
                        bad_object_success.html(pieces[1]).css("display", "block");
                    } else if (pieces[0] == 'ERROR') {
                        bad_object_error.html(pieces[1]).css("display", "block");
                    }
                }
                bad_object.find("div.right_pass > :button").removeAttr('disabled');
            }
        );
    });
}

function register_with_email(url)
{
    if (!url)
    {
        url = document.location.toString();
    }
    if (url.match('#')) { // the URL contains an anchor
      var anchor = url.split('#')[1];
      var pattern = new RegExp(email_regexp);
      if (pattern.test(anchor))
      {
          var mail = $("#id_auth_dialog").find("div.enter_forma > table > tbody > tr:first > td:last > :text");
          mail.val(anchor);
          $(".id_register_link").click();
      }
    }
}

$(document).ready(
    function()
    {
        if ($('.auth_default').length)
        {
            $('.auth_default').focus(
                function()
                {
                    if ($(this).val() == $(this).attr('alt'))
                    {
                        $(this).val('');
                    }
                }
            );
            $('.auth_default').blur(
                function()
                {
                    if ($(this).val() == '')
                    {
                        $(this).val($(this).attr('alt'));
                    }
                }
            );
        }
    }
);
