;(function($){

    $.fn.hoverSlide = function(options){

        return this.each(function(){

            var settings = $.extend({}, $.fn.hoverSlide.defaults, options),
                $slider = $(this),
                $itemContainer = $('<div />'),
                $slides = $slider.find(settings.itemClass),
                totalWidth = 0,
                cursorPosition = {},
                hoverInterval,
                isHover = false;


            function init()
            {

                settings.originalSpeed = settings.speed;
                settings.speed = Math.max(1, 100 - (settings.speed*10) );

                // Remove the margin-right on the last panel
                $slider.find(settings.itemClass + ':last').css('margin-right', 0);

                $slider.find(settings.itemClass).each(function(){
                    totalWidth += getElementWidth($(this));
                });

                if ( marginRight != 0 ) {
                    totalWidth -= (marginRight);
                }

                // Set the container width to allow the panels to float left
                $itemContainer.css({width: totalWidth});

                // Wrap an extra div around the panels
                $slides.wrapAll($itemContainer);

                // Hide the excess panels (position & width props are an ie7 fix)
                $slider.css({overflow: 'hidden', position: 'relative', width: '100%'});

                if ( settings.hoverSlide ) {
                    hoverSlide();
                }

                if ( settings.autoSlide ) {
                    autoSlide();
                }

            }

            // Update cursor position on mouseMove
            $(document).mousemove(function(e){
                cursorPosition = {
                    'x': e.pageX,
                    'y': e.pageY
                };
            });

            function hoverSlide()
            {
                // MouseEnter / mouseLeave events
                $slider.mouseenter(function(e) {
                    hoverInterval = window.setInterval(function(){
                        isHover = true;
                        var speed = (getCursorOffset($slider).x - ($slider.width() / 2)) / (0.25 * settings.speed);
                        if ( speed < -2 || speed > 2 ) {
                            $slider.scrollLeft($slider.scrollLeft() + speed);
                        }
                    }, 40);
                }).mouseleave(function(e){
                    isHover = false;
                    clearInterval(hoverInterval);
                });
            }

            function autoSlide()
            {
                var ltr = 1;
                window.setInterval(function(){
                    if ( !isHover ) {
                        // Determine direction
                        if ( ltr == 1 && $slider.scrollLeft() >= totalWidth - $slider.width() ) {
                            ltr = -1;
                        } else if ( ltr == -1 && $slider.scrollLeft() <= 0 ) {
                            ltr = 1;
                        }
                        $slider.scrollLeft($slider.scrollLeft() + Math.max(1, settings.originalSpeed / 8) * ltr);
                    }
                }, 40);
            }

            // Retrieves the cursor offset relative to $element
            function getCursorOffset($element)
            {
                return {
                    'x': cursorPosition.x - $element.offset().left,
                    'y': cursorPosition.y - $element.offset().top
                };
            }

            function getElementWidth($element)
            {

                marginRight = borderRight = borderLeft = 0;
                width = $element.width();

                if ($slides.css('borderLeftStyle') != 'none') {
                    originalBorderLeft  = $slides.css('borderLeftWidth');
                    if (originalBorderLeft) {
                        borderLeft = parseInt(originalBorderLeft.replace('px', ''));
                    }
                }
                if ($slides.css('borderRightStyle') != 'none') {
                    originalBorderRight = $slides.css('borderRightWidth');
                    alert(originalBorderRight);
                    if (originalBorderRight) {
                        borderRight = parseInt(originalBorderRight.replace('px', ''));
                    }
                }

                originalMarginRight = $slider.find(settings.itemClass).css('margin-right');
                if (originalMarginRight) {
                    marginRight = parseInt(originalMarginRight.replace('px', ''));
                }

                return (width + marginRight + borderLeft + borderRight);
            }

            init();

        });

    }

    $.fn.hoverSlide.defaults = {
        itemClass: '.panel',
        autoSlide: true,
        hoverSlide: true,
        speed: 6
    };

})(jQuery);

