Type.registerNamespace("Bonasource");

Bonasource.ControlTooltip = function(element)
{
  Bonasource.ControlTooltip.initializeBase(this, [element]);
  
  var _tooltipShowDelegate = null;
  var _tooltipHideDelegate = null;  
  var _tooltipMoveDelegate = null;    
  var _tooltipDiv = null;
  var _tooltipHTML;
  var _tooltipCssClass;
  var _pThis = this;
  
  this.get_tooltipHTML = function()
  {
    return _tooltipHTML;
  };
  this.set_tooltipHTML = function(value)
  {
    _tooltipHTML = value;
  };
  this.get_tooltipCssClass = function()
  {
    return _tooltipCssClass;
  };
  this.set_tooltipCssClass = function(value)
  {
    _tooltipCssClass = value;
  }
  this.initialize = function()
  {
    Bonasource.ControlTooltip.callBaseMethod(this, 'initialize');
    var element = this.get_element();
    
    if (!_tooltipShowDelegate)
    {
      _tooltipShowDelegate = Function.createDelegate(this,  element_OnMouseOver);
      _tooltipHideDelegate = Function.createDelegate(this,  element_OnMouseOut); 
      _tooltipMoveDelegate = Function.createDelegate(this,  element_OnMouseOver); 
      $addHandler(element, 'mouseover', _tooltipShowDelegate);
      $addHandler(element, 'mouseout', _tooltipHideDelegate);
      $addHandler(element, 'mousemove', _tooltipMoveDelegate);      
    }
  };
  this.dispose = function()
  {
    var element = this.get_element();
    
    if (_tooltipShowDelegate != null)
    {
      $removeHandler(element, 'mouseover', _tooltipShowDelegate);
      $removeHandler(element, 'mouseout', _tooltipHideDelegate);      
      $removeHandler(element, 'mousemove', _tooltipMoveDelegate);
      _tooltipShowDelegate = null;
      _tooltipHideDelegate = null;
      _tooltipMoveDelegate = null;
      
      if (_tooltipDiv)
      {
        $removeHandler(_tooltipDiv, 'mouseover', element_OnMouseOver);
        $removeHandler(_tooltipDiv, 'mouseout', element_OnMouseOut);
        _tooltipDiv.innerHTML = '';
        document.body.removeChild(_tooltipDiv);
        _tooltipDiv = null;
      }
    }
    
    Bonasource.ControlTooltip.callBaseMethod(this, 'dispose');    
  };
  function getTooltipDiv()
  {
    if (!_tooltipDiv)
    {
      _tooltipDiv = document.createElement('div');
      _tooltipDiv.className = _pThis.get_tooltipCssClass();
      _tooltipDiv.innerHTML = _pThis.get_tooltipHTML();
      _tooltipDiv.style.position = 'absolute';
      _tooltipDiv.style.zIndex = 1000;
      _tooltipDiv.style.display = 'none';
      document.body.appendChild(_tooltipDiv);
      $addHandler(_tooltipDiv, 'mouseover', element_OnMouseOver);
      $addHandler(_tooltipDiv, 'mouseout', element_OnMouseOut);
    }
    
    return _tooltipDiv;
  }
  
  var _tooltipX;
  var _tooltipY;
  var _mouseOverTimeout;
  var _mouseOutTimeout; 
  function element_OnMouseOver(evt)
  {
    if (_mouseOverTimeout)
    {
      clearTimeout(_mouseOverTimeout);
    }
    
    if (_mouseOutTimeout)
    {
      clearTimeout(_mouseOutTimeout);
    }
    
    var parTemp;
    var element = _pThis.get_element();
    element.X = 0;
    element.Y = 0;

    if(element.offsetParent)
    {
      parTemp = element;
      
      while(parTemp.offsetParent)
      {
        parTemp = parTemp.offsetParent;
        element.X += parTemp.offsetLeft;
        element.Y += parTemp.offsetTop;
      }
    }
    
    element.X += element.offsetLeft;
    element.Y += element.offsetTop;
        
    _tooltipY = element.Y + evt.offsetY;
    _tooltipX = element.X + evt.offsetX;
    _mouseOverTimeout = setTimeout(showDiv, 10);
  }
  function element_OnMouseOut(evt)
  {
    if (_mouseOutTimeout)
    {
      clearTimeout(_mouseOutTimeout);    
    }
    _mouseOutTimeout = setTimeout(hideDiv, 10);    
  };
  function showDiv()
  {
    var div = getTooltipDiv();
    
    div.style.display = 'block';
    div.style.top = _tooltipY + 21 + 'px'; // real magic number
    div.style.left = _tooltipX + 11 + 'px';
  }
  function hideDiv()
  {
    var div = getTooltipDiv();
    div.style.display = 'none';
  }
}

Bonasource.ControlTooltip.prototype = 
{
  get_tooltipHTML:this.get_tooltipHTML,
  set_tooltipHTML:this.set_tooltipHTML,
  get_tooltipCssClass:this.get_tooltipCssClass,
  set_tooltipCssClass:this.set_tooltipCssClass,
  initialize:this.initialize,
  dispose:this.dispose
}

Bonasource.ControlTooltip.registerClass('Bonasource.ControlTooltip', Sys.UI.Control);

if (typeof(Sys) !== 'undefined')
{
  Sys.Application.notifyScriptLoaded();
}