var SS_TIP_MOUSE = 1;
var SS_TIP_KBD   = 2;

function ToolTipManager() {
  
  var self = this;
  var tooltip = null;
  var coords = {left:0,top:0};
  var current_tip = null;
  var interval_id = null;
  var locked = false;
  
  var __construct = function() {
    tooltip = create("div");
    tooltip.id = "tip";
    get("body")(0).appendChild(tooltip);        
    addEvent(document, 'mousemove', function(evt) {
      var c;
      if(!evt)evt=window.event;      
      if (locked ^ SS_TIP_KBD) {
        c=getPosEvtScr(evt);     
        coords.left=c.x;
        coords.top=c.y;
      }
      if (locked & SS_TIP_MOUSE) {
     	  tooltip.style.top = (coords.top+20) + "px";
     	  tooltip.style.left = coords.left + "px";          
      }
    });  
  }

  this.register = function(elem) {
    elem.tip = new String(elem.getAttribute('title'));
    elem.setAttribute('title', '');
    addEvent(elem, 'mouseover', function() {
      if (!locked) {
        locked = SS_TIP_MOUSE;
        window.clearTimeout(interval_id);  
        current_tip = elem.tip;
        interval_id = window.setTimeout(function() {self.repaint()},500);
      }
    });
    addEvent(elem, 'mouseout', function() {locked=false;self.repaint()});
    addEvent(elem, 'focus', function() {
      if (!locked) {
        locked = SS_TIP_KBD;
        var obj_coords=getPosObj(elem);
        var obj_size=getObjSize(elem);
        coords.left=obj_coords.x + obj_size.w;
        coords.top=obj_coords.y;
        current_tip = elem.tip;
        interval_id = window.setTimeout(function() {self.repaint()},500);      
      }
    });    
    addEvent(elem, 'blur', function() {locked=false;self.repaint()});
  }
  
  this.repaint = function(state) {
    if (locked) {
 	    tooltip.style.top = (coords.top+20) + "px";
 	    tooltip.style.left = coords.left + "px";  
   	  tooltip.innerHTML = current_tip;  	 
      
      //::EXPERIMENTAL:: set the timeout based on the string length
      // to the power of three???
      var intval = Math.ceil(current_tip.length / 100);
      var timeout = (Math.pow(intval, 3) * 100) + 3000;
      
      tooltip.style.display = "block";    
      interval_id = window.setTimeout(function() {locked=false;self.repaint()},timeout);      
    }
    else {
      tooltip.style.display = "none";
      current_tip = null;
      window.clearTimeout(interval_id);          
    }
  }    
 
  __construct();
      
}

function __initToolTips() {
  var tooltipManager = new ToolTipManager(); 
  (function(elem){if(elem.title.length>0){tooltipManager.register(elem);}}).Iterate(get(['INPUT', 'TEXTAREA', 'SELECT', 'LABEL'])());
}
addLoadEvent(__initToolTips);


