//Propriété de l'objet tooltip
var tooltip = {
    tooltipElement : null,
    delay : 1500,
    offsetx : 10,
    offsety : 25,
    mouse : {
    x : 0,
        y : 0
    },
    timeMouseOver : null,
    display : false,
    saveOnMouseMove : null
}

//Fonction qui récupère un div déjà chargé ou le charge
tooltip.getTooltipElement = function(contentOrAddr) {
    var id = MD5(contentOrAddr);
    
    if(document.getElementById(id)) {
        var divTooltip = document.getElementById(id);
    } else {
        var divTooltip = document.createElement("div");
        divTooltip.id = id;
        divTooltip.className = "tooltip";
        divTooltip.style.display = "none";
        document.getElementsByTagName("body")[0].appendChild(divTooltip);
    }
        
    return divTooltip
}

//Fonction qui affiche la tooltip en gérant un délai
tooltip.show = function(contentOrAddr,isStatic) {
    this.timeMouseOver = (new Date()).getTime();
    var isStaticTooltip = !!isStatic;
    this.display = true;
    
    //Create DIV
    this.tooltipElement = this.getTooltipElement(contentOrAddr);
    
    //Bind un eventhandler pour la position du curseur et positionne la tooltip
    this.saveOnMouseMove = document.onmousemove;
    document.onmousemove = this.mouseMove;
    this.move();
    
    if(isStaticTooltip) {
        this.tooltipElement.innerHTML = contentOrAddr;
    }
    
    //Redefinition du delai si un contenu est déjà présent
    if(this.tooltipElement.innerHTML.length > 0) {
        this.delay = 200;
    } else {
        this.delay = 1500;
    }
    
    //Affichage avec delai ou non
    if(this.delay > 0) {
        setTimeout(function(){
            tooltip.showDelayed(contentOrAddr);
        },this.delay);
    } else {
        this.showDelayed(contentOrAddr);
    }
    
}

//Fonction qui charge et affiche la tooltip
tooltip.showDelayed = function(contentOrAddr) {
    var timeValid = this.timeMouseOver + this.delay;
    var now = (new Date()).getTime()
    
    if(now >= timeValid && this.display) {
        this.tooltipElement.style.display = "block";
        
        if(this.tooltipElement.innerHTML.length == 0) {
            //On charge le contenu de la tooltip
            this.loadContent(contentOrAddr);
        }
        
        this.move();
    }
}

//Fonction qui charge le contenu de la tooltip
tooltip.loadContent = function(contentOrAddr) {
    //Preloading
    $(tooltip.tooltipElement).addClass("tooltip-load");

    //Http request
    $.get(contentOrAddr, function(response){
            //On charge le contenu dans la tooltip
        $(tooltip.tooltipElement).removeClass("tooltip-load");
        tooltip.tooltipElement.innerHTML = response;
    });
}

//Fonction qui masque la tootlip
tooltip.hide = function() {
    if(!document.getElementById) {
        return;
    }
    
    //Restore le bind du mousemove par défaut
    document.onmousemove = this.saveOnMouseMove;
    
    //On retire le div qui représente la tooltip dans le document et on efface le contenu
    this.tooltipElement.style.display = "none";
    
    this.display = false;
}

//Fonction bindé au document pour capter les mouvements de la souris et ainsi positionner la tooltip
tooltip.mouseMove = function (e) {
    e = getStandardEvent(e);
    
    if(e.pageX != undefined) { // gecko, konqueror,
        tooltip.mouse.x = e.pageX;
        tooltip.mouse.y = e.pageY;
    } else if(e.clientX != undefined) { // IE6,  IE7, IE5.5
        if(document.documentElement) {
            tooltip.mouse.x = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft);
            tooltip.mouse.y = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop);
        } else {
            tooltip.mouse.x = e.clientX + document.body.scrollLeft;
            tooltip.mouse.y = e.clientY + document.body.scrollTop;
        }
    } else { 
        tooltip.mouse.x = 0;
        tooltip.mouse.y = 0;
    }
    
    //On déplace la tooltip
    tooltip.move();
}

//Fonction permettant de déplacer la tooltip
tooltip.move = function() {
    //Taille de la fenêtre
    var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
	
	//Scroll de la fenêtre
	var scrollTop, scrollLeft;
    if(typeof(window.pageYOffset) == 'number') {
        scrollTop = window.pageYOffset;
        scrollLeft = window.pageXOffset;
    } else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
        scrollTop = document.body.scrollTop;
        scrollLeft = document.body.scrollLeft;
    } else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
        scrollTop = document.documentElement.scrollTop;
        scrollLeft = document.documentElement.scrollLeft;
    }
	
	//Cast to integer
	windowWidth = parseInt(windowWidth);
	windowHeight = parseInt(windowHeight);
	
	scrollTop = parseInt(scrollTop);
    scrollTop = isNaN(scrollTop) ? 0 : scrollTop;

    scrollLeft = parseInt(scrollLeft);
    scrollLeft = isNaN(scrollLeft) ? 0 : scrollLeft;
    
    //Calcul des coordonnées
    var x = this.mouse.x + this.offsetx;
    var y = this.mouse.y + this.offsety;
    
    //Positionnement horizontal
    if(this.mouse.x > ((windowWidth / 2) + scrollLeft)) {
        this.tooltipElement.style.right = (windowWidth - x + this.offsetx) + "px";
        this.tooltipElement.style.left = "";
    } else {
        this.tooltipElement.style.left = x + "px";
        this.tooltipElement.style.right = "";
    }
    
    //Positionnement vertical
    if(this.mouse.y > ((windowHeight / 2) + scrollTop)) {
        if($.browser.msie && navigator.appVersion.indexOf("MSIE 6.0") != -1) {
            this.tooltipElement.style.bottom = scrollTop + windowHeight - this.mouse.y + this.offsety + "px";
            this.tooltipElement.style.top = "";
        } else {
        this.tooltipElement.style.bottom = (windowHeight - y + this.offsety*1.5) + "px";
        this.tooltipElement.style.top = "";
        }
    } else {
        this.tooltipElement.style.top = y + "px";
        this.tooltipElement.style.bottom = "";
    }
}

