/**
 * @version $Id: ar_scroll_horiz.js,v 1.8 2010-03-22 17:36:14 jyn Exp $
 * @package lerobert.botarscroll
 * @copyright Copyright (C) 2007 BROCELIA. All rights reserved.
 */

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);
	},
	vaparla2: function(x){
		if(x<0) x = 0;
		else if(x>1) x = 1;
		//return this.custom(this.element.scrollTop, x*(this.element.scrollWidth-this.element.offsetWidth));
		this.element.scrollLeft = x*(this.element.scrollWidth-this.element.offsetWidth);
	},
	bouge2: function(x){
		if( this.element.scrollLeft+x < this.element.offsetWidth)
		        return this.scrollTo(this.element.scrollLeft+x,0);
		else
		        return this.scrollTo(this.element.scrollLeft,0);
	}
});


var botarscroll_j = 10; //Si il y a deja un scroll vertical dans la page, il a deja l'indice 0 et ca buggue. alors par précaution on met 10, des fois qu'il y aurait deja plusieurs scroll verticaux dans la page...
var botarscroll_effets3 = Array();
var botarscroll_effets4 = Array();


function botarscroll_horiz(c, options) {
//alert(options.scrollX);
	var tabSize = options.width ? options.width : 370;

	if(options.scrollX>tabSize) { // ai remplacé scrollWidth qui ne passait pas sous FF par un parametre défini dans le code php... pas compris pk... A revoir à l'occasion, car si on veut l'utiliser en mambot automatique comme pour le scroll vertical, ca passera pas...
		// largeur dépassée => on met une scrollbar

		if(!options.height)			options.height = 10;
		if(!options.left)			options.left = 12;
		if(!options.pageRate)		options.pageRate = 0.33; // 0.80;
		if(!options.thumbWidthMin)	options.thumbWidthMin = 6;

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

		if(!options.thumbWidth || options.thumbWidth=='' || options.thumbWidth==0) {
			options.thumbWidth = Math.ceil(pageSize*trackSize/c.scrollWidth);
			if(options.thumbWidth < options.thumbWidthMin) options.thumbWidth = options.thumbWidthMin;
		}

		var scrollStart = options.left;
		var scrollEnd = tabSize - options.left - options.thumbWidth;
		var scrollWidth = scrollEnd - scrollStart;

		var d = new Element('div');
		d.id = 'botarscrollbar'+i;
		d.className = 'botarscrollbar';
		if(options.startHidden) d.style.visibility = 'hidden';
		d.style.position = 'absolute';
		//d.style.marginTop = (c.scrollHeight - options.height)+'px';

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

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

		var divThumb = new Element('div');
		divThumb.id = 'botarscrollbar_thumb'+i;
		divThumb.className = 'botarscrollbar_thumb';
		divThumb.style.position = 'absolute';
		divThumb.style.left = scrollStart+'px';
		divThumb.style.width = options.thumbWidth+'px';
		divTrack.appendChild(divThumb);

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

		var d2 = document.createElement('div');
		d2.className = 'botarscroll_content';
		d2.style.overflow = 'hidden';
		d2.style.height = '100%';
		d2.style.width = tabSize+'px';
		//d2.style.marginLeft = options.height+'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('top').toInt())) {
			divThumb.style.top = (divTrack.getTop()-d.getTop())+'px';
		}
		// actions
		var pas = Math.round(pageSize*scrollWidth/(d2.scrollWidth-d2.offsetWidth));	// nb de px sur la scrollbar pour le chgt de page
		eval("divUp.addEvent('click', function() { botarscroll_effets3["+i+'].bouge2(-'+pageSize+"); var from = $('botarscrollbar_thumb"+i+"').getStyle('left').toInt(); var to = from - "+pas+"; if(to<"+scrollStart+") to = "+scrollStart+"; botarscroll_effets4["+i+"].custom(from, to); });");
		eval("divDown.addEvent('click', function() { botarscroll_effets3["+i+'].bouge2('+pageSize+"); var from = $('botarscrollbar_thumb"+i+"').getStyle('left').toInt(); var to = from + "+pas+"; if(to>"+scrollEnd+") to = "+scrollEnd+"; botarscroll_effets4["+i+"].custom(from, to); });");
		//eval("divDown.addEvent('dblclick', function() { botarscroll_effets3["+i+'].down(); });');

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

		botarscroll_effets3[i] = new Fx.TfScroll(d2);

		botarscroll_effets4[i] = new Fx.Style(divThumb, 'left');
		botarscroll_effets4[i].scrollStart = scrollStart;

		botarscroll_j++;
	}
}


/** 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 ar_scroll_goTo(id) {
	if(botarscroll_j<=0) return false;
	var done = false;
	for(var i=0;i<botarscroll_j;i++) {
		var e = botarscroll_effets3[i].element.getElementById(id);
		if(e) {
			_ar_scroll_goTo(i, e);
			done = true;
		} else {
			botarscroll_effets3[i].element.getElements('a').each(
				function(a) {
					if(a.name == id) {
						if(a.getLeft()>a.parentNode.getLeft()+15)	 {
							_ar_scroll_goTo(i, a);
						} else {
							_ar_scroll_goTo(i, a.parentNode);
						}
						done = true;
					}
				}
			);
		}
	}
	return done;
}

function _ar_scroll_goTo(i, e) {
	var x = $(e).getLeft() - botarscroll_effets3[i].element.getLeft();
	var from = botarscroll_effets4[i].element.getStyle('left').toInt();
	var to = botarscroll_effets4[i].element.parentNode.offsetWidth * x / botarscroll_effets3[i].element.scrollWidth;
	if(to<0) to = 0;
	else if(to>botarscroll_effets4[i].element.parentNode.offsetWidth - botarscroll_effets4[i].element.offsetWidth) {
		to = botarscroll_effets4[i].element.parentNode.offsetWidth - botarscroll_effets4[i].element.offsetWidth;
	}

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

	botarscroll_effets3[i].scrollTo(0, x);
	botarscroll_effets4[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('ar_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 !ar_scroll_goTo(a.href.substring(location.href.length+1));
			};
		}
	});
});

