// Date de creation: 23/04/2008
var skinScroll = {
	nad : 0,	O  : [],	workingSC: 0, dvObj : {},
	ok : false, ym : 0, N  : 0, fo : 0, sc : 0, sp : 0, to : 0,
	hideScroll : function(n) {
		var o = skinScroll.O[n];
		o.sb.style.display	= 'none';
		o.st.style.display	= 'none';
		o.su.style.display	= 'none';
		o.sd.style.display	= 'none';
	},
	showScroll : function() {
		for (var i = 0, N = skinScroll.N; i < N; i++) {
			var o = skinScroll.O[i];
			o.sb.style.display	= '';
			o.st.style.display	= '';
			o.su.style.display	= '';
			o.sd.style.display	= '';
		}
	},
	mMove : function(e) { // on mouse move
		if (!e) e = window.event;
		if (skinScroll.fo.sg && !skinScroll.w3c && !e.button) {// drag release outside of the nav - IE
			skinScroll.mUp();
			return;
		}
		skinScroll.ym = e.screenY;// vertical mouse position
		if (skinScroll.fo.sg) skinScroll.fo.scrollTop = skinScroll.fo.sZ + (skinScroll.ym - skinScroll.fo.yZ) / skinScroll.fo.r;// drag scrollbar
	},
	mUp : function (e) { // on mouse up
		if (!e) e = window.event;
		var tg = (e.target) ? e.target : e.srcElement;
//	clear and skin scrollbar
//	if (skinScroll.fo) skinScroll.fo.sb.className = ((tg.className.indexOf('scrollbar') > 0) ? 'scl_scrollbar scl_scrollbar_over' : 'scl_scrollbar');
		document.onselectstart = '';
		skinScroll.clrTime();
		skinScroll.fo.sg = false;
	},
	clrTime : function () {// clear timeout
		clearTimeout(skinScroll.to);
		skinScroll.sc = 0;
		skinScroll.nad = 0;
		return false;
	},
	refresh : function (pointer) { // refresh all scrollbars
		for (var i = 0, N = skinScroll.N; i < N; i++) {
			var o = skinScroll.O[i];
			o.v_scroll();
			if ( parseFloat((o.r * o.offsetHeight)+(o.w*2)) >= parseFloat(o.offsetHeight)) {
				skinScroll.hideScroll(i);

			} else {
				skinScroll.showScroll();

				o.sb.style.width	= o.st.style.width	= o.su.style.width	= o.sd.style.width = o.w + 'px';
				o.su.style.height	= o.sd.style.height	= Math.ceil(o.w/4) + 'px';
				o.sb.style.height	= Math.ceil( Math.max((o.w * .5), (o.r * o.offsetHeight)) + o.w  +8 ) + 'px';
			}
		}
	},
	arrScroll : function () {// arrows scrolling loop
		if (skinScroll.sc != 0) {
			skinScroll.fo.scrollTop += 6 * skinScroll.sc / skinScroll.fo.r;
			skinScroll.to = setTimeout(skinScroll.arrScroll, skinScroll.sp);
			skinScroll.sp = 32;
		}
	},
	mDown : function (o, s) {// start arrows scrolling
		if (skinScroll.sc == 0) {
			skinScroll.fo = o.dv;
			skinScroll.sc = s;
			skinScroll.sp = 400;
			skinScroll.arrScroll();
		}
	},
	stepByStep : function (o, s) {// start roll scrolling
		if ((skinScroll.nad == 0)&&(skinScroll.workingSC==0)) {
			skinScroll.workingSC = 1;
			skinScroll.fo = o.dv;
			skinScroll.nad = s;
			skinScroll.stepDo();
		}
	},
// ###############################
	downByBlock : function(id, trId){
		if ( document.getElementById(trId)!=undefined) {
			var oTr = document.getElementById(trId);
			skinScroll.fo = this.dvObj[id];
			skinScroll.fo.scrollTop = oTr.offsetTop;
			var tabVONUM = new Array();
			tabVONUM = trId.split('T');//tabVONUM[0]=falg, tabVONUM[1] = num
			return result_line_over(oTr, tabVONUM[1], tabVONUM[0]);
		}
	},
// ###############################
	stepDo : function (){
		skinScroll.fo.scrollTop = skinScroll.fo.scrollTop+(18 * skinScroll.nad / skinScroll.fo.r);
		skinScroll.clrTime();
		setTimeout('skinScroll.workingSC = 0', 50);
	},
	init : function () {// init script
		if (window.oper || (!window.addEventListener && !window.attachEvent)) {
			this.ok = false;
			return true;// true => NAD
		}
		function addEvent (o, e, f) {// add events
			if (window.addEventListener) {
				o.addEventListener(e, f, false);
				skinScroll.w3c = true; return true;
			}
			if (window.attachEvent) return o.attachEvent('on' + e, f);
			return false;
		}
		this.ok = addEvent(window.document, 'mousemove', skinScroll.mMove);
		this.ok = addEvent(window.document, 'mouseup', skinScroll.mUp);
		this.ok = addEvent(window, 'resize', skinScroll.refresh);
		return this.ok;
	},
	add : function (id) {// add a skinned scrollbar
        var dv = document.getElementById(id);// get div
		this.dvObj[id] = dv;

		if (!skinScroll.ok) skinScroll.init();// init script
		if (!skinScroll.ok || !dv) return false;// return on error
		function cDiv (c) {// append div function
			var o = document.createElement('div');
			o.dv = dv;
			o.className = c;
			dc.appendChild(o);
			return o;
		}

		var dc = dv.cloneNode(false);// clone the original div to create an empty container
		dc.style.overflow = "hidden";
		dv.parentNode.appendChild(dc);// insert the container into the div's parent
		dc.appendChild(dv);// move the original div into the container

		dv.style.position = 'absolute';// modify its positionning to fit into the container
		dv.style.left		= "0px";
		dv.style.top		= '0px';
		dv.style.height	= '100%';
		dv.style.width		= '100%';
		dv.style.margin	= "0px";// NAD
		dv.style.padding	= "0px";// NAD
		dv.style.paddingRight = "20px";// NAD

		dv.id = dc.id+"_over";// modif NAD : renomme l'id clone identique pour bugs js sur ID identiques

		skinScroll.O[skinScroll.N++] = dv;// push div reference in array
		dv.sg = false;
		// create and append skinned scrollbar HTML elements to the container, on top of the original div
		dv.st = cDiv('scl_track');

		dv.sb	= cDiv('scl_scrollbar');
//		dv.sb.id	= 'scrollbarid';

		dv.su	= cDiv('scl_up');
		dv.sd	= cDiv('scl_down');

		dv.sb.onmouseover = function (e) {//NAD : on mouse over scrollbar
			if (window.addEventListener) {
				function weel(e) {
					var raw = e.detail ? e.detail : e.wheelDelta* -1;
					if (raw>0){	dv.sd.onscollUpEvent(e);}
					else { dv.su.onscollDownEvent(e); }
				}
				dv.sb.addEventListener('DOMMouseScroll', weel, false);
				dv.sb.addEventListener('mousewheel', weel, false);//safari cursor
			} else {// IE
				dv.sb.onmousewheel = function () {
					if (event.wheelDelta>0) { dv.su.onscollDownEvent(e);}
					else { dv.sd.onscollUpEvent(e);}
				}
			}
		}
//		dv.sb.onmouseout = skinScroll.clrTime;

		dv.st.onmouseover = function (e) {//NAD : on mouse over track
			if (window.addEventListener) {
				function weel(e) {
					var raw = e.detail ? e.detail : e.wheelDelta* -1;
					if (raw>0){	dv.sd.onscollUpEvent(e);}
					else { dv.su.onscollDownEvent(e); }
				}
				dv.st.addEventListener('DOMMouseScroll', weel, false);
				dv.st.addEventListener('mousewheel', weel, false);//safari track
			} else {// IE
				dv.st.onmousewheel = function () {
					if (event.wheelDelta>0) { dv.su.onscollDownEvent(e);}
					else { dv.sd.onscollUpEvent(e);}
				}
			}
		}
//		dv.st.onmouseout = skinScroll.clrTime;

		dv.su.onscollDownEvent = function(){
			skinScroll.stepByStep(this, -1);
		}
		dv.sd.onscollUpEvent = function(){
			skinScroll.stepByStep(this, 1);
		}

		dv.sb.onmousedown = function (e) {// scrollbar on mouse down
			if (!this.dv.sg) {
				if (!e) e = window.event;
				skinScroll.fo = this.dv;// save active/scrollable div
				this.dv.yZ = e.screenY;// save vertical mouse and scroll position
				this.dv.sZ = dv.scrollTop;
				this.dv.sg = true;
				document.onselectstart = function () {
					return false; 
				}
			}
			return false;
		}
		dv.st.onmousedown = function (e) {// track on mouse down
			if (!e) e = window.event;
			skinScroll.fo = this.dv;// save active/scrollable div
			skinScroll.ym = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;// calculate scrollbar position
			for (var o = this.dv, y = 0; o != null; o = o.offsetParent) y += o.offsetTop;
			this.dv.scrollTop = (skinScroll.ym - y - (this.dv.r * this.dv.offsetHeight / 2) - this.dv.w) / this.dv.r;
			this.dv.sb.onmousedown(e);
		}
		// arrows on mouse down
		dv.su.onmousedown = dv.su.ondblclick = function (e) {
			skinScroll.mDown(this, -1);
			return false;
		}
		dv.sd.onmousedown = dv.sd.ondblclick = function (e) {
			skinScroll.mDown(this,  1);
			return false;
		}
		// release events
		dv.su.onmouseout = dv.su.onmouseup = skinScroll.clrTime;
		dv.sd.onmouseout = dv.sd.onmouseup = skinScroll.clrTime;

		// scrollbar repositionning
		dv.v_scroll = function () {
            this.r = (this.offsetHeight - 2 * this.w) / this.scrollHeight;
            
            //NAD : ajoute car avant refresh = a -Infinity et fait planter ligne 42 en retournant NaN
			if ( this.r == -Infinity) this.r = 0;

			var topPosN = (Math.floor( this.w + this.scrollTop * this.r)-(dv.w/2));
            this.sb.style.top = (topPosN)+'px';
		}
		// calculate scrollbar width
		dv.w = dv.offsetWidth - dv.clientWidth + 1;
		// init scroll
		dv.v_scroll();
		skinScroll.refresh();
		// hook on scroll browser's event
		dv.onscroll = dv.v_scroll;

		return dv;
	}
}