/**
 * Simple horizontal circular scroller
 *
 * Author : ibresource.ru
 * Requres: jQuery
 */
(function($) {
    var defaults = {
        size     : 220,
        visible  : 4,
        perclick : 4,
        circular : true,
        speed    : 2000,
        auto     : 10000
    };
    var next = function(o, s) {
        if (o.queue('fx').length > 0) {
            return;
        }
        var curpos = o.position().left;
        var newpos = curpos + s.size * s.perclick;
        if (newpos > 0) {
            if (s.circular) {
                var num = Math.floor(newpos / s.size);
                var slice = o.children().slice(-num).clone(true);
                
                o.css('left', curpos - num * s.size);
                o.prepend(slice);
                o.animate({left: 0}, {
                    duration: s.speed,
                    complete: function() {
                        o.children().slice(-num).remove();
                    }
                });
            }
            else {
                o.animate({left: 0}, {duration: s.speed});
            }
        }
        else {
            o.animate({left: newpos}, {duration: s.speed});
        }
        return;
    };
    var prev = function(o, s) {
        if (o.queue( 'fx' ).length > 0) {
            return;
        }
        var curpos = o.position().left;
        var newpos = curpos - s.size * s.perclick;
        var total  = o.children().length;
        var minpos = ( s.visible - total ) * s.size;
        if (newpos < minpos) {
            if (s.circular) {
                var num = Math.floor( ( minpos - newpos ) / s.size );
                var slice = o.children().slice(0, num).clone( true );

                o.append(slice);
                o.animate({left: newpos}, {
                    duration: s.speed,
                    complete: function() {
                        o.children().slice(0, num).remove();
                        o.css('left', minpos);
                    }
                });
            }
            else {
                o.animate({left: minpos}, {duration: s.speed});
            }
        }
        else {
            o.animate({left: newpos}, {duration: s.speed});
        }
        return;
    };
    $.fn.extend( {
        scroll: function(opts) {
            opts = $.extend({}, defaults, opts);
            return this.each( function() {
                var obj  = $(this);
                var list =obj.find('.list > ul');
                $('<div class="next"></div>').appendTo(obj).click(function() { next(list, opts); });
                $('<div class="prev"></div>').appendTo(obj).click(function() { prev(list, opts); });
                if( opts.auto !== 0 ) {
                    var func = prev;
                    if (opts.auto < 0) {
                        func = next;
                    }
                    opts.auto = Math.abs(opts.auto);
                    var i = window.setInterval(function(){func( list, opts);}, opts.auto);
                    obj.mouseover( function(){ window.clearInterval( i ); });
                    obj.mouseout( function(){ i = window.setInterval( function(){func( list, opts);}, opts.auto); });
                }
            });
        }
    });
})(jQuery);