/*

   written by Overchuk (dima@overchuk.ru),
   licensed under GPLv3.0

*/
(function($){

$.fn.transporter = function(options)
{

var defaults = { interval: 200, delta: 3 }

// External interface
var $this = {

init : function(container, options, defaults)
{
    // Init
    this.opt = $.extend({}, defaults, options);

    this.div = container;
    this.ul = this.div.children('ul');
    this.li = this.ul.children('li');

    if(this.li.size() == 0)
        return;

    // max width of elements. UL will extend by this width
    var max = 0;
    var ulw = 0;

    this.li.each(function(){ var w = $(this).outerWidth(); ulw += w; if(w > max) max = w; });
    this.ul.css({
                position:'relative',
                left:'0px',
                top:'0px'
            });

    if(max < this.opt.delta)
        this.opt.delta = max;
    this.max_delta = max;
    this.delta = this.opt.delta;

    max += (max + this.div.width() );
    this.ul.width( max );
    var i = 0;
    while(ulw < max)
    {
        var c = $( this.li[i] );
        ulw += c.width();
        c.clone().appendTo( this.ul );

        if((++i) >= this.li.size())
            i = 0;
    }

    this.dir = 0;
    this.interval = null;
},

stop: function() {
    if(this.interval)
    {
        clearInterval(this.interval);
        this.interval = null;
    }
    this.dir = 0;
    this.delta = this.opt.delta;
},

left: function() {
    this.stop();
    var a = this;
    this.interval = setInterval(function(){ a._plus(); }, this.opt.interval);
    this.dir = 1;
},

right: function() {
    this.stop();
    var a = this;
    this.interval = setInterval(function(){ a._minus(); }, this.opt.interval);
    this.dir = -1;
},

speed: function(dt)
{
    this.delta += dt;
    if(this.delta > this.max_delta)
        this.delta = this.max_delta;
    if(this.delta < 0)
        this.delta = 0;
},



// "Internal" interface

_left: function()
{
    return /^0*(.*)px$/.exec( this.ul.css('left') )[1];
},


_minus: function()
{
    var l = this._left() - this.delta;
    if(l < 0)
    {
        var m = (-1)*l;
        var max = $(this.li[0]).outerWidth();

        if( m > max)
        {
            l += max;
            $( this.li[0] ).remove().appendTo( this.ul );
            this.li = this.ul.children('li');
        }
    }
    this.ul.css('left', l + 'px');
},

_plus: function()
{
    var l = this._left()*1 + this.delta;

    if(l > 0)
    {
        var m = this.li.size();
        do
        {
            var c = $( this.li[--m] );
            l = l - c.outerWidth();
            c.remove().prependTo( this.ul );
        }while(l > 0);
        this.li = this.ul.children('li');
    }
    this.ul.css('left', l + 'px');
}

};

$this.init($(this), options, defaults);
return $this;
}
})(jQuery);

