var User = function() {
  var COOKIE_SESSION_TOKEN = "builder_session_token";
  var user_object;
  var session_token;
  var login_success_callback;
  var loginUrl = "http://login.cooliris.com/ui/choose";
  var myPath = location.href.substring(0,location.href.lastIndexOf("/")+1);
  
  var showLoggedInUI = function() {
    $(".logged-in-name").text(User.getName());
    $(".logged-in-fname").text(User.getFirstName());
    $(".logged-out").hide();
    $(".logged-in").show();
  };

  var showLoggedOutUI = function() {
    $(".logged-in").hide();
    $(".logged-out").show();
  };
  
  var showLogin = function() {
    $('#loginDialogBG').show();
    $("#loginDialog").css({  
      "position": "absolute",  
      "top":  $(window).height() / 2 - $('#loginDialog').height() / 2,  
      "left": $(window).width() / 2 - $('#loginDialog').width() / 2  
    });  
    $('#loginDialog').show();
  };

  var hideLogin = function() {
    $('#loginDialogBG').hide();
    $('#loginDialog').hide();
  };
  
  $(function(){
    $(".login-link").click(function(){
      if ($(this).hasClass("do-reload")) {
        User.doLogin(function(){window.location.reload(0);});
      }
      else {
        User.doLogin();
      }
      return false;
    });
    $(".logout-link").click(function(){
      if ($(this).hasClass("do-reload")) {
        User.doLogout(function(){window.location.reload(0);});
      }
      else {
        User.doLogout();
      }
      return false;
    });

    $("#loginDialog a.close_button").click(function(event){
      event.preventDefault();
      hideLogin();
    });
    $("#loginDialog a.continue").click(function(event){
      event.preventDefault();
      hideLogin();
    });

  });
  
  return {
    getInstance: function() {
        return user_object;
    },
    
    init: function(callback) {
      // if ($.cookie("sid")) {
      //   $.cookie(COOKIE_SESSION_TOKEN, $.cookie("sid"));
      // }
      
      if (this.isLoggedIn()) {
        session_token = $.cookie(COOKIE_SESSION_TOKEN);
        Messaging.getUser(
          session_token,
          function(response) {
            if (response.get_user_response) {
              user_object = response.get_user_response.user;
              showLoggedInUI();
              if (typeof callback === "function") {
                callback();
              }
            } 
            else {
              showLoggedOutUI();
              if (typeof callback === "function") {
                callback();
              }
            }
          }
        );
      }
      else {
        showLoggedOutUI();
        if (typeof callback === "function") {
          callback();
        }
      }
    },
    
    getSessionToken: function() {
      return $.cookie(COOKIE_SESSION_TOKEN);
    },
    
    getName: function() {
      if (user_object) {
        return user_object.first_name + " " + user_object.last_name;
      }
      else {
        return "Guest";
      }
    },
    
    getFirstName: function() {
      if (user_object) {
        return user_object.first_name;
      }
      else {
        return "Guest";
      }
    },

    isLoggedIn: function() {
      return !!($.cookie(COOKIE_SESSION_TOKEN));
    },
    
    doLogin: function(callback) {
      $("#login-iframe").attr("src", loginUrl + "?responseUrl=" + myPath + "success.html");
      showLogin();
      if (typeof callback === "function") {
        login_success_callback = callback;
      }
    },
    
    doSuccessPageCallback: function(query) {
      var params = explodeQueryString(query.substr(1));
      console.log(params);
      hideLogin();
      if (params["response"] == "success" || ((params["token"] && params["user"]))) {
        session_token = params["token"];
        user_object = $.toJSON(decodeURIComponent(params["user"]));
        $.cookie(COOKIE_SESSION_TOKEN, session_token);
        showLoggedInUI();
        if (login_success_callback) {
          login_success_callback();
        }
      }
    },
    
    doLogout: function(callback) {
      Messaging.revokeSession(
        session_token,
        function(response) {
          session_token = null;
          $.cookie(COOKIE_SESSION_TOKEN, null);
          showLoggedOutUI();
          if (typeof callback === "function") {
            callback();
          }
        }
      );
    }
  };
}();
