function QSlideshow(width, height, displayTo, transTo, backGround)
{
	this.width = width;
	this.height = height;
	this.displayTimeout = displayTo;
	this.transTimeout = transTo;
	this.background = backGround;
	this.slides = new Array();
	this.currentSlide = -1;
}

QSlideshow.transitions = new Array();

QSlideshow.prototype.add = function(src)
{
	var slide = {
		url: src,
		img: document.createElement( "IMG" ),
		state: -1
	};
	
	slide.img.src = slide.url;
	slide.img.width = this.width;
	slide.img.height = this.height;
	slide.img.style.zIndex = 50;
	this.slides[ this.slides.length ] = slide;
}

QSlideshow.prototype.start = function(locationId)
{
	this.parentElement = document.getElementById( locationId );
	
	if( !this.parentElement ) return;
	
	this.parentElement.innerHTML = "";
	this.canvasBack = document.createElement( "DIV" );
	this.canvasBack.style.background = this.background;
	this.canvasBack.style.zIndex = 51;
	this.canvasBack.style.position = "absolute";
	this.canvasBack.style.display = "block";
	this.canvasBack.style.width = this.width + "px";
	this.canvasBack.style.height = this.height + "px";
	this.parentElement.appendChild( this.canvasBack );
	
	for( var j = 0; j < this.slides.length; j ++ ) {
		this.slides[j].img.style.position = "absolute";
		this.parentElement.appendChild( this.slides[j].img );
	}
	
	this.nextSlide();
}

QSlideshow.setOpacity = function(el, alpha)
{
	el.style.opacity = alpha;
	el.style.filter = "alpha(opacity=" + Math.round(alpha*100) + ")";

	if( el.style.setAttribute )
		el.style.setAttribute( "-moz-opacity", alpha );
}

QSlideshow.fadeThrough = function(tidx)
{
	if( !QSlideshow.transitions[ tidx ] )
		return;

	QSlideshow.transitions[ tidx ].state += 0.10;
	
	if( QSlideshow.transitions[ tidx ].imageIn != null ) {
		QSlideshow.setOpacity( QSlideshow.transitions[ tidx ].imageIn, QSlideshow.transitions[ tidx ].state );
	}

	if( QSlideshow.transitions[ tidx ].imageOut != null ) {
		QSlideshow.setOpacity( QSlideshow.transitions[ tidx ].imageOut, 1.0 - QSlideshow.transitions[ tidx ].state );
	}

	if( QSlideshow.transitions[ tidx ].state >= 1.0 ) {
		if( QSlideshow.transitions[ tidx ].imageIn != null )
			QSlideshow.transitions[ tidx ].imageIn.style.zIndex = 53;
		
		if( QSlideshow.transitions[ tidx ].imageOut != null )
			QSlideshow.transitions[ tidx ].imageOut.style.zIndex = 50;
			
		window.clearInterval( QSlideshow.transitions[ tidx ].intId );
		QSlideshow.transitions[ tidx ].intId = null;
		var moverFunc = new Function( "", "QSlideshow.moveOn(" + tidx + ");" );
		QSlideshow.transitions[ tidx ].tmrId = window.setTimeout( moverFunc, (QSlideshow.transitions[ tidx ].timeout * 1000) );
	}
}

QSlideshow.moveOn = function(tidx)
{
	if( !QSlideshow.transitions[ tidx ] ) return;

	var slideshow = QSlideshow.transitions[ tidx ].manager;
	delete QSlideshow.transitions[ tidx ];
	slideshow.nextSlide();
}

QSlideshow.prototype.nextSlide = function()
{
	var next = this.currentSlide + 1;

	if( next >= this.slides.length ) {
		next = 0;
	}

	this.gotoSlide( next );
}

QSlideshow.prototype.gotoSlide = function(next)
{
	this.previousSlide = this.currentSlide;
	this.currentSlide = next;

	if( this.previousSlide == this.currentSlide ) return;

	QSlideshow.setOpacity( this.slides[ this.currentSlide ].img, 0 );
	this.slides[ this.currentSlide ].img.style.zIndex = 52;
	
	var trans = {
		imageIn : this.slides[ this.currentSlide ].img,
		imageOut : (this.previousSlide >= 0) ? this.slides[ this.previousSlide ].img : null,
		state : 0,
		intId : null,
		tmrId : null,
		manager : this,
		timeout : this.displayTimeout
	};
	
	var tidx = Math.random();
	
	var transFunc = new Function( "", "QSlideshow.fadeThrough(" + tidx + ");" );
	trans.intId = window.setInterval( transFunc, Math.ceil((1000.0 * this.transTimeout) / 10) );

	QSlideshow.transitions[ tidx ] = trans;
}

QSlideshow.prototype.jumpSlide = function(idx)
{
	for( var tidx in QSlideshow.transitions ) {
		var trans = QSlideshow.transitions[ tidx ];

		if( trans.intId != null )
			window.clearInterval( trans.intId );
		if( trans.tmrId != null )
			window.clearTimeout( trans.tmrId );

		if( trans.imageIn != null )
			trans.imageIn.style.zIndex = 53;
		
		if( trans.imageOut != null )
			trans.imageOut.style.zIndex = 50;
	}
	
	delete QSlideshow.transitions;
	QSlideshow.transitions = new Array();
	this.gotoSlide(idx);
}

