var Tooltip = Class.create({
	element: null,
	tip: null,
	parameters: null,
	showingTip: false,
	offset: { 
		top: 0,
		left: 0
	},
	
	initialize: function(element, tip, parameters) {
		if (parameters.offset) {
			this.offset.top = parameters.offset.top;
			this.offset.left = parameters.offset.left;
		}
		var container = document.createElement('div');
		Element.addClassName(container, 'tooltip');
		container.appendChild(tip);
		document.body.appendChild(container);
		this.element = element;
		this.tip = container;
		this.parameters = parameters;
		Event.observe(element, 'mousemove', this.showTip.bind(this));
		Event.observe(element, 'mouseout', this.hideTip.bind(this));
		Event.observe(container, 'mouseout', this.hideTip.bind(this))
	},
	
	showTip: function(evt) {
		try {
			if (evt == undefined) {
				return;
			}
			if (this.showingTip == undefined)
			{
				return;
			}
			if (this.showingTip) {
				return;
			}
//			console.log(evt, "this = ", this, "evt.element = ", evt.element(), "evt.target = ", evt.target, "evt.currentTarget = ", evt.currentTarget, "evt.originalTarget = ", evt.originalTarget, "evt.relatedTarget = ", evt.relatedTarget);
			var position = this.element.cumulativeOffset();
			/* IE6 has issues with cumulativeOffset, so can't be depended on. */
			/* This is an awful hack, but life is too short to be spent devoted to IE6 */
			if ((evt.clientX - position.left) > 350)
			{
				position.left = position.left + 350;
			}

			var tipWidth = Element.getWidth(this.tip);
			var tipHeight = Element.getHeight(this.tip);
			Element.setStyle(this.tip, {
				top: ((position.top - tipHeight) + this.offset.top) + "px",
				left: (position.left + this.offset.left) + "px",
				display: 'block'
			});
			this.showingTip = true;
		}
		catch (e)
		{
			//jlog('in showTip: e ' + e.message);
		}
	},
	
	hideTip: function(evt) {
		try 
		{
			
			if (evt == undefined) {
				return;
			}
			if (this.showingTip == undefined)
			{
				return;
			}
//			console.log(evt, "this = ", this, "evt.element = ", evt.element(), "evt.target = ", evt.target, "evt.currentTarget = ", evt.currentTarget, "evt.originalTarget = ", evt.originalTarget, "evt.relatedTarget = ", evt.relatedTarget);
			if (! evt.relatedTarget) {
				return;
			}
			if (this.element == undefined)
			{
				return;
			}
			if (this.tip == undefined)
			{
				return;
			}
			if (evt.relatedTarget.descendantOf(this.element) || evt.relatedTarget.descendantOf(this.tip)) {
				return;
			}
			Element.setStyle(this.tip, {
				display: 'none'
			});
			this.showingTip = false;
		}
		catch (e)
		{
			//jlog('e = ' + e);
		}
	}
});
/*
function jlog()
{
	var message = '';
	for (var i = 0; i < arguments.length; i++)
	{
		message += arguments[i] + " ";
	}
	d = document.createElement('div');
	Element.extend(d);
	d.update(message);
	$('log').appendChild(d);
}
*/


