jQuery.fn.rhodesSlideshow = function(dataSource, settings) {
	settings = jQuery.extend({
		fadeSpeed: 'slow',
		cycleSpeed: '5s'
	}, settings);
	
	
	return this.each(function(){
	
		var json;
		var playing;
	
		var set_caption = function(value) {
			jQuery('#slideshow-nav .caption').text(value);
		}
	
		var add_nav_item = function (data, selected) {
			jQuery('#slideshow div.nav ul').append('<li'+(selected ? ' class="cur"' : '')+'><a href="'+data.large+'"></a></li>');
		}
	
		var show_image = function(img) {
			
			if (jQuery.browser.msie) {
				img = img.replace(window.location, '/');
			}

			var i, l;
			for (i=0, l=json.length; i<l; i++) {
				
				// find outgoing image
				if (json[i].visible == true) {
					jQuery('#slideshow-image-container img[src$='+json[i].large+']').fadeOut(settings.fadeSpeed);
					json[i].visible = false;
					
					// deselect nav item
					jQuery('#slideshow-nav ul a[href$='+json[i].large+']').parent('li').removeClass('cur');
				}
				
				// find incoming image
				if (json[i].large == img) {
					jQuery('#slideshow-image-container img[src$='+json[i].large+']').fadeIn(settings.fadeSpeed);
					
					json[i].visible = true;
					
					
					// select nav item
					jQuery('#slideshow-nav ul a[href$='+json[i].large+']').parent().addClass('cur');
					
					// set caption
					set_caption(json[i].title);
				}
			}
			
		}
	
		var show_thumb = function(img, obj) {
			var thumbDiv = jQuery('#slideshow-thumb');
			var thumb	= find_thumb(img);
			thumbDiv.find('img').attr('src', thumb);
			thumbDiv.css('left', jQuery(obj).offset().left-50-jQuery('#slideshow-image-container').offset().left + 'px');
			thumbDiv.fadeIn();
		}
	
		var hide_thumb = function() {
			jQuery('#slideshow-thumb').hide();
		}
	
		var find_image_from_event = function(e) {
			target = e.target;
			return jQuery(target).attr('href');
		}
	
		var find_thumb = function(large) {
			var i, l;
			for(i=0, l=json.length; i<l; i++) {
				
				if (jQuery.browser.msie) {
					if (large.indexOf(json[i].large) > 0) {
						return json[i].thumb;
					}
				}else{
					if (json[i].large == large) {
						return json[i].thumb;
					}
				}
				
				
			}
		}
	
		var create_image = function (data, hide) {
			jQuery('#slideshow-image-container').append('<img src="'+data.large+'" alt="'+data.title+'" class="large" />');
			if (hide) jQuery('#slideshow-image-container img.large:last').hide();
		}
		
		var pause = function() {
			playing = false;
			jQuery('#slideshow').stopTime('timer');
			jQuery('#slideshow-nav a.slideshow-stop').text('Play slideshow');
		}
		
		var play = function() {
			playing = true;
			jQuery('#slideshow').everyTime(settings.cycleSpeed, 'timer', function(){
				show_next_image();
			});
			jQuery('#slideshow-nav a.slideshow-stop').text('Stop slideshow');
		}
		
		var show_next_image = function() {
			if (playing) {
				var i, l, next;
				for (i=0, l=json.length; i<l; i++) {
					if (json[i].visible == true) {
						if (json[i+1]) {
							next = json[i+1].large;
						}else{
							next = json[0].large;
						}
						break;
					}
				}
				show_image(next);
			}
		}
		
		
		// fix up container
		jQuery('#slideshow-image-container').css({
				height: jQuery('#slideshow-large').css('height'),
				backgroundColor: '#000'
			});
		
		// create nav
		jQuery('#slideshow-nav .caption').after('<div class="nav"><ul></ul></div><a href="#" class="slideshow-stop">Stop slideshow</a>');
		
		
		// create thumb
		jQuery('#slideshow-image-container').append('<div id="slideshow-thumb"><img src="foo.jpg" alt="" /></div>');
		jQuery('#slideshow-thumb').hide();
		
		

		
		jQuery.getJSON(dataSource, function(data) {
			json = data;
			
			var i, l;
			for (i=data.length-1, l=0; i>=l; i--) {
				
				// add items to nav
				add_nav_item(data[i], (i==0));
				
				// load large images
				create_image(data[i], (i>0));
				
			}
			
			// set properties on first image
			json[0].visible=true;
			set_caption(json[0].title);
			
			// remove inital large image
			jQuery('#slideshow-large').remove();
			
			
			
			// event listeners on nav
			jQuery('#slideshow-nav div.nav li a').click(function(e){
				e.preventDefault();
				pause();
				large = find_image_from_event(e);
				show_image(large);
			}).hover(function(e){
				large = find_image_from_event(e);
				show_thumb(large, e.target);
			}, function(e){
				hide_thumb();
			});
			
			jQuery('#slideshow-nav a.slideshow-stop').click(function(e){
				e.preventDefault();
				if (playing) {
					pause();
				}else{
					play();
				}
			});
			
			
			// all set, let's go!
			play();
		});
		
	});

};








