
  // some common functions for accessing elements, moving elements etc, IE4+/NS6+ compatible

  // returns the object referred to by the id passed
  // I guess if document.all is unsupported, this will fail, but as it was it was failing with 
  // new browsers.
  function getElementById(elementId) {
    /*if (is_ie5_5up || is_nav6up) { return document.getElementById(elementId); }
    else if (is_ie4up) { return document.all[elementId]; }
    */
    return typeof (document.getElementById != 'undefined') ? 
      document.getElementById(elementId) : document.all[elementId];
  }

  // move an element (div) to an absolute position
  function moveElement(element, x, y) {
    if (element != null) {
      //if (is_ie5_5up || is_nav6up) {
      if (typeof element.style.top != 'undefined') {
        element.style.left = x + 'px'; element.style.top = y + 'px'; 
      } 
      //else if (is_ie4up) { 
      else if (typeof element.style.xpos != 'undefined') {
        element.style.xpos = x; 
        element.style.ypos = y; 
        element.style.left = element.style.xpos; 
        element.style.top = element.style.ypos; 
      }
    }
  }

  // toggle the visibility of an element
  function setElementVisibility(element, isVisible) {
    if (element != null)
      element.style.visibility = isVisible ? 'visible' : 'hidden';
  }

  // fade in an element for IE only, otherwise just show it
  function fadeInElement(element, duration) {
    if (element != null) {
      var supportsFilter = (typeof element.style.filter) != 'undefined';
      if (supportsFilter) {
        element.style.filter = 'progid:DXImageTransform.Microsoft.Fade(duration=' + duration + ')';
        element.filters.item(0).Apply();
      }
      setElementVisibility(element, true);
      if (supportsFilter) {
        element.filters.item(0).Play();
      }
    }
  }

  // gets the absolute position (offset) of an element by recursively
  // adding the offset of all it's parent up to the document object
  function getAbsoluteOffset(element, fromTop) {
    var currentElement = element;
    var totalOffset = 0;
    
    while (currentElement != null) {
      totalOffset += fromTop ? currentElement.offsetTop : currentElement.offsetLeft;
      currentElement = currentElement.offsetParent;
    }
    return totalOffset;
  }

  function checkElementCollision(elementA, elementB) {
    if ((elementA != null) && (elementB != null)) {
      // check for vertical collision
      if (
        ((getAbsoluteOffset(elementA, true) + getElementHeight(elementA)) > 
        getAbsoluteOffset(elementB, true)) && 
        (getAbsoluteOffset(elementA, true) < 
        (getAbsoluteOffset(elementB, true) + getElementHeight(elementB)))
        ) {
        // check for horizontal collision
        if (
          ((getAbsoluteOffset(elementA, false) + getElementWidth(elementA)) > 
          getAbsoluteOffset(elementB, false)) &&
          (getAbsoluteOffset(elementA, false) < 
          (getAbsoluteOffset(elementB, false) + getElementWidth(elementB)))
          ) {
          return true;
        }
      }
    }
    return false;
  }

  function getElementWidth(element) {
    return (element == null || typeof element.offsetWidth == 'undefined') ? 
      0 : element.offsetWidth;
  }
  
  function getElementHeight(element) {
    return (element == null || typeof element.offsetWidth == 'undefined') ? 
      0 : element.offsetHeight;
  }

  // hide any select elements which collide with the element passed
  // this is to solve the bug with divs (particularly drop down menus) floating *under* select boxes
  function hideSelectElementsOnCollisionWithElementId(elementId) {
    if (is_win) {
      for (var i = 0; i < document.forms.length; i++) {
        for (var j = 0; j < document.forms[i].elements.length; j++) {
          if ((document.forms[i].elements[j].type == 'select-one') && 
            (checkElementCollision(getElementById(elementId), document.forms[i].elements[j]))) {
            setElementVisibility(document.forms[i].elements[j], false);
          }
        }
      }
    }
  }

  // show all select elements in all forms in the document
  function showSelectElementsOnCollisionWithElementId(elementId) {
    if (is_win) {
      for(var i = 0; i < document.forms.length; i++) {
        for(var j = 0; j < document.forms[i].elements.length; j++) {
          if (
            (document.forms[i].elements[j].type == 'select-one') && 
            (checkElementCollision(getElementById(elementId), document.forms[i].elements[j]))
            ) {
            setElementVisibility(document.forms[i].elements[j], true);
          }
        }
      }
    }
  }

  // special cases for various browser positioning bugs
  function getBrowserOffsetX() {
    return 0;
  }
  function getBrowserOffsetY() {
    if      (is_nav6up && is_win) { return -4; }
    else if (is_nav6up && is_mac) { return -4; }
    else if (is_ie5 && is_mac)    { return -4; }
    else                          { return  0; }
  }

  // standard macromedia functions
  function MM_preloadImages() { //v3.0
    var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
      var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
      if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
  }
  function MM_swapImgRestore() { //v3.0
    var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
  }
  function MM_findObj(n, d) { //v4.01
    var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
      d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
    if(!x && d.getElementById) x=d.getElementById(n); return x;
  }
  function MM_swapImage() { //v3.0
    var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
     if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
  }
  function MM_openBrWindow(theURL,winName,features) { //v2.0
    window.open(theURL,winName,features);
  }
