
function overlay_getScrollAmount()
{
  var scrOfX = 0, scrOfY = 0;
  if ( typeof( window.pageYOffset ) == 'number' )
  {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  }
  else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) 
  {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  }
  else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) )
  {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  
  return [scrOfX, scrOfY];
}

function overlay_findPosition(obj, stopObjectId)
{
	var curleft = 0, curtop = 0;
	curleft = obj.offsetLeft
	curtop = obj.offsetTop

	if (obj.offsetParent)
	{
		while (obj = obj.offsetParent)
		{
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		    if (obj.id == stopObjectId)
	            return [curleft, curtop];
		}
	}
	
	return [curleft, curtop];
}

function overlay_findWindowPosition(obj)
{
	var pos = overlay_findPosition(obj);
	var scroll = overlay_getScrollAmount()
	var x = 0, y = 0;
	
	if (isNaN(window.screenX))
	{
			x = pos[0] - scroll[0] + window.screenLeft;
			y = pos[1] - scroll[1] + window.screenTop;
	}
	else
	{
			x = pos[0] + window.screenX + (window.outerWidth - window.innerWidth) - scroll[0];
			y = pos[1] + window.screenY + (window.outerHeight - 24 - window.innerHeight) - scroll[1];
	}
	
	return  [x, y];
}

//stopObjectId needed if a parent element has absolute or relative positioning
function overlay_display(overlayObjID, anchorObj, offsetLeft, offsetTop, stopObjectId)
{
    var pos = overlay_findPosition(anchorObj, stopObjectId);
   
    var popup = overlay_findObject(overlayObjID);
    
    var posX = pos[0] - offsetLeft
    var posY = pos[1] - offsetTop
    
    // if body is center aligned we need to know the position of the main div
    var startPos = 0;
    for (var i=0; i < document.body.childNodes.length; i++)
    {
        if (document.body.childNodes[i].tagName)
        {
            startPos = document.body.childNodes[i].offsetLeft;
            //NOTE: if the form tag is inside another tag then the positioning may not work properly
            if (document.body.childNodes[i].tagName == "FORM")
                break;
        }
    }
    posX -= startPos;
    
    popup.style.left =  posX + 'px';
    popup.style.top =  posY + 'px';
    
    popup.style.display = 'block';

}

function overlay_displayFixed(overlayObjID, posX, posY)
{
    var popup = overlay_findObject(overlayObjID);
    popup.style.left =  posX + 'px';
    popup.style.top =  posY + 'px';
    popup.style.display = 'block';
}

function overlay_hide(overlayObjID)
{
    var popup = overlay_findObject(overlayObjID);
    popup.style.display = 'none';
}

function overlay_findObject( oName, oFrame, oDoc ) {
  /* if not working on a layer, document should be set to the
  document of the working frame
  if the working frame is not set, use the window object
  of the current document
  WARNING: - cross frame scripting will cause errors if
  your page is in a frameset from a different domain */
  if( !oDoc ) { if( oFrame ) { oDoc = oFrame.document; } else { oDoc = window.document; } }

  //check for images, forms, layers
  if( oDoc[oName] ) { return oDoc[oName]; }

  //check for pDOM layers
  if( oDoc.all && oDoc.all[oName] ) { return oDoc.all[oName]; }

  //check for DOM layers
  if( oDoc.getElementById && oDoc.getElementById(oName) ) {
    return oDoc.getElementById(oName); }

  //check for form elements
  for( var x = 0; x < oDoc.forms.length; x++ ) {
    if( oDoc.forms[x][oName] ) { return oDoc.forms[x][oName]; } }

  //check for anchor elements
  //NOTE: only anchor properties will be available,
  //NOT link properties (in layers browsers)
  for( var x = 0; x < oDoc.anchors.length; x++ ) {
    if( oDoc.anchors[x].name == oName ) {
      return oDoc.anchors[x]; } }

  //check for any of the above within a layer in layers browsers
  for( var x = 0; document.layers && x < oDoc.layers.length; x++ ) {
    var theOb = overlay_findObject( oName, null, oDoc.layers[x].document );
      if( theOb ) { return theOb; } }

  //check for frames, variables or functions
  if( !oFrame && window[oName] ) { return window[oName]; }
  if( oFrame && oFrame[oName] ) { return oFrame[oName]; }

  //if checking through frames, check for any of the above within
  //each child frame
  for( var x = 0; oFrame && oFrame.frames && x < oFrame.frames.length; x++ ) {
    var theOb = overlay_findObject( oName, oFrame.frames[x], oFrame.frames[x].document ); if( theOb ) { return theOb; } }

  return null;
}