(function($) {  
    $.fn.promoPanel = function(options) {
        
        // Set some default options
        var defaults = {
            visibleSlides: 1,
            height: 250,
            duration: 250,
            labelNext: 'Next',
            labelPrevious: 'Previous',
            slideshow: false,
            interval: 5000
        };  
        
        // Extend function with options
        var options = $.extend(defaults,options);
        
        // Apply function to all matched objects
        return this.each(function() {
            
            // Get promoPanel object
            var promoPanel = $(this);
            var promoPanelWidth = promoPanel.width();
            promoPanel.css({
                'position':'relative',
                'height':options.height+'px',
                'width': 847
            });
            
            // Create slide wrapper to hide edges of slide container
            var slideWrapper = $('<div>');
            slideWrapper.addClass('slide-wrapper').css({
                'position':'absolute',
                'top':0,
                'left':0,
                'width':'100%',
                'height':options.height+'px',
                'overflow':'hidden',
				'z-index':'2'
            });
            
            // Get slide container object and style
            var slideContainer = promoPanel.children('.slides');
            slideContainer.css({
                'position':'absolute',
                'top':0,
                'left':0,
                'margin':0,
                'padding':0,
                'list-style':'none'
            });
            slideContainer.appendTo(slideWrapper);
            slideWrapper.appendTo(promoPanel);
            
            // Get slide objects and style
            var widthCounter = 0;
            var slides = slideContainer.children();
            var slideWidth = Math.floor(parseInt(promoPanelWidth)/options.visibleSlides);
            var slideTotal = parseInt(slides.length);
            var rowTotal = Math.ceil(slideTotal/options.visibleSlides);
            var emptySlides = options.visibleSlides - (slideTotal % options.visibleSlides);
            var remainderPixels = promoPanelWidth % (slideWidth*options.visibleSlides);
            slides.each(function(i) {
                var xPos = widthCounter;
                var thisSlideWidth = (i % options.visibleSlides < remainderPixels) ? slideWidth+1 : slideWidth;
                $(this).css({
                    'position':'absolute',
                    'top':0,
                    'left':xPos+'px',
                    'width':thisSlideWidth+'px',
                    'height':options.height+'px'
                });
                widthCounter = widthCounter+thisSlideWidth;
            });
            
            // Add empty slides to widthCounter
            widthCounter = rowTotal*promoPanelWidth;
            
            // Create controls
            var controlContainer = $('<ul>');
            controlContainer.html('<li class="previous"><a href="#" title="'+options.labelPrevious+'">'+options.labelPrevious+'</a></li><li class="next"><a href="#" title="'+options.labelNext+'">'+options.labelNext+'</a></li>');
            controlContainer.addClass('controls').css({'position':'absolute', 'z-index':'1'});
            controlContainer.appendTo(promoPanel);
            
            // Define animation values
            var totalWidth = slideTotal*slideWidth;
            var currentX = parseInt(slideContainer.css('left'));
            
            // Jump to previous slide
            function previous() {
                targetX = (currentX == 0) ? 0-widthCounter+promoPanelWidth : currentX+promoPanelWidth;
                slideContainer.animate({'left':targetX+'px'},{duration:options.duration,queue:false});
                currentX = targetX;
                if(options.slideshow) { runTimer(); }
                return false;
            }
            
            // Jump to next slide
            function next() {
                targetX = (currentX == (0-widthCounter+promoPanelWidth)) ? 0 : currentX-promoPanelWidth;
                slideContainer.animate({'left':targetX+'px'},{duration:options.duration,queue:false});
                currentX = targetX;
                if(options.slideshow) { runTimer(); }
                return false;
            }
            
            // Do timer
            var timer;
            function runTimer() {
                if(timer != null) { clearInterval(timer); }
                timer = setInterval(function() { next(); },options.interval);
            }
            
            // Create control functionality
            controlContainer.children('li.previous').children('a').click(function() { return previous(); });
            controlContainer.children('li.next').children('a').click(function() { return next(); });
            
            if(options.slideshow) { runTimer(); }
            slideContainer.show();
        });
        
    };
})(jQuery);
