function JsTooltip(tooltipId, linkId, elementId, position, adjust)
{
    var _this = this;
    var _tooltip = null;
    var _link = null;
    var _element = null;
    var _close = null;
    var _isVisible = true;
    var _position = null;
    var _adjust = null;
    var _listeners = null;

    var _ctor = function(tooltipId, linkId, elementId, position, adjust)
        {
            _tooltip = dojo.byId(tooltipId);
            _link = dojo.byId(linkId);
            _element = dojo.byId(elementId ? elementId : linkId);
            _position = position;
            _adjust = adjust
            _listeners = [];

            if (_link)
            {
                dojo.connect(_link, 'onclick', _link,
                             function(event) { _this.show(event); dojo.stopEvent(event); });
                dojo.connect(_link, 'onfocus', _link,
                             function(event) { this.blur(); });
            }
            if (_tooltip)
            {
                _close = _tooltip.getElementsByTagName('a')[0];
                if (_close)
                {
                    dojo.connect(_close, 'onclick', _close,
                                 function(event) { _this.hide(event); dojo.stopEvent(event); });
                }
            }

            _this.hide();
        };

    this.getTooltip = function()
        {
            return _tooltip;
        };

    this.getLink = function()
        {
            return _link;
        };

    this.getElement = function()
        {
            return _element;
        };

    this.addListener = function(listener)
        {
            if ((typeof listener.tooltipShown != 'undefined')
                && (typeof listener.tooltipHidden != 'undefined'))
            {
                _listeners.push(listener);
            }
        };

    this.show = function(event)
        {
            if (! _isVisible)
            {
                dojo.removeClass(_tooltip, 'hiddenElement');
                document.body.appendChild(_tooltip);
                _isVisible = true;
                _fireListeners('tooltipShown', event);
            }
            _place();
        };

    this.hide = function(event)
        {
            if (_isVisible)
            {
                dojo.addClass(_tooltip, 'hiddenElement');
                _tooltip.parentNode.removeChild(_tooltip);
                _isVisible = false;
                _fireListeners('tooltipHidden', event);
            }
        };

    var _place = function()
        {
            if (_isVisible)
            {
                var tooltipBox = dojo.coords(_tooltip, true);
                var elementBox = dojo.coords(_element, true);
                var xAdjust = ((_adjust && _adjust.x) ? _adjust.x : 0);
                var yAdjust = ((_adjust && _adjust.y) ? _adjust.y : 0);
                var left = 0, top = 0;
                switch (_position)
                {
                    case JsTooltip.NORTHWEST:
                        left = elementBox.x - tooltipBox.w - 1;
                        top = elementBox.y - tooltipBox.h - 1;
                        break;

                    case JsTooltip.NORTH:
                    default:
                        left = (elementBox.x + (elementBox.w / 2)) - (tooltipBox.w / 2);
                        top = (elementBox.y - tooltipBox.h) - 5;
                        break;
                }
                _tooltip.style.left = '' + (left + xAdjust) + 'px';
                _tooltip.style.top = '' + (top + yAdjust) + 'px';
            }
        };

    var _fireListeners = function(type, event)
        {
            for (var i = 0, n = _listeners.length; i < n; i++)
            {
                var fn = _listeners[i][type];
                if (fn)
                {
                    fn.call(_listeners[i], _this, event);
                }
            }
        };

    _ctor(tooltipId, linkId, elementId, position, adjust);
}


JsTooltip.NORTH = 1;
JsTooltip.NORTHEAST = 2;
JsTooltip.EAST = 3;
JsTooltip.SOUTHEAST = 4;
JsTooltip.SOUTH = 5;
JsTooltip.SOUTHWEST = 6;
JsTooltip.WEST = 7;
JsTooltip.NORTHWEST = 8;
