jQuery.fn.slideshow = function(options) {
	var settings = {
		timeout: '12000',
		type: 'sequence',
		bg_color: '#FFFFFF',
		width: 960
	}
	if(options)
		jQuery.extend(settings, options);
	
	var pauseState = 0;
	var current = 0;
	var last = 0;
	var next = 1;
	var timer = '';
	
	$('#slideshow').css('background', settings.bg_color);

	var change = function (slide) {
		if ( pauseState == 0 ) {
			//alert("current = "+current+"\n"+"slide = "+slide);
			current = parseInt(slide);
			//alert("current = "+current+"\n"+"slide = "+slide);
			for (var i = 0; i < slides.length; i++) {
				jQuery(slides[i]).css('display', 'none').css('zIndex', '0').css('left', ((settings.width-jQuery(slides[i]).width())/2)+'px');
				jQuery(slides[i]).siblings().filter(":first").css('display', 'none').css('zIndex', '0');
			}
			if ( current == 0 ) {
				last = slides.length - 1;
				next = parseInt(current) + 1;
				//alert("first\n last: "+last+"\n current: "+current+"\n next: "+next);
			}
			else if ( ( current + 1 ) < slides.length ) {
				last = current - 1;
				next = parseInt(current) + 1;
				//alert("middle\n last: "+last+"\n current: "+current+"\n next: "+next);
			}
			else if ( (current + 1) == slides.length) {
				last = slides.length - 2;
				next = 0;
				//alert("end\n last: "+last+"\n current: "+current+"\n next: "+next);
			}
			else {
				//alert("current = "+current+"\n"+"slidelength = "+slides.length+"\n"+"boolean = "+((current + 1) > slides.length));
			}
			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');
			$('.selector').attr('src','/images/slide_selector.png');
			$('.selector[longdesc="'+current+'"]').attr('src','/images/slide_selected.png');
		}
	}
	
	var play = function() {
		clearTimeout(timer);
		pauseState = 0;
		change(next);
		timer = setTimeout(play, settings.timeout);
	}
	
	this.css('position', 'relative');
	var slides = this.find('img').get();
	if (slides.length == 1) {pauseState = 1;}
	jQuery.each(slides, function(i){
		jQuery(slides[i]).css('zIndex', slides.length - i).css('position', 'absolute').css('bottom', '0').css('left', '0');
		$('#controls').append("<img longdesc='"+i+"' class='selector' src='/images/slide_selector.png' />");
		$('img[longdesc="'+current+'"]').attr('src','/images/slide_selected.png');
		$('.selector').hover(function() {$(this).attr('src','/images/slide_selected.png')}, function() {if($(this).attr('longdesc') != current) {$(this).attr('src','/images/slide_selector.png')}});
	});
	
	if (pauseState == 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\'');
  	}
	}
	
	$('.selector').click(function () {
		if(current == $(this).attr('longdesc'))
		{
		 	clearTimeout(timer);
		 	pauseState = 1;
		}
		else
		{
  		clearTimeout(timer);
  		pauseState = 0;
  		change($(this).attr('longdesc'));
  		if (slides.length > 1) {
  			 timer = setTimeout(play, settings.timeout);
  		}
		}
	});
	
	return this;
};
