/**
 *  @fileoverview   Variables and functions for the my-easy-actions page.
 *//*
 *  Functions
 *    activatePlan(userPlanId)
 *    cancelActivePlan()
 *    cancelAccount()
 *    completePlan()
 *    doOutItem(id)
 *    doOverItem(id)
 *    hidePopups()
 *    makeActiveHdg(planCount, completed)
 *    makeEditProfile()
 *    makeInactiveHdgs()
 *    makePlanList(listId, planItems, completed)
 *    makeSidebarObj(planAttrs)
 *    procActivatePlanRsp()
 *    procCancelAcctRsp()
 *    procCancelPlanRsp()
 *    procCompletePlanRsp()
 *    procEditProfileRsp()
 *    procSidebar()
 *    resetSidebar()
 *    submitScore(form)
 *    submitEditProfile(form)
 *    toggleItems(id)
 *    verifyEditProfile(form)
 */

var saveBtnOut = new Image(83, 24);
saveBtnOut.src = updir + "imgs/save_btn.gif";

var saveBtnOver = new Image(83, 24);
saveBtnOver.src = updir + "imgs/save_btn_over.gif";

var cancelBtnOut = new Image(83, 24);
cancelBtnOut.src = updir + "imgs/cancel_btn.gif";

var cancelBtnOver = new Image(83, 24);
cancelBtnOver.src = updir + "imgs/cancel_btn_over.gif";

var hasActive;

var sidebarHdgs = {
  upcoming : "Upcoming Easy Actions ",
  completed : "Completed Easy Actions ",
  editProfile : "Edit my profile"
};

/**
 *  Calls server script to mark plan as the active one.
 *
 *  @global {String} updir
 *  @param  {String} userPlanId
 *  @type   void
 */
function activatePlan(userPlanId)
{
  if (makeXMLHttpRequest()) {
    xhRequest.procFunc = function () { procActivatePlanRsp(userPlanId) };
    xhRequest.post(updir + "rsp_activate_plan.php", "page=" + page + "&user_plan_id=" + userPlanId);
  }
}

/**
 *  Calls server script to remove all user-plans, scores, and the user account.
 *
 *  @type   void
 */
function cancelAccount()
{
  var msg = "Are you sure you want to cancel your account? Clicking OK will close your " +
    "Diabetes Act Now account, and you will no longer have access to your personalized " +
    "My Easy Actions page.";

  if (!confirm(msg)) {
    return;
  }

  if (makeXMLHttpRequest()) {
    xhRequest.procFunc = procCancelAcctRsp;
    xhRequest.post(updir + "rsp_cancel_acct.php", null);
  }
}

/**
 *  Calls server script to cancel a plan. Only happens on my-easy-action page.
 *
 *  @global {String} updir
 *  @type   void
 */
function cancelActivePlan()
{
  if (makeXMLHttpRequest()) {
    xhRequest.procFunc = procCancelPlanRsp;
    xhRequest.post(updir + "rsp_cancel_plan.php", null);
  }
}

/**
 *  Calls server script to mark a plan completed.
 *
 *  @global {String} updir
 *  @type   void
 */
function completePlan()
{
  if (makeXMLHttpRequest()) {
    xhRequest.procFunc = procCompletePlanRsp;
    xhRequest.post(updir + "rsp_complete_plan.php", null);
  }
}

/**
 *  Changes the background color of a sidebar action-plan item on-mouse-out.
 *
 *  @param  {String} id
 *  @type   void
 */
function doOutItem(id)
{
  hidePopups();
  document.getElementById(id).style.backgroundColor = '#F9B27E';
}

/**
 *  Changes the background color of a sidebar action-plan item on-mouse-over.
 *
 *  @param  {String} id
 *  @type   void
 */
function doOverItem(id, completed)
{
  hidePopups();
  document.getElementById(id).style.backgroundColor = '#8AD1F1';

  if (completed) {
    toggleViz(id + "_popup");
  }
}

/**
 *  Hides sidebar action-plan popups. Will hide any element with 'item_popup' in its class name.
 *
 *  @type   void
 */
function hidePopups()
{
  var els = document.getElementsByTagName("div");

  for (var i = 0; i < els.length; i++) {
    if (els[i].className.indexOf("item_popup") != -1) {
      els[i].style.visibility = "hidden";
    }
  }
}

/**
 *  Sets the sidebar headings to their logged-in state (makes them clickable controls for the plan
 *  lists).
 *
 *  @param  {int} planCount       number of plans in section
 *  @param  {Boolean} completed   indicates which section is in question
 *  @type   void
 */
function makeActiveHdg(planCount, completed)
{
  var hdg, hdgAhref, hdgPlanCnt;

  hdgAhref = document.createElement("a");
  hdgAhref.setAttribute("href", "javascript: void (0);");
  hdgPlanCnt = document.createElement("span");
  hdgPlanCnt.innerHTML = "(" + planCount + ")";

  if (completed) {
    hdg = document.getElementById("completed_hdg");
    hdgAhref.setAttribute("id", "completed_ahref");
    hdgAhref.onclick = function () { toggleItems("completed"); };
    hdgAhref.innerHTML = sidebarHdgs.completed;
    hdgPlanCnt.setAttribute("id", "completed_cnt");
  }
  else {
    hdg = document.getElementById("upcoming_hdg");
    hdgAhref.setAttribute("id", "upcoming_ahref");
    hdgAhref.onclick = function () { toggleItems("upcoming"); };
    hdgAhref.innerHTML = sidebarHdgs.upcoming;
    hdgPlanCnt.setAttribute("id", "upcoming_cnt");
  }

  hdg.innerHTML = "";
  hdgAhref.appendChild(hdgPlanCnt);
  hdg.appendChild(hdgAhref);
}

/**
 *  Activates the edit-profile link on the sidebar.
 *
 *  @type   void
 */
function makeEditProfile()
{
  var hdg, hdgAhref;

  hdg = document.getElementById("edit_profile");
  hdgAhref = document.createElement("a");
  hdgAhref.setAttribute("href", "javascript: void (0);");
  hdgAhref.onclick = function () { toggleOverlay("overlay_edit_profile"); };
  hdgAhref.innerHTML = sidebarHdgs.editProfile;
  hdg.innerHTML = "";
  hdg.appendChild(hdgAhref);
}

/**
 *  Sets the sidebar headings to their logged-out state.
 *
 *  @type   void
 */
function makeInactiveHdgs()
{
  document.getElementById("upcoming_hdg").innerHTML = sidebarHdgs.upcoming;
  document.getElementById("completed_hdg").innerHTML = sidebarHdgs.completed;
  document.getElementById("edit_profile").innerHTML = sidebarHdgs.editProfile;
}

/**
 *  Writes the sidebar plan lists.
 *
 *  @global {Boolean} hasActive   set in my_easy_actions.php and procSidebar()
 *  @global {String} flashId
 *  @param  {String} listId       sidebar list identifier
 *  @param  {Array} planItems     array of objects having members plan_id, title, chart_img, etc.
 *  @param  {Boolean} completed   upcoming with and w/o activated plan or completed (uses above
 *                                constants)
 */
function makePlanList(listId, planItems, completed)
{
  var userPlanId, planId, inUpc, elPopId, elPop, elBr, el, elTitle, elActions, elActivate, elMark,
    elWatch, elWatchBtn, chartImg;
  var is1st = true;
  var actionPrefix = (completed) ? "cpd" : "upc";
  var listDiv = document.getElementById(listId);

  makeActiveHdg(planItems.length, completed);

  // build the plan items
  for (var i = 0; i < planItems.length; i++) {
    userPlanId = planItems[i].user_plan_id;
    planId = planItems[i].plan_id;
    inUpc = planItems[i].in_upc;

    // plan popup div
    if (completed) {
      elPopId = listId + "_" + userPlanId + "_popup";
      elPop = document.createElement("div");
      elPop.setAttribute("id", elPopId);
      elPop.className = "item_popup";

      if (!isBlank(planItems[i].chart_img)) {
        chartImg = new Image(207, 74);
        chartImg.src = updir + planItems[i].chart_img;
        elPop.appendChild(chartImg);
      }
      else {
        elPop.innerHTML = planItems[i].chart;
      }
    }

    // for IE---to align the popups properly
    elBr = document.createElement("div");
    elBr.style.height = "0";

    // plan listing div
    el = document.createElement("div");
    el.setAttribute("id", listId + "_" + userPlanId);
    el.className = "item" + ((is1st) ? " first" : "");
    el.onmouseover = function () { doOverItem(this.id, completed); };
    el.onmouseout = function () { doOutItem(this.id, completed); };
    el.onclick = function () { hidePopups(); };

    elTitle = document.createTextNode(planItems[i].title);
    el.appendChild(elTitle);

    elActions = document.createElement("div");
    elActions.setAttribute("id", actionPrefix + userPlanId);
    elActions.className = "plan_actions";

    if (!completed && !hasActive) {
      elActivate = document.createElement("a");
      elActivate.className = "activate_ahref";
      elActivate.setAttribute("href", "javascript: void (0);");
      elActivate.onclick = function () { activatePlan(this.parentNode.id.substr(3)); };
      elActivate.innerHTML = "Activate plan";
      elActions.appendChild(elActivate);
    }
    else if (completed) {
      if (!parseInt(inUpc)) {
        elMark = document.createElement("a");
        elMark.className = "mark_plan_ahref";
        elMark.setAttribute("href", "javascript: void (0);");
        elMark.onclick = function () { markPlan(this.parentNode.id.substr(3), ""); };
        elMark.innerHTML = "Try plan again";
        elActions.appendChild(elMark);
      }
    }

    elWatchBtn = new Image(7, 12);
    elWatchBtn.setAttribute("alt", "> Play");
    elWatchBtn.src = updir + "imgs/play_video_btn.png";
    elWatch = document.createElement("a");
    elWatch.setAttribute("href", "javascript: void (0);");
    elWatch.onclick = function () { js2asPlayVideo(flashId, this.parentNode.id.substr(3)); };
    elWatch.innerHTML = "Watch the video";
    elActions.appendChild(elWatchBtn);
    elActions.appendChild(elWatch);

    el.appendChild(elActions);

    // add the plan popup and listing to document
    if (completed) {
      listDiv.appendChild(elPop);
    }

    if (document.all) {   // IE only
      listDiv.appendChild(elBr);
    }

    listDiv.appendChild(el);

    if (is1st) {
      is1st = false;
    }
  }
}

/**
 *  Parses a plan's attributes and from them builds an object to be sent to makePlanList. Called
 *  by procSidebar.
 *
 *  @param  {Array} planAttrs
 *  @type   Object
 */
function makeSidebarObj(planAttrs)
{
  var obj = new Object;

  for (var i = 0; i < planAttrs.length; i++) {
    if (planAttrs[i].nodeType == Node.ELEMENT_NODE) {
      switch (planAttrs[i].nodeName) {
        case "user_plan_id":
          obj["user_plan_id"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;

        case "plan_id":
          obj["plan_id"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;

        case "title":
          obj["title"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;

        case "chart_img":
          obj["chart_img"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;

        case "chart":
          obj["chart"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;

        case "in_upc":
          obj["in_upc"] = (planAttrs[i].hasChildNodes()) ?
            planAttrs[i].childNodes[0].nodeValue : "";
          break;
      }
    }
  }
  
  return obj;
}

/**
 *  Processes the activate-plan XML.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @global {String} flashId
 *  @type   void
 */
function procActivatePlanRsp(userPlanId)
{
  var status;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case NO_LOGIN:
      alert("ERROR: no user is logged in");
      break;

    case INVALID_USER:
      alert("ERROR: invalid user id");
      break;

    case PLAN_HAS_ACTIVE:
      alert("ERROR: already has active");
      break;

    case PLAN_INVALID_USER_PLAN:
      alert("ERROR: invalid user-plan id");
      break;

    case PLAN_INVALID_PLAN:
      alert("ERROR: invalid plan id");
      break;

    case PLAN_MAIL_ERR:
      alert("ERROR: email error");
      break;

    case PLAN_ACTIVATE_SUCCESS:
      switch (page) {
        case "mea":
          js2asActivatePlan(flashId, userPlanId);
          procSidebar();
          break;
      }

      break;

    default:
      alert("ERROR: " + status);
  }
}

/**
 *  Processes the xh response for cancelling a user account. On success or error alerts user.
 *
 *  @type   void
 */
function procCancelAcctRsp()
{
  var status;
  var cancelMsg = "Your Diabetes Act Now account has been canceled. " +
    "You can sign-up for a new account at any time.";

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case NO_LOGIN:
      alert("ERROR: no user is logged in");
      break;

    case INVALID_USER:
      alert("ERROR: invalid user id");
      break;

    case CANCEL_ACCT_SUCCESS:
      alert(cancelMsg);
      location = updir + ".";
      break;

    default:
      alert(status);
  }
}

/**
 *  Processes the xh response for cancelling a plan. Only happens from my-easy-actions page.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procCancelPlanRsp()
{
  var status;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case NO_LOGIN:
      alert("ERROR: no user is logged in");
      break;

    case INVALID_USER:
      alert("ERROR: invalid user id");
      break;

    case PLAN_NO_ACTIVE:
      alert("ERROR: no active plan");
      break;

    case PLAN_DEL_SUCCESS:
      js2asGetPlans(flashId)
      procSidebar();
      break;

    default:
      alert("ERROR: " + status);
  }
}

/**
 *  Processes the xh response on plan completion. My-easy-actions page only.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procCompletePlanRsp()
{
  var status;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case NO_LOGIN:
      alert("ERROR: no user is logged in");
      break;

    case INVALID_USER:
      alert("ERROR: invalid user id");
      break;

    case PLAN_NO_ACTIVE:
      alert("ERROR: no active plan");
      break;

    case PLAN_NOT_READY_2_COMPLETE:
      alert("ERROR: plan not ready to complete");
      break;

    case PLAN_MAIL_ERR:
      alert("ERROR: email error");
      break;

    case PLAN_COMPLETE_SUCCESS:
      procSidebar();
      break;

    default:
      alert("ERROR: " + status);
  }
}

/**
 *  Processes the edit-profile XML response.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procEditProfileRsp()
{
  var status;
  var userName;

  try {
    status = xhRequest.responseXML.getElementsByTagName("status")[0].firstChild.nodeValue;
  }
  catch (e) {
    status = -1;
  }

  try {
    userName = xhRequest.responseXML.getElementsByTagName("user_name")[0].firstChild.nodeValue;
  }
  catch (e) {
    userName = "";
  }

  switch (status) {
    case -1:
      alert("ERROR: no xml-http-request response");
      break;

    case DB_ERR:
      alert("ERROR: database error");
      break;

    case NO_LOGIN:
      alert("ERROR: no user is logged in");
      break;

    case INVALID_USER:
      alert("ERROR: invalid user id");
      break;

    case EDIT_PROFILE_NO_UPDATE:
    case EDIT_PROFILE_SUCCESS:
      toggleViz("overlay_edit_profile");
      toggleViz("overlay_edit_profile_rsp");
      document.getElementById("hdr_user_welcome").innerHTML = "Welcome " + userName;
      break;
  }
}

/**
 *  Processes the response XML to build the sidebar.
 *
 *  @global {XMLHttpRequest} xhRequest
 *  @type   void
 */
function procSidebar()
{
  var xmlHasActive, i, k, showCompleted;
  var xmlPlans = new Array();
  var plans = new Array();

  // get the sidebar data for my easy actions
  if (xhRequest.responseXML.getElementsByTagName("has_active").length) {
    xmlHasActive = xhRequest.responseXML.getElementsByTagName("has_active")[0].firstChild.nodeValue;
    hasActive = (parseInt(xmlHasActive)) ? true : false;
  }
  else {
    hasActive = false;
  }

  resetSidebar();

  if (xhRequest.responseXML.getElementsByTagName("upc_plans").length) {
    xmlPlans = xhRequest.responseXML.getElementsByTagName("upc_plans")[0].childNodes;
    k = 0;

    for (i = 0; i < xmlPlans.length; i++) {
      if (xmlPlans[i].nodeType == Node.ELEMENT_NODE) {
        plans[k++] = makeSidebarObj(xmlPlans[i].childNodes);
      }
    }

    makePlanList("upcoming", plans, false);
    toggleItems("upcoming");
  }

  if (xhRequest.responseXML.getElementsByTagName("cpd_plans").length) {
    xmlPlans = xhRequest.responseXML.getElementsByTagName("cpd_plans")[0].childNodes;
    plans.length = 0;
    k = 0;

    for (i = 0; i < xmlPlans.length; i++) {
      if (xmlPlans[i].nodeType == Node.ELEMENT_NODE) {
        plans[k++] = makeSidebarObj(xmlPlans[i].childNodes);
      }
    }

    if (document.getElementById("completed").style.display == "block") {
      toggleItems("completed");
    }

    makePlanList("completed", plans, true);
  }

  makeEditProfile();
}

/**
 *  Changes the page to its logged-out state. Clears the sidebar lists; shows the horz rules; calls
 *  make-inactive-headings function
 *
 *  @type   void
 */
function resetSidebar()
{
  document.getElementById("upcoming").innerHTML = "";
  document.getElementById("upcoming").style.display = "none";
  document.getElementById("completed").innerHTML = "";
  document.getElementById("completed").style.display = "none";
  document.getElementById("upcoming_hr").style.display = "block";
  document.getElementById("completed_hr").style.display = "block";
  makeInactiveHdgs();
}

/**
 *  DEBUG---temp function to submit score to server script. Flash will request this directly.
 */
function submitScore(form)
{
  var els = form.elements;
  var score = -1;

  for (var i = 0; i < els.length; i++) {
    switch (els[i].name) {
      case "send_btn":
        break;

      default:
        if (els[i].checked) {
          score = els[i].value;
        }
    }
  }

  if (score != -1) {
    location = "../post_score.php?score=" + score;
  }
}

/**
 *  Processes the edit-profile form.
 *
 *  @param  {HTMLFormElement} form
 *  @type   boolean
 *  @return Always returns false to prevent form submission from the browser.
 */
function submitEditProfile(form)
{
  var els;
  var postData = "";
  var is1st = true;
  var reqFile = updir + "rsp_edit_profile.php?";

  if (verifyEditProfile(form)) {
    els = form.elements;

    for (var i = 0; i < els.length; i++) {
      if (!isBlank(els[i].value)) {
        switch (els[i].name) {
          case "user_name":
          case "password":
            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 = procEditProfileRsp;
    xhRequest.post(reqFile, postData);
  }

  return false;
}

/**
 *  Shows or hides the lists of sidebar action-plan items.
 *
 *  @param  {String} id   ID of list to toggle
 *  @type   void
 */
function toggleItems(id)
{
  var el = document.getElementById(id);
  var elHr = document.getElementById(id + "_hr");
  var elAhref = document.getElementById(id + "_ahref");

  hidePopups();

  if (el.style.display == "none") {
    el.style.display = "block";
    elHr.style.display = "none";
    elAhref.style.color = "#413C0D";
  }
  else {
    el.style.display = "none";
    elHr.style.display = "block";
    elAhref.style.color = "#887D1B";
  }
}

function verifyEditProfile(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 "conf_pwd":
        if (els["conf_pwd"].value != els["password"].value) {
          els["password"].value = "";
          els["conf_pwd"].value = "";
          document.getElementById("error_edit_pwd").innerHTML = "Passwords do not match.";
          els["password"].focus();
          return false;
        }

        break;
    }
  }

  return true;
}
