﻿var VAlign = { Top: "top", Bottom: "bottom" }
var Align = { Left: "left", Right: "right" }
var Tooltip = function()
{
    this.tooltipPrefix = "_tooltip";

    this.parentId;
    this.parent = null;
    this.tooltipId;
    this.tooltip = null;
    this.valign = VAlign.Bottom;
    this.align = Align.Left;
    this.hintBorderBaseAlign = Align.Left;
}

Tooltip.prototype.Show = function(parent)
{
    this.Register(parent);
    this.tooltip.style.display = "block";

    this.SetPosition();
    this.PreRender();
}

Tooltip.prototype.ShowAligned = function(parent, align, valign, hintBorderBaseAlign)
{
    this.align = align;
    this.valign = valign;
    this.hintBorderBaseAlign = hintBorderBaseAlign;
    this.Show(parent);
}


Tooltip.prototype.Hide = function(parent)
{
    this.Initialize(parent);
    if (this.tooltip != null)
    {
        this.tooltip.style.display = "none";
    }
}

Tooltip.prototype.Register = function(parent)
{
    this.Initialize(parent);

    if (this.IsRegistered(this.tooltip))
    {
        return;
    }

    this.AppendToBody();
}

Tooltip.prototype.IsRegistered = function(node)
{
    return node.parentNode.nodeName == "body";
}

Tooltip.prototype.GetParentPosition = function(element)
{
    result = { x: 0, y: 0 };
    while (element)
    {
        result.x += element.offsetLeft;
        result.y += element.offsetTop;

        if (element.tagName.toLowerCase() == "div")
        {
            result.x -= element.scrollLeft;
            result.y -= element.scrollTop;
        }

        element = element.offsetParent;
    }

    return result;
}

Tooltip.prototype.SetPosition = function()
{
    var pos = this.GetParentPosition(this.parent);

    var deltaY = this.parent.offsetHeight + 2;
    if (this.valign == VAlign.Top)
    {
        deltaY = -(this.tooltip.offsetHeight);
    }
    pos.y += deltaY;

    var viewportWidth = document.documentElement.clientWidth;
    var tooltipWidth = this.tooltip.offsetWidth;
    var scrollLeft = document.documentElement.scrollLeft;

    var hintBaseDelta = this.hintBorderBaseAlign == Align.Left ? 0 : tooltipWidth;
    var delta = viewportWidth > pos.x - scrollLeft + (this.hintBorderBaseAlign == Align.Left ? tooltipWidth : 0)
            ? ((this.align == Align.Right) ? -(hintBaseDelta - this.parent.offsetWidth) : -(hintBaseDelta - 0))
            : viewportWidth - (pos.x + tooltipWidth) + scrollLeft;

    this.tooltip.style.left = ((pos.x > 0) ? pos.x + delta : 0) + "px";
    this.tooltip.style.top = ((pos.y > 0) ? pos.y : 0) + "px";
}

Tooltip.prototype.PreRender = function()
{
    if (this.tooltip == null)
        return;
    var iframe = this.tooltip.getElementsByTagName("iframe")[0];

    if (iframe == null)
        return;

    iframe.style.width = this.tooltip.offsetWidth + 2 + "px";
    iframe.style.height = this.tooltip.offsetHeight + 2 + "px";
}

Tooltip.prototype.AppendToBody = function()
{
    this.tooltip.parentNode.removeChild(this.tooltip);
    document.body.appendChild(this.tooltip);
}

Tooltip.prototype.Initialize = function(parent) {

    this.parentId = parent.id;
    this.parent = parent;

    this.tooltipId = this.parentId + this.tooltipPrefix;
    this.tooltip = document.getElementById(this.tooltipId);
}

var ShowTooltip = function(parent)
{
    GetTooltip().Show(parent);
}

var ShowTooltipAligned = function(parent, align, valign, borderBaseAlign)
{
    GetTooltip().ShowAligned(parent, align, valign, borderBaseAlign);
}

var HideTooltip = function(parent)
{
    GetTooltip().Hide(parent);
}

var __tooltip;

function GetTooltip()
{
    if (!__tooltip)
    {
        __tooltip = new Tooltip;
    }
    return __tooltip;
}