jQuery.fn.slideshow = function(options) {
	var settings = {
		timeout: '3000',
		type: 'sequence',
		pauselink: null,
		playcallback: null,
		pausecallback: null
	}
	if(options)
		$.extend(settings, options);
	
	var pauseState = 0;
	var current = 1;
	var last = 0;
	var timer = '';

	if (settings.type == '') {
		 alert('Display Type Missing');
		 return false;
	}

	var change = function () {
		var $c = $(slides[current]), $l = $(slides[last]);
		var fn = function() {$c.animate({ opacity: 1 }, 800, null, null)};

		$c.css({'display':'block','opacity':0});
		$l.animate({ opacity: 0 }, 400, null, function() {
			$l.css({'display':'none'});
		});
		
		fn();

		if (settings.type == 'random' ) {
			last = current;
			while (	current == last ) {
				current = Math.floor ( Math.random ( ) * ( numSlides ) );
			}
		} else {
			if ( ( current + 1 ) < numSlides ) {
				last = current;
				current += 1;
			}
			else {
				current = 0;
				last = numSlides - 1;
			}
		}
		timer = setTimeout(change, settings.timeout);
	}
	
	var pause = function() {
		if ( pauseState == 0 ) {
			pauseState = 1;
			clearTimeout(timer);
			if ( settings.playcallback != null ) {
				settings.pausecallback($('#' + settings.pauselink));
			}
		}
		else {
			pauseState = 0;
			change();
			if ( settings.playcallback != null ) {
				settings.playcallback($('#' + settings.pauselink));
			}
		}
		return false;
	}

	var slides = this.find('li').get();
	var numSlides = slides.length;

	if ( settings.type == 'random' ) {
		current = Math.floor ( Math.random ( ) * ( numSlides ) );
		timer = setTimeout(change, settings.timeout);
	}
	else
		timer = setTimeout(change, settings.timeout);

	if ( settings.pauselink != null ) {
		$('#' + settings.pauselink).click(pause);
	}

	// on hover stuff
	this.hover(function(){ // stop on a hover
		clearTimeout(timer);
	},
		function(){ // resume after hover
			timer = setTimeout(change, 1000);
	});			


	return this;
};