var slideShowGallery = Class.create ({

	initialize : function( element, options ) {
		this.options = Object.extend( {
			selector : ".slide",
			thumbSelector : ".thumb",
			activeSelector : "slide-active",
			mode : "slideshow",	// slideshow, thumbs
			interval : 3,
			initialSlide : 1,
			transitionTimeAuto: 1.5,
			transitionTimeAction: 0.5,
			thumbMoveDelay: 0.26
		}, options||{ } );
		
		this.element = $( element );		
		this.slides = this.element.select( this.options.selector );
		this.mode = this.options.mode;
		this.interval = this.options.interval * 1000;
		this.slideID = this.options.initialSlide-1;
		this.initialElement = this.slides[this.slideID];
		this.transitionTimeAuto = this.options.transitionTimeAuto;
		this.transitionTimeAction = this.options.transitionTimeAction;
		this.thumbMoveDelay = this.options.thumbMoveDelay * 1000;
		this.isPlaying = false;

		if( this.slides.size( ) > 1 ) {
			
			if( this.mode == "thumbs" ) {
				this.thumbs = this.element.select( this.options.thumbSelector );
				this.thumbs.each( function( el, index ) {				
					//el.observe( 'mouseover', function( e ) { this.goToSlide( index ) }.bind( this ) );
					el.observe( 'mouseover', function( e ) { this.initNextSlide( index ) }.bind( this ) );
				}.bind( this ) );
			}	
			
			this.animating = false;
			this.slidesLength = this.slides.size( );
			this.slides.invoke( 'hide' );
			this.initialElement.show( ).addClassName( this.options.activeSelector );
			this.play( );
		}
		
	},
	
	play : function( ) {
		if( this.isPlaying ) this.clearTimer( this.runShow );
		this.runShow = setTimeout( this.next.bind( this ), this.interval );
		this.isPlaying = true;		
	},
	
	next : function( ) {
		var activeSlide = this.slides[this.slideID];
		this.slideID = this.slideID >= this.slidesLength - 1 ? 0 : this.slideID + 1;
		var nextSlide = this.slides[this.slideID];
		this.fadeSlides( activeSlide, nextSlide, this.transitionTimeAuto );
	},
	
	initNextSlide : function( i ) {
		this.nextSlideID = i;
		if( this.activeDelay ) clearTimeout( this.runDelay );
		this.activeDelay = true;
		this.runDelay = setTimeout( this.goToSlide.bind( this ), this.thumbMoveDelay );
	},
	
	goToSlide : function( ) {
		
		if( this.activeDelay ) clearTimeout( this.runDelay );
		this.activeDelay = false;
		if( !this.animating && this.slideID != this.nextSlideID ) {
			this.fadeSlides( this.slides[this.slideID], this.slides[this.nextSlideID], this.transitionTimeAction );
			this.slideID = this.nextSlideID;
			this.play( );
		}
	},
	
	fadeSlides : function( activeSlide, nextSlide, transitionTime ) {
		this.animating = true;
		nextSlide.show( );
		activeSlide.fade( { duration : transitionTime, afterFinish: this.cleanup.bind( this, activeSlide, nextSlide ) } );
	},
	
	cleanup : function( activeSlide, nextSlide ) {
		$( activeSlide ).removeClassName( this.options.activeSelector );
		$( nextSlide ).addClassName( this.options.activeSelector );
		this.animating = false;
		this.play( );
	},
	
	clearTimer : function( ) {
		clearTimeout( this.runShow );
		this.isPlaying = false;	
	}

});
