/**
 * carrousel.class.js
 * creates a carrousel
 * 
 * @version  1.0
 * @author Rocco
 * @since 05/08/2009
 * @copyright Rocco Janse
 * @package Engine JS Lib
 * @subpackage Carrousel
 * @uses MooTools 1.2.3 More
 */

 var Carrousel = new Class({
	
	Implements: Options,
	
	options: {
		'viewport': false,
		'slidesContainer': false,
		'linkNext': false,
		'linkPrevious': false,
		'slidesToShift': 1,
		'slidesToShow': 6		
	},
	
	initialize: function(options) {
		
		this.setOptions(options);
		
		if (!this.options.viewport) return;
		this.viewport = this.options.viewport;
		
		this.slides = [];
		this.slidesToShift = this.options.slidesToShift.toInt();
		this.slidesToShow = this.options.slidesToShow.toInt();
		
		this.currentSlide = 0;
		this.startPosition = 0;
		
		this.slidesContainer = this.options.slidesContainer;
		if (!this.slidesContainer) return;
		
		this.initSlidesContainer();
		this.initSlides();
		
		this.linkNext = this.options.linkNext;
		this.linkPrevious = this.options.linkPrevious;
		
		if (!this.linkNext || !this.linkPrevious) return;
		
		// hide next		
		if ((this.currentSlide + this.slidesToShift + 1) > this.totalSlides-this.slidesToShow) {
			this.linkNext.addClass('inactive');	
		} 
		
		// hide prev
		if (this.currentSlide == 0) {
			this.linkPrevious.addClass('inactive');	
		}
		
		this.initLinks();

	},
	
	initSlides: function() {
		
		// fetch original slides
		this.slides = this.slidesContainer.getElements('li');
		this.totalSlides = this.slides.length;

	},
	
	initLinks: function() {
		this.linkNext.addEvents({
			'click': function() {
				this.gotoNextPosition();	
			}.bind(this)
		})
		this.linkPrevious.addEvents({
			'click': function() {
				this.gotoPreviousPosition();
			}.bind(this)
		})
	},
	
	initSlidesContainer: function() {
		this.viewport.setStyles({
			'position': 'relative',
			'overflow': 'hidden'
		});
		this.slidesContainer.setStyles({
			'position': 'absolute',
			'top': 0,
			'left': 0
		});
	},

	gotoNextPosition: function() {

		var endPos = 0;
		
		this.linkPrevious.removeClass('inactive');
		
		if (this.currentSlide + this.slidesToShift > this.totalSlides-this.slidesToShow) {
			this.nextSlide = (this.totalSlides-this.slidesToShow).toInt();
		} else {
			this.nextSlide = this.currentSlide + this.slidesToShift;
		}
		
		if ((this.currentSlide + this.slidesToShift + 1) > this.totalSlides-this.slidesToShow) {
			this.linkNext.addClass('inactive');	
		} 
		
		for(i = 1; i < this.slides.length; ++i) {
			
			endPos = endPos - this.slides[i].getWidth();
			
			if (i == this.nextSlide) {			
				break;
			}
		}
		
		var myFx = new Fx.Tween(this.slidesContainer);
		myFx.start('left', this.startPosition, endPos);
		
		this.currentSlide = this.nextSlide;
		this.startPosition = endPos;
	},
	
	gotoPreviousPosition: function() {
		
		var endPos = 0;
		
		this.linkNext.removeClass('inactive');
		
		if (this.currentSlide - this.slidesToShift == 0) {
			this.linkPrevious.addClass('inactive');	
		}
			
		if (this.currentSlide - this.slidesToShift < 0) {
			
			this.nextSlide = 0;
			
		} else {
			this.nextSlide = this.currentSlide - this.slidesToShift;
			
			for(i = this.currentSlide; i >= this.nextSlide; i--) {
				
				endPos = this.startPosition + this.slides[i].getWidth();
				
				if (i == this.nextSlide) {			
					break;
				}
			}
			
			var myFx = new Fx.Tween(this.slidesContainer);
			myFx.start('left', this.startPosition, endPos);
		}

		this.currentSlide = this.nextSlide;
		this.startPosition = endPos;

	}
});