/**
 * Carousel class carousel.js
 * Version 0.01
 * By David van Leeuwen (Mashed Potatoes)
 **/


if (typeof mashedCarousel == "undefined"){
	mashedCarousel = {};
}

mashedCarousel.topCarousel = Class.create({
	initialize: function(element, options){
		this.element = $(element);
		this.options = Object.extend({
			interval: 6,
			slidesClass: '.slides',
			listClass: '.list', 
			activeClass: 'active',
			activeTabClass: 'activetab',
			enabled: true
		}, options || { });
		
		// Slide vars:
		this.contentElement = this.element.down(this.options.slidesClass);	
		this.contentElements = this.contentElement.childElements();
		this.lastContentElementIndex = this.contentElements.length-1;
		
		// Tab vars:
		this.tabElement = this.element.down(this.options.listClass);	
		this.tabElements = this.tabElement.childElements();
		this.lastTabElementIndex = this.tabElements.length-1;
		this.linkElements = this.tabElement.select('a');
		
		
		Event.observe(this.tabElement, 'click', this.clickHandler.bindAsEventListener(this));
		
		if(this.options.enabled) {
			this.startTimer();
		}
	},
	/*
	* Click Handler
	*/
	clickHandler: function(event) {
		var link = event.findElement('a');
		if(link){
			var slideNumber = this.linkElements.indexOf(link);
			if (slideNumber >= 0) {
				this.stopTimer();
				this.activateClickedSlide(slideNumber);
				this.activateClickedTab(slideNumber);
			}
			link.blur();
			event.stop();
		}
	},
	/*
	* Time Handler
	*/
	timerHandler: function() {
		this.stopTimer();
		this.activateTab();
		this.activateSlide();
	},
	/*
	* Initialize the timer
	*/
	startTimer: function(element) {
		if(this.options.interval > 0){
			this.timer = new PeriodicalExecuter(this.timerHandler.bindAsEventListener(this), this.options.interval);
		}
	},
	/*
	* Stop the timer
	*/
	stopTimer: function(element) {
		this.timer.stop();
	},
	/*
	* Activate a tab
	*/
	activateTab: function(tabnumber) {
		this.activeTabIndex = this.tabElements.indexOf(this.tabElement.down('.' + this.options.activeTabClass));
		
		if (this.activeTabIndex < this.lastTabElementIndex) {
			this.tabElements[this.activeTabIndex].removeClassName(this.options.activeTabClass);
			this.tabElements[this.activeTabIndex+1].addClassName(this.options.activeTabClass);
		} else if (this.activeTabIndex == this.lastTabElementIndex) {
			this.tabElements[this.lastTabElementIndex].removeClassName(this.options.activeTabClass);
			this.tabElements[0].addClassName(this.options.activeTabClass);
		}
	},
	/*
	* Activate a tab
	*/
	activateClickedTab: function(tabnumber) {
		this.activeTabIndex = this.tabElements.indexOf(this.tabElement.down('.' + this.options.activeTabClass));
		var tabNumber = tabnumber;
		
		if (tabNumber != this.activeTabIndex) {
			if (!tabNumber) {
				var tabNumber = 0;
			}
			this.tabElements[this.activeTabIndex].removeClassName(this.options.activeTabClass);
			this.tabElements[tabNumber].addClassName(this.options.activeTabClass);
		}
	},
	/*
	* Active a clicked slide
	*/
	activateClickedSlide: function(slidenumber) {
		this.activeIndex = this.contentElements.indexOf(this.contentElement.down('.' + this.options.activeClass));
		var slideNumber = slidenumber;
		
		if (slideNumber != this.activeIndex) {
			if (!slideNumber) {
					slideNumber = 0;
			}

			this.contentElements[slideNumber].hide();
			this.contentElements[slideNumber].addClassName(this.options.activeClass);
			new Effect.Appear(this.contentElements[slideNumber],{
				duration: 0,
				afterFinish: function(transport) {
					this.contentElements[this.activeIndex].removeClassName(this.options.activeClass);
				}.bind(this)
			});
		}
	},
	/*
	* Active a slide
	*/
	activateSlide: function() {
		this.activeIndex = this.contentElements.indexOf(this.contentElement.down('.' + this.options.activeClass));
		
		if (this.activeIndex < this.lastContentElementIndex) {
			this.contentElements[this.activeIndex+1].hide();
			this.contentElements[this.activeIndex+1].addClassName(this.options.activeClass);
			new Effect.Appear(this.contentElements[this.activeIndex+1],{
				duration: 0.3,
				afterFinish: function(transport) {
					this.contentElements[this.activeIndex].removeClassName(this.options.activeClass);
					this.startTimer();
				}.bind(this)
			});
		} else if (this.activeIndex == this.lastContentElementIndex) {
			this.contentElements[0].hide();
			this.contentElements[0].addClassName(this.options.activeClass);
			this.contentElements[this.lastContentElementIndex].removeClassName(this.options.activeClass);
			new Effect.Appear(this.contentElements[0],{
				duration: 0.3,
				afterFinish: function(transport) {	
					this.startTimer();
				}.bind(this)
			});
		}
	}
});
