(function($){
	$.fn.simpleCarousel = function(options) {
		// ===== append events to each carousel =====
		return this.each(function(){
			$.simpleCarousel(this, options);
		});
	};
	$.simpleCarousel = function(container,options){
		var settings = {
			'showNextPrev':		true,
			'pagination': 		true,
			'showPageNumbers':	true,
			'autostart':		true,
			'pause':          	6000,
            'fade':            	300,
            'type':             'sequence',
			'animationtype':    'fade'
		};
		var options = $.extend(settings, options);
		
		// ===== Internal Variables =====
		var current = 0;
		var slide = new Array;
		var pages = new Array();
		var elements = $("ul.photos li", $(container));
		var soonVisible = null;
		var visibleDiv = null;
		var slideTimer = null;
		
		// ===== Primary Carousel Functions =====
		var nextSlide = function(){
			current = (parseFloat(current)+1) %  elements.size();
			switchSlide();
		};
		var prevSlide = function(){
			current = (!current)? elements.size()-1 : (parseFloat(current)-1) % elements.size();
			switchSlide();
		};
		var switchSlide = function(n){
			current = n || current;
			if(pages.length){
				pages.removeClass('active');
				$(pages[current]).addClass('active');
			};
			var soonVisible = slide[current];
			if(visibleDiv != soonVisible){
				var content = ""; //reset;
				if(visibleDiv != null) $(visibleDiv.image).stop().animate({opacity:0},settings.fade*2);	
				$(soonVisible.image).stop().animate({opacity:1},settings.fade);
				var description = $('div.description',container);
				if(soonVisible.caption.title) content += '<h2>'+soonVisible.caption.title+'</h2>';
				if(soonVisible.caption.text) content += '<span>'+soonVisible.caption.text+'</span>';
				description.css('cursor','pointer').html(content);
				$(description, container).unbind('click').bind('click',function(){ window.location.href = $('a',$(description))[0] });
				$('ul.photos',container).unbind('click').bind('click',function(){ window.location.href = $('a',$(description))[0] });
				$('ul.photos',container).css('cursor','pointer');
			};
			visibleDiv = soonVisible;
			if(settings.autostart){
				clearTimeout(slideTimer);
				slideTimer = setTimeout(nextSlide,settings.pause)
			};
		}
		
		// ===== Gather All Elements =====
		elements.each(function(i){
			var data = {
				image: $(this).find('.photo'),
				caption: {
					title: $(this).find('h2').html(),
					text: $(this).find('span').html()
				}
			};
			$(data.image).css({opacity:0});
			$(this).find('h2').remove();
			$(this).find('span').remove();
			$(this).css('display','block');
			
			slide.push(data);
		});
		
		function createPagination(){
			var ul = $('ul.controls',container);
			if(elements.size() == 1){ 
				ul.remove(); 
			} else {
				ul.css('display','block');	
			}
			
			// ===== Add Click Functionality / Pagination =====
			var li = ul.find('li');
			if(settings.showNextPrev){
				$('a',li[0]).click(function(e){ e.preventDefault(); prevSlide(); });
				$('a',li[1]).click(function(e){ e.preventDefault(); nextSlide(); });
			} else {
				li.remove();
			}
			if(settings.pagination){
				if(settings.showNextPrev){
					for(var x=elements.length-1;x>=0;x--){
						var num = (settings.showPageNumbers)? (x+1) : '&nbsp;';
						$('<li><a href="#" rel="'+x+'" class="page">'+num+'</a>').insertAfter(li[0]);
					};
				} else {
					for(var x=0,xl=elements.length;x<xl;x++){
						var num = (settings.showPageNumbers)? (x+1) : '&nbsp;';
						ul.append('<li><a href="#" rel="'+x+'" class="page">'+num+'</a>');
					};
				}
				pages = $('ul.controls li a.page',container);
				pages.click(function(e){ e.preventDefault(); switchSlide($(this).attr('rel')); });
			};
			
			// ===== init =====
			switchSlide(0);
		};
		
		createPagination();
	};
})(jQuery);