(function($, undefined) {

    var SCROLL_DURATION = 150;
    var SCROLL_SHADOW = 80;
    var SCROLL_EC = 0.075

    var scrollInterval;

    function init(jQueryObject, params, resizeFlag) {

        if ((!resizeFlag) && ($.browser.msie) && ($.browser.version <= 7)) {
            var w = 0;
            var $ul = jQueryObject.find('ul');
            var $li = $ul.find('li').css({
                position : 'absolute'
            });
            for (var i = 0; i < $li.length; i++) {
                var $l = $li.eq(i);
                $l.css({
                    left : w,
                    width : $l.width()
                });
                w += $l.outerWidth();
            }
            $ul.css({ position: 'absolute' }).width(w);
        }

        var el = jQueryObject.get(0);
        el._$ = jQueryObject;

        jQueryObject
            .scrollLeft(0)
            .unbind('mousemove.scroller');

        if (el.scrollWidth > el.clientWidth) {
            el._left = jQueryObject.offset().left;
            var $active = jQueryObject.find('.active');
            if ($active.length) {
                var left = $active.offset().left - el._left;
                if (left > el.clientWidth)
                    jQueryObject.scrollLeft(left - (el.clientWidth / 2));
            }
            jQueryObject.bind('mousemove.scroller', mouseMoveHandler);
        }
        $(window).resize(function() {
            init(jQueryObject, params, true);
        });
    }

    function mouseMoveHandler(e) {
        var el = this;
        var width = this._$.width();
        // Относительное смещение мыши
        var dx = e.pageX - this._left - SCROLL_SHADOW;

       // Величина прокрутки относительно смещения
        var scrollLeft = (this.scrollWidth - this.clientWidth) * (dx / (this.clientWidth - 2 * SCROLL_SHADOW));

        // Проверяем, не вышл ли за диапозон
        if (scrollLeft < 0)
            scrollLeft = 0;
        if (scrollLeft > this.scrollWidth - this.clientWidth)
            scrollLeft = this.scrollWidth - this.clientWidth;

        // Округлим, на всякий
        el._scrollTo = Math.round(scrollLeft);

        // Запуск анимации
        if (!el._scrollInterval)
            el._scrollInterval = window.setInterval(function () {
                scroll(el);
            }, 10);
    }

    /**
     * Анимация прокрутки
     */
    function scroll(el) {
        var c = el.scrollLeft;
        if (c != el._scrollTo) {
            var d = (el._scrollTo - c) * SCROLL_EC;
            d = (d > 0) ? Math.ceil(d) : Math.floor(d);
            el.scrollLeft = c + d;
        } else {
            window.clearInterval(el._scrollInterval);
            el._scrollInterval = null;
        }
    }

    $.fn.extend({
        scroller : function(params) {
            if (!params)
                params = {};
            for (var i = 0; i < this.length; i++)
                init(this.eq(i), params);
            return this;
        }
    });
})(jQuery);

