var Tooltip = Class.create();
Tooltip.prototype = {
	initialize : function(id)
	{
		this.followMouse = true;
		this.fixed = false;
		this.offX = 8;
		this.offY = 12;
		this.tipID = id;
		this.ready = false;
		this.tip = null;
		this.mouseMoveFunction = null;

		if(document.createElement&&document.body&&typeof document.body.appendChild!="undefined")
		{
			if(!document.getElementById(this.tipID))
			{
				var el=document.createElement("DIV");
				el.id=this.tipID;
				document.body.appendChild(el);
			}
			this.ready=true;
		}
	},
	show:function(e,msg,x,y)
	{
		this.tip=document.getElementById(this.tipID);
		if(this.followMouse && !this.fixed)
		{
			this.mouseMoveFunction = this.trackMouse.bindAsEventListener(this);
			document.onmousemove = this.mouseMoveFunction;
		}
		this.writeTip("");
		this.writeTip(msg);
		viewport.getAll();
		if (this.fixed == true)
			this.positionFixedTip(x,y);
		else
			this.positionTip(e,this);
		$(this.tipID).style.visibility = 'visible';
	},
	writeTip:function(msg)
	{
		if(this.tip&&typeof this.tip.innerHTML!="undefined")
			this.tip.innerHTML=msg;
	},
	positionTip:function(e)
	{
		if(this.tip&&this.tip.style)
		{
			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;
				if(x<0)
					x=0;
			}
			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-tooltiptip.offsetHeight;
			}
			else
				y=y+this.offY;

			this.tip.style.left=x+"px";
			this.tip.style.top=y+"px";
		}
	},
	positionFixedTip:function(x,y)
	{
		if(this.tip&&this.tip.style)
		{
			this.tip.style.left=x+"px";
			this.tip.style.top=y+"px";
		}
	},
	hide:function()
	{
		$(this.tipID).style.visibility = 'hidden';
		if(this.followMouse && !this.fixed)
			Event.stopObserving(document, 'mousemove', this.mouseMoveFunction, true);
		this.tip=null;
	},
	trackMouse:function(e)
	{
		this.positionTip(e);
	}
}
var viewport = {
  getWinWidth: function () {
    this.width = 0;
    if (window.innerWidth) this.width = window.innerWidth - 18;
    else if (document.documentElement && document.documentElement.clientWidth)
  		this.width = document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth)
  		this.width = document.body.clientWidth;
  },

  getWinHeight: function () {
    this.height = 0;
    if (window.innerHeight) this.height = window.innerHeight - 18;
  	else if (document.documentElement && document.documentElement.clientHeight)
  		this.height = document.documentElement.clientHeight;
  	else if (document.body && document.body.clientHeight)
  		this.height = document.body.clientHeight;
  },

  getScrollX: function () {
    this.scrollX = 0;
  	if (typeof window.pageXOffset == "number") this.scrollX = window.pageXOffset;
  	else if (document.documentElement && document.documentElement.scrollLeft)
  		this.scrollX = document.documentElement.scrollLeft;
  	else if (document.body && document.body.scrollLeft)
  		this.scrollX = document.body.scrollLeft;
  	else if (window.scrollX) this.scrollX = window.scrollX;
  },

  getScrollY: function () {
    this.scrollY = 0;
    if (typeof window.pageYOffset == "number") this.scrollY = window.pageYOffset;
    else if (document.documentElement && document.documentElement.scrollTop)
  		this.scrollY = document.documentElement.scrollTop;
  	else if (document.body && document.body.scrollTop)
  		this.scrollY = document.body.scrollTop;
  	else if (window.scrollY) this.scrollY = window.scrollY;
  },

  getAll: function () {
    this.getWinWidth(); this.getWinHeight();
    this.getScrollX();  this.getScrollY();
  }

}
