(function($) {  
    $.fn.tabPanel = function(options) {
        
        // Set some default options
        var defaults = {
            height: 250,
            duration: 250,
            interval: 2000
        };  
        
        // Extend function with options
        var options = $.extend(defaults,options);
        
        // Apply function to all matched objects
        return this.each(function() {
        
            // Set timer
            var timer;
            var setTimer = function() {
                if(timer != null) { clearInterval(timer); }
                timer = setInterval(function() { nextSlide(); },options.interval);
            }
            if(options.interval > 1) { setTimer(); }
            
            // Get tabPanel object and style
            var tabPanel = $(this);
            var tabPanelWidth = tabPanel.width();
            
            // Create slide wrapper to hide edges of slide container
            var slideWrapper = $('<div>');
            slideWrapper.addClass('slide-wrapper').css({
                'position':'relative',
                'top':0,
                'left':0,
                'width':'100%',
                'height':options.height+'px',
                'overflow':'hidden'
            });
            
            // Get slide container object and style
            var slideContainer = tabPanel.children('.slides');
            slideContainer.css({
                'position':'absolute',
                'top':0,
                'left':0,
                'margin':0,
                'padding':0,
                'list-style':'none'
            });
            slideContainer.appendTo(slideWrapper);
            slideWrapper.prependTo(tabPanel);
            
            // Get slide objects and style
            var slides = slideContainer.children();
            slides.each(function(i) {
                var xPos = i*tabPanelWidth;
                $(this).css({
                    'position':'absolute',
                    'top':0,
                    'left':xPos+'px',
                    'width':tabPanelWidth+'px',
                    'height':options.height+'px'
                });
            });
            
            // Define animation values
            var currentX = parseInt(slideContainer.css('left'));
            
            // Function to move slides
            var moveTo = function(slideNumber) {
                controlContainer.children('li').removeClass('selected');                
                var button = controlContainer.children('li:nth-child('+(slideNumber+1)+')');
                button.addClass('selected');
                var targetX = 0-slideNumber*tabPanelWidth;
                slideContainer.animate({'left':targetX+'px'},{duration:options.duration,queue:false});
                setTimer();
            }
            
            // Create control functionality
            var controlContainer = tabPanel.children('.tabs');
            controlContainer.css({
                'margin':0,
                'padding':0,
                'list-style':'none'
            });
            controlContainer.children('li:first-child').addClass('selected');
            var controlItems = controlContainer.children('li');
            controlItems.each(function(i) {
                $(this).children('a').click(function() {
                    moveTo(i);
                    return false;
                });
            });
            
            // Next slide
            var nextSlide = function() {
                if(slideContainer.is(':not(:animated)')) {
                    var currentX = parseInt(slideContainer.css('left'));
                    var currentSlideNumber = (0-currentX)/tabPanelWidth;
                    var targetSlideNumber = ((currentSlideNumber+1) == slides.length) ? 0 : currentSlideNumber+1;
                    moveTo(targetSlideNumber);                    
                }
            }
            
            // Make sure slides and tabs are visible again
            slideContainer.show();
            controlContainer.show();
        });
        
    };
})(jQuery);
