var ToolTip = 
{
    followMouse: true,
    offX: 12,
    offY: 12,
    // duration of clipping animation
    showAni: 300,
    hideAni: 200,
    ID:"ToolTipDiv",
    ready:false,
    timer:null,
    tip:null,
    init:function()
    {
     var opok=(!window.opera||window.opera&&opera.buildNumber&&opera.buildNumber()>3800)?true:false;
     if (document.createElement&&document.body&&typeof document.body.appendChild!="undefined"&&opok)
     {
      var el=document.createElement("DIV");
      el.id=this.ID;document.body.appendChild(el);
      this.showMult=el.offsetWidth/this.showAni/this.showAni;
      this.hideMult=el.offsetWidth/this.hideAni/this.hideAni;
      el.style.clip="rect(0, 0, 0, 0)";
      el.style.visibility="visible";
      this.ready=true;
     }
    },
    reveal:function(msg,e)
    {
     if (this.timer)
     { 
      clearTimeout(this.timer);
      this.timer=0;
     }
     if (!this.rtready) return;
     this.tip=document.getElementById(this.ID);
     this.writeTip("");
     this.writeTip(msg);
     viewport.getAll();
     this.w=this.tip.offsetWidth;
     this.h=this.tip.offsetHeight;
     this.startTime=(new Date()).getTime();
     this.positionTip(e);
     if (this.followMouse) tip_event.add(document,"mousemove",this.trackMouse,true);
     this.timer=setInterval("ToolTip.rollOut()",10);
    },
    rollOut:function()
    {
     var elapsed=(new Date()).getTime()-this.startTime;
     if (elapsed<this.showAni) 
     {
      var cv=this.w-Math.round(Math.pow(this.showAni-elapsed,2)*this.showMult);
      this.clipTo(0,cv,this.h,0);
     }
     else
     {
      this.clipTo(0,this.w,this.h,0);
      clearInterval(this.timer);
      this.timer=0;
     }
    },
    conceal:function()
    {
     if(this.timer)
     {
      clearTimeout(this.timer);
      this.timer=0;
     }
     this.startTime=(new Date()).getTime();
     if (this.followMouse) tip_event.remove(document,"mousemove",this.trackMouse,true);
     this.timer=setInterval("ToolTip.rollUp()",10);
    },
    rollUp:function()
    {
     var elapsed=(new Date()).getTime()-this.startTime;
     if (elapsed<this.hideAni)
     {
      var cv=Math.round(Math.pow(this.hideAni-elapsed,2)*this.hideMult);
      this.clipTo(0,cv,this.h,0);
     }
     else
     {
      this.clipTo(0,0,this.h,0);
      clearInterval(this.timer);
      this.timer=0;this.tip=null;
     }
    },
    writeTip:function(msg)
    {
     if (this.tip&&typeof this.tip.innerHTML!="undefined") this.tip.innerHTML=msg;
    },
    clipTo:function(top,rt,btm,lft)
    {
     if (this.tip&&this.tip.style) this.tip.style.clip="rect("+top+"px, "+rt+"px, "+btm+"px, "+lft+"px)";
    }
  };

  ToolTip.positionTip=function(e)
  {
   var x=e.pageX?e.pageX:e.clientX+viewport.scrollX;
   var y=e.pageY?e.pageY:e.clientY+viewport.scrollY;
   if (x+this.tip.offsetWidth+this.offX>viewport.width+viewport.scrollX)
   {
    x=x-this.tip.offsetWidth-this.offX;
   }
   else 
   {
    x=x+this.offX;
   }
   if (y+this.tip.offsetHeight+this.offY>viewport.height+viewport.scrollY)
   {
    y=y-this.tip.offsetHeight-this.offY;
    if (y<viewport.scrollY) y=viewport.height+viewport.scrollY-this.tip.offsetHeight;
   }
   else
   {
    y=y+this.offY;this.tip.style.left=x+"px";
   }
   this.tip.style.top=y+"px";
  };
  ToolTip.trackMouse=function(e)
  {
   e=tip_event.DOMit(e);
   ToolTip.positionTip(e);
  };
  ToolTip.rtready=true;