// this function is called after html body is loaded
// pages that require any initialization should override this function in their bodies
function init() {
}

// set text field value
function setTextValue(text, value) {
  text.value = value;
}

// get currently selected value of a <select> element
function getSelectValue(select) {
    return select.options[select.selectedIndex].value;
}
// get the value of the ith element
function getSelectIndexValue(select, index) {
    return select.options[index].value;
}
// get currently selected option of a <select> element
function getSelectText(select) {
    return select.options[select.selectedIndex].text;
}
// set currently selected value of a <select> element
// true us returned if a matching <option> element was found
function setSelectValue(select, value) {
  for (var i = 0; i < select.options.length; i++) {
    if (select.options[i].value == value) {
      select.options[i].selected = true;
      return true;
    }
  }
  return false;
}

// prompt user for a name with given message
function getName(message, name) {
  var name = prompt(message, name);
  if (name != null && name == "") {
    alert("name cannot be empty");
    name = getName(message, name);
  }
  return name;
}

// get currently selected values of a <select multiple> element
function getSelectValues(select) {
  var values = new Array();
  for (var i = 0; i < select.options.length; i++) {
    if (select.options[i].selected == true) {
      values[values.length] = select.options[i].value;
    }
  }
  return values;
}

// get radio value
function getRadioValue(radio) {
  for (var i = 0; i < radio.length; i++) {
    if (radio[i].checked) {
      return radio[i].value;
    }
  }
}

// check radio button within a given group with given value
function checkRadio(radio, value) {
  for (var i = 0; i < radio.length; i++) {
    if (radio[i].value == value) {
      radio[i].checked = true;
    }
  }
}

// update month, day, and year text fields with currently selected value of "type" combo box. currently represented date is returned if object exists
function updateSelectableDate(form, name) {
  var disabled = (form[name + ".type.value"].selectedIndex != 0);
  form[name + ".month.value"].disabled = disabled;
  form[name + ".day.value"].disabled = disabled;
  form[name + ".year"].disabled = disabled;

  if (disabled) {
    var parts = getSelectValue(form[name + ".type.value"]).split("/");
    form[name + ".month.value"].value = parts[0];
    form[name + ".day.value"].value = parts[1];
    form[name + ".year"].value = parts[2];
  }

  return new Date(form[name + ".year"].value, form[name + ".month.value"].value - 1, form[name + ".day.value"].value);
}

// get current date with only year, month and date set (hours, minutes, etc, are all zeroes)
function getCurrentDate() {
  var date = new Date();
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);
  date.setMilliseconds(0);
  return date;
}

// caluclate difference between two dates and return as an array [y, m, d]
function dateDifference(date1, date2) {
  var y1 = date1.getFullYear();
  var m1 = date1.getMonth();
  var d1 = date1.getDate();
  var y2 = date2.getFullYear();
  var m2 = date2.getMonth();
  var d2 = date2.getDate();

  if (d2 < d1) {
    m2--;
    d2 += daysInMonth(y2, m2);
  }
  d2 -= d1;
  if (m2 < m1) {
    y2--;
    m2 += 12;
  }
  m2 -= m1;
  y2 -= y1;

  return [y2, m2, d2];
}

// get number of days in given year and 0-based month number
function daysInMonth(y, m) {
  with (new Date(y, m + 1, 1)) {
    setDate(0);
    return getDate();
  }
}

// trim leading and trailing whitespace from given string
function trim(string) {
  return (string.replace(/^\W+/,'')).replace(/\W+$/,'');
}

// submit object's parent form, where object is a radio button, a combo box, etc.
function submitForm(object) {
  object.form.submit();
}

// change sort settings and submit given form
function sort(form, sortBy) {
  if (sortBy == form.sortBy.value) {
    if (form.sortAscending.value == "true") {
      form.sortAscending.value = "false";
    } else {
      form.sortAscending.value = "true";
    }
  } else {
    form.sortBy.value = sortBy;
    form.sortAscending.value = "true";
  }
  form.submit();
}

// set the html for a given element
function setHTML(name, html) {
  writeToObject(new getObj(name), html);
}

// write to a given object
function writeToObject(object, html) {
  if (object.obj) {
    if (document.layers) { // nav 4
      object.obj.document.open('text/html');
      object.obj.document.write(html);
      object.obj.document.close();
    } else { // all others
      object.obj.innerHTML=html;
    }
  }
}
// set the visibilty of a given object
function setObjectVisibility(object, isVisible) {
  if (object.isNN4) {
    object.style.visible = (isVisible ? 'show' : 'hide');
  } else {
    object.style.visibility = (isVisible ? 'visible' : 'hidden');
  }
}

function getObj(name) {
  if (document.getElementById) {
    this.isNN4 = false;
    this.obj = document.getElementById(name);
    if (this.obj != null) {
      this.style = document.getElementById(name).style;
    }
  } else if (document.all) {
    this.isNN4 = false;
    this.obj = document.all[name];
    this.offsetWidth = document.all[name].offsetWidth;
    if (this.obj != null) {
      this.style = document.all[name].style;
    }
  } else if (document.layers) {
    this.isNN4 = true;
    this.obj = getObjNN4(document,name);
    if (this.obj != null) {
      this.style = this.obj;
    }
  }
}

function getObjNN4(obj, name) {
  var x = obj.layers;
  var foundLayer;
  for (var i=0;i<x.length;i++) {
    if (x[i].id == name)
      foundLayer = x[i];
    else if (x[i].layers.length)
      var tmp = getObjNN4(x[i],name);
    if (tmp) foundLayer = tmp;
  }
  return foundLayer;
}

// open a pop-up window
function openPopup(url, name) {
  var win = window.open(url, name, "toolbar=no,status=no,location=no,menubar=no,height=300,width=500,resizable=yes,scrollbars=yes,dependent=yes");
  win.focus();
}

// open a big pop-up window
function openBigPopup(url, name) {
  var win = window.open(url, name, "toolbar=no,status=no,location=no,menubar=no,height=650,width=650,resizable=yes,scrollbars=yes,dependent=yes");
  win.focus();
}

// find parent with given tag name (i.e. find enclosing "TR" node)
function findParentByTagName(node, tagName) {
  for (var parentNode = node; parentNode != null; parentNode = parentNode.parentNode) {
    if (parentNode.nodeName == tagName) {
      return parentNode;
    }
  }
}

// get elements of a given class, given an optional root node (defaults to document), and tag (defaults to '*', which is all)
function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null ) {
     node = document;
    }
    if ( tag == null ) {
     tag = '*';
    }
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
    for (var i = 0, j = 0; i < elsLen; i++) {
      if ( pattern.test(els[i].className) ) {
        classElements[j] = els[i];
        j++;
      }
    }
    return classElements;
}

// set disabled flag for a list of elements to the given value
function setDisabled(elements, disabled) {
  for (var i = 0; i < elements.length; i++) {
    elements[i].disabled = disabled;
  }
}


// toggle the visibility of a div
function toggleLayer( whichLayer )
{
  var elem, vis;
  if( document.getElementById ) // this is the way the standards work
    elem = document.getElementById( whichLayer );
  else if( document.all ) // this is the way old msie versions work
      elem = document.all[whichLayer];
  else if( document.layers ) // this is the way nn4 works
    elem = document.layers[whichLayer];
  vis = elem.style;
  // if the style.display value is blank we try to figure it out here
  if(vis.display==''&&elem.offsetWidth!=undefined&&elem.offsetHeight!=undefined)
    vis.display = (elem.offsetWidth!=0&&elem.offsetHeight!=0)?'':'none';
  vis.display = (vis.display==''||vis.display=='block')?'none':'';
}
