var TOOLTIP_TEMPLATE_ID     = "TooltipTPL";     /**< ID of the location of the tooltip message template */
var TOOLTIP_MESSAGE_ID      = "TooltipMessage"; /**< ID of the location of the tooltip message (in the template) */
var TOOLTIP_TIMEOUT_START   = "100";            /**< Wait for 800ms before displaying the tooltip */

/*
 * Global variables
 */

/**
 * ID of the current tooltiped control
 */
var Tooltip_goControl   = null;
var Tooltip_goRegion    = null;
var Tooltip_gsTimerID   = null;

/**
 * Starts a tooltip event
 * A tooltip wait for a period of time and display a toolip message over a control.
 * @param _sID ID of the control to use for tooltip
 */
function Tooltip_Start(_sRegionID, _sMessageID)
{
    // Valid control ?
    if((_sMessageID != null)
    && (_sRegionID != null))
    {
        // Gets Region control
        var oRegionCtrl = document.getElementById(_sRegionID);
        
        // Valid ?
        if(oRegionCtrl != null)
        {
            // Gets Region position
            Tooltip_goRegion = Tools_GetDimensions(oRegionCtrl);
            
            // Valid ?
            if(Tooltip_goRegion != null)
            {
                // Gets control
                var oControl = document.getElementById(_sMessageID);
                
                // Previous control tooltiped ?
                if(oControl != null)
                {
                    if((Tooltip_goControl != null)
                    && (Tooltip_goControl != oControl))
                    {
                        // Release the previous tooltip
                        // NOTE : It shoule never happen since as soon as the mouse move,
                        // the tooltip, the current tooltip is destroyed
                        _private_Tooltip_Release();
                    }
                    
                    // Assigns new control
                    Tooltip_goControl = oControl;
                    
                    // Stop the previous timer
                    Timer_Stop(Tooltip_gsTimerID);
                    
                    // Starts a Timer
                    Tooltip_gsTimerID = Timer_Start("_private_Tooltip_onStartTimeout()", TOOLTIP_TIMEOUT_START);
                }
            }
        }
    }
}


/********* EVENTS *********************/
function _private_Tooltip_onStartTimeout()
{
    // The current timer ID has been released
    Tooltip_gsTimerID = null;
    
     // Valid control selected ?
     if(Tooltip_goControl != null)
     {
         // Valid coordinated ?
         if(Tools_IsMouseInRegion(Tooltip_goRegion))
         {
             // Build generated tooltip ID
             var sBuiltTooltipID = Tooltip_goControl.id + TOOLTIP_TEMPLATE_ID;
             
             // Try to gets built tooltip
             var oBuiltTooltip = document.getElementById(sBuiltTooltipID);
             
             // A tooltip has not already been generated ?
             if(oBuiltTooltip == null)
             {
                 // Gets tooltip template
                 var oTooltipTemplate = document.getElementById(TOOLTIP_TEMPLATE_ID);
                 
                 // Valid ?
                 if(oTooltipTemplate != null)
                 {
                     // Gets the inner content
                     var sContent = Tooltip_goControl.innerHTML;
                     
                     // Clone tooltip template
                     var oBuiltTooltip = oTooltipTemplate.cloneNode(true);
                     
                     // Set style
//                 oBuiltTooltip.setAttribute("style", "position: absolute;");
                     
                     // valid clone ?
                     if(oBuiltTooltip != null)
                     {
                         // Updates clone ID
                         Tools_AppendID(oBuiltTooltip, Tooltip_goControl.id, TOOLS_POSITION_PREFIX);
                         
                         // Inserts clone just after message
                         Tooltip_goControl.parentNode.insertBefore(oBuiltTooltip, Tooltip_goControl);
                         
                         // Inserts message content
                         var sBuiltTooltipMessageID = Tooltip_goControl.id + TOOLTIP_MESSAGE_ID;
                         var oInsertNode = document.getElementById(sBuiltTooltipMessageID);
                         
                         // Valid ?
                         if(oInsertNode != null)
                         {
                             oInsertNode.innerHTML = sContent;
                         }
                     }
                 }
             }
             
             // The tooltip built, shows it
             oBuiltTooltip.style.display = "block";
    
             // Sets position
             oBuiltTooltip.style.left   = (Tools_giMouseX - 10) + "px";
             oBuiltTooltip.style.top    = (Tools_giMouseY + 10) + "px";
                      
             // Catch mouse move event
             Event_AddAction(EVENT_MOUSE_MOVE, _private_Tooltip_OnMouseMove);
         }
     }
}

/**
 * Event raised when mouse moved
 */
function _private_Tooltip_OnMouseMove()
{
    // A control was shown ?
    if(Tooltip_goControl != null)
    {
        // Timer exists ?
        if(Tooltip_gsTimerID != null)
        {
            // restart timer
            Timer_Restart(Tooltip_gsTimerID);
        }
        else
        {
            // Starts a new timer
            Tooltip_gsTimerID = Timer_Start("_private_Tooltip_onStartTimeout()", TOOLTIP_TIMEOUT_START);
        }
        
        // Releases it
        _private_Tooltip_Release();
    }
}

/******** PRIVATE METHODS ************/

function _private_Tooltip_Release()
{
    // Build generated tooltip ID
    var sBuiltTooltipID = Tooltip_goControl.id + TOOLTIP_TEMPLATE_ID;
     
    // Try to gets built tooltip
    var oBuiltTooltip = document.getElementById(sBuiltTooltipID);
     
    // A tooltip was generated ?
    if(oBuiltTooltip != null)
    {
        // Hides it
        oBuiltTooltip.style.display = "none";
        
        // Do not catch mouse move events
        Event_RemoveAction(EVENT_MOUSE_MOVE, _private_Tooltip_OnMouseMove);
    }
}
