/**************************************************************

	Script		: greenwallScroller
	Version		: 1.0
	Authors		: Marc LACROIX FOR AGENCEFMC.com
	Desc			: Horizontal or vertical scroller.
	Licence		: COPYRIGHT AGENCE FMC
	REQUIRES 		: 
				:	MOOTOOLS 1.11
				:	fmcScrollTo

**************************************************************/
var fmcScroller = new Class(
{
	'options':
	{
		'list':new Array(),
		'container':false,
		'scrollerContainer':false,
		'scrollerDirection':'horizontal',
		'margin':5,
		'duration':1000,
		'btnPrec':'reas_prec',
		'btnSuiv':'reas_suiv',
		'defilement':false,
		'sommaire':false,
		'accesRapide':false,
		'nbByStep':1,
		'emptyMc':false // {'class':'emptyMc'}
	},
	'initialize':function(options)
	{
		this.setOptions(options);
		this.list = this.options.list;
		this.btnPrec = $(this.options.btnPrec);
		this.btnSuiv = $(this.options.btnSuiv);
		//alert(this.options.btnPrec + '-  '+this.options.btnSuiv+ ' - ' + this.btnPrec + '-  '+this.btnSuiv);
		if(this.list.length > 1)
		{
			this.scrollable = true;
			// Si on ajoute des elements vides :  
			this.steps = this.list.length;
			this.nb = this.options.nbByStep;
			this.steps = Math.ceil(this.steps/this.nb);
			if(this.options.emptyMc) this.balanceNumber();
			this.list = $$(this.list);
			// si on scrolle horizontalement, on resize la div en largeur.
			if(this.options.scrollerDirection == 'horizontal') this.setContainerSize();
			this.scroller = new fmcScrollTo({
				'slides': this.list,
				'container': this.options.scrollerContainer,
				'duration':this.options.duration
			});
			if(this.options.defilement) this.defilement(this.options.defilement);
			this.checkBTNS();
			var obj = this;
			this.btnPrec.addEvent('click',function(e)
			{
				var e = new Event(e);
				e.stop();
				if(!this.hasClass('disabled')){
					//ul.getChildren()[scroller.startIndex].removeClass('active');
					//ul.getChildren()[scroller.startIndex-1].addClass('active');
					//obj.scroller.scrollToEl(obj.scroller.startIndex-1);
					if(obj.scroller.startIndex != 0 && (obj.scroller.startIndex-obj.nb)>=0)
					{
						obj.scroller.scrollToEl(obj.scroller.startIndex-obj.nb);
					}else{
						obj.scroller.scrollToEl(0);
					}
					obj.checkBTNS();
				}
			});
			this.btnSuiv.addEvent('click',function(e)
			{
				var e = new Event(e);
				e.stop();
				if(!this.hasClass('disabled')){
					//ul.getChildren()[scroller.startIndex].removeClass('active');
					//ul.getChildren()[scroller.startIndex+1].addClass('active');
					//obj.scroller.scrollToEl(obj.scroller.startIndex+1);
					if(obj.scroller.startIndex < obj.list.length-1 && Math.ceil((obj.scroller.startIndex+obj.nb) / obj.nb) <= obj.steps)
					{
						obj.scroller.scrollToEl(obj.scroller.startIndex+obj.nb);
					}
					else{
						obj.scroller.scrollToEl(obj.nb*obj.steps-obj.nb);
					}
					obj.checkBTNS();
				}
			});
		}else{
			this.checkBTNS(true);
		}
		if(this.options.accesRapide)
		{
			this.arInit();
		}
		this.scroller.scrollToEl(0);
	},
	'setContainerSize':function()
	{
		$(this.options.container).setStyle('width', (this.list[0].getSize().size.x + this.options.margin) * this.list.length);
	},
	'checkBTNS':function(show)
	{
		if(!show)
		{
			var minus = false;
			var plus = false;
			if(Math.ceil((this.scroller.startIndex+this.nb) / this.nb) == this.steps)
			{
				plus = false;
				this.btnSuiv.addClass('disabled');
			}else{
				plus = true;
				this.btnSuiv.removeClass('disabled');
			}
			if(this.scroller.startIndex == 0)
			{
				this.btnPrec.addClass('disabled');
			}else{
				this.btnPrec.removeClass('disabled');
			}
		}else{
				this.btnSuiv.setStyle('display','none');
				this.btnPrec.setStyle('display','none');
		}
	},
	/*
	
	DEFILEMENT ET FONCTIONS CONNEXES
	
	opt est un objet, les variables peuvent être les suivantes : 
	{
		'interval':7000, 
		'pauseOnMouseOver':true, 
		'pauseButton':true, 								-> Bouton pause ?
		'classe':'scrollerPause',							-> Classe du bouton pause
		'textStop':'Arr&ecirc;ter le d&eacute;filement',			-> texte du bouton pause avant la pause
		'textStart':'Arr&ecirc;ter le d&eacute;filement',			-> texte du bouton pause en pause
		'scrollerTimerBar':true 
	}	
	*/
	'defilement': function(opt)
	{
		
		if(opt.pauseButton) { 
			this.setPauseButton(opt.textStop, opt.classe, opt.interval);
		}
		if(opt.pauseOnMouseOver) this.pauseDefilementOnMouseOver();
		this.iCanMove = true;
		this.delayBeforeMove = this.defile.delay(opt.interval, this, opt.interval);
		if(opt.scrollerTimerBar) {
			this.scrollerTimerBar();
			this.theBarEffect = this.theBar.effect('width', {'duration':(opt.interval-100), 'transition': Fx.Transitions.linear, 'wait':false}).start(0,$(this.options.scrollerContainer).getSize().size.x - this.options.margin);
		}
		
	},
	'setPauseButton':function(texte, classe, delay)
	{
		var obj = this;
		this.pauseButton = new Element('div', 
		{
			'class':classe,
			'events':{
				'click':function(e)
				{
					var e = new Event(e);
					e.stop();
					if(obj.iAmPaused)
					{
						if(obj.options.defilement.textStart) this.setHTML(texte);
						obj.iAmPaused = false;
						obj.delayBeforeMove = obj.defile.delay(delay, obj, delay);
						if(obj.theBar){
							obj.theBarEffect.options.duration = delay-100;
							obj.theBarEffect.start(0,$(obj.options.scrollerContainer).getSize().size.x - obj.options.margin);
						}
					}else{
						if(obj.options.defilement.textStart) this.setHTML(obj.options.defilement.textStart);
						obj.iAmPaused = true;
						obj.pauseIt();
						obj.theBarEffect.set(0);

					}
					this.toggleClass(classe+'On');
				}
			}
		}).setHTML(texte).injectAfter($(this.options.scrollerContainer));
	},
	'pauseDefilementOnMouseOver': function()
	{
		var obj = this;
		$(this.options.scrollerContainer).addEvents(
		{
			'mouseenter': function(e)
			{
				if(!obj.iAmPaused){
					obj.pauseIt();
				}
			},
			'mouseleave':function(e)
			{
				if(!obj.iAmPaused){
					var delay = obj.options.defilement.interval;
					if(obj.theBar){
						var width = $(obj.options.scrollerContainer).getSize().size.x - obj.options.margin;
						var widthOfTheBar = obj.theBar.getSize().size.x;
						delay = obj.options.defilement.interval - Math.round(obj.options.defilement.interval * widthOfTheBar / width);
						obj.theBarEffect.options.duration = delay;
						obj.theBarEffect.start($(obj.options.scrollerContainer).getSize().size.x - obj.options.margin);
					}
					obj.delayBeforeMove = obj.defile.delay(delay, obj, obj.options.defilement.interval);
				}
			}
		});
		var obj = this;
		this.btnSuiv.addEvents(
		{
			'mouseenter':function(e){if(!obj.iAmPaused) obj.pauseIt(); },
			'mouseleave':function(e)
			{
				if(!obj.iAmPaused){
					var delay = obj.options.defilement.interval;
					if(obj.theBar){
						var width = $(obj.options.scrollerContainer).getSize().size.x - obj.options.margin;
						var widthOfTheBar = obj.theBar.getSize().size.x;
						delay = obj.options.defilement.interval - Math.round(obj.options.defilement.interval * widthOfTheBar / width);
						obj.theBarEffect.options.duration = delay;
						obj.theBarEffect.start($(obj.options.scrollerContainer).getSize().size.x - obj.options.margin);
					}
					obj.delayBeforeMove = obj.defile.delay(delay, obj, obj.options.defilement.interval);
				}
			}
		});
		this.btnPrec.addEvents(
		{
			'mouseenter':function(e){if(!obj.iAmPaused) obj.pauseIt(); },
			'mouseleave':function(e)
			{
				if(!obj.iAmPaused){
					var delay = obj.options.defilement.interval;
					if(obj.theBar){
						var width = $(obj.options.scrollerContainer).getSize().size.x - obj.options.margin;
						var widthOfTheBar = obj.theBar.getSize().size.x;
						delay = obj.options.defilement.interval - Math.round(obj.options.defilement.interval * widthOfTheBar / width);
						obj.theBarEffect.options.duration = delay;
						obj.theBarEffect.start($(obj.options.scrollerContainer).getSize().size.x - obj.options.margin);
					}
					obj.delayBeforeMove = obj.defile.delay(delay, obj, obj.options.defilement.interval);
				}
			}
		});
	},
	'defile': function(delay)
	{
		if(this.iCanMove || !this.iCanMove)
		{
			if(this.scroller.startIndex+1 == this.steps )
			{
				this.scroller.scrollToEl(0);
			}else{
				this.scroller.scrollToEl(this.scroller.startIndex+1);
			}
			this.checkBTNS();
			if(this.theBar){
				this.theBarEffect.options.duration = delay - 100;
				this.theBarEffect.start(0,$(this.options.scrollerContainer).getSize().size.x - this.options.margin); 
			}
		}
		this.delayBeforeMove = this.defile.delay(delay, this, delay);
	},
	'pauseIt': function()
	{
		this.delayBeforeMove = $clear(this.delayBeforeMove);
		if(this.theBarEffect != null) this.theBarEffect.stop();
	},
	'scrollerTimerBar': function()
	{
		this.theBar = new Element('div', {'class':'scrollerTimerBar'}).injectAfter($(this.options.scrollerContainer));
	},
	/*
	********************************************************
	Menu , accès direct
	********************************************************
	*/
	'arInit': function()
	{
		//acces_rapide acces_rapide_bt
		var obj = this;
		var acces_rapide = new Element('div', { 'id':'acces_rapide' }).injectAfter($(this.options.scrollerContainer));
		this.accesRapide = {};
		this.accesRapide.div = acces_rapide;
		var ul = new Element('ul', {'class':'main'}).injectInside(acces_rapide);
		this.accesRapide.ul = ul;
		var reasList = this.list;
		reasList.each(function(el, index)
		{
			if(el.getFirst().getFirst())
			{
				var titre = el.getFirst().getFirst().innerHTML;
			}else if(el.getFirst()){
				var titre = el.getFirst().innerHTML;
			}else{
				var titre = 'Element '+ (i+1);
			}
			var ligne = new Element('li').injectInside(ul);
			var lien = new Element('a',
			{
				'class':'rea-direct-lien',
				'href':('#'+index),
				'events':{
					'click':function(e)
					{
						var e = new Event(e);
						e.stop();
						this.index = index;
						this.blur();
						ul.getChildren()[obj.scroller.startIndex].removeClass('active');
						obj.scroller.scrollToEl(this.index);
						obj.checkBTNS();
						this.getParent().addClass('active');
					}
				}
			}).injectInside(ligne);
			lien.setHTML(titre);
/*			infosBt = infosListBts[index];
			infosBt.index = index+'ter';
			infosBt.infos = infosList[index];
			infosBt.fx = infosBt.infos.effect('height', {'duration': 500, 'transition': Fx.Transitions.Quart.easeInOut, 'wait':false});
			//infosBt.infos.setStyle('opacity',.95);
			infosBt.toggled = false;
			infosBt.addEvent('click', function(e)
			{
				var e= new Event(e);
				e.stop();
				if(!this.toggled)
				{
					// AFFICHE LES INFOS / DESC
					this.fx.start(0, 255);
					this.toggled = true;
				}else{
					// MASQUE LES INFOS / DESC
					this.fx.start(0);
					this.toggled = false;
				}
			});*/
		});
		ul.getChildren()[obj.scroller.startIndex].addClass('active');
		if(this.options.accesRapide.toggle)
		{
			var arBt = new Element('div', 
			{
				'id':'acces_rapide_bt',
				'events':{
					'click': function(e)
					{
						if(!this.toggle)
						{
							ul.fx.start(0, 251);
							this.toggle = true;
							if(!obj.accesRapide.hideDelay){
								obj.accesRapide.hideDelay = obj.hideList.delay(2000, obj);
							}
							this.getNext().addEvent('mouseleave', function(ev)
							{
								if(!obj.accesRapide.hideDelay){
									obj.accesRapide.hideDelay = obj.hideList.delay(1000, obj);
								}
							});
							this.getNext().addEvent('mouseenter', function(ev)
							{
								obj.accesRapide.hideDelay = $clear(obj.accesRapide.hideDelay);
							});
						}else{
							obj.hideList();
						}
					}
				}
			});
			if(this.options.accesRapide.after)
			{
				arBt.injectAfter(ul);
			}else{
				arBt.injectBefore(ul);	
			}
			this.accesRapide.arBt = arBt;
			this.options.accesRapide.toggle.bt ? arBt.setHTML(this.options.accesRapide.toggle.bt) : arBt.setHTML('Voir la liste');
			ul.setStyles({'display':'block', 'height':0, 'overflow':'hidden'});
			ul.fx = ul.effect('height', {'duration': 500, 'transition': Fx.Transitions.Quart.easeInOut, 'wait':false});
		}
	},
	'hideList': function()
	{
		this.accesRapide.hideDelay = $clear(this.accesRapide.hideDelay);
		this.accesRapide.ul.fx.start(0);
		this.accesRapide.arBt.toggle = false;
	},
	'balanceNumber': function()
	{
		//alert(this.list.length+ ' - ' +(this.steps*this.nb));
		if(this.list.length<(this.steps*this.nb))
		{
			var ttt = this.steps * this.nb - this.list.length;
			for(i=0; i < ttt; i++)
			{
				var temporaryDiv = new Element('div', 
				{
					'class':this.options.emptyMc.classe
				}).injectInside($(this.options.container));
			}
		}
	}
});
fmcScroller.implement(new Options, new Events);




