var sp_xToolTipOffset = 0;
var sp_yToolTipOffset = 0;

function sp_GetEventX(zEvent)
{
	if (typeof(zEvent.pageX) == "number")
	{
	    return zEvent.pageX + sp_xToolTipOffset;
	}
	else
	{
	    return zEvent.clientX + sp_xToolTipOffset + sp_GetScrollX();
	}
	return 0;
}

function sp_GetEventY(zEvent)
{
	if (typeof(zEvent.pageY) == "number")
	{
	    return zEvent.pageY + sp_yToolTipOffset;
	}
	else
	{
	    return zEvent.clientY + sp_yToolTipOffset + sp_GetScrollY();
	}
	return 0;
}

function sp_GetScrollX()
{
    if (typeof(window.pageXOffset) == "number") 
    {
        return window.pageXOffset;
    } 
    else if (document.body && document.body.scrollLeft)
    {
        return document.body.scrollLeft;
    } 
    else if (document.documentElement && document.documentElement.scrollLeft) 
    {
        return document.documentElement.scrollLeft;
    }
    return 0;
}

function sp_GetScrollY()
{
    if (typeof(window.pageYOffset ) == "number") 
    {
        return window.pageYOffset;
    } 
    else if (document.body && document.body.scrollTop)
    {
        return document.body.scrollTop;
    } 
    else if (document.documentElement && document.documentElement.scrollTop) 
    {
        return document.documentElement.scrollTop;
    }
    return 0;
}

function sp_GetClientW() 
{
    if (typeof(window.innerWidth) == "number") 
    {
        return window.innerWidth;
    } 
    else if (document.documentElement && document.documentElement.clientWidth) 
    {
        return document.documentElement.clientWidth;
    } 
    else if (document.body && document.body.clientWidth) 
    {
        return document.body.clientWidth;
    }
    return 0;
}

function sp_GetClientH() 
{
    if (typeof(window.innerHeight) == "number") 
    {
        return window.innerHeight;
    } 
    else if (document.documentElement && document.documentElement.clientHeight) 
    {
        return document.documentElement.clientHeight;
    } 
    else if (document.body && document.body.clientHeight) 
    {
        return document.body.clientHeight;
    }
    return 0;
}

function sp_GetElementW(szElementID)
{
    if (document.getElementById && document.getElementById(szElementID))
    {
        var zElement = document.getElementById(szElementID);
        if (zElement)
        {
            return zElement.offsetWidth || zElement.style.pixelWidth || 0;
        }
    } 
    return 0;
}

function sp_GetElementH(szElementID)
{
    if (document.getElementById && document.getElementById(szElementID))
    {
        var zElement = document.getElementById(szElementID);
        if (zElement)
        {
            return zElement.offsetHeight || zElement.style.pixelHeight || 0;
        }
    } 
    return 0;
}

function sp_GetElementP(zElement) 
{
    var zObject = new Object();
    zObject.x = 0; zObject.y = 0;
    zObject.width = 0; zObject.height = 0;
    if (zElement.offsetParent)
    {
        zObject.x = zElement.offsetLeft;
        zObject.y = zElement.offsetTop;
        var zParent = zElement.offsetParent;
        while (zParent) 
        {
            zObject.x += zParent.offsetLeft;
            zObject.y += zParent.offsetTop;
            var parentTagName = zParent.tagName.toLowerCase();
            if (parentTagName != "html" && parentTagName != "body" && parentTagName != "table" && parentTagName != "div" && zParent.clientTop && zParent.clientLeft)
            {
                zObject.x += zParent.clientLeft;
                zObject.y += zParent.clientTop;
            }
            zParent = zParent.offsetParent;
        }
    }
    else if (zElement.left && zElement.top)
    {
        zObject.x = zElement.left;
        zObject.y = zElement.top;
    }
    else
    {
        if (zElement.x)
        {
            zObject.x = zElement.x;
        }
        if (zElement.y)
        {
            zObject.y = zElement.y;
        }
    }
    if (zElement.offsetWidth && zElement.offsetHeight)
    {
        zObject.width = zElement.offsetWidth;
        zObject.height = zElement.offsetHeight;
    }
    else if (zElement.style && zElement.style.pixelWidth && zElement.style.pixelHeight)
    {
        zObject.width = zElement.style.pixelWidth;
        zObject.height = zElement.style.pixelHeight;
    }
    return zObject;
}

function sp_ToolTipShow(zElement, zEventObject, szToolTipID)
{
    if (zElement && zEventObject)
    {
        zEventObject.cancelBubble = true;
        
        var zObject = sp_GetElementP(zElement);
              
        sp_ToolTipMove(szToolTipID, zObject.x, zObject.y + zObject.height);
        
        if (sp_ToolTipChangeVisibility(szToolTipID, "visible"))
        {
            window.currentlyVisibleToolTip = szToolTipID;
            return true;
        }
    }
    return false;
}

function sp_ToolTipShowWithOffset(zElement, zEventObject, szToolTipID, xOffset, yOffset) 
{
    if (zElement && zEventObject) 
    {
        zEventObject.cancelBubble = true;

        var zObject = sp_GetElementP(zElement);

        sp_ToolTipMove(szToolTipID, zObject.x + xOffset, zObject.y + yOffset + zObject.height);

        if (sp_ToolTipChangeVisibility(szToolTipID, "visible")) 
        {
            window.currentlyVisibleToolTip = szToolTipID;
            return true;
        }
    }
    return false;
}

function sp_ToolTipShowXY(zEventObject, szToolTipID)
{
    if (zEventObject)
    {
        zEventObject.cancelBubble = true;
        
        var x = sp_GetEventX(zEventObject);
        var y = sp_GetEventY(zEventObject);

        var maxX = sp_GetClientW() + sp_GetScrollX() - sp_GetElementW(szToolTipID);
        var maxY = sp_GetClientH() + sp_GetScrollY() - sp_GetElementH(szToolTipID);

        if (x > maxX) x = maxX;
        if (y > maxY) y = maxY;
        
        if (x < sp_GetScrollX()) x = sp_GetScrollX();
        if (y < sp_GetScrollY()) y = sp_GetScrollY();
        
        sp_ToolTipMove(szToolTipID, x, y);
        
        if (sp_ToolTipChangeVisibility(szToolTipID, "visible"))
        {
            window.currentlyVisibleToolTip = szToolTipID;
            return true;
        }
    }
    return false;
}

function sp_ToolTipHide()
{
    if (window.currentlyVisibleToolTip)
    {
        sp_ToolTipChangeVisibility(window.currentlyVisibleToolTip, "hidden");
        window.currentlyVisibleToolTip = false;
    }
    return false;
}

function sp_ToolTipMove(szToolTipID, xCoordinate, yCoordinate)
{
    if (document.getElementById && document.getElementById(szToolTipID))
    {
        var zElement = document.getElementById(szToolTipID);
        if (zElement)
        {
            if (zElement.style)
            {
                zElement.style.left = xCoordinate + "px";
                zElement.style.top = yCoordinate + "px";
                return true;
            }
        }
    } 
    return false;
}

function sp_ToolTipChangeVisibility(szToolTipID, sVisibility)
{
    if (document.getElementById && document.getElementById(szToolTipID))
    {
        var zElement = document.getElementById(szToolTipID);
        if (zElement)
        {
            if (zElement.style)
            {
                zElement.style.visibility = sVisibility;
                return true;
            }
        }
    } 
    return false;
}

