var SlideShow = new Class({
			
			/* implements */
			Implements: [Options],
			
			marginChange: null,
			
			/* options */
			options: {
				auto: true,
				speed: 400,
				slides: '.slides',
				thumb: '.thumbnail',
				controlContainer: '.thumbnail',
				next: '.next',
				previous: '.previous'
			},
			/* initialization */
			initialize: function(options) {
				var self = this;
				/* set options */
				self.setOptions(options);
				self.slides = $$(this.options.slides)[0];
				self.thumb = $$(this.options.thumb)[0];
				self.controlContainer = $$(this.options.controlContainer)[0];
				self.totWidth=0;
				self.positions = new Array();
				self.pos = 0;
				self.count = 0;
				self.changeEvery = 6;
				self.auto = this.options.auto;
				self.play = self.auto;
				self.slides.setStyle('margin-left',0);
				
				self.marginChange = new Fx.Tween(self.slides, {
					duration: 'long',
					property: 'margin-left'
				});
				
				window.onload = function(){
					self.slides.getChildren().each(function(item,i){
					/* Traverse through all the slides and store their accumulative widths in totWidth */
						self.positions[i]= self.totWidth;
						self.totWidth += item.getSize().x;
						self.count++;
					});	
				}
				
				this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
					this.itvl;
				
				window.addEvent('keypress',function(event) {
					if(event.key == 'left') {
						clearInterval(this.itvl);
						this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
						this.itvl;
						self.previous();
					} 
				});
				
				window.addEvent('keypress',function(event) {
					if(event.key == 'right') {
						clearInterval(this.itvl);
						this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
						this.itvl;
						self.next();
					} 
				});
				
				self.thumb.getElements('li').addEvent('click',function(event) {
					event.preventDefault();
					self.goTo(self.thumb.getElements('li').indexOf(this));										   
				});
				
				self.controlContainer.getElement('.next').addEvent('click',function(event) {
					event.preventDefault();
					clearInterval(this.itvl);
					this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
					this.itvl;
					self.next();
				});
				
				self.controlContainer.getElement('.previous').addEvent('click',function(event) {
					event.preventDefault();
					clearInterval(this.itvl);
					this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
					this.itvl;
					self.previous();
				});

			},
			
			/* directs the plugin to highlight elements */
			next: function() {	
				var self = this;
				if(this.pos < this.count-1)
					this.pos++;
				else
					this.pos=0;
				
				clearInterval(this.itvl);
				this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
				this.itvl;

				this.goTo(this.pos);

				/* Start the sliding animation */
					return this;
			},
			
			previous: function() {	
				var self = this;
				if(this.pos != 0)
					this.pos--;
				else
					this.pos = this.count-1;
					
				clearInterval(this.itvl);
				this.itvl = setInterval(function(){self.autoAdvance()},self.changeEvery*1000);
				this.itvl;
				
				this.goTo(this.pos);
				/* Start the sliding animation */
					return this;
			},
			
			goTo: function(pos) {
				var self = this;
				this.pos = pos;
				this.current = self.thumb.getElements('li').indexOf(self.thumb.getElement('li.active'))
				if(this.pos == 0 && this.current == this.count-1) {
					self.marginChange.cancel();
					var first = self.slides.getFirst().clone();
					self.slides.grab(first);
					self.marginChange.addEvent('complete',function(){
						self.slides.setStyle('margin-left',0);
						self.slides.getLast().destroy();
						self.marginChange.removeEvents();
					});
					self.marginChange.addEvent('cancel',function(){
						self.slides.setStyle('margin-left',0);
						self.slides.getLast().destroy();
						self.marginChange.removeEvents();
					});
					self.marginChange.start(-this.positions.getLast()-this.positions[1]);
					self.thumb.getElements('li').removeClass('active');
					self.thumb.getElements('li')[this.pos].addClass('active');
				}
				else if(this.pos == this.count-1 && this.current == 0) {
					self.marginChange.cancel();
					var last = self.slides.getLast().clone()
					last.setStyle('float','left');
					self.slides.grab(last,'top').setStyle('margin-left',-self.positions[1]);
					self.marginChange.addEvent('complete',function(){
						self.slides.setStyle('margin-left',-self.positions[self.count - 1]);
						self.slides.getFirst().destroy();
						self.marginChange.removeEvents();
					});
					self.marginChange.addEvent('cancel',function(){
						self.slides.setStyle('margin-left',-self.positions[self.count - 1]);
						self.slides.getFirst().destroy();
						self.marginChange.removeEvents();
					});
					self.marginChange.start(0);
					self.thumb.getElements('li').removeClass('active');
					self.thumb.getElements('li')[this.pos].addClass('active');
				}
				else {
					self.marginChange.cancel();
					self.marginChange.start(-this.positions[this.pos]);
					self.thumb.getElements('li').removeClass('active');
					self.thumb.getElements('li')[this.pos].addClass('active');
				}
				/* Start the sliding animation */
				return this;
			},
			autoAdvance: function(){	
				var self = this;
				if(self.play)
					self.next();
			}	
});
