
(function($) {
	$.slippyDefaults = {
		slideSel: 	".frontslide",
		navCtrSel:	"#frontslide-nav",
		titleSel:	".fs-title",
		// navigation generation
		navClass:	"fs-nav",
		
		// animation
		interval: 5000,
		animationTime: 1000
	};
	
	function generateNav($slide, options) {
		var id = $slide.attr("id");
		var title = ($slide.find(options.titleSel).text() || "");
		var $el = $("<a>", {
			"rel":		id,
			"class":	options.navClass,
			"href":		"#",
			"title":	title
		});
		$slide.data("slippy-nav", $el);
		$el.data("slippy-slide", $slide);
		return $el;
	}
	
	$.fn.slippy = function(options) {
		
		options = $.extend($.slippyDefaults, options || {});
		
		var $ctr = $(this);
		var $slides = $(options.slideSel, $ctr);
		var $navCtr = $(options.navCtrSel, $ctr);
		var bGenNav = !!($navCtr.length);
		
		$slides.each(function() {
			var $slide = $(this);
			var $off = $slide.position();
			$slide.data("slippy-nativepos", $off);
			if(bGenNav) $navCtr.append(generateNav($slide, options));
		});
		$navButtons = $("." + options.navClass, $navCtr);

		
		var currentIndex = 0;
		var nextSlideTimeout = null;
		
		function waitForNextSlide() {
			nextSlideTimeout = setTimeout(scrollToNextSlide, options.interval);
		}
		
		function clearNextSlideTimeout() {
			clearTimeout(nextSlideTimeout);
			nextSlideTimeout = null;
		}
		
		function getSlideIndex($slide) {
			var el = $slide[0] || $slide;
			for(var i = 0; i < $slides.length; i++) if($slides[i] == el) return i;
			return 0;
		}
		
		function setCurrentSlide($slide) {
			currentIndex = getSlideIndex($slide);
			$navButtons.removeClass("current");
			var $navBtn = $($slide).data("slippy-nav");
			if($navBtn) $navBtn.addClass("current");
		}
		
		function scrollToSlideIndex(newIndex) {
			clearNextSlideTimeout();
			var $slide = $($slides[newIndex]);
			var off = $slide.data("slippy-nativepos");
			var attrs = {
				"scrollTop":	off.top,
				"scrollLeft":	off.left
			};
			$ctr.animate(attrs, {
				"duration":		options.animationTime,
				"complete":		function() { setCurrentSlide($slide); waitForNextSlide(); }
			});
		}
		
		function scrollToNextSlide() {
			scrollToSlideIndex((currentIndex + 1) % $slides.length);
		}
		
		function navButtonClick() {
			var $btn = $(this);
			var idx = getSlideIndex($btn.data("slippy-slide"));
			scrollToSlideIndex(idx);
		}
		
		$navButtons.live("click", navButtonClick);
		
		scrollToSlideIndex(currentIndex);
	};
}(jQuery));
