var XToolbar = function() {
    // ----
    // classes

    var UserModel = Xteam.Model;

    // ----

    return {
        elm: null,
        user_model: null,

        setup: function() {
            var elm = this.elm = $('#x-company-toolbar');

            // create the user model
            this.user_model = new UserModel({is_loaded: false});

            // watch changes in the user model
            this.user_model.addOwner(this.handleUserEvent);

            this.detectUser();
            this.setupEvents();
        },

        /**
         * Handle a change in the user model
         */
        handleUserEvent: function(event, changes) {
            var self = XToolbar;
            $.each(changes, function(field, value) {
                       if (field == 'username') {
                           self.loginAs(value);
                           return true;
                       }
                       else if (field == 'is_loaded' && value == true) {
                           self.elm.pickClass('show_', 'status');
                       }
                   });

            return true;
        },

        setupEvents: function() {
            var elm = this.elm;
            var self = this;

            // switch to login
            elm.find('.toggle.login')
                .click(function(event) {
                           event.preventDefault();
                           elm.pickClass('show_', 'login');
                       });

            // switch to forgot password
            elm.find('.toggle.forgotpassword')
                .click(function(event) {
                           event.preventDefault();
                           elm.pickClass('show_', 'forgot_password');
                       });

            // toggle openid mode
            elm.find('.toggle.openid')
                .click(function(event) {
                           event.preventDefault();
                           elm.toggleClass('use_openid');
                       });

            // set the action on the 'forgot password' form
            elm.find('form.password')
                .submit(function(event) {
                            event.preventDefault();
                            self.handleForgotPasswordSubmit();
                        });

            // Watch the logout
            $('.logout a').live('click', this.handleLogoutClick);

            if ($.browser.msie) {
                $('.x-company-network').hover(function() { $(this).addClass('hover'); },
                                              function (){ $(this).removeClass('hover'); });
            }

            this.setupForms();
        },

        setupForms: function() {
            // login form
            var self = this;
            this.elm.find('form.login, form.openid')
                .each(function() {
                          $(this).validate(
                              {
                                  ignore: 'input:not(:visible)',
                                  rules: {
                                      username: {
                                          required: true
                                      },
                                      password: 'required',
                                      openid_identifier: 'url'
                                  },
                                  submitHandler: function() {
                                      return self.handleLoginSubmit
                                          .apply(self, arguments);
                                  }
                              }
                          );
                      });
        },

        loadToolbar: function() {
            var self = this;
            $.ajax(
                {url: "/src/toolbar/load.php",
                 dataType: "json",
                 success: function(response) {
                     // insert buttons
                     self.elm.find('.user_actions ul')
                         .prepend(response.user_actions_html);
                 },

                 error: function(reason) {
                     console.error(arguments);
                 }
                });
        },

        detectUser: function() {
            var self = this;

            // Check for session on remote server.
            $.ajax({
                url: Config.sso_url + 'get_session?callback=?',
                dataType: 'json',
                success: self.checkSessionResponse,
                error: function(reason) {
                    // on error, just ask our local server if we are logged in
                    $.ajax({
                       dataType: 'json',
                       url: 'src/order/check_login.php',
                       success: function(data) {
                           self.user_model.update({username: data.username || null});
                       },
                       complete: function() {
                           // in any case, we've finished detecting the user
                           self.user_model.update({is_loaded: true});
                       }
                   });
                }
            });

        },

        checkSessionResponse: function(response) {
            var self = XToolbar;

            if (response.status == 'active') {
                $.ajax({
                    url: 'src/order/session_login.php',
                    dataType: 'json',
                    data: {
                        session_id: response.session_id
                    },
                    success: self.handleLoginResponse,
                    complete: function() {
                        self.user_model.update({is_loaded: true});
                    }
                });
            }
            else {
                $.ajax({
                    url: 'src/order/logout.php',
                    complete: function() {
                        self.user_model.update({is_loaded: true,
                                                username: null});
                    }
                });
            }
        },

        enterLoadingState: function() {
            this.elm.addClass('loading');
        },

        exitLoadingState: function() {
            this.elm.removeClass('loading');
        },

        handleLoginSubmit: function(form, event) {
            event.preventDefault();

            this.enterLoadingState();
            $(form).find('.buttons').append(this.elm.find('.loading-msg'));

            var self = this;
            $(form).ajaxSubmit(
                {
                    dataType: 'json',
                    success: function(data) {
                        self.handleLoginResponse(data);
                    },

                    error: function() {
                        self.showLoginFailure();
                    },

                    complete: function() {
                        self.exitLoadingState();

                        // clear the password field
                        $(form).find('input[name=new_password]').val('');
                    }
                }
            );
        },

        handleLoginResponse: function(data) {
            var self = XToolbar;
            if (data.result == 'success') {
                self.user_model.update({username: data.username});
                $.ajax({
                           url: Config.sso_url + 'change_session',
                           dataType: 'jsonp',
                           data: {
                               site_url:  Config.site_domain + '/src/pages',
                               session_id: $.cookie('PHPSESSID')
                           }
                       });
            }
            else {
                self.showLoginFailure();
            }
        },

        handleLogoutClick: function(e) {
            e.preventDefault();
            var self = XToolbar;
            $.ajax({
                url: 'src/order/logout.php',
                complete: function() {
                    self.user_model.update({username: null});
                    $.ajax({
                        url: Config.sso_url + 'change_session&callback=?',
                        dataType: 'jsonp'
                    });
                }
            });
        },

        showLoginFailure: function() {
            this.elm
                .find('form.login fieldset').addClass('warning')
                .find('div.field:eq(0)').addClass('warning');
        },

        loginAs: function(username) {
            this.setUsername(username);
            this.elm
                .setClass('logged_in', !!username)
                .pickClass('show_', 'status');

            if (username) {
                // load buttons
                this.loadToolbar();
            }
        },

        setUsername: function(value) {
            this.elm.find('.username').text(value);
        },

        handleForgotPasswordSubmit: function() {
            var form = this.elm.find('form.password');
            var email = form.find('input[name=email]').val();

            var self = this;
            $.ajax(
                {url: Config.local_forgot_password_api,
                 type: 'POST',
                 dataType: 'json',
                 data: {email: email},
                 success: function(response) {
                     self.handleForgotPasswordResponse(response);
                 },
                 error: function() {
                     console.error(arguments);
                 }
                });
        },

        handleForgotPasswordResponse: function(response) {
            if (response.message) {
                this.showResult(response.result, response.message);
            }
            else {
                this.showResult("error", "Sorry, an error occurred and we can't reset your password at this time.  Please try again in a little while.");
            }
        },

        showResult: function(type, message) {
            var resultElm = this.elm.find('.result');
            resultElm
                .pickClass("type_", type)
                .find('.message')
                .text(message);

            // show the result state
            this.elm.pickClass('show_', 'login_result');
        }
    };
}();

