
	Infobulle = new Class.create();
	
	Infobulle.prototype = {
		info:false,
		event:{
			on:false,
			off:false
		},
		type:false,
		isOver: new Array(),		
		initialize:function(myInfobulle,eventVal,myStyle) {
			// initialisation des éléments/variables
			var ref = this;
			zIndex = 0;
			
			// Associations comportements on/off
			switch(eventVal.event) {
				case 'click':
					this.event = {
						on:'click',
						off:'click'
					}
					break;
				case 'mouseover':
					this.event = {
						on:'mouseover',
						off:'mouseout'
					}
					break;
			}
			
			// infos sur le type de l'infobulle
			if(ref.get(myInfobulle.type)) {
				this.type = myInfobulle.type;
			}
			
			// initialisation des param visuels
			this.setInfobulle(myInfobulle);
			this.setCSS(myStyle);
			
			// gestion des évenements
			this.info.each(function(myBulle,i) {
				ref.setAction(myBulle);
			})
		},	
		setInfobulle: function(myObj) {			
			var ref = this;
			ref.info = new Array();
			
			$$(myObj.content).each(function(myBulle,i){		
				var tmp = new Array();
				switch(ref.type) {
					default:
						tmp[0] = false;
						break;
					case 'menu':
						tmp[0] = false;
						tmp[1] = false;
						break;
				}		
				
				/*
					On récupére le lien:
					1. on cherche via le chemin CSS
					2. le lien est juste avant
					3. Le lien est le parent
				*/
				var link0 = false;
				switch(myObj.link) {
					default:
						link0 = myBulle.up().getElementsBySelector(myObj.link)[0];
						break;
					case 'previous':
						link0 = myBulle.previous();
						break;
					case 'parent':
						link0 = myBulle.up();
						break;
				}
				
				ref.info[ref.info.length] = {
					link:link0,
					content:myBulle,
					isOver:tmp
				}
			}) 
		},
		setCSS:function(cssVal) {
			var ref = this;
			
			this.info.each(function(myInfo) {
				/*
				myInfo.content.ancestors()[0].setStyle({"position":"relative"});
				*/
				myInfo.content.setStyle({"position":"absolute"});
				
				// positionnement CSS spécifique
				if(ref.get(cssVal)) {
					if(ref.get(cssVal.top)) myInfo.content.setStyle({"top":cssVal.top});
					if(ref.get(cssVal.left)) myInfo.content.setStyle({"left":cssVal.left});
					if(ref.get(cssVal.right)) myInfo.content.setStyle({"right":cssVal.right});
					if(ref.get(cssVal.bottom)) myInfo.content.setStyle({"bottom":cssVal.bottom});
				}
			});
		},
		setAction:function(myBulle) {
			var ref = this;
			this.hide(myBulle);
			
			// spécificités des actions OFF
			switch(this.event.on) {
				case 'click':
					myBulle.link.onclick = function() {return false;}
					break;
			}
			
			// affichage de l'infobulle
			Event.observe(myBulle.link,ref.event.on, function(){
				ref.show(myBulle,0);
			});
			
			// masquage de l'infobulle
			switch(ref.type) {
				default:
					Event.observe(myBulle.content,ref.event.off, function(){
						ref.hide(myBulle);
					});
					break;
				case "menu":
					/*
						Pour masque l'infobulle, il faut:
						1. etre sorti du lien
						2. etre sorti de linfobulle
					*/
					
					// On vérifie si on sort de l'infobulle
					myBulle.content.descendants().each(function(child,c) {
						if(ref.getTagName(child) == "li") {
							Event.observe(child,ref.event.on, function(){ 
								myBulle.isOver[1] = true; 
							});
							Event.observe(child,ref.event.off, function(){ 
								myBulle.isOver[1] = false;
							});
						}
					});			
					// On vérifie si on sort du lien				
					Event.observe(myBulle.link,ref.event.off, function(){
						myBulle.isOver[0] = false;
						
						var testHide = true;
						myBulle.isOver.each(function(over,o) {
							if(over == true) testHide = false;
						})
						if(testHide) ref.hide(myBulle);
					});
					break;
			}
		},
		show:function(myBulle,valId) {
			// affiche l'infobulle
			zIndex++;
			
			myBulle.content.setStyle({"z-index":2*zIndex});
			myBulle.isOver[valId] = true;
			if(this.event.on != "mouseover") myBulle.content.toggle();
			else myBulle.content.show();
		},
		hide:function(myBulle) {
			// masque l'infobulle
			myBulle.content.setStyle({"z-index":1});
			myBulle.isOver[myBulle.isOver.length-1] = false;
			myBulle.content.hide();
		},
		get:function(obj) {
			// test si l'élément existe/n'existe pas
			if(obj == undefined) return false;
			else return true;
		},
		getChildByClassName : function(obj,classVal) {
			var myChildren = new Array();
			obj.childElements().each(function(child,i) {
				if(child.hasClassName(classVal)) {
					myChildren[myChildren.length] = child;
				}
			})
			return myChildren;
		},
		getTagName : function(obj) {
			return obj.tagName.toLowerCase()
		}
	}