Slideshow=new Class({
	Implements:[Options,Events],
	slides:[],
	options:{
		effect:{
			opacity:[0,1]
		},
		stayDuration:1000,
		effectDuration:3000,
		effectTransition:'sine:in:out',
		slideClass:'slide',
		containerClass:'slideshow',
		containerId:'',
		zIndex:100,
		autoStart:true
	},
	currentSlide:0,
	slideshowElm:null,
	size:{x:0,y:0},
	position:{x:0,y:0},
	initialize:function(target,options)
	{
		this.setOptions(options);
		target=$(target);
		var children=target.getChildren();
		
		var slideshowElm=new Element('div',{'class':this.options.containerClass});
		this.slideshowElm=slideshowElm;

		slideshowElm.inject(target);
		
		this.resize('100%','100%');
		
		
		children.each(function(child)
		{
			child.dispose();
			this.addSlide(child);
		},this);
		if(this.options.autoStart)
			this.start();
		this.position=slideshowElm.getPosition();
	},
	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+')'});
			
			
		}
		slide.set('class',this.options.slideClass);
		slide.setStyles({
				'position':'absolute',
				'z-index':this.options.zIndex-2,
				'visibility':'hidden'
		});
		slide.dispose();
		

		this.slides.push(slide);


		slide.inject(this.slideshowElm);
		slide.set('morph',{
			duration:this.options.effectDuration,
			transition:this.options.effectTransition,
			onComplete:this.fireEvent.pass('change',this)
		});
		this.resizeSlide(slide);
		this.fireEvent('add');
		if(this.slides.length==1)
			this.gotoSlide(0,true);

	},
	resize:function(x,y)
	{
		if(x==undefined || y==undefined)
		var gx=0;
		var	gy=0;
		this.slides.each(function(slideElm,index)
		{
			if(x==undefined)
			{
				var w=slideElm.getStyle('width').toInt();
				slideElm.setStyle('width',null);
				gx=Math.max(gx,slideElm.getStyle('width').toInt());
				slideElm.setStyle('width',w);
				console.log('Suurin leveys nyt ',gx,slideElm,' sliden numero:',index);
			}
			if(y==undefined)
			{
				var h=slideElm.getStyle('height').toInt();
				
				slideElm.setStyle('height',null);
				gy=Math.max(gy,slideElm.getStyle('height').toInt());
				slideElm.setStyle('height',h);
			}
			
		});
		if(x==undefined)
			x=gx;
		if(y==undefined)
			y=gy;
		
		
		this.slideshowElm.setStyle('width',x);
		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
		});
		slide.setPosition(this.position);
	},
	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._autoNext();
	},
	stop:function()
	{
		this.removeEvent('change',this._autoNext);
	}
});


