function SlideShow(ImageList,LinkList,ImageDuration,ImageDelay,ImageRandom)
{
	// set slide show object
	var SlideShowObject=this;
	// set image elements
	SlideShowObject.ImageElements=$H();
	// loop image list
	ImageList.each(function(ListElement)
	{
		if(!$(ListElement.key))
		{
			alert('Image \''+ListElement.key+'\' not found.');
			return;
		}
		SlideShowObject.ImageElements.set(ListElement.key,$A());
		ListElement.value.each(function(ImageElement)
		{
			SlideShowObject.ImageElements.get(ListElement.key).push(new Element('img',{'src':ImageElement}));
		});
	});
	// set link list
	SlideShowObject.LinkList=LinkList;
	// set duration
	SlideShowObject.Duration=ImageDuration;
	// set delay
	SlideShowObject.Delay=ImageDelay;
	// set random
	SlideShowObject.Random=ImageRandom;
	// set current image
	SlideShowObject.CurrentImage=-1;
	// loop image list
	ImageList.keys().each(function(ListElement)
	{
		// set container element
		var ContainerElement=new Element('div',
		{
			id:ListElement
		}).setStyle(
		{
			height:$(ListElement).getHeight()+'px',
			overflow:'hidden',
			position:'relative',
			width:$(ListElement).getWidth()+'px'
		});
		// set front image element
		var FrontImageElement=new Element('img',
		{
			height:$(ListElement).getHeight(),
			src:$(ListElement).src,
			width:$(ListElement).getWidth()
		}).setStyle(
		{
			height:$(ListElement).getHeight()+'px',
			left:'0px',
			position:'absolute',
			top:'0px',
			width:$(ListElement).getWidth()+'px'
		}).setOpacity(1);
		// set back image element
		var BackImageElement=new Element('img',
		{
			height:$(ListElement).getHeight(),
			src:$(ListElement).src,
			width:$(ListElement).getWidth()
		}).setStyle(
		{
			height:$(ListElement).getHeight()+'px',
			left:'0px',
			position:'absolute',
			top:'0px',
			width:$(ListElement).getWidth()+'px'
		}).setOpacity(1);
		ContainerElement.insert(BackImageElement);
		ContainerElement.insert(FrontImageElement);
		$(ListElement).replace(ContainerElement);
	});
	SlideShowObject.Rotate();
	new PeriodicalExecuter(function(pe)
	{

		SlideShowObject.Rotate();
	},SlideShowObject.Duration);
}

SlideShow.prototype.Rotate=function()
{
	// set slide show object
	var SlideShowObject=this;
	// set firstimage name
	var FirstImageName=this.ImageElements.keys()[0];
	// check random
	if(this.Random)
	{
		do
		{
			// set current image
			var CurrentImage=Math.round(Math.random()*10);
		}
		while((CurrentImage>=this.ImageElements.get(FirstImageName).size())||(CurrentImage==this.CurrentImage));
		// set current image
		this.CurrentImage=CurrentImage;
	}
	else
	{
		// check current image
		if(this.CurrentImage==this.ImageElements.get(FirstImageName).size()-1)
		{
			this.CurrentImage=0;
		}
		else
		{
			this.CurrentImage++;
		}
	}
	// set image counter
	var ImageCounter=0;
	new PeriodicalExecuter(function(pe)
	{
		// check image counter
		if(ImageCounter==SlideShowObject.ImageElements.keys().size())
		{
			pe.stop();
		}
		else
		{
			ImageName=SlideShowObject.ImageElements.keys()[ImageCounter++];
			$(ImageName).stopObserving();
			if(SlideShowObject.LinkList.get(ImageName)[SlideShowObject.CurrentImage])
			{
				$(ImageName).observe('click',function()
				{
					window.location.href=SlideShowObject.LinkList.get(ImageName)[SlideShowObject.CurrentImage];
				});
			}
			SlideShowObject.Change(ImageName);
		}
	},SlideShowObject.Delay);
}

SlideShow.prototype.Change=function(ImageName)
{
	// change images
	$(ImageName).select('img')[0].src=$(ImageName).select('img')[1].src;
	$(ImageName).select('img')[1].setOpacity(0);
	$(ImageName).select('img')[1].src=this.ImageElements.get(ImageName)[this.CurrentImage].src;
	// set image src
	new PeriodicalExecuter(function(pe)
	{
		// set opacity
		var Opacity=$(ImageName).select('img')[1].getStyle('opacity');
		// check opacity
		if(Opacity<1)
		{
			$(ImageName).select('img')[1].setOpacity((Opacity+0.1));
		}
		else
		{
			pe.stop();
		}
	},0.05);
}
