jQuery.fn.slideshow = function(options) {
	var settings = {
		timeout: '6000',
		type: 'sequence',
		bcklink: null,
		pauselink: null,
		fwdlink: null,
		playcallback: null,
		pausecallback: null
	}
	if(options)
		jQuery.extend(settings, options);
	
	var pauseState = 0;
	var current = 0;
	var last = 0;
	var timer = '';

	var change = function (direction) {
		$('#slideshow').css('background', '#000000');
		if ( pauseState == 0 ) {
			for (var i = 0; i < slides.length; i++) {
				jQuery(slides[i]).css('display', 'none').css('zIndex', '0').css('left', ((936-jQuery(slides[i]).width())/2)+'px');
				jQuery(slides[i]).siblings().filter(":first").css('display', 'none').css('zIndex', '0');
			}
			if ( settings.type == 'sequence' ) {
				if(direction == 1)
				{
					if ( ( current + 1 ) < slides.length ) {
						current = current + 1;
						last = current - 1;
					}
					else {
						current = 0;
						last = slides.length - 1;
					}
				}
				else if(direction == 0)
				{
					if ( ( current + 1 ) > 1 ) {
						current = current - 1;
						last = current + 1;
					}
					else {
						current = slides.length - 1;
						last = 0;
					}
				}
			}
			else if ( settings.type == 'random' ) {
				last = current;
				while (	current == last ) {
					current = Math.floor ( Math.random ( ) * ( slides.length ) );
				}
			}
			else {
				alert('type must either be \'sequence\' or \'random\'');
			}
			jQuery(slides[last]).siblings().filter(":first").css('zIndex', '0').css('filter', 'alpha(opacity=0)').fadeOut('slow');
			jQuery(slides[last]).css('zIndex', '0').css('filter', 'alpha(opacity=0)').fadeOut('slow');
			jQuery(slides[current]).css('zIndex', '1').css('filter', 'alpha(opacity=100)').fadeIn('slow');
			jQuery(slides[current]).siblings().filter(":first").css('zIndex', '2').css('filter', 'alpha(opacity=75)').fadeIn('slow');
		}
	}
	
	var play = function() {
		clearTimeout(timer);
		pauseState = 0;
		change(1);
		timer = setTimeout(play, settings.timeout);
		if ( settings.playcallback != null ) {
			settings.playcallback(jQuery('#' + settings.pauselink));
		}
	}
	
	var bck = function() {
		clearTimeout(timer);
		pauseState = 0;
		change(0);
		timer = setTimeout(play, settings.timeout);
		if ( settings.playcallback != null ) {
			settings.playcallback(jQuery('#' + settings.pauselink));
		}
	}
		
	var pause = function() {
		if ( pauseState == 0 ) {
			pauseState = 1;
			clearTimeout(timer);
			if ( settings.playcallback != null ) {
				settings.pausecallback(jQuery('#' + settings.pauselink));
			}
		}
		else {
			play();
		}
		return false;
	}
	
	this.css('position', 'relative');
	var slides = this.find('img').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(play, settings.timeout);
	}
	else if ( settings.type == 'random' ) {
		do { current = Math.floor ( Math.random ( ) * ( slides.length ) ); } while ( current == 0 )
		timer = setTimeout(play, settings.timeout);
	}
	else {
		alert('type must either be \'sequence\' or \'random\'');
	}
	
	if ( settings.pauselink != null ) {
		jQuery('#' + settings.pauselink).click(pause);
	}
	
	if ( settings.pauselink != null ) {
		jQuery('#' + settings.bcklink).click(bck);
	}
	
	if ( settings.pauselink != null ) {
		jQuery('#' + settings.fwdlink).click(play);
	}
	
	return this;
};