(function($) {
	$.fn.simpleslides = function(settings) {		
		settings = $.extend({
			slide: "li",
			paginationContainer: "",
			paginationId: "simpleSlidesPagination",
			paginationLinkClass: "simpleSlidesPaginationLink",
			slideId: "simpleSlidesSlide",
			defaultSlide: 0
		}, settings);
		
		var s=settings;
		var instanceCounter=0;
		var $$ = $(this);
				
		//slide toggling function
		function showSlide(currentSlide, totalSlides, pagination, slideId, instance){
			pagination.find('a').removeClass("selected");
			pagination.find('a[rel="' + slideId + '"]').addClass("selected");
			
			//hide all slides
			$$.find(s.slide).removeClass("selected").hide();
			//show the one selected
			$$.find(slideId).addClass("selected").show();
			
			pagination.find('li.simpleSlidesNext').remove();
			pagination.find('li.simpleSlidesPrevious').remove();
			
			if(currentSlide<totalSlides-1){
				//add next link
				$('<a href="#">Next</a>')
				.click(function(){
					showSlide(parseInt(currentSlide+1), totalSlides, pagination, '#'+s.slideId+instance+parseInt(currentSlide+1), instance);
					return false;
				})
				.appendTo($('<li class="simpleSlidesNext"></li>').appendTo(pagination));
			}
			if(currentSlide > 0){
				//add prev link
				$('<a href="#">Prev</a>')
				.click(function(){
					showSlide(parseInt(currentSlide-1), totalSlides, pagination, '#'+s.slideId+instance+parseInt(currentSlide-1), instance);
					return false;
				})
				.appendTo($('<li class="simpleSlidesPrevious"></li>').prependTo(pagination));
			}
		}
		
		//irritatingly necessary function to retrieve hashes from urls, because IE is gay.
		function getHash(url){
			var href_array= url.split("#");
			var part_num = 0;
			while (part_num < href_array.length) {
				hash = href_array[part_num];
				part_num++;
			}
			return hash;
		}
		
		return this.each(function() {	
			//find all slides
			var slides=$$.find(s.slide);
			
			//append pagination container
			var paginationId=s.paginationId+instanceCounter;
			
			if(s.paginationContainer.length){
				$(s.paginationContainer).append('<ul id="'+paginationId+'"></ul>');
			}else{
				$$.after('<ul id="'+paginationId+'"></ul>');
			}
			var pagination=$('#'+paginationId);
			
			for(i=0;i<slides.length; i++){
				//attach an ID to each slide
				var slideId=s.slideId+instanceCounter+i;
				$(slides[i]).attr("id",slideId);
				
				//add a pagination link for each slide
				$('<a href="#'+slideId+'" class="'+s.paginationLinkClass+'" rel="#'+slideId+'">'+(i+1)+'</a>')
				.bind("click", {currentSlide:i, instance:instanceCounter}, function(e){
					showSlide(e.data.currentSlide, slides.length, pagination, "#"+getHash($(this).attr("href")), e.data.instance);
					return false;
				})
				.appendTo($('<li></li>').appendTo(pagination));
			}
					
			//show first one, or whatever user sets as the default, or whatever is set in the URL hash, if valid
			if(location.hash.length && $$.find(location.hash).length){					
				for(i=0;i<slides.length; i++){
					if($(slides[i]).attr("id")==getHash(location.hash)){
						currentSlide=i;
						break;
					}
				}
				
				showSlide(currentSlide, slides.length, pagination, location.hash, instanceCounter);
			}else{
				showSlide(s.defaultSlide, slides.length, pagination, '#'+s.slideId+instanceCounter+s.defaultSlide, instanceCounter);
			}
			
			instanceCounter++;
		});
	};
})(jQuery);