/*
 * jQuery Plus Slider Beta 1
 * By Jamy Golden
 * http://css-plus.com
 *
 * Copyright 2010, Jamy Golden
 * Free to use under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 */
(function($) {
	$.fn.plusSlider = function(options) {
		
		var settings = $.extend({}, $.fn.plusSlider.defaults, options),
			slider = this,
			slides = slider.children(),
			totalSlides = slides.length;
				
		// Injected HTML elements 
		slider.wrap('<div class="plusSlider" />');
		slides.addClass('child');
		slides.eq(0).addClass('current');
		
		// Slider/Fader Settings
		if(settings.sliderType == 'slider'){
		
			var slideWidth = slider.find(':first').outerWidth(true),
				sliderWidth = slideWidth * totalSlides,
				stopPosition = sliderWidth - slideWidth;
				
			slider.width(sliderWidth);
			slider.children().show();
						
		}
		else{
			slider.parent().addClass('fader');
			slider.children(':first').show();
		}

		if (totalSlides === 1){
			settings.autoPlay = false;
			settings.createArrows = false;
			setting.createPagination = false;
		}
		
		// Begin settings.pagination
		if(settings.createPagination){
			// #slider-controls
			slider.after('<div class="plusSlider-controls" />');
			var sliderControls = slider.next('.plusSlider-controls');
			sliderControls.wrap('<div class="plusSlider-controls-wrapper" />');
			// Pagination
			for(var i = 0; i < totalSlides; i++){
				sliderControls.append('<a href="#" rel="' + i + '">' + (i + 1) + '</a>');
			}
			
			sliderControls.width(sliderControls.find('a').outerWidth(true) * totalSlides);

			if(settings.sliderType == 'slider'){
				sliderControls.find('a').click(function(){
					// Don't animate while animated
					if(!slides.is(':animated')){
						var $this = $(this),
							rel = $this.attr('rel');
						$this.addClass('current').siblings().removeClass('current');
						slider.animate({left : slideWidth * rel * -1 + "px"}, settings.speed, settings.sliderEasing);							
						if(settings.autoPlay){
							clearTimer();
							beginTimer();
						}
					}
					return false;
				});
			}
			else{
				sliderControls.find('a').click(function(){
					// Don't animate while animated
					if(!slides.is(':animated')){
						var $this = $(this);
						$this.addClass('current').siblings().removeClass('current');
						slides.eq($this.attr('rel')).siblings().css('zIndex', 50).removeClass('current');
						slides.eq($this.attr('rel')).css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
							slides.not('.current').hide();
						});
							
						if(settings.autoPlay){
							clearTimer(); 
							beginTimer();
						}
					}
					return false;
				});
			}
			sliderControls.find('a').eq(0).addClass('current');
		} // End settings.pagination
						
		// Auto Play Begins
		if(settings.autoPlay){
			clearTimer = function(){
				// Clear the timer only if it is set
				if(timer){
					window.clearInterval(timer);
				}
			}
			beginTimer = function(){
				timer = window.setInterval(function() {
					slider.nextSlide();
				}, settings.displayTime);
			}
			beginTimer();

			// Pause on hover
			if(settings.pauseOnHover){
				slider.hover(function(){
					clearTimer();
				}, function(){
					beginTimer();	
				});
			}
		} // Auto Play Ends
		
		// Create Arrows
		if(settings.createArrows){
			slider.before('<a class="arrow prev" href="#">prev</a><a class="arrow next" href="#">next</a>');
			slider.siblings('.next').click(function(){
				$(this).nextSlide();
				if(settings.autoPlay){
					clearTimer(); 
					beginTimer();
				}
					return false;
			});
			
			slider.siblings('.prev').click(function(){
				$(this).nextSlide(false);
				if(settings.autoPlay){
					clearTimer(); 
					beginTimer();
				}
				
				return false;
			});
		} // End Arrow Creation
		
		// Keyboard navigation
		if(settings.keyboardNavigation){
			$(window).keyup(function(e){
				if(e.keyCode == 39){
					slider.nextSlide();
					
					if(settings.autoPlay){
						clearTimer(); 
						beginTimer();
					}
					return false;
					
				}
				else if(e.keyCode == 37){
					slider.nextSlide(false);
						
					if(settings.autoPlay){
						clearTimer(); 
						beginTimer();
					}
					return false;

				}
			});
		}
		
		// Begin Functions
		if(settings.sliderType == 'slider'){
			jQuery.fn.nextSlide = function(direction) {
				var $this = this;
				if (direction !== false){
					direction = true;
				}
				if(direction == true && !slider.is(':animated')){
					/* stop position -1 to fix IE8 inconsistancy*/
					if(slider.position().left > (stopPosition - 1) * -1){
						if(settings.createPagination){
							sliderControls.find('a.current').removeClass('current').next().addClass('current');
						}
						slider.animate({left : "-=" + slideWidth + "px"}, settings.speed, settings.sliderEasing);
					}
					else{
						if(settings.createPagination){
							sliderControls.find('a:last').removeClass('current').siblings('a:first').addClass('current');
						}
						slider.animate({left : 0}, settings.speed, settings.sliderEasing);
					}
					
				} else if(direction == false && !slider.is(':animated')){
				
					if(slider.position().left < 0 && !slider.is(":animated")){
						if(settings.createPagination){
							sliderControls.find('a.current').removeClass('current').prev().addClass('current');
						}
						slider.animate({left : "+=" + slideWidth + "px"}, settings.speed, settings.sliderEasing);
					}
					else{
						if(settings.createPagination){
							sliderControls.find('a:first').removeClass('current').siblings('a:last').addClass('current');
						}
						slider.animate({left : "-=" + stopPosition + "px"}, settings.speed, settings.sliderEasing);
					}
					
				}
			}
		}
		else{
			jQuery.fn.nextSlide = function(direction) {
				var $this = this;
				if (direction !== false){
					direction = true;
				}
				if(direction == true && !slider.children().is(':animated')){
					if(slider.children(':last').is(":visible")){
						if(settings.createPagination){
							sliderControls.find('a:last').removeClass('current').siblings('a:first').addClass('current');
						}
						slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
						slider.children(':first').css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
							slides.not('.current').hide();
						});
					} else{
						if(settings.createPagination){
							sliderControls.find('a.current').removeClass('current').next().addClass('current');
						}
						slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
						slider.children(':visible').next().css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
							slides.not('.current').hide();
						});
					}
				}
				else if(direction == false && !slider.children().is(':animated')){
					if(slider.children(':first').is(":visible")){
						if(settings.createPagination){
							sliderControls.find('a:first').removeClass('current').siblings('a:last').addClass('current');
						}
						slider.children(':visible').removeClass('current').css('zIndex', 60).siblings().css('zIndex', 50);
						slider.children(':last').css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
							slides.not('.current').hide();
						});
					} else if(!slider.children().is(':animated')){
						if(settings.createPagination){
							sliderControls.find('a.current').removeClass('current').prev().addClass('current');
						}
						slider.children(':visible').removeClass('current').siblings().css('zIndex', 50);
						slider.children(':visible').css('zIndex', 60).prev().css('zIndex', 100).addClass('current').fadeIn(settings.speed, function(){
							slides.not('.current').hide();
						});
					}
				}
			}
			
		}
	};
	//Default settings
	$.fn.plusSlider.defaults = {
		sliderType: 'slider', // Choose whether the carousel is a 'slider' or a 'fader'
		autoPlay: true, // Creats a times, looped 'slide-show'
		createArrows: true,	// Creates forward and backward navigation
		createPagination: true, // Creates Numbered pagination
		displayTime: 5000, // The amount of time the slide waits before automatically moving on to the next one. This requires 'autoPlay: true'
		keyboardNavigation: true, // The keyboard's directional left and right arrows function as next and previous buttons
		sliderEasing: 'easeInOutExpo', // Anything other than 'linear' and 'swing' requires the easing plugin
		speed: 500, // The amount of time it takes for a slide to fade into another slide
		pauseOnHover: true // Autoplay does not continue if someone hovers over Plus Slider.
	};	

})(jQuery);
