(function($) {  
    $.fn.slideShow = function(options) {
        
        // Set some default options
        var defaults = {
            slidesWidth: 380,
            thumbHeight: 150,
            thumbWidth: 150,
            visibleThumbs: 3,
            thumbDuration: 250,
            thumbInterval: 2000,
            slideShow: true,
            imageInterval: 700  
        };  
        
        // Extend function with options
        var options = $.extend(defaults,options);
        
        // Apply function to all matched objects
        return this.each(function() {
            
            // Set Initial Variables
            var slideShow = $(this);
            var slideContainer = $('.slide-container',slideShow);
            var slides = $('.slides',slideShow);
            var slideImage = $('.image',slides);
            var totalSlides = slideImage.length;
            var thumbContainer = $('.thumb-container',slideShow);
            var thumbs = $('.thumbs',slideShow);
            var thumbImage = $('.image',thumbs);
            var thumbX = options.thumbWidth * options.visibleThumbs;
            var thumbsNumber = Math.ceil(thumbImage.length / options.visibleThumbs);
            var thumbsTotalWidth = (options.thumbWidth * options.visibleThumbs) * thumbsNumber;
            var currentX = 0;
            var counter = 1;
            var currentSlide = 1;
            var playPause = false;
            var differenceCounter = 0;
            var timeDifference = 0;
            var end = 0;
            var start = 0;
            var slideCounter = 0;
                        
            //Thumbnail Settings
            thumbContainer.css({
                'width' : thumbX+'px',
                'height' : options.thumbHeight+'px',
                'overflow' : 'hidden',
                'position' : 'relative'
            });
            thumbs.css({
                'width' : thumbsTotalWidth+'px',
                'height' : options.thumbHeight+'px',
                'position' : 'absolute',
                'left' : 0
            });
            thumbImage.css({
                'float' : 'left',
                'width' : options.thumbWidth+'px',
                'height' : options.thumbHeight+'px'
            });
            thumbs.children('li:first').addClass('selected');   
            
            // Slides Settings
            slideContainer.css({ 'width' : '100%' });
            slides.css({ 'height' : options.slidesWidth+'px','width' : options.slidesWidth+'px','position':'relative' });
            slideImage.css({
                'position' : 'absolute',
                'left' : 0,
                'top' : 0,
                'width' : '100%',
                'height' : '100%',
                'display' : 'none',
                'margin' : 0
            });
            slides.children('li:nth-child(1)').css({ 'display' : 'block' });
            
            // Add Slide Identifier Class
            slideImage.each(function(i) {
                $(this).addClass('featured'+(i+1));
            });
            thumbImage.each(function(i) {
                $(this).addClass('featured'+(i+1));
            });
            
            //Create Controls
            var controlContainer = $('<ul>');
            controlContainer.html('<li class="previous"><a href="#" title="Previous">Previous</a></li><li class="next"><a href="#" title="Next">Next</a></li>');
            controlContainer.addClass('controls').css({'position':'absolute'});
            controlContainer.appendTo(slideShow);
            
            var playPauseControls = $('<ul>');
            playPauseControls.addClass('play-controls').css({'position':'relative'});
            playPauseControls.html('<li class="play"><a href="#" title="Play">Play</a></li><li class="pause"><a href="#" title="Pause">Pause</a></li>');
            playPauseControls.appendTo(thumbContainer);
            playPauseControls.children('.play').css({'display':'none'});
            
            
            // Move Thumbs
            function thumbPrevious() {         
                if(currentX == 0) {
                    thumbs.animate({'left':-(thumbsTotalWidth - thumbX)+'px'},{duration:options.thumbDuration});
                    currentX = -(thumbsTotalWidth-thumbX);
                    counter = 1;
                    currentSlide = ((options.visibleThumbs * thumbsNumber) - options.visibleThumbs)+1;
                    slideSwitch(currentSlide);
                }
                else {
                    thumbs.animate({'left':(currentX+thumbX)+'px'},{duration:options.thumbDuration});
                    currentX += thumbX;
                    currentSlide -= options.visibleThumbs;
                    slideSwitch(currentSlide);
                }
                        
                return false;
            }
            function thumbNext() {
               if(currentX == -(thumbsTotalWidth - thumbX)) {
                    thumbs.animate({'left':0+'px'},{duration:options.thumbDuration});
                    currentX = 0;
                    counter = 1;
                    currentSlide = 1;
                    slideSwitch(1);
                }
                else {
                    thumbs.animate({'left':(currentX-thumbX)+'px'},{duration:options.thumbDuration});
                    currentX -= thumbX;
                    currentSlide += options.visibleThumbs;
                    slideSwitch(currentSlide);
                }
                                
                return false;
            }
                                                
            controlContainer.children('li.previous').children('a').click(function() { return thumbPrevious(); });
            controlContainer.children('li.next').children('a').click(function() { return thumbNext(); });
            
            
            // Change Image Function            
            var slideSwitch = function(slideNumber) {
                slideImage.fadeOut('normal');
                slides.children('.featured'+slideNumber).fadeIn('normal');
                thumbImage.removeClass('selected');
                thumbs.children('.featured'+slideNumber).addClass('selected');
                if(options.slideShow && playPause == false) { runSlideTimer(); }
                counter = slideNumber;
            }
            
            thumbImage.each(function(i) {
                $(this).children('a').click(function() {
                    slideSwitch(i+1);                    
                    return false;
                });
            });
            
            function autoImageSwitch() {
                if((counter != slideImage.length) && (counter % options.visibleThumbs != 0) && playPause == false) {
                    slideImage.fadeOut('normal');
                    slides.children('li:nth-child('+(counter+1)+')').fadeIn('normal');
                    counter += 1;
                    thumbImage.removeClass('selected');
                    thumbs.children('.featured'+(counter)).addClass('selected');
                }
                else if(((counter % options.visibleThumbs == 0) || counter == slideImage.length ) && playPause == false) {
                    thumbNext();
                }
            }
            
            
            var slideTimer;
            function runSlideTimer() {
                if(slideTimer != null) { clearInterval(slideTimer); }
                clearInterval(slideTimeout);
                slideTimer = setInterval(function() { autoImageSwitch(); },(options.thumbInterval) );
                
            }
            
            var slideTimeout;
            function runSlideTimeout() {
                if(slideTimeout != null) { clearInterval(slideTimeout); }
                if(timeDifference < 0) {
                    autoImageSwitch();
                    runSlideTimer();
                }
                else { 
                    slideTimeout = setTimeout(function() { autoImageSwitch(); },(timeDifference) );
                    runSlideTimer();
                }
            }
                        
            function slidePause() {
                playPauseControls.children('li:visible').fadeOut('normal');
                playPauseControls.children('li:hidden').fadeIn('normal');
                clearInterval(slideTimer);
                // Set Play again
                if(playPause == true) {
                    playPause = false;
                    end = new Date().getTime();
                    differenceCounter = end - start;
                    timeDifference = options.thumbInterval - differenceCounter;
                    runSlideTimeout();
                }
                // Pause Things
                else {
                    playPause = true;
                    start = new Date().getTime();
                }
            }
            
            
            // Play  / Pause
            playPauseControls.children('li').each(function(i) {
                $(this).children('a').click(function() {
                    slidePause();
                    return false;
                });
            });
                        
            if(options.slideShow) { runSlideTimer(); }
            
        });
        
    };
})(jQuery);
