Slideshow=new Class({
	Implements:[Options,Events],
	slides:[],
	options:{
		effect:{
			opacity:[0,1]
		},
		stayDuration:5000,
		effectDuration:5000,
		effectTransition:'sine:in:out',
		slideClass:'slide',
		containerClass:'slideshow',
		containerId:'',
		zIndex:100
	},
	currentSlide:0,
	slideshowElm:null,
	size:{x:0,y:0},
	initialize:function(target,options)
	{		
		this.setOptions(options);
		
		target=$(target);
		var slideshowElm=new Element('div',{'class':this.options.containerClass,'id':this.options.containerId});
		this.slideshowElm=slideshowElm;
		
		slideshowElm.inject(target);
		
		this.resize();
	},
	addSlide:function(slide)
	{
		//Onko slide string, eli kuvan urli...
		if($type(slide)=='string')
		{
			//preload
			var img=new Image();
			img.src=slide;
			slide=new Element('div',{style:'width:100%;height:100%;background-image:url('+slide+')'});
		
		}
		var slideElm=new Element('div',{
			'class':this.options.slideClass,
			'styles':{
				'position':'absolute',
				'z-index':this.options.zIndex-2,
				'visibility':'hidden'
			}
		});
		
		slideElm.adopt(slide);
		
		this.slides.push(slideElm);
		
		
		slideElm.inject(this.slideshowElm);
		slideElm.set('morph',{
			duration:this.options.effectDuration,
			transition:this.options.effectTransition,
			onComplete:this.fireEvent.pass('change',this)
		});
		this.resizeSlide(slideElm);
		this.fireEvent('add');
		if(this.slides.length==1)
			this.gotoSlide(0,true);
			
	},
	resize:function(x,y)
	{
		if(x)
			this.slideshowElm.setStyle('width',x);
		if(y)
			this.slideshowElm.setStyle('height',y);
			
		var size=this.slideshowElm.getSize();
		this.size=size;
		this.slides.each(function(slide)
		{
			this.resizeSlide(slide);
		},this);
		this.fireEvent('resize');
	},
	resizeSlide:function(slide,x,y)
	{
		if(!x)
			x=this.size.x;
		if(!y)
			y=this.size.y;
			
		slide.setStyles({
			width:x,
			height:y
		});
	},
	gotoSlide:function(index,instant)
	{
		if(this.slides.length==1)
			instant=true;
			
		index=Math.min(index,this.slides.length-1);
		var slideElm=this.slides[index];
		var previousSlideElm=this.slides[this.currentSlide];
		this.slides.each(function(slide)
		{
			slide.setStyle('z-index',this.options.zIndex-2);
		},this);
		previousSlideElm.setStyle('z-index',this.options.zIndex-1);
		slideElm.setStyles({
			'z-index':this.options.zIndex,
			'visibility':'hidden'
		});
		if(instant)
		{
			slideElm.setStyle('visibility','visible');
		}
		else
			slideElm.morph(this.options.effect);
		this.currentSlide=index;
		
	},
	nextSlide:function(instant)
	{
		var slideIndex=(this.currentSlide+1)%this.slides.length;
		this.gotoSlide(slideIndex,instant);
		return this;
	},
	_autoNext:function()
	{
		this.nextSlide.delay(this.options.stayDuration,this);
	},
	start:function()
	{
		this.gotoSlide(this.currentSlide,true);
		if(this.slides.length==1)
			return false;
		this.addEvent('change',this._autoNext);
		this.nextSlide();
	},
	stop:function()
	{
		this.removeEvent('change',this._autoNext);
	}
});
