$(function() {
    $("#login").click( function() {
        return $("#loginDivup").is(":hidden") ? login.open() : login.close();
    });

    $("#register, #registerNow").click( function() {
        return $("#registerDivup").is(":hidden") ? register.open() : register.close();
    });

    login.init();
    register.init();
    home.init();
});

var login = {

    init: function() {
        global.login = false;

        // Blue border for the text fields on focus
        $("#frmLogin input").focusBorder();

        // Call login() if enter is pressed on the loginId or password fields
        $("#frmLogin input").enterPress(function() {
            return login.login();
        });

        // Call login() when the login button is clicked
        $("#btnLogin").click(function() {
            return login.login();
        });

        // Everytime the page is inited, show the error. In case of no error, there will be no div, so nothing will happen
        $("#divFrmLogin div.error").fadeIn("slow");

        forgotPassword.init();
        forgotLoginId.init();
    },

    /**
     * Opens a login divup. If a register divup is already open, it closes that first.
     * Position to open will be given when "save alert", "bookmark search" etc functionality is requesting login.
     */
    open: function() {
        $("#registerDivup").hide();
        $("#loginDivup").bgiframe().show();
        $("#frmLogin").focusFirst();
        return false;
    },

    /**
     * Closes a login divup. If the divup's form has some validation errors, then it resets the form and clears
     * the errors first before closing.
     */
    close: function() {
        global.action = null; global.actionArgs = null;
        $("#loginDivup").resetFormAndError().hide();
        $("#loginDivup .forgotDetails").hide();
        $("#divFrmForgotPassword").resetFormAndError().hide();
        $("#divFrmForgotLoginId").resetFormAndError().hide();
        $("#loginDivup").loadingHide("loadingText");
        return false;
    },

    /*
     * When return is pressed or the login button is clicked, validate the form, and when the validation is
     * successful, submit the form the server.
     */
    login: function() {
        var validator = $("#frmLogin").validate(rules.login);

        if(validator.form()) {
            $("#loginDivup").loadingShow({text: "Verifying..."}, "loadingText");
            $("#frmLogin").ajaxSubmit({
                s: function() { // Server-Side Validtion success
                    $("#loginDivup").loadingShow({text:"Logging In..."}, "loadingText");
                    if(global.action) {
                        global.action.apply(this, global.actionArgs);
                        global.action = global.actionArgs = null; global.login = true;
                        login.close();
                        $.ajax({
                            url: "/login.page", data: "action=showMainMenu",
                            s: function(d) {
                                $("#mainMenu").html(d);
                            }
                        });
                    } else {
                        location.href="/my.page";
                    }
                },
                e: function(data) { // Server-Side Validation Error
                    $("#loginDivup").loadingHide("loadingText");
                    $("#divFrmLogin").html(data);
                    login.init();
                }
            });
        }
        return false;
    }
};

var forgotPassword = {
    init: function() {
        // Blue border for the text fields on focus
        $("#frmForgotPassword input").focusBorder();

        $("#forgotPassword").click(function() {
            return forgotPassword.open();
        });

        $("#frmForgotPassword input").enterPress(function() {
            return forgotPassword.retrieve();
        });
        $("#btnSendForgotPassword").click(function() {
            return forgotPassword.retrieve();
        });
        $("#btnCancelForgotPassword").click(function() {
            return forgotPassword.close();
        });

        $("#divFrmForgotPassword div.error").fadeIn("slow");
    },

    open: function() {
        forgotLoginId.close();
        $("#divFrmForgotPassword").show();
        $("#frmForgotPassword").focusFirst();
        return false;
    },

    close: function() {
        $("#divFrmForgotPassword").resetFormAndError().hide();
        $("#frmLogin").focusFirst();
        return false;
    },

    retrieve: function() {
        var validator = $("#frmForgotPassword").validate(rules.forgotPassword);

        if(validator.form()) {
            $("#loginDivup").loadingShow({text: "Verifying..."}, "loadingText");
            $("#frmForgotPassword").ajaxSubmit({
                complete: function(xhr) {
                    $("#loginDivup").loadingHide("loadingText");
                    $("#divFrmForgotPassword").html(xhr.responseText);
                    forgotPassword.init();
                }
            });
        }
        return false;
    }
};

var forgotLoginId = {
    init: function() {
        // Blue border for the text fields on focus
        $("#frmForgotLoginId input").focusBorder();

        $("#forgotLoginId").click(function() {
            return forgotLoginId.open();
        });

        $("#frmForgotLoginId input").enterPress(function() {
            return forgotLoginId.retrieve();
        });
        $("#btnSendForgotLoginId").click(function() {
            return forgotLoginId.retrieve();
        });
        $("#btnCancelForgotLoginId").click(function() {
            forgotLoginId.close();
        });
        $("#divFrmForgotLoginId div.error").fadeIn("slow");
    },

    open: function() {
        forgotPassword.close();
        $("#divFrmForgotLoginId").show();
        $("#frmForgotLoginId").focusFirst();
        return false;
    },

    close: function() {
        $("#divFrmForgotLoginId").resetFormAndError().hide();
        $("#frmLogin").focusFirst();
        return false;
    },

    retrieve: function() {
        var validator = $("#frmForgotLoginId").validate(rules.forgotLogin);

        if (validator.form()) {
            $("#loginDivup").loadingShow({text: "Verifying..."}, "loadingText");
            $("#frmForgotLoginId").ajaxSubmit({
                complete: function(xhr) {
                    $("#loginDivup").loadingHide("loadingText");
                    $("#divFrmForgotLoginId").html(xhr.responseText);
                    forgotLoginId.init();
                }
            });
        }
        return false;

    }
};

var register = {
    loginIdVal: "",
    loginAvail: false,

    /**
     * Opens a register divup. If a login divup is already open, it closes that first.
     */
    open: function() {
        $("#loginDivup").hide();
        $("#registerDivup").bgiframe().show();
        $("#frmRegister").focusFirst();
        return false;
    },

    /**
     * Closes a register divup. If the divup's form has some validation errors, then it resets the form and clears
     * the errors first before closing.
     */
    close: function() {
        global.action = null; global.actionArgs = null;
        if(!$.util.isBlank($("#loginId").val())) {
            $("#loginAvailability").html("None Entered").removeClass("available").removeClass("notAvailable");
            register.loginAvail = false;
        }

        $("#registerDivup").resetFormAndError().hide();
        return false;
    },

    /*
     * attaches all the events for register divup including external(eg: click of register link results in
     * divup being shown), and internal (validation event, login availability event etc).
     */
    init: function() {
        var frmRegisterInput = $("#frmRegister input, #frmRegister select");
        frmRegisterInput.help("#hlpRegister", {hide:false});

        frmRegisterInput.focus(function() { $(this).addClass("focus"); })
                        .blur (function() { $(this).removeClass("focus"); } );

        this.initLoginAvailEvent();
        this.initRegisterEvent();
    },

    /*
     * attaches an event on blur of the loginId input to check if the login is available via ajax.
     */
    initLoginAvailEvent: function() {
        var loginId = $("#frmRegister #loginId"), lblLoginAvail = $("#loginAvailability");
        if(this.loginAvail) lblLoginAvail.html("Available").addClass("available");
        loginId.blur(function() {
            if(loginId.val() != this.loginIdVal) {
                this.loginIdVal = $.trim(loginId.val());
                if(this.loginIdVal == '' || !$.util.isIdentifier(this.loginIdVal) || this.loginIdVal.length < 6) { // Nothing is entered in the login id field
                    lblLoginAvail.html("None Entered").removeClass("available").removeClass("notAvailable");
                    lblLoginAvail.html("None Entered").removeClass("available").removeClass("notAvailable");
                    register.loginAvail = false;
                } else { // Something is entered in the login id field
                    lblLoginAvail.html("Checking Availability...").removeClass("available").removeClass("notAvailable");
                    $.ajax({
                        url: "/user.page?action=isLoginIdAvailable",
                        data: "&loginId=" + this.loginIdVal,
                        s: function() { // Entered login id is available
                            lblLoginAvail.html("Available").addClass("available").removeClass("notAvailable");
                            register.loginAvail = true;
                        },
                        e: function() { // Entered login id is unavailable
                            lblLoginAvail.html("Unavailable").addClass("notAvailable").removeClass("available");
                            register.loginAvail = false;
                        }
                    });
                }
            }
        });
    },

    /*
     * Attempts validation and registraton when return is pressed or register is clicked.
     */
    initRegisterEvent: function() {
        $("#frmRegister input, #frmRegister select").enterPress(function() {
            return register.register();
        });
        $("#btnRegister").click( function() {
            return register.register();
        });
    },

    /*
     * When the return is pressed, or the register button is clicked, validate the form, and when the validation
     * is successful submit the form
     */
    register: function() {
        var validator = $("#frmRegister").validate(rules.register);

        if(validator.form()) {
            if(register.loginAvail) { // Submit request only of login id is available
                $("#registerDivup").loadingShow({text:"Registering..."}, "loadingText");
                $("#frmRegister").ajaxSubmit({
                    s: function(data) { // Server-Side Validtion success
                        $("#registerDivup").loadingShow({text:"Logging In..."}, "loadingText");
                        if(global.action) {
                            global.action.apply(global.actionArgs);
                            global.action = global.actionArgs = null; global.login = true;
                            register.close();
                            $.ajax({
                                url: "/login.page", data: "action=showMainMenu",
                                s: function(d) {
                                    $("#mainMenu").html(d);
                                }
                            });
                        } else {
                            location.href="/my.page";
                        }
                    },
                    e: function(data) { // Server-Side Validation Error
                        $("#registerDivup .s").html(data);
                        register.init();
                    }
                });
            }
        }
        return false;
    }
};

var home = {

    init: function() {
        $("#homeVirtualWalkthru").show();
        $(".homeButton").mouseover(function() {
            $(".homeButton").removeClass("homeButtonSelected");
            $(this).addClass("homeButtonSelected");

            $("div.homeMenuItem").hide();
            $(this).next("div.homeMenuItem").show();
        });
    }
};