function FindXY(obj) // Retourne la position de l'élément passé en paramètre
{
	var x=0, y=0;
	while (obj!=null)
	{
		x+=obj.offsetLeft;//-obj.scrollLeft;
		y+=obj.offsetTop;//-obj.scrollTop;
		obj=obj.offsetParent;//alert(i + ' ' +y);
	}
	return {x:x,y:y};
}

function FindWH(obj) // Retourne la taille de l'élément passé en paramètre
{
	var w=0, h=0;
	if(obj.offsetHeight)
	{
		w = obj.offsetWidth;
		h = obj.offsetHeight;
	}
	else if(obj.style.pixelHeight)
	{
		w = obj.style.pixelWidth;
		h = obj.style.pixelHeight;
	}
	return {w:w,h:h};
}

function getScrollPosition() // Retourner la position de la scrollbar
{
	var y = (document.documentElement && document.documentElement.scrollTop) || window.pageYOffset || self.pageYOffset || document.body.scrollTop;
    return y;
}

function FindHWwindow() // Retourne la taille de la fenêtre
{
	var w=0, h=0;
	if(document.body)
	{
		w = document.documentElement.clientWidth;
		h = document.documentElement.clientHeight;
	}
	else
	{
		w = window.innerWidth;
		h = window.innerHeight;
	}
	return {w:w,h:h};
}

function mouvenbas(id, de, a) // Mouvement progressif vers le bas
{
	document.getElementById(id).style.top = de + ((a-de) / 10) + 'px';//alert(a  + 'de' + de);

	if(de < a - 3)
		setTimeout("mouvenbas('" + id + "', "+(de +((a-de) / 10))+", "+a+")", 10);
	else
		document.getElementById(id).style.top = a + 'px';
}

function mouvenhaut(id, de, a) // Mouvement progressif vers le haut
{
	document.getElementById(id).style.top = de - ((de-a) / 10) + 'px';//alert(a +'de-' + de);

	if(de > a + 3)
		setTimeout("mouvenhaut('" + id + "', "+(de -((de-a) / 10))+", "+a+")", 10);
	else
		document.getElementById(id).style.top = a + 'px';
}

function mouv(id, de, a)
{
	if(de < a) // Si le scroll est descendu, on provoque un mouvement vers le bas
		setTimeout("mouvenbas('" + id + "', " + de + ", " + a + ")", 10);
	else // Si le scroll est monté, on provoque un mouvement vers le haut
		setTimeout("mouvenhaut('" + id + "', " + de + ", " + a + ")", 10);
}

function Timer(idtab, iddiv, margetop)
{
	var postab = FindXY(document.getElementById(idtab)); // Position de la cellule contenant le calque
	var posdiv = FindXY(document.getElementById(iddiv)); // Position du calque

	postab.y += margetop; // Marge supérieur pour éviter les bugs de sursaut du calque sur IE

	if(getScrollPosition() - posdiv.y != 0) // Si la scrollbar a été bougé
	{
		if(getScrollPosition() > postab.y) // Si la partie supérieur de la cellule est sortie du visuel
		{
			var tailtab = FindWH(document.getElementById(idtab)); // Taille de la cellule contenant le calque
			var taildiv = FindWH(document.getElementById(iddiv)); // Taille du calque
			var tailfen = FindHWwindow(); // Taille de la fenêtre
			
			if(getScrollPosition() + tailfen.h > posdiv.y + taildiv.h || getScrollPosition() < posdiv.y) // Si le calque est plus grand que la fenêtre, alors ne provoque un mouvement que lorsque la partie inférieur ou supérieur est dépassée
			{
				if(getScrollPosition() < postab.y + tailtab.h - taildiv.h) // Si le calque ne dépasse pas la partie inférieur da la cellule
				{
					mouv(iddiv, posdiv.y - postab.y, getScrollPosition() - postab.y);
				}
				else // Si le calque dépasse la partie inférieur da la cellule : interdiction au calque de descendre plus bas
				{
					mouv(iddiv, posdiv.y - postab.y, tailtab.h - taildiv.h);
				}
			}
		}
		else // Si la partie supérieur de la cellule n'est pas sortie du visuel : interdiction au calque d'aller plus haut
		{
			mouv(iddiv, posdiv.y - postab.y, 0);
		}
	}
	setTimeout("Timer('" + idtab + "', '" + iddiv + "', " + margetop + ")", 1000);
}