
// Add event and EventCache taken from:
//http://www.dustindiaz.com/rock-solid-addevent/
// (Archived in my Docs directory)

function addEvent( obj, type, fn ) {
  if (obj.addEventListener) {
    obj.addEventListener( type, fn, false );
    EventCache.add(obj, type, fn);
  }
  else if (obj.attachEvent) {
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
    obj.attachEvent( "on"+type, obj[type+fn] );
    EventCache.add(obj, type, fn);
  }
  else {
    obj["on"+type] = obj["e"+type+fn];
  }
}

var EventCache = function(){
  var listEvents = [];
  return {
    listEvents : listEvents,
    add : function(node, sEventName, fHandler){
      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]);
	};
	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;
      };
    }
  };
}();
addEvent(window,'unload',EventCache.flush);



// From the basic prototypes.js
function $() {
  var elements = new Array();
  
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);
    
    if (arguments.length == 1)
      return element;
    
    elements.push(element);
  }
  
  return elements;
}


//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/dhtml/tooltip [v1.1]

//========================================================
// REQUIRES http://www.jsfromhell.com/geral/event-listener
//========================================================

ToolTip = function(o, t, c, f){
  var i, $ = this;
  $.s = ($.o = document.createElement("div")).style;
  $.s.display = "none", $.s.position = "absolute", $.o.className = c, $.t = t, $.f = f;
  for(i in {mouseout: 0, mouseover: 0, mousemove: 0})
    addEvent(o, i, function(e){$[e.type](e);});
};
with({p: ToolTip.prototype}){
  p.update = function(e){
    var w = window, b = document.body;
    this.s.top = e.clientY + (w.scrollY || b.scrollTop || b.parentNode.scrollTop || 0) + "px",
    this.s.left = e.clientX + (w.scrollX || b.scrollLeft || b.parentNode.scrollLeft || 0) + "px";
  }
  p.mouseout = function(){
    this.s.display = "none";
  };
  p.mouseover = function(e){
    this.s.display = "block", document.body.appendChild(this.o).innerHTML = this.t,
    e.stopPropagation(), this.update(e);
  };
  p.mousemove = function(e){
    this.f && this.update(e);
  };
}



