/* This code snagged from dcm@mit.edu */

/* Returns true if container is an ancestor or self node of containee */
function containsDOM (container, containee) {
  var isParent = false;
  do {
    if ((isParent = container == containee))
      break;
    containee = containee.parentNode;
  }
  while (containee != null);
  return isParent;
}

/* Given an element and an onmouseenter event on that element, returns
 * true if the mouse entered the element from a non-child element (i.e.
 * it didn't just get bubbled in from a child node). */
function checkMouseEnter (element, evt) {
  if (!evt)
    evt = window.event;
  if (element.contains && evt.fromElement)
    return !element.contains(evt.fromElement);
  else if (evt.relatedTarget)
    return !containsDOM(element, evt.relatedTarget);
  // this final case is hit when the mouse enters from another window */
  return true;
}

/* Given an element and an onmouseout event on that element, returns
 * true if the mouse left the element to a non-child element (i.e.
 * it didn't just get bubbled in from a child node). */
function checkMouseLeave (element, evt) {
  if (!evt)
    evt = window.event;
  if (element.contains && evt.toElement)
    return !element.contains(evt.toElement);
  else if (evt.relatedTarget)
    return !containsDOM(element, evt.relatedTarget);
  // this final case is hit when the mouse leaves to another window */
  return true;
}

/* Gets the top of an element relative to the top of the rendered page */
function getElementTop(el) {
  var t = el.offsetTop;
  while ((el=el.offsetParent) != null) { t += el.offsetTop; }
  return t;
}

/* Gets the left of an element relative to the left of the rendered page */
function getElementLeft(el) {
  var l = el.offsetLeft;
  while ((el=el.offsetParent) != null) { l += el.offsetLeft; }
  return l;
}

/* Remove an element from the DOM */
function removeElement(element) {
  element.parentNode.removeChild(element);
}

/* Given an element and an onmouseout event on that element, returns true
 * if the mouse left to element el2 (or a descendent of it). */
function checkLeaveTo (element, evt, el2) {
  if (!evt)
    evt = window.event;
  if (!el2)
    return false;
  if (element.contains && evt.toElement) {
    return evt.toElement == el2 || el2.contains(evt.toElement);
  }
  else if (evt.relatedTarget) {
    return evt.relatedTarget == el2 || containsDOM(el2, evt.relatedTarget);
  }
  return false;
}

var overlay = null;
/* Creates a copy of an element and overlays this duplicate on top of the previous
 * copy with a highlighted style.  This copy is removed when the mouse moves away. */
function overlayElement(el,event) {
  if (!checkMouseEnter(el,event))
    return;
  overlay = el.cloneNode(true);
  var t = getElementTop (el);
  var l = getElementLeft (el);
  overlay.setAttribute("onmouseover", null);
  overlay.style.top = t;
  overlay.style.left = l;
  overlay.style.position = "absolute";
  overlay.style.height = "auto";
  if (document.defaultView != null)
      overlay.style.width = document.defaultView.getComputedStyle(el, "").width;
  overlay.style.backgroundColor = "#ffffaa";
  overlay.style.borderColor = "#cccc66";
  overlay.onmouseout = function(event) {
    if (checkMouseLeave(this,event))
      removeElement(overlay);
  };
  el.onmouseout = function(event) {
    if (checkMouseLeave(this,event) && !checkLeaveTo(this,event,overlay))
      removeElement(overlay);
  };
  el.parentNode.insertBefore (overlay,el);
}

function selectall(frm, v)
{
    for (i=0; i < frm.length; i++)
	frm.elements[i].checked = v;
}
