
/*
 * 
 * ppSlider Plugin 1.0
 * Version 1.0
 * @requires jQuery v1.3.0
 * 
 * Copyright (c) 2010 Gareth Preston
 * Licensed under the GPL licenses:
 * http://www.gnu.org/licenses/gpl.html
 * 
 */

(function($) {
	$.fn.ppSlider = function (options) {
		
		var defaults = {
			controller : ".ppSliderController",
			slidesWrapper : ".ppSliderSlides",
			slideWrapper : ".ppSliderSlide",
			selectedWrapper: "ppSliderSelected",
			paginationWrapper: ".ppSliderPagination",
			navigationWrapper: ".ppSliderNavigation",
			duration: 'slow',
			prev: ".ppSliderPrev",
			next: ".ppSliderNext",
			paginationSelected: ".ppSliderSelected",
			content: '.ppSliderContent',
			img: '.ppSliderImg',
			auto: true,
			intervalSpeed: 5000
		};
		
		var animating = false;
		var interval = null;
		var opts = $.extend({}, defaults, options);
		
		if(!$(this).hasClass(opts.controller.substring(1))) {
			$(this).addClass(opts.controller.substring(1));
		}
		
		var links = new Array();
		for(var i = 1; i <= $(this).find(opts.slideWrapper).length; i++) {
			links[links.length] = '<a href="javascript:;"><span>' + i + '</span></a>';
		}
		$(opts.controller).find(opts.paginationWrapper).html(links.join(''));
		$(opts.controller).find(opts.paginationWrapper + ' a:first').addClass(opts.paginationSelected.substring(1));
		
		$(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper + ':first').addClass(opts.selectedWrapper.substring(1));
		var contentTopPosition = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper + ' ' + opts.content).position().top;
		var contentLeftPosition = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper + ' ' + opts.content).position().left;
		var imgTopPosition = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper + ' ' + opts.img).position().top;
		var imgLeftPosition = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper + ' ' + opts.img).position().left;
		
		var slide = function(mode) {
			
			if(!animating) {
				
				animating = true;
				
				var current = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper);
				current.find(opts.img).animate(
					{left: "-" + (imgLeftPosition + current.find(opts.img).width()) + "px"},
					opts.duration
				, function() {
					current.find(opts.content).animate(
						{top: "-" + (contentTopPosition + current.find(opts.content).height()) + "px" },
						opts.duration
					, function() {
						
						if(mode == 'prev') {
							var prev = current.prev();
							if(prev.length == 0) {
								current.removeClass(opts.selectedWrapper.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a').removeClass(opts.paginationSelected.substring(1));
								
								$(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper + ':last').addClass(opts.selectedWrapper.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a:last').addClass(opts.paginationSelected.substring(1));
							}
							else {
								current.removeClass(opts.selectedWrapper.substring(1));
								prev.addClass(opts.selectedWrapper.substring(1));
								
								$(opts.controller).find(opts.paginationWrapper + ' a' + opts.selectedWrapper).prev().addClass(opts.paginationSelected.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a' + opts.selectedWrapper + ':last').removeClass(opts.paginationSelected.substring(1));
							}
						}
						else if(!isNaN(mode)) {
							current.removeClass(opts.selectedWrapper.substring(1));
							$(opts.controller).find(opts.paginationWrapper + ' a').removeClass(opts.paginationSelected.substring(1));
							
							$(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper + ':nth-child(' + mode + ')').addClass(opts.selectedWrapper.substring(1));
							$(opts.controller).find(opts.paginationWrapper + ' a:nth-child(' + mode + ')').addClass(opts.paginationSelected.substring(1));
						}
						else {
							var next = current.next();
							if(next.length == 0) {
								current.removeClass(opts.selectedWrapper.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a').removeClass(opts.paginationSelected.substring(1));
								
								$(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper + ':first').addClass(opts.selectedWrapper.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a:first').addClass(opts.paginationSelected.substring(1));
							}
							else {
								current.removeClass(opts.selectedWrapper.substring(1));
								next.addClass(opts.selectedWrapper.substring(1));
								
								$(opts.controller).find(opts.paginationWrapper + ' a' + opts.paginationSelected).next().addClass(opts.paginationSelected.substring(1));
								$(opts.controller).find(opts.paginationWrapper + ' a' + opts.paginationSelected + ':first').removeClass(opts.paginationSelected.substring(1));
								
							}
						}
						
						$(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper).css({top:'-' + $(opts.controller).find(opts.slidesWrapper + ' ' + opts.slideWrapper).outerHeight()});
						
						current = $(opts.controller).find(opts.slidesWrapper + ' ' + opts.selectedWrapper);
						$(current).find(opts.img).css({
							left: imgLeftPosition + "px",
							top: $(current).height() + "px"
						});
						$(current).find(opts.content).css({
							left: "-" + (contentLeftPosition + $(opts.controller).find(opts.content).width()) + "px",
							top: (contentTopPosition) + "px"
						});
						current.css({top:0});
						current.find(opts.content).css({left: current.width()});
						current.find(opts.content).animate(
							{left: contentLeftPosition},
							opts.duration
						, function() {
							current.find(opts.img).animate(
								{top: imgTopPosition},
								opts.duration
							, function() {
								
								animating = false;
								
							});
						});
					});
				});
				
			}
			
		}
		
		var stop = function() {
			window.clearInterval(interval);
			interval = null;
		}
		
		var startTicker = function() {
			if(opts.auto) {			
				interval = window.setInterval(function(){
					if(!animating) {
						slide('next');
					}
				}, opts.intervalSpeed);
			}
		}
		
		$(this).find(opts.navigationWrapper + ' ' + opts.next).click(function(e) {
			if(!animating) {
				stop();
				slide('prev');
				startTicker();
			}
			e.preventDefault();
		});
		
		$(this).find(opts.navigationWrapper + ' ' + opts.prev).click(function(e) {
			if(!animating) {
				stop();
				slide('next');
				startTicker();
			}
			e.preventDefault();
		});
		
		$(this).find(opts.paginationWrapper + ' a').each(function(index) {
			$(this).click(function(e) {
				if(!animating) {
					stop();
					slide(index + 1);
					startTicker();
				}
				e.preventDefault();
			});
		});
		
		if(opts.auto) {	
			$(opts.controller).hover(
				function() {
					stop();
				},
				function() {
					startTicker();
				}
			);
			
			startTicker();
			
			$(window).unload(function() {
				stop();
			});
		}
		
		return this;
		
	}
})(jQuery);

