/**
 * @version $Id: scroll.js,v 1.3 2009-08-21 15:51:57 daz Exp $
 * @package projet-joomla.plgscroll
 * @copyright Copyright (C) 2006 BROCELIA. All rights reserved.
 */

window.addEvent('load', function() {
	var c = $$('.contenu_scroll');
	for(var i=0;i<c.length;i++) {
		var params = c[i].id.split('_');
		//console.log(params[1]);
		if(params.length>1){
			plgscroll(c[i], {height:params[1], width:params[2], top:params[3], thumbHeight:params[4], arrows:params[5]});
		}else{
			plgscroll(c[i], {});
		}
	}
});

Fx.TfScroll = Fx.Scroll.extend({
	vaparla: function(y){
		if(y<0) y = 0;
		else if(y>1) y = 1;
		//return this.custom(this.element.scrollTop, y*(this.element.scrollHeight-this.element.offsetHeight));
		this.element.scrollTop = y*(this.element.scrollHeight-this.element.offsetHeight);
	},
	bouge: function(y){
		return this.scrollTo(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 : 290;
	if(c.scrollHeight>tabSize) {
		// hauteur dépassée => on met une scrollbar

		if(!options.width)			options.width = 10;
		if(!options.top)			options.top = 7;
		if(!options.pageRate)		options.pageRate = 0.50;
		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
		if(options.arrows != "0") {
			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.id = 'plgscrollbar_track'+i;
		divTrack.className = 'plgscrollbar_track';
		divTrack.style.height = trackSize+'px';
		if(options.arrows != "0") divTrack.style.marginTop = '0px'; // A changer en fonction de la hauteur des fleches
		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
		if(options.arrows != "0") {
			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()-1)+'px';
		}


		// actions
		var pas = Math.round(pageSize*scrollHeight/(d2.scrollHeight-d2.offsetHeight));	// nb de px sur la scrollbar pour le chgt de page
		if(options.arrows != "0") {
			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;
				//console.log(from+" "+to);
				plgscroll_effets2[i].custom(from, to);
			});
			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].custom(from, to);
			});
		}

		divTrack.addEvent('mousedown', function(event) {
			var pageY = (event.offsetY || event.layerY) - options.thumbHeight;
			var from = $('plgscrollbar_thumb'+i).getStyle('top').toInt();
			var to;
			if(pageY < from) {
				to = from - pas;
				if(to<scrollStart) to = scrollStart;
			}
			else {
				to = from + pas;
				if(to>scrollEnd) to = scrollEnd;
			}
			if(pageY > from) {
				plgscroll_effets[i].bouge(pageSize);
			}
			else {
				plgscroll_effets[i].bouge(-pageSize);
			}
			plgscroll_effets2[i].custom(from, to);
		}
		);
		c.addEvent('mousewheel', function(event) { event = new Event(event); var from = $('plgscrollbar_thumb'+i).getStyle('top').toInt(); var to; if (event.wheel > 0) { to = from - pas; if(to<scrollStart) to = scrollStart; plgscroll_effets[i].bouge(-pageSize); } else if (event.wheel < 0) { to = from + pas;if(to>scrollEnd) to = scrollEnd; plgscroll_effets[i].bouge(pageSize); } plgscroll_effets2[i].custom(from, to); event.stop(); } );


		//eval("divDown.addEvent('dblclick', function() { plgscroll_effets["+i+'].down(); });');

		eval('var onDrag = function(event) { 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});

		plgscroll_effets[i] = new Fx.TfScroll(d2);
		plgscroll_effets2[i] = new Fx.Style(divThumb, 'top');
		plgscroll_effets2[i].scrollStart = scrollStart;

		plgscroll_i++;
	}
}


/** va jusqu'à l'objet dont l'id est passé en paramètre
 *  si il y a une scrollbar autour, on lance les effets pour y aller
 *  sinon il ne se passe rien
 *  @param id id de l'objet dom qui doit être en haut de la zone de scroll ou name de l'ancre
 */
function brc_scroll_goTo(id) {
	if(plgscroll_i<=0) return false;
	var done = false;
	for(var i=0;i<plgscroll_i;i++) {
		var e = plgscroll_effets[i].element.getElementById(id);
		if(e) {
			_brc_scroll_goTo(i, e);
			done = true;
		} else {
			plgscroll_effets[i].element.getElements('a').each(
				function(a) {
					if(a.name == id) {
						if(a.getTop()>a.parentNode.getTop()+15)	 {
							_brc_scroll_goTo(i, a);
						} else {
							_brc_scroll_goTo(i, a.parentNode);
						}
						done = true;
					}
				}
			);
		}
	}
	return done;
}

function _brc_scroll_goTo(i, e) {
	var x = $(e).getTop() - plgscroll_effets[i].element.getTop();
	var from = plgscroll_effets2[i].element.getStyle('top').toInt();
	var to = plgscroll_effets2[i].element.parentNode.offsetHeight * x / plgscroll_effets[i].element.scrollHeight;
	if(to<0) to = 0;
	else if(to>plgscroll_effets2[i].element.parentNode.offsetHeight - plgscroll_effets2[i].element.offsetHeight) {
		to = plgscroll_effets2[i].element.parentNode.offsetHeight - plgscroll_effets2[i].element.offsetHeight;
	}

	to += plgscroll_effets2[i].scrollStart.toInt();

	plgscroll_effets[i].scrollTo(0, x);
	plgscroll_effets2[i].custom(from, to);
}



/* si une ancre est demandée dans l'url on s'y rend après le chargement de la page
 * attention : il y a encore un bug d'affichage de la zone de scroll sous firefox dans ce cas
 * ajoute la fonction à tout les liens commencant par #
 */

window.addEvent('load', function() {
	if(location.hash && location.hash.length>0) {
		setTimeout('brc_scroll_goTo(location.hash.substring(1));', 300);
	}
	$$('a').each(function(a) {
		if(a.href && a.href.length>location.href.length+2 && a.href.indexOf('#')==location.href.length) {
			a.onclick = function() {
				return !brc_scroll_goTo(a.href.substring(location.href.length+1));
			};
		}
	});
});

