function Slideshow(id, moveMode, moveTime) {
	var object = this;
	this.id = id;
	this.layer = document.getElementById('slideshow'+id);
	
	this.elements = new Array();
	
	this.inFront = 0;
	
	this.maxWidth = 0;
	this.maxHeight = 0;
	
	
	this.moveMode = (typeof moveMode != 'undefined') ? moveMode.split('.') : new Array('top', 'top');
	this.moveTime = (typeof moveTime != 'undefined') ? moveTime : 1000;
	this.toolbarMargin = 20;
	this.imageMargin = 6;
	
	var links = this.layer.getElementsByTagName('a');
	for (var i = 0; i < links.length; i++) {
		var element = new Object();
		element.link = links[i];
		element.image = links[i].firstChild;
		
		element.imageWidth = parseInt(element.image.getAttribute('width'));
		element.imageHeight = parseInt(element.image.getAttribute('height'));

		if (element.imageWidth > this.maxWidth)
			this.maxWidth = element.imageWidth;
		if (element.imageHeight > this.maxHeight)
			this.maxHeight = element.imageHeight;
		
		element.image.style.display = 'block';
		
		element.link.style.display = 'block';
		element.link.style.cssFloat = 'left';
		element.link.style.marginRight = this.imageMargin + 'px';
		
		this.elements.push(element);
	}
	
	this.linkPrev = document.createElement('a');
	this.linkPrev.className = 'link-prev';
	this.linkPrev.style.visibility = 'hidden';
	this.linkPrev.style.opacity = 0.0;
	this.linkPrev.style.marginRight = this.toolbarMargin + 'px';
	this.linkPrev.onclick = function (e) {
		if (object.inFront <= 0) return;
		object.initMove(object.inFront, --object.inFront);
	}
	
	this.linkNext = document.createElement('a');
	this.linkNext.className = 'link-next';
	this.linkNext.onclick = function (e) {
		if (object.inFront >= object.elements.length - 1) return;
		object.initMove(object.inFront, ++object.inFront);
	}

	this.layer.insertBefore(this.linkPrev, this.layer.firstChild);
	this.layer.appendChild(this.linkNext);
	
	this.slideWidth = 2*this.maxWidth;
	
	this.layer.style.overflow = 'hidden';
	this.layer.style.height = this.maxHeight + 'px';
	this.layer.style.width = (2*this.linkNext.offsetWidth + this.slideWidth + 2*this.toolbarMargin + 2*this.imageMargin) + 'px';

	var linkMarginTop = Math.round((this.layer.offsetHeight - this.linkNext.offsetHeight) / 2);
	
	this.linkNext.style.marginTop = linkMarginTop + 'px';
	this.linkPrev.style.marginTop = linkMarginTop + 'px';
	
	for (var i = 0; i < this.elements.length; i++)
		this.setPosition(i, this.calculatePosition(i, this.inFront));

	
	this.layer.onmouseover = function () { window.clearInterval(object.interval); object.interval = null; }
	this.layer.onmouseout = function () { object.startAutoMove(); }
	
	this.startAutoMove();
}

Slideshow.prototype.startAutoMove = function () {
	var object = this;

	var autoMove = function () {
		if(object.inFront < object.elements.length - 1) {
			object.initMove(object.inFront, ++object.inFront);
		} else {
			object.initMove(object.inFront, object.inFront = 0);
		}
	}
	
	this.interval = window.setInterval(autoMove, 10 * this.moveTime);
}

Slideshow.prototype.initMove = function (inFront, toFront) {
	if (toFront == 0) {
		new Motion(this.linkPrev, 'opacity', '', false, 1.0, 0.0, this.moveTime, 0, 'linear');
		new Motion(this.linkPrev, 'visibility', '', false, 'visible', 'hidden', this.moveTime);
	} else if (toFront == this.elements.length - 1) {
		new Motion(this.linkNext, 'opacity', '', false, 1.0, 0.0, this.moveTime, 0, 'linear');
		new Motion(this.linkNext, 'visibility', '', false, 'visible', 'hidden', this.moveTime);
	}

	
	if (inFront == 0) {
		new Motion(this.linkPrev, 'opacity', '', false, 0.0, 1.0, this.moveTime, 0, 'linear');
		this.linkPrev.style.visibility = 'visible';
	} else if (inFront == this.elements.length - 1) {
		new Motion(this.linkNext, 'opacity', '', false, 0.0, 1.0, this.moveTime, 0, 'linear');
		this.linkNext.style.visibility = 'visible';
	}
	
	var backwards = (toFront < inFront);
	
	for (var i = (backwards) ? this.elements.length - 1 : 0; (backwards) ? i >= 0 : i < this.elements.length; (backwards) ? i-- : i++) {
		var startPos = this.calculatePosition(i, inFront);
		var endPos = this.calculatePosition(i, toFront);
		
		if (startPos.width != endPos.width)
			new Motion(this.elements[i].image, 'width', 'px', true, startPos.width, endPos.width, this.moveTime);
			
		if (startPos.height != endPos.height)
			new Motion(this.elements[i].image, 'height', 'px', true, startPos.height, endPos.height, this.moveTime);
			
		if (startPos.marginTop != endPos.marginTop)
			new Motion(this.elements[i].link, 'marginTop', 'px', true, startPos.marginTop, endPos.marginTop, this.moveTime);
			
		if (startPos.marginLeft != endPos.marginLeft)
			new Motion(this.elements[i].link, 'marginLeft', 'px', true, startPos.marginLeft, endPos.marginLeft, this.moveTime);
			
		if ((endPos.width == 0 || endPos.height == 0) && startPos.width != endPos.width)
			new Motion(this.elements[i].link, 'display', null, false, 'block', 'none', this.moveTime);
		
		if (endPos.width > 0 && endPos.height > 0)
			this.elements[i].link.style.display = 'block';
			
		if (startPos.opacity != endPos.opacity)
			new Motion(this.elements[i].link, 'opacity', '', false, startPos.opacity, endPos.opacity, this.moveTime, 0, 'linear');
	}
}

Slideshow.prototype.setPosition = function (index, position) {
	this.elements[index].image.style.width = position.width + 'px';
	this.elements[index].image.style.height = position.height + 'px';
	this.elements[index].link.style.display = (position.width > 0 && position.height > 0) ? 'block' : 'none';
	this.elements[index].link.style.marginTop = position.marginTop + 'px';
	this.elements[index].link.style.marginLeft = position.marginLeft + 'px';
	this.elements[index].link.style.opacity = position.opacity;
}

Slideshow.prototype.calculatePosition = function (index, inFront) {
	var position = new Object();
	position.marginLeft = 0;
	position.opacity = 1.0;
	if (index == inFront) {
		position.width = this.elements[index].imageWidth;
		position.height = this.elements[index].imageHeight;
	} else if (index == inFront - 1 || index == inFront + 1) {
		position.width = Math.round( (this.slideWidth - this.elements[inFront].imageWidth) / 2);
		position.height = Math.round((this.elements[index].imageHeight / this.elements[index].imageWidth) * position.width);
		position.opacity = 0.2;
	} else {
		position.width = 0;
		position.height = 0;
		position.opacity = 0.0;
	}
	
	
	if (index != inFront) {
		var side = (index < inFront) ? 0 : 1;
		if (this.moveMode[side] == 'top')
			position.marginTop = 0;
		else if (this.moveMode[side] == 'center')
			position.marginTop = Math.round((this.layer.offsetHeight - position.height) / 2 );
		else
			position.marginTop = this.layer.offsetHeight - position.height;
	} else
		position.marginTop = 0;
	
	
	if (index == 0 && inFront == 0) {
		var ratio = this.elements[1].imageWidth / this.elements[1].imageHeight;
		var width1 = Math.round(this.calculatePosition(1, 0).height * ratio);
		position.marginLeft = this.slideWidth - width1 - this.elements[0].imageWidth;
	}
	
	return position;
}




