//send any questions/bugs/issues to sdailey@schoolfusion.com
//please only change options where this plugin is called - not directly in this file.
(function($){
    $.fn.slideGallery = function(options){
        var defaults = {
                delay: 5000, // time between transition
                speed: 500, // slide transition speed
                easing: 'swing', //animation easing. Only change if you're using the jquery easing plugin
                controls: false, // adds numbered controls
                auto: true, // auto play
                hover: true, // pauses on hover
                hoverSelect: this, // I can explain this if needed
                prevNext: false, // adds previous & next buttons
                playPause: false // adds play and pause buttons.  If playPause is true, hover MUST be set to false
            },         
            settings = $.extend(defaults, options);
    
        var $container = $(this), next, $controls, resume, $prevNext, $prev, $next, $playPause, $play, $pause,
            $slides = $container.children('li'),
            liWidth = $slides.width() + 50,
            current = 0,
            last = $slides.length - 1;

        $slides.hide();
        $($slides[0]).show();
            
        function nextSlide() {
            if ($slides.is(':animated')) {
                return false;
            } else {
	            if (current === last) {
	                next = 0;
	            } else if (current > last) {
	                current = 0;
	                next = 1;
	            } else {
	                next = current + 1;
	            }
	            
	            $($slides[current]).animate({ left: '-=' + liWidth }, settings.speed, settings.easing);
	            $($slides[next])
					.show()
					.css({ left: liWidth })
					.animate({ left: '-=' + liWidth }, settings.speed, settings.easing);
	                    
				if (settings.controls === true) {
					$controls.children().removeClass('selected');
					$controls.children().eq(next).addClass('selected');
				}
	            
	            if (current === last) {
	                current = 0;
	            } else {
	                current ++;
	            }
            }
        }

        function prevSlide() {           
            if ($slides.is(':animated')) {
                return false;
            } else {
	            if (current === 0) {
	                next = last;
	            } else {
	                next = current - 1;
	            }

				$($slides[current]).animate({ left: '+=' + liWidth }, settings.speed, settings.easing);
				$($slides[next])
					.show()
					.css({ left: liWidth * -1 })
					.animate({ left: '+=' + liWidth }, settings.speed, settings.easing);
	                    
	            if (settings.controls === true) {
	                $controls.children().removeClass('selected');
	                $controls.children().eq(next).addClass('selected');
	            }
	            
	            if (current === 0) {
	                current = last;
	            } else {
	                current --;
	            }
            }
        }

        $.fn.hoverPause = function() {
            $(this).hover(function(){
                clearInterval(resume);
            }, function() {
               resume = setInterval(function() {
                    nextSlide();
                }, settings.delay);
            });
        };

        if ($slides.length > 1) {
            if (settings.controls === true) {
                $container.parent('div').append('<ul class="sliderControls"></ul>');
                $controls = $('.sliderControls');
                
                for (var i = 0, ii=$slides.length; i < ii; i++) {
                    $controls.append('<li><a href="#">' + (i + 1) + '</a></li>');
                }
        
                $controls.children().eq(0).addClass('selected');
                $controls.find('a').bind('click', function(){
	                if ($slides.is(':animated')) {
		                return false;
	                } else {
	                    var $li = $(this).parent(),
	                        liIndex = $li.parent().children().index($li);
	                    
	                    if (current !== liIndex && !$slides.is(':animated')) {
	                        $controls.children().removeClass('selected');

							if (current < liIndex) {
								$($slides[current]).animate({ left: '-=' + liWidth }, settings.speed, settings.easing);
								$($slides[liIndex])
									.show()
									.css({ left: liWidth })
									.animate({ left: '-=' + liWidth }, settings.speed, settings.easing);
							} else {
								$($slides[current]).animate({ left: '+=' + liWidth }, settings.speed, settings.easing);
								$($slides[liIndex])
									.show()
									.css({ left: liWidth * -1 })
									.animate({ left: '+=' + liWidth }, settings.speed, settings.easing);
							}

	                        $li.addClass('selected');
	                        current = liIndex;
	                    }
	                    return false;
	                }
                });
            }
        
            if (settings.prevNext === true) {
                $container.parent('div').append('<div class="prevNext"><a class="prev" href="#">Previous</a><a class="next" href="#">Next</a></div>');
                $prevNext = $('.prevNext');
                $next = $('.prevNext').find('.next').bind('click', function() {
		                nextSlide();
		                return false;
                });
                $prev = $('.prevNext').find('.prev').bind('click', function() {
		                prevSlide();
		                return false;
                });
            }
            
            if (settings.playPause === true) {
                $container.parent('div').append('<div class="playPause"><a class="play selected" href="#">Play</a><a class="pause" href="#">Pause</a></div>');
                $playPause = $('.playPause');
                
                $play = $('.playPause').find('.play').bind('click', function() { 
					if ($play.hasClass('selected')) {
						return false;
					} else {
						$pause.removeClass('selected');
						$(this).addClass('selected');
						nextSlide();
						resume = setInterval(function() {
							nextSlide();
						}, settings.delay);
						return false; 
					}
                });
                
                $pause = $('.playPause').find('.pause').bind('click', function() { 
					if ($pause.hasClass('selected')) {
						return false;
					} else {
						$play.removeClass('selected');
						$(this).addClass('selected');
						clearInterval(resume); 
						return false; 
					}
				});
            }            

            if (settings.auto === true) {
                resume = setInterval(function() {
                        nextSlide();
                    }, settings.delay);

                if (settings.hover === true) {
	                $(settings.hoverSelect).hoverPause();
	                if (settings.controls === true) {
	                    $controls.hoverPause();
	                }
	                
	                if (settings.prevNext === true) {
	                    $prevNext.hoverPause();
	                }
                } 
            }            
        }        
    };
})(jQuery);
