/**
 *  @fileoverview   Functions and variables for global form handling.
 *//*
 *
 *  Variables
 *    userLoggedIn
 *    userLoggedOut
 *  Functions
 *    handleResponse()
 *    js2asLogin(flashId)
 *    js2asLogout(flashId)
 *    logout()
 *    procForgotPwdRsp()
 *    procLoginRsp()
 *    procLogoutRsp()
 *    procSignupRsp()
 *    submitForgotPwd(form)
 *    submitLogin(form)
 *    submitSignup(form)
 *    verifyForgotPwd(form)
 *    verifyLogin(form)
 *    verifySignup(form)
 */

/**
 *  Variables for user login/logout.
 */
var is1stLogin = false;

var userLoggedIn =
  '<span id="hdr_user_welcome"></span>' +
  '&nbsp; | &nbsp;' +
  '<span id="hdr_logout"><a href="javascript: void (0);" onclick="logout();">' +
  '  logout</a></span>';

var userLoggedOut =
  '<span id="hdr_login"><a href="javascript: void (0);" onclick="toggleLogin();">' +
  '  login</a></span>' +
  '&nbsp; | &nbsp;' +
  '<span id="hdr_forgot_pwd"><a href="javascript: void (0);" class="forgot_pwd"' +
  '  onclick="toggleOverlay(\'overlay_forgot_pwd\');">forgot password?</a></span>' +
  '&nbsp; | &nbsp;' +
  '<span id="hdr_signup"><a href="javascript: void (0);"' +
  '  onclick="toggleOverlay(\'overlay_signup\');">sign up</a></span>';

var errorTxt = {
  nameMissing : "<strong>Oops!</strong><br />Please enter your first name.",
  emailInvalid : "<strong>Oops!</strong><br />Some information is missing or contains invalid " +
    "characters. Please try again.",
  emailNoMatch : "<strong>Oops!</strong><br />Your email addresses don&rsquo;t match. " +
    "Please try again."
}

/**
 *  Waits for the 'complete' status of the request, tests the server response,
 *  and calls the xml processor.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @global {Function} xhRequest.procFunc   specific function to process XML
 *  @type   void
 */
function handleResponse()
{
  if (xhRequest.readyState == 4) {
    if (xhRequest.status == 200) {
      xhRequest.procFunc();
    }
    else {
      alert("Error: the request failed---status: " + xhRequest.status);
    }
  }
}

/**
 * On-login, call this swf.ExternalInterface function to tell the Flash the user is logged in.
 *
 *  @param  {String} flashId    id of the swf object in the page
 *  @type   void
 */
function js2asLogin(flashId)
{
  try {
    document.getElementById(flashId).login();
  }
  catch (e) {
    alert(flashErrMsg + "\n\n" + arguments.callee + "\n\n" + e);
  }
}

/**
 *  On-logout, call this swf.ExternalInterface function to tell the flash the user has logged out.
 *
 *  @param  {String} flashId    id of the swf object in the page
 *  @type   void
 */
function js2asLogout(flashId)
{
  switch (page) {
    case "mea":
      try {
        document.getElementById(flashId).js2asLogout();
      }
      catch (e) {
        alert(flashErrMsg + "\n\n" + arguments.callee + "\n\n" + e);
      }
      break;

    default:
      try {
        document.getElementById(flashId).logout();
      }
      catch (e) {
        alert(flashErrMsg + "\n\n" + arguments.callee + "\n\n" + e);
      }
  }
}

 /**
 *  Logs a user out. Changes the user elements in the heading and calls responding php to destroy
 *  the session.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @global {String} updir
 *  @type   void
 */
function logout()
{
  if (makeXMLHttpRequest()) {
    xhRequest.procFunc = procLogoutRsp;
    xhRequest.post(updir + "rsp_logout.php", null);
  }
}

/**
 *  Processes the forgot-password XML response.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procForgotPwdRsp()
{
  var status;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  clearErrorMsgs();

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case FORGOT_PWD_MAIL_ERR:
      alert("ERROR: mail error");
      break;

    case INVALID_USER:
      clearErrorMsgs();
      document.getElementById("error_forgot_email").innerHTML =
        "This email is not registered. Please try again.";
      document.getElementById("forgot_email").focus();

      break;

    case FORGOT_PWD_SUCCESS:
      toggleOverlay("overlay_forgot_pwd");
      break;
  }
}

/**
 *  Processes the login XML response.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procLoginRsp()
{
  var xmlRsp = xhRequest.responseXML;
  var status = xmlRsp.getElementsByTagName("status")[0].firstChild.nodeValue;
  var userEmail, userName, lastLoginDate, isSurveyed, yesterday;

  clearErrorMsgs();

  switch (status) {
    case LOGIN_INVALID:
      if (is1stLogin) {
        document.getElementById("error_login_email").innerHTML =
          "Your email or password is invalid. Try again.";
        document.getElementById("password").value = "";
        document.getElementById("user_email").value = "";
        document.getElementById("user_email").focus();
      }
      else {
        document.getElementById("error_hdr_login").innerHTML =
          "Your email or password is invalid. Try again.";
        document.getElementById("hdr_password").value = "";
        document.getElementById("hdr_user_email").value = "";
        document.getElementById("hdr_user_email").focus();
      }

      break;

    case LOGIN_SUCCESS:
      if (is1stLogin) {
        toggleOverlay("overlay_1st_login");
      }
      else {
        toggleLogin();
      }

      userEmail = xmlRsp.getElementsByTagName("user_email")[0].firstChild.nodeValue;
      userName = xmlRsp.getElementsByTagName("user_name")[0].firstChild.nodeValue;

      lastLoginDate = xmlRsp.getElementsByTagName("last_login_date")[0].firstChild.nodeValue;
      lastLoginDate = (isDate(lastLoginDate)) ? new Date(lastLoginDate) : false;

      isSurveyed = parseInt(xmlRsp.getElementsByTagName("is_surveyed")[0].firstChild.nodeValue);

      document.getElementById("hdr_user").innerHTML = userLoggedIn;
      document.getElementById("hdr_user_welcome").innerHTML = "Welcome " + userName;

      switch (page) {
        case "act":
          js2asLogin(flashId);
          break;

        case "mea":
          js2asGetPlans(flashId);
          procSidebar();
          document.getElementById("user_email_display").innerHTML = userEmail;
          document.getElementById("edit_name").value = userName;
          break;
      }

//      if (!isSurveyed) {
//        if (lastLoginDate !== false) {  // test that last login was more than 24 hours ago
//          yesterday = new Date().getTime() - (24 * 60 * 60 * 1000);
//
//          if (lastLoginDate.getTime() < yesterday) {
//            doSurvey();
//          }
//        }
//      }

      break;
  }
}

/**
 *  Processes the logout XML response. Displays the logout state of the page. Restores the header
 *  login fields to blurred state.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procLogoutRsp()
{
  var hdrEmail = document.getElementById("hdr_user_email");
  var hdrPwd = document.getElementById("hdr_password");

  txtInputBlur(hdrEmail, hdrLoginBgEmail);
  hdrPwd.value = "";
  txtInputBlur(hdrPwd, hdrLoginBgPwd);

  document.getElementById("hdr_user").innerHTML = userLoggedOut;

  if (page == "mea") {
    js2asLogout(flashId);
    resetSidebar();
    document.getElementById("user_email_display").innerHTML = "";
    document.getElementById("edit_name").value = "";
  }
}

/**
 *  Processes the sign-up XML response.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procSignupRsp()
{
  var status;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  clearErrorMsgs();

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case SIGNUP_USER_EXISTS:
      document.getElementById("error_user_email").innerHTML =
        "This email is already registered. Please try another.";
      document.getElementById("conf_email").value = "";
      document.getElementById("signup_email").focus();
      break;

    case SIGNUP_SUCCESS:
      toggleViz("overlay_signup");
      toggleViz("overlay_signup_rsp");
      break;

    case SIGNUP_MAIL_ERR:
      alert("ERROR: email error");
      break;
  }
}

/**
 *  Verifies forgot password form, builds the post-string from its fields, and submits via ajax.
 *
 *  @param {HTMLFormElement} form
 *  @return Always returns false to prevent form submission from the browser.
 *  @type   boolean
 */
function submitForgotPwd(form)
{
  var els;
  var postData = "";
  var is1st = true;
  var reqFile = updir + "rsp_forgot_pwd.php?";

  if (verifyForgotPwd(form)) {
    els = form.elements;

    for (var i = 0; i < els.length; i++) {
      switch (els[i].name) {
        case "user_email":
          if (is1st) {
            is1st = false;
          }
          else {
            postData += "&";
          }

          postData += encodeURIComponent(els[i].name) + "=" + encodeURIComponent(els[i].value);
          break;
      }
    }

    if (!makeXMLHttpRequest()) {
      return false;
    }

    xhRequest.procFunc = procForgotPwdRsp;
    xhRequest.post(reqFile, postData);
  }

  return false;
}

/**
 *  Verifies login form, builds the post-string from its fields, and submits via ajax.
 *
 *  @global {String} updir
 *  @param  {HTMLFormElement} form
 *  @return Always returns false to prevent form submission from the browser.
 *  @type   boolean
 */
function submitLogin(form)
{
  var els;
  var postData = "";
  var is1st = true;
  var reqFile = updir + "rsp_login.php?";

  if (verifyLogin(form)) {
    els = form.elements;

    for (var i = 0; i < els.length; i++) {
      switch (els[i].name) {
        case "page":
        case "user_email":
        case "password":
          if (is1st) {
            is1st = false;
          }
          else {
            postData += "&";
          }

          postData += encodeURIComponent(els[i].name) + "=" + encodeURIComponent(els[i].value);
          break;
      }
    }

    if (!makeXMLHttpRequest()) {
      return false;
    }

    xhRequest.procFunc = procLoginRsp;
    xhRequest.post(reqFile, postData);
  }

  return false;
}

/**
 *  Verifies sign-up form and builds get-string from its fields.
 *
 *  @global {String} updir
 *  @param  {HTMLFormElement} form
 *  @return Always returns false to prevent form submission from the browser.
 *  @type   boolean
 */
function submitSignup(form)
{
  var els;
  var postData = "";
  var is1st = true;
  var reqFile = updir + "rsp_signup.php?";

  if (verifySignup(form)) {
    els = form.elements;

    for (var i = 0; i < els.length; i++) {
      switch (els[i].name) {
        case "user_name":
        case "ref":
        case "user_email":
          if (is1st) {
            is1st = false;
          }
          else {
            postData += "&";
          }

          postData += encodeURIComponent(els[i].name) + "=" + encodeURIComponent(els[i].value);
          break;

        case "opt_in":
          if (is1st) {
            is1st = false;
          }
          else {
            postData += "&";
          }

          postData += encodeURIComponent(els[i].name) + "=";
          postData += (els[i].checked) ? 1 : 0;
          break;
      }
    }

    if (!makeXMLHttpRequest()) {
      return false;
    }

    xhRequest.procFunc = procSignupRsp;
    xhRequest.post(reqFile, postData);
  }

  return false;
}

/**
 *  Trims forgot-pwd-form field values and tests for data presence and format.
 *
 *  @param  {HTMLFormElement} form
 *  @type   boolean
 */
function verifyForgotPwd(form)
{
  var els = form.elements;
  var errorEl;

  clearErrorMsgs();

  for (var i = 0; i < els.length; i++) {
    els[i].value = els[i].value.trim();

    switch (els[i].name) {
      case "user_email":
        errorEl = document.getElementById("error_forgot_email");

        if (isBlank(els[i].value)) {
          els[i].focus();
          errorEl.innerHTML = "Email is missing.";
          return false;
        }

        if (!isEmail(els[i].value)) {
          els[i].focus();
          errorEl.innerHTML = "Email is invalid.";
          return false;
        }

        break;
    }
  }

  return true;
}

/**
 *  Trims login-form field values and tests for data presence and format.
 *
 *  @param  {HTMLFormElement} form
 *  @type   boolean
 */
function verifyLogin(form)
{
  var els = form.elements;

  // is this the user's first login
  if (typeof els["is_1st_login"] != "undefined") {
    is1stLogin = true;
  }

  var errorElId = (is1stLogin) ? "error_login_email" : "error_hdr_login";
  var errorMsg = (is1stLogin) ? "The login information you supplied appears to be incorrect." +
      "<br />Please carefully retype your username and password to try again." :
    "Oops! Some information is missing or contains invalid characters.";

  clearErrorMsgs();

  for (var i = 0; i < els.length; i++) {
    els[i].value = els[i].value.trim();

    switch (els[i].name) {
      case "user_email":
        if (isBlank(els[i].value)) {
          document.getElementById(errorElId).innerHTML = errorMsg;
          els[i].focus();
          return false;
        }

        break;

      case "password":
        if (isBlank(els[i].value)) {
          document.getElementById(errorElId).innerHTML = errorMsg;
          els[i].focus();
          return false;
        }

        break;
    }
  }

  return true;
}

/**
 *  Trims sign-up-form field values and tests for data presence and format.
 *
 *  @param  {HTMLFormElement} form
 *  @type   boolean
 */
function verifySignup(form)
{
  var els = form.elements;
  var errorEl;

  clearErrorMsgs();

  for (var i = 0; i < els.length; i++) {
    els[i].value = els[i].value.trim();

    switch (els[i].name) {
      case "user_name":
        if (isBlank(els[i].value)) {
          document.getElementById("error_name").innerHTML = errorTxt.nameMissing;
          els[i].focus();
          return false;
        }

        document.getElementById("rsp_name").innerHTML = els[i].value;
        break;

      case "user_email":
        errorEl = document.getElementById("error_user_email");

        if (isBlank(els[i].value)) {
          els[i].focus();
          errorEl.innerHTML = errorTxt.emailInvalid;
          return false;
        }

        if (!isEmail(els[i].value)) {
          els[i].focus();
          errorEl.innerHTML = errorTxt.emailInvalid;
          return false;
        }

        document.getElementById("rsp_email").innerHTML = els[i].value;
        break;

      case "conf_email":
        if (els["conf_email"].value != els["user_email"].value) {
          els[i].focus();
          document.getElementById("error_conf_email").innerHTML = errorTxt.emailNoMatch;
          return false;
        }

        break;

      case "agreement":
        if (!els[i].checked) {
          els[i].focus();
          document.getElementById("error_agreement").innerHTML = "Please check the box to " +
            "acknowledge your agreement with the Privacy Policy, and your awareness that the " +
            "information on this site cannot substitute for the advice of your healthcare " +
            "provider. This is required in order to create your Diabetes Act Now account.";
          return false;
        }

        break;
    }
  }

  return true;
}
