(function($) {
	var DMSlider = function(element, userOptions) {
		var defaults = {
			slideClass: 'dms-slide',
			navPrevText: 'Prev',
			navNextText: 'Next',
			slideSpeed: 500
		};

		var instance = this;
		var sliderElement = $(element);
		var options = $.extend({}, defaults, userOptions);
		var slides = sliderElement.find('.' + options.slideClass);
		var currentSlideIndex = 0;

		var viewport = $('<div class="dms-viewport"/>');
		var caption = $('<div class="dms-caption"/>');
		var nav = $('<div class="dms-nav"/>');
		var navPrev = $('<div class="dms-nav-prev"/>');
		var navNext = $('<div class="dms-nav-next"/>');
		var navPrevLink = $('<a href="#">' + options.navPrevText + '</a>');
		var navNextLink = $('<a href="#">' + options.navNextText + '</a>');

		var init = function() {
			sliderElement.append(viewport.append(slides), caption, nav, navPrev.append(navPrevLink), navNext.append(navNextLink));
	
			// Reverse the stack order of the slides and create nav
			for (var i = 0; i < slides.length; i++) {
				$(slides[i]).css('z-index', slides.length - i);
				
				var navLink = $('<a href="#' + i + '">' + $(slides[i]).find('img').attr('title') + '</a>');
				navLink.click(navLinkClickHandler);
				
				nav.append(navLink);
			}
	
			nav.css('margin-left', (nav.width() * -.5) + 'px')
	
			navPrevLink.click(showPrevSlideClickHandler);
			navNextLink.click(showNextSlideClickHandler);
	
			updateCaption();
			updateNav();
		};

		var navLinkClickHandler = function(e) {
			e.preventDefault();
			
			var slideIndex = parseInt($(this).attr('href').slice(1));
			
			showSlide(slideIndex, (slideIndex < currentSlideIndex ? true : false));
		};
	
		var showPrevSlideClickHandler = function(e) {
			e.preventDefault();
			showPrevSlide();
		};
	
		var showPrevSlide = function() {
			var prevSlideIndex = currentSlideIndex - 1;
			
			if (prevSlideIndex < 0) {
				prevSlideIndex = slides.length - 1;
			}
	
			showSlide(prevSlideIndex, true);
		};
		
		var showNextSlideClickHandler = function(e) {
			e.preventDefault();
			showNextSlide();
		};
	
		var showNextSlide = function() {
			var nextSlideIndex = currentSlideIndex + 1;
			
			if (nextSlideIndex > slides.length - 1) {
				nextSlideIndex = 0;
			}
	
			showSlide(nextSlideIndex, false);
		};
	
		var showSlide = function(slideIndex, isNextSlide) {
			if (slideIndex != currentSlideIndex) {
				var currentSlideZ = parseInt($(slides[currentSlideIndex]).css('z-index'));
	
				$(slides[slideIndex]).css('z-index', currentSlideZ + 1);
	
				if (isNextSlide) {
					$(slides[slideIndex]).css('left', viewport.width() + 'px');
				} else {
					$(slides[slideIndex]).css('left', (viewport.width() * -1) + 'px');
				}

				$(slides[slideIndex]).animate({ 'left':'0px' }, options.slideSpeed, 'swing');
	
				currentSlideIndex = slideIndex;
				
				updateCaption();
				updateNav();
			}
		};
		
		var updateCaption = function() {
			caption.html($(slides[currentSlideIndex]).find('span').html());
		};
		
		var updateNav = function() {
			nav.find('a').each(function(index) {
				if ($(this).attr('href') == '#' + currentSlideIndex) {
					$(this).addClass('dms-active');
				} else {
					$(this).removeClass('dms-active');
				}
			});
		};
		
		init();
	};

	$.fn.dmslider = function(userOptions) {
		return this.each(function() {
			if ($(this).data('dmslider')) {
				return;
			} else {
				$(this).data('dmslider', new DMSlider(this, userOptions));
			}
		});
	};
})(jQuery);
