/**
 * @fileoverview Tooltip class with all necessary helper functions
 *
 * @author      Marc-Oliver Stühmer
 * @version     1.0.20071122
 */

/**
 * Attach an event handler to an element's event
 *
 * @param   {Node} element              The element to attach the event handler to
 * @param   {String} eventname          The name of the event (without 'on')
 * @param   {Function} handler          The event handler function to add
 */
function addEventHandler(element, eventname, handler)
{
    if (element.addEventListener) {
        element.addEventListener(eventname, handler, false);   // DOM version
    } else if (element.attachEvent) {
        element.attachEvent('on' + eventname, handler);   // IE version
    }
} 
 
/**
 * Determine the document size and scrollbar positions
 *
 * @return  {Object}                    The document dimensions (height, width, X-offset, Y-offset)
 */
function getDocumentDimensions()
{
    var width, height, offsetX, offsetY;
        
    if (document.compatMode && document.compatMode != 'BackCompat'
        && navigator.appName.search(/opera/i) == -1) {
        width   = document.documentElement.clientWidth;
        height  = document.documentElement.clientHeight;
        offsetX = document.documentElement.scrollLeft;
        offsetY = document.documentElement.scrollTop;
    } else {
        width   = document.body.clientWidth;
        height  = document.body.clientHeight;
        offsetX = document.body.scrollLeft;
        offsetY = document.body.scrollTop;  
    }
    
    return {
        'width'   : width, 
        'height'  : height, 
        'offsetX' : offsetX, 
        'offsetY' : offsetY
    };
}


/**
 * @class       Mouse cursor position class
 * @static
 */
var CursorPos = {

    /**
     * The X value of the current cursor position
     * @static
     * @type    Number
     */
    x : null,
    /**
     * The Y value of the current cursor position
     * @static
     * @type    Number
     */
    y : null,

    /**
     * Start to acquire the cursor position from the document object
     * @static
     */
    init : function ()
    {
        document.onmousemove = CursorPos._detectCoords;
    },

    /**
     * Determine the current mouse cursor coordinates
     * @private
     * @static
     * 
     * @param   {Event} ev              The calling event
     */
    _detectCoords : function (ev)
    {
        if (!ev) {   // IE version
            if (document.compatMode && document.compatMode != 'BackCompat') {
                var x = document.documentElement.scrollLeft + window.event.clientX;
                var y = document.documentElement.scrollTop + window.event.clientY;
            } else {
                var x = document.body.scrollLeft + window.event.clientX;
                var y = document.body.scrollTop + window.event.clientY;
            }
        } else {   // DOM version
            var x = ev.pageX;
            var y = ev.pageY;
        }
        CursorPos.x = x;
        CursorPos.y = y;
    }
    
}


/**
 * @class       Tooltip class
 * @static
 *
 * @requires    CursorPos               html/cCursorPos.js
 * @requires                            html/positioning.js
 */
var Tooltip = {

    /**
     * The X offset of the tooltip relative to the cursor position
     * @static
     * @type    Number
     */
    offsetX : 0,
    /**
     * The Y offset of the tooltip relative to the cursor position
     * @static
     * @type    Number
     */
    offsetY : 18,

    /**
     * Display the tooltip at the current cursor position
     * @static
     * 
     * @param   {String} source_id      ID of the HTML element to get the tooltip's content from
     */
    show : function (source_id)
    {
        var div = document.getElementById('tooltip');
        if (!div) {
            div = document.createElement('div');
            div.setAttribute('id', 'tooltip');
            div.style.display  = 'none';
            div.style.position = 'absolute';
            div.style.zIndex   = '1000';
            document.getElementsByTagName('body')[0].appendChild(div);
        }
        // Dummy IFrame for IE 6 to cover select boxes
        var iframe = document.getElementById('if_tooltip');
        if (!iframe) {
            iframe = document.createElement('iframe');
            iframe.setAttribute('id', 'if_tooltip');
            iframe.style.display  = 'none';
            iframe.style.position = 'absolute';
            iframe.style.zIndex   = '999';
            iframe.style.border   = '0';
            document.getElementsByTagName('body')[0].appendChild(iframe);
        }
        div.innerHTML = document.getElementById(source_id).innerHTML;        
    
        div.style.display = '';   // Temporarily show DIV to determine its size
        var divWidth  = div.offsetWidth;
        var divHeight = div.offsetHeight;
        div.style.display = 'none';

        if (CursorPos.x + Tooltip.offsetX + divWidth - Tooltip._documentOffsetX > Tooltip._documentWidth) {
            var x = Tooltip._documentWidth - divWidth + Tooltip._documentOffsetX;
        } else if (CursorPos.x + Tooltip.offsetX - Tooltip._documentOffsetX < 0) {
            var x = Tooltip._documentOffsetX;
        } else {
            var x = CursorPos.x + Tooltip.offsetX;
        }
        if (CursorPos.y + Tooltip.offsetY + divHeight - Tooltip._documentOffsetY > Tooltip._documentHeight) {
            var y = CursorPos.y - divHeight - 4;
        } else if (CursorPos.y + Tooltip.offsetY - Tooltip._documentOffsetY < 0) {
            var y = CursorPos.y + 18;
        } else {
            var y = CursorPos.y + Tooltip.offsetY;
        }
    
        iframe.style.left = x + 'px';
        iframe.style.top  = y + 'px';
        div.style.left    = x + 'px';
        div.style.top     = y + 'px';

        iframe.style.display = '';
        div.style.display    = '';

        iframe.width  = div.offsetWidth;
        iframe.height = div.offsetHeight;
    },

    /**
     * Hide the tooltip
     * @static
     */
    hide : function ()
    {
        var div = document.getElementById('tooltip');
        if (div) {
            div.style.display = 'none';
        }
        var iframe = document.getElementById('if_tooltip');
        if (iframe) {
            iframe.style.display = 'none';
        }
    },

    /**
     * Initialize the tooltip's properties
     * @static
     */
    init : function ()
    {
        var dim = getDocumentDimensions();
        Tooltip._documentWidth   = dim.width;
        Tooltip._documentHeight  = dim.height;
        Tooltip._documentOffsetX = dim.offsetX;
        Tooltip._documentOffsetY = dim.offsetY;
    }

}

CursorPos.init();
addEventHandler(window, 'load', Tooltip.init);
addEventHandler(window, 'resize', Tooltip.init);
addEventHandler(window, 'scroll', Tooltip.init);

