// Initial setup code. Finds all tooltips on the page and registers appropriate event handlers.
function setUpTooltips()
{
    var lIcons = YAHOO.util.Dom.getElementsByClassName('tooltip');
    
    for (var i = 0; i < lIcons.length; i++)
    {
        var lIcon = lIcons[i];
        var lTooltipContents = document.getElementById(lIcon.id + 'Contents');
        
        YAHOO.util.Event.addListener(lIcon, "mouseover", showContents(lIcon, lTooltipContents));
        
        // When we mouse out of the tooltip contents, hide it.
        YAHOO.util.Event.addListener(lTooltipContents, "mouseout", hideContents(lIcon, lTooltipContents));
    }      
}
   
YAHOO.util.Event.onDOMReady(setUpTooltips); 

// Adjusts the tooltip position to make sure it's in the right place, then fades it in.
function showContents(icon, contents){
  return function(event){    
    var xy = YAHOO.util.Dom.getXY(icon);
    YAHOO.util.Dom.setXY(contents, [xy[0] + 33, xy[1] - 5]);
    new YAHOO.util.Anim(contents, { opacity: { to: 1 } }, 1, YAHOO.util.Easing.easeOut).animate();    
    
    // We rehide the tooltip in 3 seconds, unless the user mouses over the icon.
    function fadeOnExit(){
      var hideId = setTimeout(hide(contents), 2000);              
                
      YAHOO.util.Event.addListener(contents, "mouseover", function() { clearTimeout(hideId); });
      YAHOO.util.Event.addListener(icon, "mouseover", function() { clearTimeout(hideId); });
    };
    
    YAHOO.util.Event.addListener(contents, "mouseout", fadeOnExit);
    YAHOO.util.Event.addListener(icon, "mouseout", fadeOnExit);
  };
};

function hide(elt)
{
  return function() { 
    var anim = new YAHOO.util.Anim(elt, { opacity: { to: 0 } }, 1, YAHOO.util.Easing.easeOut);

    anim._onComplete.subscribe(function(){
      YAHOO.util.Dom.setXY(elt, [-1000, -1000]);
    });
    
    anim.animate();
  }
}
// Fade out the tooltip.  
function hideContents(icon, contents)
{
    return function(event)
    {
        // We may have moused over tooltip help links, and in this case, we don't wish to hide contents.
        var lMouseX = event.clientX;
        var lMouseY = event.clientY;
        var lTooltipRegion = YAHOO.util.Region.getRegion(contents);
        
        // Note that due to an 'out by one' bug in the region.contains() method, we test mouseX+1Y+1 as well as
        // mouseXY.
        if (! (lTooltipRegion.contains(new YAHOO.util.Point(lMouseX, lMouseY)) && 
               lTooltipRegion.contains(new YAHOO.util.Point(lMouseX + 1, lMouseY + 1))))
        {
          hide(contents)();
        }
    };
}
