/**
 * ContentScroller.js
 * Copyright (c) Fluid Creativity, 2009
 * 
 * Implements a rotating slide show (with optional controls)
 */

var ContentScroller = new Class({

	Implements: [Options,  Events],

	options: {
		slides: [],
		slideDuration: 4000,
		fadeDuration: 1000,
		includePages: false,
		controlContainer: null,
		direction: 'forward',
		nextLinkText: 'Next Slide',
		previousLinkText: 'Previous Slide'
	},
	
	initialize: function(options) {
		this.setOptions(options);
		this.current = 0;
		this.slides = [];
		this.addSlides(this.options.slides);
	},
	
	addSlides: function(slides) {
		$$(slides).each(function(el) {
			this.addSlide(el);
		}, this);
	},
	
	addSlide: function(slide) {
		var s = new Fx.Tween(slide.addClass('slide'), { property: 'opacity', duration: this.options.fadeDuration, link: 'cancel' });
		this.slides.push(s);
		
		if (this.slides.length > 1 && !this.initialisedControls) {
			this.setupControls();
		}
	},
	
	nextSlide: function() {
		var nextElement = (this.current + (this.options.direction == 'forward' ? 1 : -1) + this.slides.length) % this.slides.length;
		
		this.slides[this.current].start(0);
		this.slides[nextElement].start(1);
		
		this.current = nextElement;
		
		this.updateCurrentPage();
	},

	getCurrentSlide: function() {
		return this.slides[this.current].subject;
	},

	setupControls: function() {
		var controlContainer = $(this.options.controlContainer);
		
		if (!this.initialisedControls && controlContainer) {
			controlContainer.addClass('slideshow');
			
			var controls = new Element('div', { 'class': 'controls' }).inject(controlContainer);
		
			// Previous Link
			controls.adopt(new Element('a', { 'class': 'prevLink', 'href': '#', 'text': this.options.previousLinkText }).addEvent('click', function(e) {
				e.stop();
				
				$clear(this.slideTimer);
				
				this.options.direction = 'backward';
				this.nextSlide();
			}.bindWithEvent(this)));
			
			// Next Link		
			controls.adopt(new Element('a', { 'class': 'nextLink', 'href': '#', 'text': this.options.nextLinkText }).addEvent('click', function(e) {
				e.stop();
				
				$clear(this.slideTimer);
				
				this.options.direction = 'forward';
				this.nextSlide();
			}.bindWithEvent(this)));

			// Paging
			if (this.options.includePages) {
				this.pageContainer = new Element('span').inject(controls);
			}

			this.initialisedControls = true;
		}
	},
	
	updateCurrentPage: function() {
		if (this.pageContainer) {
			this.pageContainer.set('text', (this.current + 1) + " of " + this.slides.length);
		}
		
		this.fireEvent('changed', this);
	},

	start: function() {
		if (this.slides.length > 1) {
			$each(this.slides, function(slide, i) { slide.set(i > 0 ? 0 : 1); });
			this.slideTimer = this.nextSlide.periodical(this.options.slideDuration, this);
			this.updateCurrentPage();
		}
	}
});
