jQuery.fn.horisontalScroller = function (options) {

    var options = jQuery.extend({
        scrollTime: 1000,
        driverSelector: '.driver',
        itemSelector: 'a',
        rebuildEachTime: false
    }, options);

    return this.each(function () {

        var $this = $(this);
        var left = 0;
        var items = null;
        var driver = $this.find(options.driverSelector);
        var leftButton = $this.find('.left');
        var rightButton = $this.find('.right');

        var reloadItems = function(){
            items = $this.find(options.driverSelector + ' ' + options.itemSelector);
        };
        reloadItems();

        driver.css({ left: '0px' });

        function GetWidth() {
            return $this.width();
        }

        function Play() {
            driver.stop().animate({ 'left': left }, options.scrollTime);
        }

        rightButton.click(function () {            
            if(options.rebuildEachTime)reloadItems();
            $(this).blur();
            var width = GetWidth();            
            var currLeft = 0;
            for (var i = 0; i < items.length; i++) {
                var itemLeft = items.eq(i).position().left;
                if (itemLeft > -left + width || (i == items.length - 1 && itemLeft + items.eq(i).width() > -left + width)) {
                    left = -currLeft;
                    Play();
                    break;
                }
                currLeft = itemLeft;
            }
            return false;
        });

        leftButton.click(function () {
            if(options.rebuildEachTime)reloadItems();
            var currLeft = 0;
            $(this).blur();
            var width = GetWidth();
            for (var i = items.length - 1; i >= 0; i--) {
                var itemLeft = items.eq(i).position().left;
                if (itemLeft < -left - width || itemLeft == 0) {
                    if (itemLeft == 0) left = 0;
                    else left = -currLeft;
                    Play();
                    break;
                }
                currLeft = itemLeft;
            }
            return false;
        });
    });
};
