/*
*	options
*/

var idBarreScroll = "scroll";
var idContenuScroll = "ajax"; 
var vitesseScrollFlechesLent = 8;
var vitesseScrollFlechesRapide = 16;
var delaiScrollFleches = 20;
var hauteurScrollWheel = 25;

/*
*	variables du programme
*/

var divScroll = null;
var divContenu = null;

var vitesse = 0;
var timerScroll = null;

var position = 0;
var positionScroll = 0;

var scrollActif = false;
var positionMouseScroll = 0;
var mouseX = 0;
var mouseY = 0;
var IE = document.all ? true : false;

/*
*	setHauteurScroll()
*	initialise la hauteur de la barre de scroll et les variables necessaires
*/
function setHauteurScroll()
{
	if (divScroll == null)
		divScroll = document.getElementById(idBarreScroll);
	if (divContenu == null)
		divContenu = document.getElementById(idContenuScroll);
	if (divContenu.offsetHeight > divContenu.parentNode.offsetHeight)
		divScroll.style.height = parseInt(divScroll.parentNode.offsetHeight * (divContenu.parentNode.offsetHeight / divContenu.offsetHeight))+"px";	
	else
		divScroll.style.height = "100%";
	position = positionScroll = 0;
	divContenu.style.top = divScroll.style.top = "0px";
	
	if (divContenu.parentNode.addEventListener)
		divContenu.parentNode.addEventListener('DOMMouseScroll', wheel, false);
	divContenu.parentNode.onmousewheel = wheel;
}

/*
*	beginScrollFleche()
*	demarre le scroll personnalise
*
*	- vitesse : nombre de pixels a ajouter ou soustraire a la position actuelle du contenu
*/
function beginScrollFleche(vitesse)
{
	if (!scrollActif && divScroll.parentNode.offsetHeight - divScroll.offsetHeight > 0)
	{
		setVitesseScrollAuto(vitesse);
		setTop();
	}
	return false;
}

/*
*	setVitesseScrollAuto()
*	change le nombre de pixels a ajouter ou soustraire a la position actuelle du contenu
*
*	- valeur : nouvelle valeur
*/
function setVitesseScrollAuto(valeur)
{
	vitesse = valeur;
	return false;
}

/*
*	setTop()
*	change la position du contenu dans le cas du scroll avec les fleches
*/
function setTop()
{
	if ((vitesse < 0 && position > -1 * (divContenu.offsetHeight - divContenu.parentNode.offsetHeight)) || (vitesse > 0 && position < 0))
		position += vitesse;
	
	setNewPosition();
	
	if (vitesse != 0)
		timerScroll = setTimeout("setTop()", delaiScrollFleches);
}

/*
*	setNewPosition()
*	change la position du contenu en verifiant qu'il ne sorte pas de son conteneur
*	et met a jour la position de la barre de scroll
*/
function setNewPosition()
{
	if (position > 0 || divContenu.offsetHeight < divContenu.parentNode.offsetHeight)
	{
		position = 0;
		endScrollAuto();
	}
	else if (position < -1 * (divContenu.offsetHeight - divContenu.parentNode.offsetHeight))
	{
		position = -1 * (divContenu.offsetHeight - divContenu.parentNode.offsetHeight);
		endScrollAuto();
	}
	
	divContenu.style.top = position+"px";
	positionScroll = parseInt((divScroll.parentNode.offsetHeight - divScroll.offsetHeight) * divContenu.offsetTop / (divContenu.parentNode.offsetHeight - divContenu.offsetHeight));
	divScroll.style.top = positionScroll+"px";
}

/*
*	endScrollAuto()
*	arrete le defilement avec les fleches
*/
function endScrollAuto()
{
	if (timerScroll != null)
		clearTimeout(timerScroll);
	setVitesseScrollAuto(0);
	return false;
}

/*
*	setScroll()
*	active ou desactive le scroll avec la barre
*	
*	- actif : true si le scroll est active, false sinon
*/
function setScroll(actif)
{
	scrollActif = actif;
	if (scrollActif)
		positionMouseScroll = mouseY - divScroll.offsetTop;
	return false;
}

/*
*	gestion de la fin du scroll avec la barre quelle que soit la position de la souris
*	lorsque le bouton est relache
*/
document.onmouseup = function()
{
	setScroll(false);
}

/*
*	getMouseXY()
*	recuperation des coordonnees de la souris et defilement du contenu
*
*	- e :
*/
function getMouseXY(e)
{
	if (IE)
	{
		mouseX = event.clientX + document.body.scrollLeft;
		mouseY = event.clientY + document.body.scrollTop;
	}
	else
	{
		mouseX = e.pageX;
		mouseY = e.pageY;
	}
	if (scrollActif && divScroll.parentNode.offsetHeight - divScroll.offsetHeight > 0)
	{
		positionScroll = mouseY - positionMouseScroll;
		if (positionScroll < 0)
			positionScroll = 0;
		if (positionScroll > divScroll.parentNode.offsetHeight - divScroll.offsetHeight)
			positionScroll = divScroll.parentNode.offsetHeight - divScroll.offsetHeight;
		divScroll.style.top = positionScroll+"px";
		position = parseInt((divContenu.parentNode.offsetHeight - divContenu.offsetHeight) * divScroll.offsetTop / (divScroll.parentNode.offsetHeight - divScroll.offsetHeight));
		divContenu.style.top = position+"px";
	}
}

if (!IE)
	document.captureEvents(Event.MOUSEMOVE)
document.onmousemove = getMouseXY;

/*
*	scrollWheel()
*	defilement du contenu avec la molette
*
*	- delta :
*/
function scrollWheel(delta)
{
	position += delta * hauteurScrollWheel;
	setNewPosition();
}

/*
*	wheel()
*	gestion de la molette sur le contenu
*
*	- event :
*/
function wheel(event)
{
	var delta = 0;
	
	if (!event)
		event = window.event;
	
	if (event.wheelDelta)
	{
		delta = event.wheelDelta / 120;
		if (window.opera)
			delta = -delta;
	}
	else if (event.detail)
		delta = -event.detail / 3;
	
	if (delta)
		scrollWheel(delta);
	
	if (event.preventDefault)
		event.preventDefault();
	event.returnValue = false;
}