function hint(texto, padre, offset, clase)      //Offset como array de x e y
{
	this.crear_caja = function(texto, clase)
	{
		var temporal=document.createElement('div');			   
		temporal.innerHTML=texto;

		if(!clase) this.fallback_clase(temporal);
		else temporal.className=clase; //Fallback, por si acaso no hay clase...

		return temporal;
	}

	this.posicionar = function(padre, offset)
	{
		var coordenadas=this.posicion(padre);
		var x=parseInt(coordenadas[0])+parseInt(padre.offsetWidth)+parseInt(offset[0]);
		var y=parseInt(coordenadas[1])+parseInt(padre.offsetHeight)+parseInt(offset[1]);		

		this.caja.style.visibility='hidden'; //Lo escondemos antes de calcular... Si simplemente le ponemos display: none NO tendrá ancho (!!!).
		document.body.appendChild(this.caja); //Lo ponemos, aunque escondido, para obtener su ancho.

		if(x+parseInt(this.caja.offsetWidth) > parseInt(document.body.clientWidth)) 
		{
			//x-=parseInt(this.caja.offsetWidth)- ( parseInt(document.body.clientWidth)-parseInt(x) );	//Cálculos...
			x=parseInt(this.caja.offsetWidth)- ( parseInt(document.body.clientWidth)-parseInt(x) );	//Cálculos...
		}
		if(y+parseInt(this.caja.offsetHeight) > parseInt(document.body.clientHeight))
		{
			//y-=parseInt(this.caja.offsetHeight)-( parseInt(document.body.clientHeight)- parseInt(y));
			y=parseInt(this.caja.offsetHeight)-( parseInt(document.body.clientHeight)- parseInt(y));				
		}
		this.caja.style.left=x+'px'; //Establecemos la posición...
		this.caja.style.top=y+'px';			
		this.caja.style.visibility='visible'; //Lo volvemos a enseñar.	
	}

	this.cambiar_evento_padre = function(padre)
	{
		var caja=this.caja;	//Tenemos que hacer esto para solucionar el problema del scope que se nos creará en la función.
		var eliminar=this.eliminar;		
		
		if(padre.onmouseout) 
		{
			var original=padre.onmouseout; 
		}
		else 
		{
			var original=null;
		}
		
		if(padre.onclick)	
		{
			var click_original=padre.onclick;
			padre.onclick=null;
		}
		else
		{
			var click_original=null;
		}

		padre.onmouseout = function() {eliminar(caja, padre, original, click_original);} //He aquí el porqué de asignar el tema temporal... si usamos this.eliminar pensará que "this" es la nueva función que estamoscreando para asignar al evento.

	}

	this.eliminar = function(caja, padre, original, click_original)
	{
		caja.parentNode.removeChild(caja);	//Equivale a document.body.removeChild(caja).
		padre.onmouseout=original; //No sólo reasignamos el evento...
		padre.onclick=click_original;
		if(original) padre.onmouseout();        //...sino que lo ejecutamos: por eso lo guardamos en primer lugar!.
	}

	this.posicion = function(padre)
	{
		var arriba=0; 
		var izquierda=0; 
		var temporal=padre;

		if(temporal.offsetParent)
		{
			do
			{
			   izquierda += temporal.offsetLeft;
			   arriba += temporal.offsetTop;
			}
			while(temporal = temporal.offsetParent);
		}
		temporal=null;
		return [izquierda,arriba];
	}

	this.fallback_clase = function(caja)
	{
		caja.style.position='absolute'; //Lo que tenemos que poner como fallback bajo mínimos para que al menos el hint tenga una posición...
	}

	//Accion!!!... Como un constructor, pero en cutre.	   
	if(!offset) var offset=[0,0];

	this.caja = this.crear_caja(texto, clase);      //Crear el elemento.
	this.posicionar(padre, offset);      //Colocarlo en el documento.
	this.cambiar_evento_padre(padre); //Cambiamos el onmouseout... Hay que mandar la función eliminar para poderla referenciar luego en el evento onclick.
}
