MOBX.UserSignup = function() {
  var publicObj = {};
  var signupForm = null;
  var nextPage = null;
  var loginForm = null;
  
  MOBX.EventHandler.subscribe(MOBX.cssNamespace, "user_signup_failure", function(evt) {
    MOBX.Button.restore("signup_button");
    MOBX.FormTools.Errors.removeErrors(signupForm);
    MOBX.FormTools.Errors.displayErrors({'user': evt.user.errors}, signupForm);
  });
  
  MOBX.EventHandler.subscribe(MOBX.cssNamespace, "user_signup_success", function(evt) {
    if(nextPage) {
      window.location = nextPage;
    }
  });
  
  var submitSignupForm = function() {
    var handleSuccess = function(resp) {
      debug("success");
      var user = MOBX.stringToObject(resp.responseText);
      MOBX.EventHandler.fireCustom(document.body, "user_signup_success", {'user': user });
    };
    
    var handleFailure = function(resp) {
      var user = MOBX.stringToObject(resp.responseText);
      MOBX.EventHandler.fireCustom(document.body, "user_signup_failure", {'user': user });
    };
    
    var ajx = new Ajax.Request(signupForm.action, {
      method: 'post',
      parameters: Form.serialize(signupForm),
      onSuccess: handleSuccess,
      onFailure: handleFailure
    });
    
  };
  
  MOBX.EventHandler.subscribe(MOBX.cssNamespace, 'user_login_failure', function(evt) {
    MOBX.Button.restore("login_button");
    MOBX.FormTools.Errors.removeErrors(loginForm);
    MOBX.FormTools.Errors.displayErrors({'user': [['base', 'Login unsuccessful']]}, loginForm);
  });
  
  var submitLoginForm = function() {
    var handleSuccess = function(resp) {
      var user = MOBX.stringToObject(resp.responseText);
      debug("firing success");
      MOBX.EventHandler.fireCustom(document.body, "user_login_success", {'user': user });
    };
    
    var handleFailure = function(resp) {
      MOBX.EventHandler.fireCustom(document.body, "user_login_failure");
    };
        
    var ajx = new Ajax.Request(loginForm.action, {
      method: 'post',
      parameters: Form.serialize(loginForm),
      onSuccess: handleSuccess,
      onFailure: handleFailure
    });
    
  };
  
  var handleSignupClick = function(evt) {
    MOBX.Button.setToLoading("signup_button");
    Event.stop(evt);
    submitSignupForm();
  };
  
  var handleLoginClick = function(evt) {
    MOBX.Button.setToLoading("login_button");
    Event.stop(evt);
    submitLoginForm();
  };
  
  publicObj.ajaxifyForm = function(form, opts) {
    if(form) {
      opts = opts || {};
      if(opts.nextPage) {
        nextPage = opts.nextPage;
      }
      signupForm = form;
      signupForm.onsubmit = function() {
        return false;
      };
      loginForm = $("login_form");
      loginForm.onsubmit = function() {
        return false;
      }
      MOBX.EventHandler.subscribe("#signup_button", "click", handleSignupClick);
      MOBX.EventHandler.subscribe("#login_button", "click", handleLoginClick);
    }
  };
  
  var debug = function (txt) {
      //console.log(txt);
  };
  
  return publicObj;
}();