/* Ce script implémente une barre de scroll
sur la structure Html suivante:

 ----#Scrollbox-----------------------
| ---.Scrollpanel----   --.Scrollbar-- |
|| --.Scrollcontent- | | -.Scrollpad- ||
|||                 || ||            |||
|||                 || ||            |||
|||                 || ||            |||
|||                 || ||            |||
|| ----------------- | |  ----------- ||
| -------------------   ---------------|
 --------------------------------------

La hauteur et la largeur de Scrollpanel et Scrollbar doivent etre défini dans la feuille de style
La propriété overflow de ces 2 div doit être définie sur 'hidden'
La position de Scrollcontent et Scrollpad doit etre définie sur 'absolute'
*/


var Scroll = {

	obj : null,
	
	init : function(scrollpad,scrollcontent,hscroll,oncolor,offcolor) { 
		var o = scrollpad;
		
		o.onmousedown = Scroll.start;
		o.ctn = scrollcontent;
		o.pad = scrollpad; 
		setPadEventColor(o.pad,o.oncolor,o.offcolor);
		o.oncolor = oncolor?oncolor:'#cccccc';
		o.offcolor = offcolor?offcolor:'#cccccc';
		
		o.hscroll = hscroll ? true : false;
		
		o.ctndisplaysize = hscroll ? o.ctn.parentNode.offsetWidth : o.ctn.parentNode.offsetHeight;
		o.ctnsize = hscroll ? scrollcontent.offsetWidth - o.ctndisplaysize : scrollcontent.offsetHeight - o.ctndisplaysize;
		var freescrollsize = hscroll ? o.parentNode.offsetWidth - o.offsetWidth : o.parentNode.offsetHeight - o.offsetHeight;
		var contentmovesize = hscroll ? o.ctn.offsetWidth - o.ctn.parentNode.offsetWidth : o.ctn.offsetHeight - o.ctn.parentNode.offsetHeight;

		var str = 'scrollbar w : '+o.parentNode.offsetWidth;
		str += 'scrollpad w : '+o.offsetWidth;
		str += '<br>=> freescrollsize : '+o.freescrollsize;
		str += '<br>content w : '+parseInt(o.ctn.offsetWidth);
		str += '<br>=>contentmovesize : '+contentmovesize;
		str += '<br>'+o.minX+', '+o.maxX+', '+o.minY+', '+o.maxY;
		//Scroll.debug(str);		

		o.coef = contentmovesize / freescrollsize;
		
		o.minX = 0;
		o.maxX = hscroll ? o.parentNode.offsetWidth - o.offsetWidth : 0;
		o.minY = 0;
		o.maxY = hscroll ? 0 : o.parentNode.offsetHeight - o.offsetHeight;		
		
		o.root = o;
		o.root.style.left =  o.minX+'px';
		o.root.style.top =  o.minY+'px';
		
		o.root.onRun	= new Function();
		o.root.onStart	= new Function();
		o.root.onEnd	= new Function();
		o.root.onPlay	= new Function();

	},
	
	start : function(e) {
		e = Scroll.setE(e);
		var o = Scroll.obj = this; 
		//o.pad.style.borderColor = o.oncolor; 
		o.pad.style.background = o.oncolor;
		//On récupère la taille du contenu au cas ou l'utilisateur ai modifier la taille d'affichage
		o.ctnsize = o.hscroll ? scrollcontent.offsetWidth - o.ctndisplaysize : scrollcontent.offsetHeight - o.ctndisplaysize;
		var freescrollsize = o.hscroll ? o.parentNode.offsetWidth - o.offsetWidth : o.parentNode.offsetHeight - o.offsetHeight;
		var contentmovesize = o.hscroll ? o.ctn.offsetWidth - o.ctn.parentNode.offsetWidth : o.ctn.offsetHeight - o.ctn.parentNode.offsetHeight;

		o.coef = contentmovesize / freescrollsize;
		
		var x = parseInt(o.root.style.left);
		var y = parseInt(o.root.style.top);
		o.root.onStart(x,y);
		
		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY; //Scroll.debug('>>>>>'+o.maxY+' - '+o.lastMouseY+' - '+e.clientY);
		
		o.minMouseX	= e.clientX - x + o.minX;
		o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		o.minMouseY	= e.clientY - y + o.minY;
		o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
		
		if(o.hscroll) stopAutoScroll();
		document.onmousemove = Scroll.run;
		document.onmouseup = Scroll.end;
		o.pad.onmouseover = o.pad.onmouseout = null;
	},
	
	run : function(e) {
		var o = Scroll.obj;
		e = Scroll.setE(e);


		var x = parseInt(o.root.style.left);
		var y = parseInt(o.root.style.top);
		var nx, ny;
		
		var ex	= e.clientX;
		var ey	= e.clientY;
		

		ex = Math.max(ex, o.minMouseX);
		ex = Math.min(ex, o.maxMouseX);
		ey = Math.max(ey, o.minMouseY);
		ey = Math.min(ey, o.maxMouseY);

		nx = x + ((ex - o.lastMouseX) * (1));
		ny = y + ((ey - o.lastMouseY) * (1));

		o.root.style.left = nx + "px";
		o.root.style.top = ny + "px";
		
		if(o.hscroll) o.ctn.style.left = (-o.coef * nx)+'px';
		else  o.ctn.style.top = (-o.coef * ny)+'px';
		
		o.lastMouseX = ex;
		o.lastMouseY = ey;
		
		o.root.onRun(x, y); 
		//Scroll.debug(o.coef+' <-ctn.offsetWidth : '+o.ctn.offsetWidth+' - MinMouseX:'+o.minMouseX+'MaxMouseX:'+o.maxMouseX+'MinMouseY:'+o.minMouseY+'MaxMouseY:'+o.maxMouseY);
		
		return false;
	},
	
	end : function(e) {
		e = Scroll.setE(e);
		var o = Scroll.obj;
		//o.pad.style.borderColor = o.offcolor;
		o.pad.style.background = o.offcolor;
		setPadEventColor(o.pad,o.oncolor,o.offcolor);
			
		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY;
		
		o.root.onEnd(parseInt(o.root.style.left), parseInt(o.root.style.top));
		o = null;
		
		document.onmousemove = null;
		document.onmouseup = null;		
	},
	
	setE : function(e) {
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	},
	
	debug : function(str) { 
		return;
		//document.getElementById('debug').innerHTML = str;
	}
}
