// Tooltip.js
Codebase.load("http://codebase.gd-ks.com/js/Event.js");
Codebase.load("http://codebase.gd-ks.com/js/Element.js");
Codebase.load("http://codebase.gd-ks.com/js/Style.js");

Tooltip.offsetX=10;
Tooltip.offsetY=10;

Tooltip.Styles={
   
   Default: {"position":"absolute", "visibility":"hidden", "top":"0px", "left":"0px", "padding":"2px", "background":"#FFFFCC", "border":"1px solid #333", "color":"#333", "minWidth":"250px"}, 

   Default: {"position":"absolute", "visibility":"hidden", "top":"0px", "left":"0px"}, 
   
   Blank: {"position":"absolute", "visibility":"hidden", "top":"0px", "left":"0px", "padding":"0px", "background":"transparent", "border":"0px"}
   
};

Tooltip.STYLE=Tooltip.Styles.Default;

function Tooltip()
{
   this._node=arguments[0];
   
   var tooltipHTML=(arguments.length==2 ? arguments[1] : ((this._node.title!="" && this._node.title!=undefined) ? this._node.title : (this._node.alt!="" && this._node.alt!=undefined) ? this._node.alt : ""));
   
   if(tooltipHTML!="")
   {
      var _this=this;

      this.tooltipNode=$E("div");
      Style.setAttributes(this.tooltipNode, Tooltip.STYLE);
      
      // Set content then clear old title tag so browser-defined tooltips don't show
      this.tooltipNode.innerHTML=(arguments.length>1 ? arguments[1] : tooltipHTML);
      this._node.title=(this._node.alt="");

      // Handle listeners
      Event.observe(this._node, "mouseover", function(e){ _this.showTooltip(e); });
      Event.observe(this._node, "mousemove", function(e){ _this.updateTooltipLocation(e); });
      Event.observe(this._node, "mouseout", function(e){ _this.hideTooltip(e); });

      // Build
      $tagName("body")[0].appendChild(this.tooltipNode);
      
      Element.addClassName(this.tooltipNode, "tooltip");

      return this;
   }
}

Tooltip.prototype.setStyle=function(s)
{
   this.tooltipNode.setStyle(s);
};

Tooltip.prototype.showTooltip=function(e)
{
   this.updateTooltipLocation(e);
   this.tooltipNode.style.visibility="visible";
};

Tooltip.prototype.hideTooltip=function()
{
   this.tooltipNode.style.visibility="hidden";
};

Tooltip.prototype.updateTooltipLocation=function(e)
{
   var evt=e || window.event;
   
   var x=evt.pageX || evt.clientX + document.body.scrollLeft;
   var y=evt.pageY || evt.clientY + document.body.scrollTop;
   
   var width=Element.getWidth(this.tooltipNode);
   var height=Element.getHeight(this.tooltipNode);
   
   // Handle positioning and offset
   if(self.innerWidth)
   {
      frameWidth=self.innerWidth;
      frameHeight=self.innerHeight;
   }
   else if(document.documentElement && document.documentElement.clientWidth)
   {
      frameWidth=document.documentElement.clientWidth;
      frameHeight=document.documentElement.clientHeight;
   }
   else if(document.body)
   {
      frameWidth=document.body.clientWidth;
      frameHeight=document.body.clientHeight;
   }
   
   if(x+width>frameWidth)
   {
      left=x-width;
      offsetX=Tooltip.offsetX*-1;
   }
   else
   {
      left=x;
      offsetX=Tooltip.offsetX;
   }
      
   if(y+height>frameHeight)
   {
      elTop=y-height;
      offsetY=Tooltip.offsetY*-1;
   }
   else
   {
      elTop=y;
      offsetY=Tooltip.offsetY;
   }
   
   this.tooltipNode.style.top=(elTop+offsetY) + "px";
   this.tooltipNode.style.left=(left+offsetX) + "px";
};

Tooltip.init=function()
{
   var els=$className("flag_tooltip");
   
   for(i=0; i<els.length; i++)
      new Tooltip(els[i]);
};
