//Fixed variables
var VISIBLE = 1;
var HIDDEN = 2;
var MENU_STICKY = false;
var MENU_ARRAY = new Array();

function launchPopup(url,name,w,h,scroll){
  var win = null;
  LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
  TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
  settings =
  'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars='+scroll+',resizable'
  win = window.open(url,name,settings)
}



// todo: pass in the screen title
function launchAbout(source) {
  popup=window.open("about.faces","About","height=400,width=400,toolbar=no,menubar=no");
  popup.focus();
}

// redirects user to the selected module in the modules selection component
function gotoModule() {
  f=document.moduleForm
  Index=f.x.selectedIndex
  if(f.x.options[Index].value!= "none") {
    f.action=f.x.options[Index].value
    f.submit()
  }
}

//launch the calendar zoom for datetime entry
function launchCalendarZoom (returnField) {
  var fieldDate;
  for (i=0; i < document.forms.length; i++) {
    for (x=0; x < document.forms[i].elements.length; x++) {
      if (returnField == document.forms[i].elements[x].name) {
        fieldDate = document.forms[i].elements[x].value;
      }
    }
  }

  child = window.open('zoomCalendar.do?EVT_KEY=handleView&fieldName=' + returnField + '&fieldDate=' + fieldDate, 'cal_zoom', 'resizable=yes,width=315,height=362,top=120,left=120');
  child.focus();
}

//used to force uppercase on entry fields
function toUpper(field) {
  field.value = field.value.toUpperCase();
}

// Menu generation functions
function menuItem(id, parent_id, name) {
  this.menu_id = id;
  this.parent_id = parent_id;
  this.name = name;
  this.expanded = false;
  this.level = 0;
  this.links = new Array();
  this.children = new Array();
  this.child_stack = new Array();
  this.parent = findMenuItemById(parent_id); //parent reference

  if ((parent_id > 0) && (this.parent != null)) {
    l = this.parent.children.length;
    this.parent.children[l] = this;
    this.level = this.parent.level + 1;
  }
}

function menuLink(parent_id, name, url) {
  this.parent_id = parent_id;
  this.name = name;
  this.url = url;

  var parent = findMenuItemById(parent_id);
  if (parent != null) {
    l = parent.links.length;
    parent.links[l] = this;
  }
}

function findMenuItemById(id) {
  for (m=0; m < MENU_ARRAY.length; m++) {
    if (MENU_ARRAY[m].menu_id == id) {
      return MENU_ARRAY[m];
    }
  }
  return null;
}

function createMenuItem(id, parent_id, name) {
  MENU_ARRAY[MENU_ARRAY.length] = new menuItem(id, parent_id, name);
}

function createMenuLink(parent_id, name, url) {
  new menuLink(parent_id, name, url);
}

function menuHandler() {
  if (!MENU_FIXED) {
    if (MENU_STATE == VISIBLE) {
      collapseMenu();
      MENU_STATE = HIDDEN;
      MENU_STICKY = false;
    }
    else {
      expandMenu();
      MENU_STATE = VISIBLE;
    }
  }
}

function menuSticky() {
  var menuButton = document.getElementById("menu_sticky_button");

  if (MENU_STICKY) {
    //TODO: need to add logic to check if fields even exist
    menuButton.className = "domMenuStickyButtonUp";
    document.forms[0].MENU_STATE_KEY.value="HIDDEN";
    MENU_STICKY = false;
  }
  else
  {
    menuButton.className = "domMenuStickyButton";
    document.forms[0].MENU_STATE_KEY.value="VISIBLE";
    MENU_STICKY = true;
  }
}

function addMenuItem(tbody, menu_item) {
  var row;
  var td;
  var div;
  var element;
  var indent = menu_item.level * 25;
  var width = indent;
  var draw_item = true;

  if (indent == 0) {
    indent = 4;
  }

  if (menu_item.level > 0) {
    draw_item = menu_item.parent.expanded;
  }

  if (draw_item) {
    row = document.createElement("TR");
    td = document.createElement("TD");
    div = document.createElement("DIV");

    if (menu_item.children.length > 0) {
      element = document.createElement("A");
      element.appendChild(document.createTextNode(menu_item.name));
      element.setAttribute("id","menu_" + menu_item.menu_id);
      element.setAttribute("href","javascript:expandMenuItem(" + menu_item.menu_id + ")");
      element.setAttribute("className","domMenuLinkHdr");
      element.setAttribute("class","domMenuLinkHdr");
    }
    else {
      element = document.createTextNode(menu_item.name);
    }

    div.appendChild(element);
    width = width + (menu_item.name.length * 7);

    for (j=0; j < menu_item.links.length; j++) {
      element = document.createElement("A");
      element.appendChild(document.createTextNode(menu_item.links[j].name));
      element.setAttribute("id","menu_link_" + menu_item.links[j].parent_id + menu_item.links[j].name);
      element.setAttribute("href","javascript:launchMenuLink('" + menu_item.links[j].url + "')");
      element.setAttribute("className","domMenuLink");
      element.setAttribute("class","domMenuLink");
      div.appendChild(element);
//      width = width + (menu_item.links[j].name.length * 2);
    }

    div.style.paddingLeft = "" + indent + "px";
    div.style.width = "" + width + "px";
    td.appendChild(div);
    td.setAttribute("noWrap","true");
    td.setAttribute("height","25");
    row.appendChild(td);
    row.setAttribute("id","item_" + menu_item.menu_id);
    tbody.appendChild(row);

    //Loop through children and create a stack for recursion
    if (menu_item.children.length > 0 ) {
      for (c=0; c < menu_item.children.length; c++) {
        menu_item.child_stack[menu_item.child_stack.length] = menu_item.children[c];
      }

      while (menu_item.child_stack.length > 0) {
        addMenuItem(tbody,menu_item.child_stack.shift());
      }
    }
  }
}

function expandMenu() {
  var tbody = document.getElementById("menu_body");
  var row;
  var td = document.getElementById("menu_header");
  var menuButton = document.getElementById("menu_button");

  for (i=0; i < MENU_ARRAY.length; i++) {
    if (MENU_ARRAY[i].parent_id == 0) {
      addMenuItem(tbody,MENU_ARRAY[i]);
    }
  }

  //---------build filler---------------
  row = document.createElement("TR");
  td = document.createElement("TD");
  td.setAttribute("id","menu_filler");
  td.setAttribute("height","100%");

  if (MENU_ARRAY.length < 1) {
    td.className = "domMenuHdr";
  }

  row.appendChild(td);
  tbody.appendChild(row);

  //---------build footer---------------
  row = document.createElement("TR");
  td = document.createElement("TD");
  td.setAttribute("id","menu_footer");
  td.className = "domMenuHdr";
  row.appendChild(td);
  tbody.appendChild(row);

  menuButton.className = "domMenuButtonCollapse";
  menuButton = document.getElementById("menu_sticky_button");

  if (MENU_STICKY) {
    menuButton.className = "domMenuStickyButton";
  }
  else
  {
    menuButton.className = "domMenuStickyButtonUp";
  }
}

function collapseMenu() {
  var tbody = document.getElementById("menu_body");
  var row;
  var td = document.getElementById("menu_header");
  var menuButton = document.getElementById("menu_button");

  for (k=0; k < MENU_ARRAY.length; k++) {
    row = document.getElementById("item_" + MENU_ARRAY[k].menu_id);
    if (row != null) {
      tbody.removeChild(row);
    }
  }

  tbody.removeChild(document.getElementById("menu_filler").parentNode);
  tbody.removeChild(document.getElementById("menu_footer").parentNode);
  menuButton.className = "domMenuButton";
  menuButton = document.getElementById("menu_sticky_button");
  menuButton.className = "domMenuStickyButtonDisabled";
}

function toggleMenuItem(menu_item, toggle) {
  menu_item.expanded = toggle;

  if (menu_item.parent_id != 0) {
    toggleMenuItem(menu_item.parent,true);
  }
}

function expandMenuItem(menu_id) {
  collapseMenu();

  var menu_item = findMenuItemById(menu_id);
  var toggle = !menu_item.expanded;

  for (e=0; e < MENU_ARRAY.length; e++) {
    MENU_ARRAY[e].expanded = false;
  }

  if (toggle) {
    document.forms[0].MENU_KEY.value=menu_id;
  }
  else {
    if (menu_item.parent_id != 0) {
      document.forms[0].MENU_KEY.value=menu_item.parent_id;
    }
    else {
      document.forms[0].MENU_KEY.value=0;
    }
  }

  toggleMenuItem(menu_item, toggle);

  expandMenu();
}

function launchMenuLink(url) {
  var append = "MENU_KEY=" + document.forms[0].MENU_KEY.value + "&MENU_STATE_KEY=" + document.forms[0].MENU_STATE_KEY.value;

  if (url.indexOf("?") < 0) {
    append = "?" + append;
  }
  else {
    append = "&" + append;
  }

  window.location.href=url + append;
}

function getForm(node) {
  while (node != null && !(node.nodeName == 'FORM' || node.nodeName == 'form')) {
    node = node.parentNode;
  }
  return node;
}

function drillDown(node) {
  var form = getForm(node);
  if (form != null) {
    var evtKey = form.EVT_KEY;
    if (evtKey != null) {
      evtKey.value = 'handleDrillDown';
    }
    form.submit();
  }
  return true;
}

function drillDownTarget(node,target) {
  var form = getForm(node);
  if (form != null) {
    var evtKey = form.EVT_KEY;
    if (evtKey != null) {
      evtKey.value = target;
    }
    form.submit();
  }
  return true;
}

function setValue(form, parameter, value) {
  // alert('Setting form [' + form + '] attribute [' + form.name + '.' + parameter + '] has value [' + form[form.name + '.' + parameter] + ']');
  var control = form[form.name + '.' + parameter].value = value;
}

function setParamValue(node, parameter, value) {
  var form = getForm(node);
  if (form != null) {
    var control = form[form.name + '.' + parameter].value = value;
  }
  return true;
}

function setRow(node, value) {
  var form = getForm(node);
  if (form != null) {
    setValue(form, 'row', value);
  }
  return true;
}

function infoPopup(field, table, column, type, length) {
  var message = 'Field Name: ' + field + '\n' + 'Table.Column: ' + table + '.' + column + '\n';
  if (type != null) {
    message += 'Data Type: ' + type + '(' + length + ')' + '\n';
  }
  alert(message);
}

function infoPopupCF(msg, override) {
  var message = '';
  if (override != null) {
    message += override + '\n';
  } else {
    message += 'Calculated Field';
    if (msg != null) {
      message += ': \n' + msg + '\n';
    }
  }
  alert(message);
}

function checkAll(state, form, cb_control_name) {
  if (form.elements[cb_control_name].length == null || form.elements[cb_control_name].length == 0) {
    form.elements[cb_control_name].checked = state.checked;
  }
  else {
    for(var i=0; i < form.elements[cb_control_name].length; i++) {
      form.elements[cb_control_name][i].checked = state.checked;
    }
  }
}