(function( $ ){

    $.fn.carousel = function(options){
        
        // Options are overlay, delay_seconds, btns, paginate
        // paginate and overlay can't both be true.
        var opts = $.extend({}, options, $.fn.carousel.options),
            carousel = $(this),
            advance_timeout = null;
           
        if(opts.overlay){ var overlay = $('<li class="overlay">').appendTo(carousel); }
        
        if(opts.paginate){ var control = carousel.find('.control'); }
        
        slideShow(opts.delay_seconds);
        select(carousel.children('li').first());
        
        function goLeft()
        {
            var left = carousel.children('.active').prev();
            if (left.length == 0) {
                select( carousel.children('li').not('.overlay').last() );
                if(opts.paginate) { 
                    var active = control.find('.active');
                    active.removeClass('active');
                    active.find('.selector').first().addClass('active');
                }
            }
            else {
                if(opts.paginate) { 
                    var active = control.find('.active');
                    active.removeClass('active');
                    active.prev('.selector').addClass('active');
                }
                select( left );
            }
        }

        function goRight()
        {
            var right = carousel.children('.active').next().not('.overlay');
            if (right.length == 0){
                select( carousel.children('li').first() );
                if(opts.paginate) { 
                    var active = control.find('.active');
                    active.removeClass('active');
                    control.find('.selector').first().addClass('active');
                }
            }
            else {
                if(opts.paginate) {
                    var active = control.find('.active');
                    active.removeClass('active');
                    active.next('.selector').addClass('active');
                }
                select( right );
            }
        }

        function select(li)
        {
            carousel.find('li').not('.overlay').removeClass('active').stop().hide();
            li.addClass('active').hide().fadeIn();

            if (li.find('a.trailer').length == 0)
                carousel.addClass('no-trailer');
            else
                carousel.removeClass('no-trailer');
            if (li.find('a.details').length == 0)
                carousel.addClass('no-details');
            else
                carousel.removeClass('no-details');

            li.find('a').css({bottom: -100}).animate({bottom: -25}, 'fast', 'swing');
            li.find('a').click(function()
            {
                slideShow();
            })
        }

        function slideShow(restartAfter)
        {
            if (advance_timeout != null)
                clearTimeout(advance_timeout);
            if (restartAfter)
                advance_timeout = setTimeout(slideShowAdvance, restartAfter)
            else
                advance_timeout = null;
        }

        function slideShowAdvance()
        {
            slideShow();
            goRight();
            slideShow(opts.delay_seconds);
        }
        
        if(opts.paginate) {
            carousel.hover(function()
            {
                slideShow();
            }, function()
            {
                slideShow(opts.delay_seconds);
            });
            control.hover(function()
            {
                slideShow();
            }, function()
            {
                slideShow(opts.delay_seconds);
            });
        }
        
        if(opts.btns) {
            var left = $("<div class='left'>")
                        .click(function() { goLeft(); slideShow() })
                        .appendTo(overlay),
                right = $("<div class='right'>")
                        .click(function() { goRight(); slideShow() })
                        .appendTo(overlay),
                buttons = left.add(right);
            buttons.hide();

            carousel.hover(function()
            {
                buttons.fadeIn();
                slideShow();
            }, function()
            {
                buttons.fadeOut();
                if (!window.trailer)
                    slideShow(opts.delay_seconds);
            });
        }
        
        carousel.find('a').hover(function()
        {
            $(this).animate({bottom: -15}, 'fast', 'swing');
        }, function()
        {
            $(this).animate({bottom: -25}, 'fast', 'swing');
        });
        
    }
})(jQuery);

