MouseDocX = -1;
MouseDocY = -1;
MouseScrX = -1;
MouseScrY = -1;
TooltipObjs = new Array();
TrackTooltips = new Array();
TooltipIntervalID = null;
TooltipInterval = 40;

if(bIsNN4)
	document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = SaveMousePos;

if(bIsNN4)
{	iOrigScrWidth = parent.innerWidth;
	iOrigScrHeight = parent.innerHeight;
}
self.onresize = TooltipDocumentReload;

function TooltipDocumentReload()
{	if(bIsNN4)
	{	if(top.innerWidth != iOrigScrWidth || top.innerHeight != iOrigScrHeight)
			window.location.reload();
	}
	else
		self.location.reload();
}

function SaveMousePos(e)
{	if(bIsIE5)
	{	MouseDocX = event.clientX + document.body.scrollLeft;
		MouseDocY = event.clientY + document.body.scrollTop;

		MouseScrX = event.clientX;
		MouseScrY = event.clientY;
	}
	else
	{	MouseDocX = e.pageX;
		MouseDocY = e.pageY;

		MouseScrX = MouseDocX - GMM_GetDocumentScrollX();
		MouseScrY = MouseDocY - GMM_GetDocumentScrollY();
	}
}

function UpdateTooltips()
{	PosX = 0;
	PosY = 0;

	for(i=0;i<TrackTooltips.length;i++)
	{	if(TrackTooltips[i].dMx < 0 && MouseScrX < TrackTooltips[i].FlipXMargin && MouseScrX < TrackTooltips[i].UnFlipXMargin)
			PosX = MouseDocX - TrackTooltips[i].dMx - TrackTooltips[i].width;	//flipped
		else if(TrackTooltips[i].dMx > 0 && MouseScrX > TrackTooltips[i].FlipXMargin && MouseScrX > TrackTooltips[i].UnFlipXMargin)
			PosX = MouseDocX - TrackTooltips[i].dMx - TrackTooltips[i].width;	//flipped
		else
			PosX = MouseDocX + TrackTooltips[i].dMx;

		if(TrackTooltips[i].dMy < 0 && MouseScrY < TrackTooltips[i].FlipYMargin && MouseScrY < TrackTooltips[i].UnFlipYMargin)
			PosY = MouseDocY - TrackTooltips[i].dMy - TrackTooltips[i].height;
		else if(TrackTooltips[i].dMy > 0 && MouseScrY > TrackTooltips[i].FlipYMargin && MouseScrY > TrackTooltips[i].UnFlipYMargin)
			PosY = MouseDocY - TrackTooltips[i].dMy - TrackTooltips[i].height;
		else
			PosY = MouseDocY + TrackTooltips[i].dMy;

		GMM_MoveLayerTo(TrackTooltips[i].BaseLayer, PosX, PosY);
	}
}

// Tooltip constructor
function Tooltip(Content, TrackMouse, X, Y) //[, width, height)]
{	this.TrackMouse = TrackMouse;
	if(TrackMouse)
	{	//Make the layer (name is index in TooltipObjs)
		this.BaseLayer = GMM_CreateLayer("Tooltip"+TooltipObjs.length+"Base", 0, 0, -1, -1, 1);
	}
	else
	{	//Make the layer (name is index in TooltipObjs)
		this.BaseLayer = GMM_CreateLayer("Tooltip"+TooltipObjs.length+"Base", X, Y, -1, -1, 1);
	}

	//Generate HTML...
	TooltipHTML = "<table";
	if(arguments[4])
		TooltipHTML += " width='"+arguments[4]+"'";
	if(arguments[5])
		TooltipHTML += " height='"+arguments[5]+"'";
	TooltipHTML += " cellpadding='";
	TooltipHTML += self.TooltipPadding? TooltipPadding : "0";
	TooltipHTML += "' border='0' cellspacing='";
	TooltipHTML += self.TooltipBorder? TooltipBorder : "0";
	TooltipHTML += "'>\n<tr>\n<td";
	TooltipHTML += self.TooltipBgcolor? " bgcolor='"+TooltipBgcolor+"'>" : ">";
	TooltipHTML += Content;
	TooltipHTML += "</td>\n</tr>\n</table>\n";

	//Get a ref for later use...
	TooltipObjs[TooltipObjs.length] = this;

	//Set up content for tooltip
	GMM_UpdateLayerContent(this.BaseLayer, TooltipHTML);

	//Set bordercolor if one is specified
	if(self.TooltipBordercolor)
		GMM_SetLayerBgColor(this.BaseLayer, TooltipBordercolor);

	if(TrackMouse)
	{	this.isTracked = -1;
		this.width = GMM_GetLayerWidth(this.BaseLayer);
		this.height = GMM_GetLayerHeight(this.BaseLayer);

		if(X < 0)
		{	this.dMx = X - this.width;	//Mind u: X is negative! dMx is also...
			this.FlipXMargin = -this.dMx;	//Margin before flipping
			this.UnFlipXMargin = GMM_GetWindowInnerWidth() + this.dMx;	//Margin when flipped
		}
		else
		{	this.dMx = X;
			this.UnFlipXMargin = this.dMx + this.width;	//Margin when flipped
			this.FlipXMargin = GMM_GetWindowInnerWidth() - this.UnFlipXMargin;	//Margin before flipping
		}

		if(Y < 0)
		{	this.dMy = Y - this.height;	//Mind u: Y is negative! dMy is also...
			this.FlipYMargin = -this.dMy;	//Margin before flipping
			this.UnFlipYMargin = GMM_GetWindowInnerHeight() + this.dMy;	//Margin when flipped
		}
		else
		{	this.dMy = Y;
			this.UnFlipYMargin = this.dMy + this.height;	//Margin when flipped
			this.FlipYMargin = GMM_GetWindowInnerHeight() - this.UnFlipYMargin;	//Margin before flipping
		}

		this.RightMargin = GMM_GetWindowInnerWidth() - this.dMx - this.width;
		this.BottomMargin = GMM_GetWindowInnerHeight() - this.dMy - this.height;
	}

	//Declare methods...
	this.show = ToolTipShow;
	this.hide = ToolTipHide;
}

function ToolTipShow()
{	if(!this.TrackMouse)
	{	//No MouseTrack: just display layer...
		GMM_SetLayerVisibility(this.BaseLayer, "visible");
	}
	else
	{	//MouseTrack: add to TrackTooltips array and start tracking if neccessary...

		//Already tracking: return...
		if(this.isTracked != -1)
			return;

		//Calculate interval based on FPS setting...
		if(self.TooltipFPS)
		{	TooltipInterval = parseInt(1000 / TooltipFPS);
		}


		this.isTracked = TrackTooltips.length;
		TrackTooltips[TrackTooltips.length] = this;
		UpdateTooltips();
		GMM_SetLayerVisibility(this.BaseLayer, "visible");

		//Start tracking loop if neccessary...
		if(TooltipIntervalID == null)
			TooltipIntervalID = self.setInterval("UpdateTooltips();", TooltipInterval);
	}
}

function ToolTipHide()
{	//Not tracking: just hide layer...
	if(this.isTracked == -1)
	{	GMM_SetLayerVisibility(this.BaseLayer, "hidden");
	}
	else
	{	//Tracking: remove from track array, hide layer and stop loop if neccessary...
		GMM_SetLayerVisibility(this.BaseLayer, "hidden");
    // TrackTooltips.splice(this.isTracked, 1);
		this.isTracked = -1;
		if(TrackTooltips.length == 0)
		{	self.clearInterval(TooltipIntervalID);
			TooltipIntervalID = null;
		}
	}
}

