jQuery.fn.slideshow = function(options) {
	var settings = {
		timeout: '2000',
		type: 'sequence',
		pauselink: null,
		playcallback: null,
		pausecallback: null
	}
	if(options)
		jQuery.extend(settings, options);
	
	var pauseState = 0;
	var current = 0;
	var timer = '';

	var fadeToSlide = function(slideIndex) {
		var last = current;
		current = slideIndex;
		for (var i = 0; i < slides.length; i++) {
			jQuery(slides[i]).css('display', 'none');
		}
		jQuery(slides[last]).css('display', 'block').css('zIndex', '0');
		jQuery(slides[current]).css('zIndex', '1').fadeIn('slow');			
	}
	
	var change = function() {
		if ( pauseState == 0 ) {
			var nextSlide = current;
			if ( settings.type == 'sequence' ) {
				if ( ( current + 1 ) < slides.length ) {
					nextSlide = current + 1;
				} else {
					nextSlide = 0;
				}
			} else if ( settings.type == 'random' ) {
				while (	current == nextSlide ) {
					nextSlide = Math.floor ( Math.random ( ) * ( slides.length ) );
				}
			} else {
				alert('type must either be \'sequence\' or \'random\'');
			}
			fadeToSlide(nextSlide);
			timer = setTimeout(change, settings.timeout);
		}
	}

	this.showSlide = function(slide) {
		clearTimeout(timer);
		fadeToSlide(slide);
		if (pauseState == 0) {
			timer = setTimeout(change, settings.timeout);
		}
	}

	this.showNext = function() {
		clearTimeout(timer);
		change();
	}

	this.stop = function() {
		pauseState = 1;
		clearTimeout(timer);
		if ( settings.playcallback != null ) {
			settings.pausecallback(jQuery('#' + settings.pauselink));
		}
	}

	this.play = function() {
		pauseState = 0;
		change();
		if ( settings.playcallback != null ) {
			settings.playcallback(jQuery('#' + settings.pauselink));
		}
	}
	
	this.pause = function() {
		if ( pauseState == 0 ) {
			this.stop();
		} else {
			this.play();
		}
		return false;
	}

	this.css('position', 'relative');
	var slides = this.find('a').get();
	jQuery.each(slides, function(i){
		jQuery(slides[i]).css('zIndex', slides.length - i).css('position', 'absolute').css('top', '0').css('left', '0');
	});
	if ( settings.type == 'sequence' ) {
		timer = setTimeout(change, settings.timeout);
	}
	else if ( settings.type == 'random' ) {
		do { current = Math.floor ( Math.random ( ) * ( slides.length ) ); } while ( current == 0 )
		timer = setTimeout(change, settings.timeout);
	}
	else {
		alert('type must either be \'sequence\' or \'random\'');
	}
	
	if ( settings.pauselink != null ) {
		jQuery('#' + settings.pauselink).click(this.pause);
	}
	
	return this;
};

