jQuery.fn.slideshow = function(options) {
	var settings = {
		timeout: '5000',
		type: 'sequence',
		tag: 'img',
		pauselink: null,
		playcallback: null,
		pausecallback: null
	}
	if(options)
		jQuery.extend(settings, options);
	
	var pauseState = 0;
	var current = 1;
	var last = 0;
	var timer = '';
	
	var change = function () {
		if ( pauseState == 0 ) {
			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 rcurr = current + 1;
			var rlast = last + 1;
			//alert(rcurr);
			$('a#slide' + rlast).removeClass("current");
			$('a#slide' + rcurr).addClass("current");
			
			if ( settings.type == 'sequence' ) {
				if ( ( current + 1 ) < slides.length ) {
					current = current + 1;
					last = current - 1;
				}
				else {
					current = 0;
					last = slides.length - 1;
				}
			}
			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\'');
			}

			timer = setTimeout(change, settings.timeout);
		}
	}
	
	var pause = function() {
		if ( pauseState == 0 ) {
			pauseState = 1;
			clearTimeout(timer);
			if ( settings.playcallback != null ) {
				settings.pausecallback(jQuery('#' + settings.pauselink));
			}
		}
		else {
			pauseState = 0;
			change();
			if ( settings.playcallback != null ) {
				settings.playcallback(jQuery('#' + settings.pauselink));
			}
		}
		return false;
	}

	var switchSlide = function(node){
		var setId = node.id.replace(/[^0-9]/g, '');
		current = setId - 1;
		pauseState = 0;
		change();
		pauseState = 1;
		clearTimeout(timer);
		
	}

	var prevSlide = function(){
		if(current == 0) current = slides.length;
		current = current - 2;
		if(current < 0) current = slides.length - 1;
		pauseState = 0;
		change();
		pauseState = 1;
		clearTimeout(timer);
	}

	var nextSlide = function(){
		pauseState = 0;
		change();
		pauseState = 1;
		clearTimeout(timer);
	}
	
	this.css('position', 'relative');
	var slides = this.find(settings.tag).get();

	jQuery.each(slides, function(i){
		jQuery(slides[i]).css('zIndex', slides.length - i).css('position', 'absolute');
	});

	$('a.showBox').click(function(){
		switchSlide(this);
		return false;
	;})
	$('a.prevBox').click(function(){
		prevSlide(this);
		return false;
	;})
	$('a.nextBox').click(function(){
		nextSlide(this);
		return false;
	;})

	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(pause);
	}
	
	return this;
};