
function docPopup(url)
{
  var w;
  if ((url.indexOf("http") != 0)
      || (url.indexOf("fema.gov") > 0)
      || (url.indexOf("fema.net") > 0))
  {
    w = window.open(url, "nimcast_doc");
  }
  else
  {
    var newUrl = "http://www.fema.gov/goodbye/goodbye.jsp?url=" + escape(url);
    w = window.open(newUrl, "nimcast_doc");
  }

  w.focus();
}

/*
 * use this with the onkeydown event.  disables form submittal by hitting
 * enter, and remaps the keystroke to the equivalent of hitting tab.
 */
function handleEnter(event) 
{
  if (event.keyCode == 13)
  {
    event.keyCode = 9;
  }
}      

function selectedOrNone(optionId)
{
  return selected(optionId) || !selectedAny(getQuestionByOptionId(optionId).id);
}

function selected(optionId)
{
  return selectedOption(document.getElementById("" + optionId));
}

function selectedOption(option)
{
  if ((option.type == "radio") || (option.type == "checkbox"))
  {
    return option.checked;
  }

  return false;
}

function selectedAny(questionId)
{
  var options = getOptionsByQuestionId(questionId);

  for (var i=0; i < options.length; i++)
  {
    if (selectedOption(options[i]))
    {
      return true;
    }
  }

  return false;
}

function getOptionsByQuestionId(questionId)
{
  return document.getElementsByName("mappedResponse(" + questionId + ").optionIds");
}

function getQuestionByOptionId(optionId)
{
  var option = document.getElementById("" + optionId);
  return document.getElementById(option.name.match(/[0-9]+/));
}

function requireSelect(questionId, evalString, errorMsg)
{
  var question = document.getElementById("" + questionId);
  var questionListItem = question.parentNode.parentNode;

  if (questionListItem.className.match("metricsQuestionNode"))
  {
    var enablementElems = getDescendEnablementElems(questionListItem);

    for (var i=0; i < enablementElems.length; i++)
    {
      if (eval(evalString))
      {
        enableElement(enablementElems[i]);
      }
      else
      {
        disableElement(enablementElems[i]);
      }
    }
  }
}

/*
 * Get descendant enablement elements (they have "depOptionId" attributes)
 */
function getDescendEnablementElems(currentElement)
{
  var depElements = new Array();

  if (currentElement.childNodes != null)
  {
    for (var i=0; i < currentElement.childNodes.length; i++)
    {
      var depChildElements = getDescendEnablementElems(currentElement.childNodes[i]);

      for (var j=0; j < depChildElements.length; j++)
      {
        depElements.push(depChildElements[j]);
      }
    }
  }

  if ((currentElement.attributes != null) && currentElement.getAttribute("depOptionId"))
  {
    depElements.push(currentElement);
  }

  return depElements;
}

function initSelect(selectElementId, selectedValue)
{
  var selectElement = document.getElementById(selectElementId);

  for (var i=0; i < selectElement.options.length; i++)
  {
    selectElement.options[i].selected = (selectElement.options[i].value == selectedValue);
  }
}

/*
 * Enabling/Disabling of fields, text, and such, is performed by consulting
 * the "depOptionId" atttibute of certain fields, text, and such.  This
 * attribute points to the "id" attribute of the parent option, thus setting up
 * a tree of dependants we can traverse to grey-out appropriate nodes/branches.
 */

/*
 * Initial enabling/disabling (onload)
 */
function initEnablement()
{
  var allElements = getAllEnablementElements();

  for (var i=0; i < allElements.length; i++)
  {
    if ((allElements[i].type == "radio") || (allElements[i].type == "checkbox"))
    {
      handleEnablement(allElements[i], (!allElements[i].checked && allElements[i].type != "hidden") || (allElements[i].type == "hidden" && allElements[i].value=="true"), allElements);
    }
  }
}

/*
 * Initial enabling/disabling, if applicable in assessment (onload)
 */
function initEnablementIfApplicable()
{
  var allElements = getAllEnablementElements();

  for (var i=0; i < allElements.length; i++)
  {
    if (((allElements[i].type == "radio") || (allElements[i].type == "checkbox") || (allElements[i].type == "hidden"))
     && (allElements[i].getAttribute("depOptionId") == "APPLICABLE"))
    {
      handleEnablement(allElements[i], (!allElements[i].checked && allElements[i].type != "hidden") || (allElements[i].type == "hidden" && allElements[i].value=="true"), allElements);
    }
  }
}

/*
 * Toggle related enabling/disabling (onclick of option selection)
 */
function toggleRelatedEnablement(parentOptionField)
{
  var allElements = getAllEnablementElements();
  var isDisablement = !parentOptionField.checked;// || parentOptionField.type == "hidden";
    
  handleEnablement(parentOptionField, isDisablement, allElements);

  if (parentOptionField.type == "radio" || parentOptionField.type == "hidden")
  {
    for (var i=0; i < allElements.length; i++)
    {
      if (allElements[i].name == parentOptionField.name)
      {
      	isDisablement = !allElements[i].checked;
      	
        handleEnablement(allElements[i], isDisablement, allElements);
      }
    }
  }
}

/*
 * Handle dependant enabling/disabling given parent option field
 */
function handleEnablement(parentOptionField, isDisablement, allElements)
{
  var depElements = getDependantElements(parentOptionField, allElements);
  
  for (var i=0; i < depElements.length; i++)
  {
    if (isDisablement)
    {
      disableElement(depElements[i]);
    }
    else
    {
      if (parentOptionField.checked || parentOptionField.type=="hidden")
      {
        enableElement(depElements[i]);
      }
      else
      {
        disableElement(depElements[i]);
      }
    }

    if ((depElements[i].type == "radio")
     || (depElements[i].type == "checkbox"))
    {
      handleEnablement(depElements[i], isDisablement, allElements);
    }
  }
}

/*
 * Disable an element
 */
function disableElement(element)
{
  if (element.tagName.toLowerCase() == "li")
  {
    element.className = "metricsQuestionNodeDisabled";
  }
  else if (element.tagName.toLowerCase() == "table")
  {
    element.className = "metricsGroupTableDisabled";
  }
  else
  {
    element.disabled = true;

    if ((element.getAttribute("name") != null) && element.getAttribute("name").match("dateAnswer"))
    {
      // dateTrigger is the calendar <img> next to the date field
      // Its "id" looks like:  mappedResponse(NNNN).dateTrigger
      var dateTriggerId = element.getAttribute("name").replace("dateAnswer","dateTrigger");
      var dateTriggerElement = document.getElementById(dateTriggerId);

      if (dateTriggerElement != null)
      {
        dateTriggerElement.className = "metricsDateTriggerDisabled";
      }
    }

    if ((element.type == "radio") || (element.type == "checkbox"))
    {
      element.checked = null;
    }
    else
    {
      element.value = "";

      if (element.id != null)
      {
        var statusObj = document.getElementById(element.id + ".status");

        if (statusObj != null)
        {
          statusObj.firstChild.nodeValue = "";
          element.rows = 2;
          element.cols = Math.max(Math.round(statusObj.clientWidth / 9), 1);  // ~ 9 pixels per column at default font.
        }
      }
    }
  }
}

/*
 * Enable an element
 */
function enableElement(element)
{
  if (element.tagName.toLowerCase() == "li")
  {
    element.className = "metricsQuestionNode";
  }
  else if (element.tagName.toLowerCase() == "table")
  {
    element.className = "metricsGroupTable";
  }
  else
  {
    element.disabled = false;

    if ((element.getAttribute("name") != null) && element.getAttribute("name").match("dateAnswer"))
    {
      // dateTrigger is the calendar <img> next to the date field
      // Its "id" looks like:  mappedResponse(NNNN).dateTrigger
      var dateTriggerId = element.getAttribute("name").replace("dateAnswer","dateTrigger");
      var dateTriggerElement = document.getElementById(dateTriggerId);

      if (dateTriggerElement != null)
      {
        dateTriggerElement.className = "metricsDateTrigger";
      }
    }
  }
}

function onmouseover_DateTrigger(element)
{
  if (element.className.toLowerCase() == "metricsDateTrigger")
  {
    element.style.background = "#003399";
  }
}

function onmouseout_DateTrigger(element)
{
  if (element.className.toLowerCase() == "metricsDateTrigger")
  {
    element.style.background = "";
  }
}

/*
 * Get dependant elements
 */
function getDependantElements(parentOptionField, allElements)
{
  var depElements = new Array();

  for (var i=0; i < allElements.length; i++)
  {
    var depOptionId = allElements[i].getAttribute("depOptionId");

    if (depOptionId == parentOptionField.id)
    {
      depElements.push(allElements[i]);
    }
  }

  return depElements;
}

/*
 * Get all elements possibly to be involved in enabling/disabling
 */
function getAllEnablementElements()
{
  var allInputFields = document.getElementsByTagName("input");
  var allTextAreaFields = document.getElementsByTagName("textarea");
  var allListItems = document.getElementsByTagName("li");
  var allTables = document.getElementsByTagName("table");
  var allElements = new Array();

  for (var i=0; i < allInputFields.length; i++)
  {
    if (allInputFields[i].getAttribute("depOptionId") != null)
    {
      allElements.push(allInputFields[i]);
    }
  }

  for (var i=0; i < allTextAreaFields.length; i++)
  {
    if (allTextAreaFields[i].getAttribute("depOptionId") != null)
    {
      allElements.push(allTextAreaFields[i]);
    }
  }

  for (var i=0; i < allListItems.length; i++)
  {
    if (allListItems[i].getAttribute("depOptionId") != null)
    {
      allElements.push(allListItems[i]);
    }
  }

  for (var i=0; i < allTables.length; i++)
  {
    if (allTables[i].getAttribute("depOptionId") != null)
    {
      allElements.push(allTables[i]);
    }
  }

  return allElements;
}

function handleTextArea(obj, isOnload)
{
  var isOnload = (isOnload == null) ? false : isOnload;

  var MAX_CHARS = 4000;
  var MIN_ROWS = 2 ;
  var MAX_ROWS = 99 ;

  // NOTE: Checking clientWidth to determine if textarea is visible.  It works, but surely there is a better/right way.
  // Without the visibility check, the calculations below are all screwed up.
  if (obj.clientWidth < 1)
  {
    return;
  }
  
  var MIN_COLS = Math.max(Math.round(obj.clientWidth / 9), 1);  // ~ 9 pixels per column at default font.
  var MAX_COLS = Math.max(Math.round(obj.clientWidth / 9), 1);  // ~ 9 pixels per column at default font.

  var txtLength = obj.value.length;

  if (txtLength > MAX_CHARS)
  {
      obj.value = obj.value.substr(0, MAX_CHARS);
      txtLength = obj.value.length;
  }

  var numRows = 0 ;
  var arrNewLines = obj.value.split("\n");

  for(var i=0; i<=arrNewLines.length-1; i++)
  {
    numRows++;

    if (arrNewLines[i].length > MAX_COLS-5)
    {
      numRows += Math.floor(arrNewLines[i].length/MAX_COLS);
    }
  }

  if (txtLength == 0)
  {
    obj.cols = MIN_COLS ;
    obj.rows = MIN_ROWS ;
  }
  else
  {
    if (numRows <= 1)
    {
      obj.cols = (txtLength % MAX_COLS) + 1 >= MIN_COLS ? ((txtLength % MAX_COLS) + 1) : MIN_COLS ;
    }
    else
    {
      obj.cols = MAX_COLS ;
      obj.rows = numRows > MAX_ROWS ? MAX_ROWS : numRows ;
    }
  }

  if ((obj.id != null) && !isOnload)
  {
    var statusObj = document.getElementById(obj.id + ".status");

    if (statusObj != null)
    {
      var availChars = MAX_CHARS - txtLength;

      if (availChars == 0)
      {
        statusObj.firstChild.nodeValue = "No more characters may be entered.";
      }
      else if (availChars > 1)
      {
        statusObj.firstChild.nodeValue = availChars + " more characters may be entered.";
      }
      else
      {
        statusObj.firstChild.nodeValue = "1 more character may be entered.";
      }
    }
  }
}

function initTextAreas()
{
  var allTextAreaFields = document.getElementsByTagName("textarea");

  for (var i=0; i < allTextAreaFields.length; i++)
  {
    if (allTextAreaFields[i].id.match(".expandable") != null)
    {
        handleTextArea(allTextAreaFields[i], true);
    }
  }
}

function initReviewCAPHistories()
{
  var allTableRows = document.getElementsByTagName("tr");

  for (var i=0; i < allTableRows.length; i++)
  {
    if (allTableRows[i].id.match("reviewCAPHistoryBox.") != null)
    {
      var sectionId = allTableRows[i].id.replace("reviewCAPHistoryBox.", "");
      toggleReviewCAPHistory(sectionId);
      toggleCollapsible("reviewCAPHistoryLinkBox." + sectionId);
    }
  }
}

function toggleReviewCAPHistory(sectionId)
{ 
  toggleCollapsible("reviewCAPHistoryBox." + sectionId, "reviewCAPHistoryLink." + sectionId,
    "Hide review history for this section", "Show review history for this section");
}

function toggleCollapsible(id, linkId, linkCollapseText, linkExpandText)
{
  var expand = "";
  var collapse= "none";

  var element = document.getElementById(id);

  if (element != null)
  {
	element.style.display=element.style.display==collapse?expand:collapse;

    if ((linkId != null) && (linkCollapseText != null) && (linkExpandText != null))
    {
      var link = document.getElementById(linkId);
      var child = link.getElementsByTagName("img")[0];
      if(child!=null)
    	  child.src = element.style.display != collapse ? linkCollapseText : linkExpandText;
      else
    	  link.firstChild.nodeValue = element.style.display != collapse ? linkCollapseText : linkExpandText;
    }
  }
}

function showTableGroup(tableBodyId)
{
  var agt = navigator.userAgent.toLowerCase();
  var show = (agt.indexOf('msie') > -1) ? 'inline' : 'table-row-group';
  var tableBody = document.getElementById(tableBodyId);

  tableBody.style.display = show;
}

function hideTableGroup(tableBodyId)
{
  var tableBody = document.getElementById(tableBodyId);

  tableBody.style.display = 'none';
}

function showLink(linkId)
{
  var link = document.getElementById(linkId);

  link.style.display = "";
}

function hideLink(linkId)
{
  var link = document.getElementById(linkId);

  link.style.display = 'none';
}
