// авторизация
(function() {

    var renderAuthEl = function(r, notifyFlag) {

        var el = $("#auth"), wf = false;
        if (el.length == 0) {
            el = $("#auth-widget");
            if (el.length > 0) wf = true;
        }
        var tab = "<span class=\"tab\">|</span>";

        if (r !== false) {

            el.empty();

            el.appendText(r.login);
            if (r.status == -1) {
                el.appendText(" (требуется активация)");
            }

            if (r.status == 1 && wf !== true) {

                el.append(tab).append(

                    $("<a/>").attr("href", myterra.link("userprofile"))
                        .text("мой профиль")

                )

            }

            el.append(tab).append(

                $("<a href=\"#\"/>").text("выход").click(function() {
                    return myterra.userLogout();
                })

            );

        } else {

            el.text("").append(

                $("<a/>").attr("href", "#").click(function(e) {
                    myterra.userLogin({
                        title: "Вход в систему"
                    });
                    return false;
                }).text("войти")

            ).append(tab).append(

                $("<a href=\"#\"/>").click(function(e) {
                    showAuthForm({
                        title: "Регистрация",
                        activeTab: 1
                    })
                    return false;

                }).text("регистрация")

            );

        }

        if (notifyFlag === true) {
            myterra.fireEvent("login", r);
        }

    };

    var tpl = "<div class=\"mt-authform\">"
        + "<div class=\"leftcol\" id=\"tabs\" />"
        + "<div class=\"rightcol\" id=\"panels\" />" + "</div>";

    var panels_data = [

    {
        code: "streetjournal",
        title: "Аккаунт на StreetJournal.org",
        tpl: "<form>"
            + "  <div class=\"row\">"
            + "    E-mail<br/>"
            + "    <input type=\"text\" name=\"email\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>"
            + "  <div class=\"row\">"
            + "    Пароль<br/>"
            + "    <input type=\"password\" name=\"password\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>"
            + "  <div class=\"row\">"
            + "    <a href=\"#\" id=\"restorepass\" style=\"color:#a0a0ff;\">Забыли пароль?</a>"
            + "  </div>"
            + "  <div class=\"row\">"
            + "    <a href=\"#\" id=\"register\" style=\"color:#a0a0ff\">Не зарегистрированы?</a>"
            + "  </div>" // ----------------------------------
            + "  <div class=\"row\" id=\"remflag_control\" />"
            + "  <div class=\"row\">"
            + "    <input type=\"submit\" value=\"Войти\" class=\"button\"/>"
            + "    <input type=\"reset\" value=\"Отмена\" class=\"button\"/>"
            + "  </div></form>"
    },

    {
        code: "register",
        title: "Регистрация",
        tpl: "<form>"
            + "  <div class=\"row\">"
            + "    Ваше имя<br/>"
            + "    <input type=\"text\" name=\"login\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>"
            + "  <div class=\"row\">"
            + "    E-mail<br/>"
            + "    <input type=\"text\" name=\"email\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>"
            + "  <div class=\"row\">"
            + "    Пароль<br/>"
            + "    <input type=\"password\" name=\"password\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>" // ----------------------------------
            + "  <div class=\"row\">"
            + "    Повторите ввод пароля<br/>"
            + "    <input type=\"password\" name=\"password2\" class=\"edit textinput\"/>"
            + "    <div style=\"clear:left;\"/>"
            + "  </div>" // ----------------------------------
            + "  <div class=\"row\">"
            + "    <input type=\"submit\" value=\"Зарегистрироваться\" class=\"button\"/>"
            + "    <input type=\"reset\" value=\"Отмена\" class=\"button\"/>"
            + "  </div></form>"
    }

    ];

    var tpl1 = "<form>"
        + "  <div class=\"row\">" // ---------------
        + "    Адрес электронной почты<br/>"
        + "    <input type=\"text\" name=\"email\" class=\"edit textinput\"/>"
        + "    <div style=\"clear:left;\" />"
        + "  </div>" // ----------------------------
        + "  <div class=\"row\">"
        + "    <input type=\"submit\" value=\"Отправить\" class=\"button\"/>"
        + "    <input type=\"reset\" value=\"Отмена\" class=\"button\"/>"
        + "  <div></form>";

    /**
     * Вызов формы восстановления пароля.
     * opts = {
     *   callback: function(success, result) // (emtyFn)
     * }
     */
    var showRestorePassDialog = function(opts) {

        opts = myterra.applyIf(opts, {});
        opts.callback = opts.callback || myterra.emptyFn;

        var el = $(tpl1).attr("autocomplete", "off");

        el.submit(function(e) {

            var data = myterra.apply(myterra.formData(el), {
                action: "restorepassword"
            });

            myterra.doAction("register_json", {
                data: data,
                callback: function(s, r) {
                    if (s === true) {
                        dialog.hide(true);
                        myterra.showMessage(
                        "На указанный Вами адрес электронной почты"
                            + " было отправлено письмо со ссылкой"
                            + " для подтверждения создания нового пароля.",
                        function() {
                            dialog.close();
                        });
                    }
                }
            });
            return false;
        });

        var dialog = new myterra.DialogWindow(el, {
            title: "Восстановление пароля",
            modal: true
        });
        dialog.setCloseOnHide(true);
        dialog.show();
        myterra.formatElements();

        dialog.addListener("close", function() {
            opts.callback(false);
        });

        $("input:reset", el).click(function(e) {
            dialog.close();
            return false;
        });

        $("input[name=email]", el).focus();

    };

    var showAuthForm = function(opts) {

        opts = myterra.applyIf(opts, {
            activeTab: 0,
            allowRegister: false
        });
        opts.callback = opts.callback || myterra.emptyFn;

        var rootEl = $(tpl), el = rootEl;
        var sb, cb, login, password, remflag;

        var disableButtons = function(f) {
            var tmp = $("input[type=submit],input[type=reset]", rootEl);
            if (f === true) {
                tmp.attr("disabled", "yes");
            } else {
                tmp.removeAttr("disabled");
            }
        };

        // Создадим панели
        var tabsEl = $("#tabs", el), panelsEl = $("#panels", el);
        var panels = [], i, len, tmp;
        for (i = 0, len = panels_data.length; i < len; i++) {
            tmp = panels_data[i];
            panels.push(new myterra.Panel($(tmp.tpl).appendTo(panelsEl), {
                title: tmp.title
            }));
        }

        // Скроем и отключим автозаполнение
        $("form", panelsEl).attr("autocomplete", "off").addClass("hidden");

        var T = new myterra.TabBar(tabsEl, panels);
        T.addListener("change", function(tabBar, tab, index) {
            var tmp = $("input,textarea", tab.el);
            if (tmp.length > 0) {
                tmp[0].focus();
            }
        }, this);

        var waitForLogin = (function() {

            var id = null;

            return function() {

                if (id != null) {
                    clearInterval(id);
                }

                var c = "authprocess=" + new Date().getTime();
                var re = new RegExp(c, "i");
                document.cookie = c + "; path=/";

                id = setInterval(function() {
                    if (!re.exec(document.cookie)) {
                        clearInterval(id);
                        myterra.doAction("login_json", {
                            data: {
                                action: "ping"
                            },
                            callback: function(s, r) {
                                if (s === true) {
                                    renderAuthEl(r, true);
                                    dialog.close();
                                    opts.callback(true, r);
                                }
                            },
                            quiet: true
                        });
                    }
                }, 1000);
            };

        })();

        /*
        $("<a href=\"#\"/>").text("ВКонтакте").click(function() {
            waitForLogin();
            window
                .open(myterra.link("authservice?vk"),
                    "Авторизация через vkontakte.ru",
                    "width=400,height=200,location=no,toolbar=no,directories=no,menubar=no");
            return false;
        }).appendTo(tabsEl);
        */

        $("<a href=\"#\" class=\"loginza\" />")
            .append("<span>или Вы можете войти, используя Ваш аккаунт на</span>")
            .append("<br/><br/>").append("<img src=\""
                + myterra.staticLink("images/yandex.png") + "\"/>")
            .append("<img src=\"" + myterra.staticLink("images/openid.png")
                + "\"/>").append("<img src=\""
                + myterra.staticLink("images/vkontakte.png") + "\"/>")
            .append("<img src=\"" + myterra.staticLink("images/facebook.png")
                + "\"/>").append("<img src=\""
                + myterra.staticLink("images/twitter.png") + "\"/>").click(
            function() {
                waitForLogin();
                window
                    .open(myterra.link("authservice?loginza&url="
                            + document.location.toString()),
                        "Авторизация через loginza.ru",
                        "width=400,height=200,location=no,toolbar=no,directories=no,menubar=no");
                return false;
            }).appendTo(tabsEl);

        // Сконфигурируем панели:

        // StreetJournal
        var form0 = panels[0].el;

        var remflag = new myterra.Checkbox($("#remflag_control", form0), {
            caption: "чужой компьютер"
        });

        form0.submit(function(e) {
            disableButtons(true);
            var data = myterra.apply(myterra.formData(this), {
                remflag: remflag.getChecked() === true
            });
            myterra.action("login_json", data, function(s, r) {
                disableButtons(false);
                if (s === true) {
                    dialog.close();
                    renderAuthEl(r, true);
                    opts.callback(true, r);
                }
            });
            return false;
        });

        $("#restorepass", form0).click(function() {
            dialog.hide(true);
            showRestorePassDialog({
                callback: function() {
                    dialog.show();
                }
            });
            return false;
        });

        $("#register", form0).click(function() {
            T.setActive(1);
            return false;
        });

        $("input:reset", form0).click(function(e) {
            dialog.close();
            return false;
        });

        // Новый пользователь
        var form1 = panels[1].el;
        form1.submit(function(e) {
            disableButtons(true);
            var data = myterra.formData(this);
            myterra.action("register_json", data, function(s, r) {
                disableButtons(false);
                if (s === true) {
                    dialog.close();
                    ping();
                    myterra.showMessage(
                    "На ваш адрес электронной почты отправлено"
                        + " письмо со ссылкой для активации аккаунта.",
                    function() {
                        opts.callback(true, r);
                    });
                }
            });
            return false;
        });
        $("input:reset", form1).click(function(e) {
            dialog.close();
            return false;
        });

        // -------------------

        var dialog = new myterra.DialogWindow(rootEl, {
            title: opts.title || "Вход в систему",
            modal: true
        });
        dialog.setCloseOnHide(true);
        dialog.show();
        myterra.formatElements();

        dialog.addListener("close", function() {
            opts.callback(false);
        });

        T.setActive(opts.activeTab, true);

    };

    myterra.applyIf(myterra, {

        /**
         * Вызов формы авторизации.
         * opts = {
         *   title: string, // заголовок формы ("Вход в систему")
         *   activeTab: number, // индекс активной закладки (0)
         *   callback: function(success, result) // (emptyFn) 
         * }
         */
        userLogin: function(opts) {
            showAuthForm(opts);
            return false;
        },

        /**
         * Выход из системы.
         */
        userLogout: function() {
            myterra.action("login_json", {
                action: "logout"
            }, function(s, r) {
                if (s === true && r === true) {
                    renderAuthEl(false, true);
                    if (myterra.fireEvent("logout") !== false) {
                        document.location.reload();
                    }
                }
            });
            return false;
        }

    });

    // Пинг для поддержания сессии и обновления информации о текущем пользователе
    var ping = function(notifyFlag) {
        myterra.doAction("login_json", {
            data: {
                action: "ping"
            },
            callback: function(s, r) {
                if (s === true) {
                    renderAuthEl(r, notifyFlag);
                } else {
                    if (notifyFlag) {
                        renderAuthEl(false, notifyFlag);
                    }
                }
            },
            quiet: true
        });
    };

    $(function() {
        ping(true);
        setInterval(ping, 60 * 1000);
    });

})();
