/**
 * Class: Infobulle
 * Description: Html Tooltip
 *  
 * Author: 			bschneider@croisieurope.com
 * Version: 		1.0a 
 * Last modified: 	20/01/2009 08:55:28
 * File:			Infobulle.js 
 * 
 * Usage:
 *  var tooltip = null;
 *  document.observe('dom:loaded', function(event) {
 *  	tooltip = new Infobulle();
 *  });
 */    
var Infobulle = Class.create({
	container:null,
	cursorMargin:10,
	opacityConfig:{
		appear:{
			duration:.5, 
			from:0, 
			to:.95, 
			transition:Effect.Transitions.sinoidal
		}, 
		fade:{
			duration:.5, 
			from:.95, 
			to:0, 
			transition:Effect.Transitions.sinoidal
		}
	},
	appearInstance:null,
	fadeInstance:null,
	initialize: function() {
		var self = this;
		if ($('tooltip-container') == null) {
			self.bodyTag = $$('body')[0];
			self.container = new Element("div", {id:'tooltip-container'});
			self.bodyTag.insert({top:self.container});
			self.container.setStyle({
				zIndex:10000,
				position:'absolute',
				backgroundColor:'#fff',
				margin:0,
				padding:'5px',
				top:'0px',
				left:'0px',
				font:'11px Verdana, Arial, Geneva',
				border:'1px solid #ccc',
				opacity:.95
			});
			self.hide();
			self.opacityConfig.appear.afterFinish = function(event) {};
			self.opacityConfig.fade.afterFinish = function(event) {};
			document.observe('mousemove', self.move.bind(self));
		}
	},
	setStyle:function(value) {
		var self = this;
		self.container.setStyle(value);
	},
	move:function(event) {
		var self = this;
		self.container.style.top = Number(Event.pointerY(event) + self.cursorMargin) + 'px';
		self.container.style.left = Number(Event.pointerX(event) + self.cursorMargin) + 'px';
		/* A ameliorer : peut provoquer des scintillements dans des cas extremes... */
		var isValidY = (
			(com.croisi.Tools.toNumber(document.viewport.getDimensions().height) + com.croisi.Tools.toNumber(document.viewport.getScrollOffsets().top))
			> (com.croisi.Tools.toNumber(self.container.style.top) + com.croisi.Tools.toNumber(self.container.getHeight()))
		);
		if (!isValidY) {
			self.container.style.top = parseInt(
				com.croisi.Tools.toNumber(document.viewport.getDimensions().height) 
				+ com.croisi.Tools.toNumber(document.viewport.getScrollOffsets().top) 
				- com.croisi.Tools.toNumber(self.container.getHeight()) 
				- self.cursorMargin
			) + 'px';
		}
		var isValidX = (
			(com.croisi.Tools.toNumber(document.viewport.getDimensions().width) + com.croisi.Tools.toNumber(document.viewport.getScrollOffsets().left))
			> (com.croisi.Tools.toNumber(self.container.style.left) + com.croisi.Tools.toNumber(self.container.getWidth()))
		);
		if (!isValidX) {
			self.container.style.left = parseInt(
				com.croisi.Tools.toNumber(document.viewport.getDimensions().width) 
				+ com.croisi.Tools.toNumber(document.viewport.getScrollOffsets().left) 
				- com.croisi.Tools.toNumber(self.container.getWidth()) 
				- self.cursorMargin
			) + 'px';
		}
	},
	show:function(html) {
		var self = this;
		self.cancelEffects();
		self.container.update(html);
		self.appearInstance = new Effect.Appear(self.container, self.opacityConfig.appear);
	},
	hide:function() {
		var self = this;
		self.cancelEffects();
		self.fadeInstance = new Effect.Fade(self.container, self.opacityConfig.fade);
	},
	cancelEffects:function() {
		var self = this;
		if (self.appearInstance != null) self.appearInstance.cancel();
		if (self.fadeInstance != null) self.fadeInstance.cancel();
	}
});