var ToolTips =
{
    CURRENT: null,
    TIMEOUT: null,
    LINK: null,
    TIMEOUT_HIDE: null,

    attachBehavior: function()
    {
        var links = document.getElementsByTagName('area');
        for (var i = 0; i < links.length; i++)
        {
            if (links[i].className.indexOf('pixel') >= 0 && links[i].title)
            {
                links[i].setAttribute('nicetitle', links[i].title);
                links[i].removeAttribute('title');
                addEvent(links[i], 'mouseover', ToolTips.over);
                addEvent(links[i], 'mouseout', ToolTips.out);
                addEvent(links[i], 'focus', ToolTips.over);
                addEvent(links[i], 'blur', ToolTips.out);
            }
        }
    },

    tooltipOver: function()
    {
        if (typeof ToolTips == 'undefined')
            return;
        if (ToolTips.TIMEOUT_HIDE)
            window.clearTimeout(ToolTips.TIMEOUT_HIDE);
    },

    tooltipOut: function()
    {
        if (typeof ToolTips == 'undefined')
            return;
        ToolTips.TIMEOUT_HIDE = window.setTimeout('ToolTips.hide()', 1000);
    },

    over: function(e)
    {
        if (typeof ToolTips == 'undefined')
            return;
        if (ToolTips.TIMEOUT)
            window.clearTimeout(ToolTips.TIMEOUT);
        if (ToolTips.TIMEOUT_HIDE)
            window.clearTimeout(ToolTips.TIMEOUT_HIDE);
        if (window.event && window.event.srcElement)
            ToolTips.LINK = window.event.srcElement;
        else if (e && e.target)
            ToolTips.LINK = e.target;
        ToolTips.TIMEOUT = window.setTimeout('ToolTips.show()', 500)
    },

    out: function()
    {
        if (typeof ToolTips == 'undefined')
            return;
        if (ToolTips.TIMEOUT)
            window.clearTimeout(ToolTips.TIMEOUT);
        ToolTips.TIMEOUT_HIDE = window.setTimeout('ToolTips.hide()', 1000);
    },

    hide: function()
    {
        if (typeof ToolTips == 'undefined')
            return;
        if (ToolTips.TIMEOUT_HIDE)
            window.clearTimeout(ToolTips.TIMEOUT_HIDE);
        if (ToolTips.CURRENT)
        {
            document.getElementsByTagName('body')[0].removeChild(ToolTips.CURRENT);
            ToolTips.CURRENT = null;
        }
    },

    show: function()
    {
        if (typeof ToolTips == 'undefined' || !ToolTips.LINK)
            return;
        if (ToolTips.CURRENT)
            ToolTips.hide();
        var link = ToolTips.LINK;
        while (!link.getAttribute('nicetitle') && link.nodeName.toLowerCase() != 'body')
            link = link.parentNode;
        var nicetitle = link.getAttribute('nicetitle');
        if (!nicetitle)
            return;
        var d = document.createElement('div');
        d.className = 'nicetitle';
        d.innerHTML = nicetitle;
        d.id = 'toolTip';
        d.style.position = "absolute";
        d.style.left = 10 + "px";
        d.style.width = 600 + "px";
        d.style.height = 400 + "px";
        var top = 10;
        if (document.documentElement && document.documentElement.scrollTop)
            top += document.documentElement.scrollTop;
        else if (document.body && document.body.scrollTop)
            top += document.body.scrollTop;
        d.style.top = top + "px";
        d.style.display = "block";
        document.getElementsByTagName('body')[0].appendChild(d);
        ToolTips.CURRENT = d;
        addEvent(d, 'mouseover', ToolTips.tooltipOver);
        addEvent(d, 'mouseout', ToolTips.tooltipOut);
        d.style.zIndex = 100;
    }

};

function addEvent(obj, evType, fn)
{
    if (obj.attachEvent)
    {
        var r = obj.attachEvent('on' + evType, fn);
        EventCache.add(obj, evType, fn);
        return r;
    }
    else if (obj.addEventListener)
    {
        obj.addEventListener(evType, fn, true);
        return true;
    }
    return false;
}

var EventCache = function()
{
    var listEvents = [];

    return {
        listEvents: listEvents,

        add: function(node, sEventName, fHandler, bCapture)
        {
            listEvents.push(arguments);
        },

        flush: function()
        {
            var i, item;
            for (i = listEvents.length - 1; i >= 0; i = i - 1)
            {
                item = listEvents[i];

                if (item[0].removeEventListener)
                {
                    item[0].removeEventListener(item[1], item[2], item[3]);
                }
                ;

                /* From this point on we need the event names to be
                 * prefixed with 'on'. */
                if (item[1].substring(0, 2) != 'on')
                {
                    item[1] = 'on' + item[1];
                }

                if (item[0].detachEvent)
                {
                    item[0].detachEvent(item[1], item[2]);
                }

                item[0][item[1]] = null;
            }
        }
    };
}();

if (document.createElement && document.getElementsByTagName)
{
    ToolTips.attachBehavior();
    addEvent(window, 'unload', ToolTips.out);
    addEvent(window, 'unload', EventCache.flush);
}
