/**
 * @version $Id: oe_scroll.js,v 1.1 2009-03-30 17:01:50 dsp Exp $
 * @package oenobiol.plgscroll
 * MOOTOOLS 1.2
 * @copyright Copyright (C) 2006 BROCELIA. All rights reserved.
 */

action = true;

var extendFunction = {
	vaparla: function(y){

		if(y<0) y = 0;
		else if(y>1) y = 1;
		this.element.scrollTop = y*(this.element.scrollHeight-this.element.offsetHeight);
	},
	bouge: function(y){
		this.set(0, this.element.scrollTop + y);
	}
};

var plgscroll_i = 0;
var plgscroll_effets = Array();
var plgscroll_effets2 = Array();

function plgscroll(c, options) {

	var tabSize = options.height ? options.height : 320;

	if(c.scrollHeight>tabSize) {
		// hauteur dépassée => on met une scrollbar

		if(!options.width)			options.width = 10;
		if(!options.top)			options.top = 10;
		if(!options.pageRate)		options.pageRate = 0.70;
		if(!options.thumbHeightMin)	options.thumbHeightMin = 6;

		var i = plgscroll_i;
		var pageSize = Math.round(tabSize * options.pageRate);	// nb px pour le chgt de page
		var trackSize = tabSize-(2*options.top);

		if(!options.thumbHeight || options.thumbHeight=='' || options.thumbHeight==0) {
			options.thumbHeight = Math.ceil(pageSize*trackSize/c.scrollHeight);
			if(options.thumbHeight < options.thumbHeightMin) options.thumbHeight = options.thumbHeightMin;
		}

		var scrollStart = options.top;
		var scrollEnd = tabSize - options.top - options.thumbHeight;
		var scrollHeight = scrollEnd - scrollStart;

		var d = new Element('div');
		d.id = 'plgscrollbar'+i;
		d.className = 'plgscrollbar';
		if(options.startHidden) d.style.visibility = 'hidden';
		d.style.position = 'absolute';
		d.style.marginLeft = (c.scrollWidth - options.width)+'px';

		// bouton up
		var divUp = new Element('div');
		divUp.className = 'plgscrollbar_up';
		divUp.id = 'plgscrollbar_up'+i;
		divUp.style.cursor = 'pointer';
		d.appendChild(divUp);

		var divTrack = new Element('div');
		divTrack.className = 'plgscrollbar_track';
		divTrack.style.height = trackSize+'px';
		d.appendChild(divTrack);

		var divThumb = new Element('div');
		divThumb.id = 'plgscrollbar_thumb'+i;
		divThumb.className = 'plgscrollbar_thumb';
		divThumb.style.position = 'absolute';
		divThumb.style.top = scrollStart+'px';
		divThumb.style.height = options.thumbHeight+'px';
		divTrack.appendChild(divThumb);

		// bouton down
		var divDown = new Element('div');
		divDown.className = 'plgscrollbar_down';
		divDown.id = 'plgscrollbar_down'+i;
		divDown.style.cursor = 'pointer';
		d.appendChild(divDown);

		var d2 = document.createElement('div');
		d2.className = 'plgscroll_content';
		d2.style.overflow = 'hidden';
		d2.style.height = tabSize+'px';
		d2.style.marginRight = options.width+'px';
		var t;
		while(t=c.firstChild) {
			d2.appendChild(t);
		}

		c.appendChild(d);
		c.appendChild(d2);


		// bug position thumb sous ie
		if(!$chk(divThumb.getStyle('left').toInt())) {
			divThumb.style.left = (divTrack.getLeft()-d.getLeft())+'px';
		}


		// actions
		pas = Math.round(pageSize*scrollHeight/(d2.scrollHeight-d2.offsetHeight));	// nb de px sur la scrollbar pour le chgt de page
		eval("divUp.addEvent('click', function() { plgscroll_effets["+i+'].bouge(-'+pageSize+"); var from = $('plgscrollbar_thumb"+i+"').getStyle('top').toInt(); var to = from - "+pas+"; if(to<"+scrollStart+") to = "+scrollStart+"; plgscroll_effets2["+i+"].start('top',from, to); });");
		eval("divDown.addEvent('click', function() { plgscroll_effets["+i+'].bouge('+pageSize+"); var from = $('plgscrollbar_thumb"+i+"').getStyle('top').toInt(); var to = from + "+pas+"; if(to>"+scrollEnd+") to = "+scrollEnd+"; plgscroll_effets2["+i+"].start('top',from, to); });");


		$$('.plgscroll_content').each(function(el){
			el.addEvent('mousewheel', function(e){

				if(el.style.top == "")
					el.style.top = '0px';



				if(action){
					action = false;
					if(e.wheel == 1){
						var from = $('plgscrollbar_thumb'+i).getStyle('top').toInt(); var to = from - pas; if(to< scrollStart ) to = scrollStart; plgscroll_effets2[i].start('top',from, to);plgscroll_effets[i].bouge((parseInt(el.style.top.substring(0, el.style.top.length-2))- (e.wheel*pageSize)));
					}else{
						var from = $('plgscrollbar_thumb'+i).getStyle('top').toInt(); var to = from + pas; if(to>scrollEnd) to = scrollEnd; plgscroll_effets2[i].start('top',from, to);plgscroll_effets[i].bouge((parseInt(el.style.top.substring(0, el.style.top.length-2))- (e.wheel*pageSize)));
					}
					setTimeout ( "reinit()", 1000 );
					return false;
				}

			});
		});


		eval('var onDrag = function() { plgscroll_effets['+i+'].vaparla((parseInt(this.element.style.top.substring(0, this.element.style.top.length-2)) - '+scrollStart+') / '+scrollHeight+'.0); }');
		divThumb.makeDraggable({onDrag:onDrag, modifiers: {y: 'top', x:null}, limit: {y: [scrollStart, scrollEnd]}, snap: false});

	var scroller = new Fx.Scroll(d2);

		scroller = $extend(scroller, extendFunction);
		plgscroll_effets[i] = scroller;
		plgscroll_effets2[i] = new Fx.Tween(divThumb, 'top');
		plgscroll_effets2[i].scrollStart = scrollStart;

		plgscroll_i++;
	}
}

function reinit(){
	action = true;
}
