/*
Carrousel pour Volten
Copyright(c) 2009, Skalpel.

Author : Michael
michael@skalpel.fr

Note : 
	-
ToDo :
	- 
*/

/* 
Class : SKjs.Carrousel
	Carrousel / Slideshow
	
Arguments : 
	container {String} - Id du conteneur
	menu {String} - Id ou Selecteur du menu / des pages
	slide {String} - Id ou Selecteur des diapositives
	options {object} - Objet Options
	
Options :
	periodicalTime {Integer} - Durée des intavalles du slideshow
	delayTime {Integer} - 
	pause {Boolean} -
*/
SKjs.Carrousel = new Class ({
	Implements: [Events, Options],
	options: {
		periodicalTime: 10000,
		delayTime: 15000,
		
		// Events
		onStart: $empty,
		onShow: $empty,
		onGoto: $empty
	},
	
	/*
	Property :
		Initialisation de la Class
	*/
	initialize: function(container, menu, slide, options) {
		this.setOptions(options);
		
		// DOM
		this.container = $(container);
		this.menu = ($type(menu) == 'array') ? menu : this.container.getElements(menu);
		this.slide = ($type(slide) == 'array') ? slide : this.container.getElements(slide);
		
		// Constantes
		this.index = 0;
		this.intervalId = null;
		
		// Reset
		this.slide.fade('hide');
		this.menu.removeClass(SKjs.activeCls);
		this.slide.removeClass(SKjs.activeCls);
		
		this.slide[0].fade('show');
		this.menu[0].addClass(SKjs.activeCls);
		
		// Events
		this.menu.each(function(page, index) {
			page.addEvent('click', this.goTo.bindWithEvent(this, [index]));
		}, this);
		
		// Launch
		this.launchSlideshow();
		this.fireEvent('start');
	},
	
	/*
	Property :
	*/
	launchSlideshow: function() {
		$clear(this.intervalId);
		this.intervalId = this.nextSlide.periodical(this.options.periodicalTime, this);
	},
	
	/*
	Property :
	*/
	goTo: function(event, index) {
		event.stop();
		if(index != this.index) {
			$clear(this.intervalId);
			this.slide[index].fade('in');
			this.slide[this.index].fade('out');
			this.menu[index].addClass(SKjs.activeCls);
			this.menu[this.index].removeClass(SKjs.activeCls);
			this.index = index;
			this.launchSlideshow.delay(this.options.delayTime, this);
			this.fireEvent('goto');
		}
	},
	/*
	Property :
	*/
	nextSlide: function(pause) {
		var nextIndex = (this.index+1 > this.menu.length-1) ? 0 : this.index+1;
		
		this.slide[nextIndex].fade('in');
		this.slide[this.index].fade('out');
		this.menu[nextIndex].addClass(SKjs.activeCls);
		this.menu[this.index].removeClass(SKjs.activeCls);
		
		this.index = nextIndex;
		if(pause) this.launchSlideshow();
		this.fireEvent('show');
	},
	/*
	Property :
	*/
	previousSlide: function(pause) {
		var previousIndex = (this.index-1 < 0) ? this.menu.length-1 : this.index-1;
		
		this.slide[previousIndex].fade('in');
		this.slide[this.index].fade('out');
		this.menu[previousIndex].addClass(SKjs.activeCls);
		this.menu[this.index].removeClass(SKjs.activeCls);
		
		this.index = previousIndex;
		if(pause) this.launchSlideshow();
		this.fireEvent('show');
	}
});
