(function($)  {
$.fn.bsSlider = function(options) {
    if ($(this).length == 0)
        return null;
    if ($(this).data('bsSlider')) {
        return $(this).data('bsSlider');
    }
    // load defaults to options
    this.options = $.extend({
        width: 130,
        space: 10,
        onShow: function(element) {}
    }, options);
    options = this.options;
    $(this).addClass('bsSlider');
    var i = 0;
    elements = $(this).find('li');
    count = elements.length;
    while ((count - 1) * (options.width + options.space) < this.width()) {
        elements.clone().appendTo(elements.parent());
        count += elements.length;
    }
    this.activeElement =$(this).find('li').first();
    $(this).find('li').each(function(){
        $(this).attr('elementId', i).css('top', '0px').css('left', ((options.width + options.space)*i)+'px');
        i++;
    });
    this.elementCount = i;
    this.elementsTotalWidth = (options.width + options.space) * this.elementCount;
    this.elementsBreakWidth = (options.width + options.space) * (this.elementCount - 1);
    $(this).find('li').click(function() {
        $(this).parents('div.bsSlider').bsSlider().goToElement(this);
    });

    this.goToElementId = function(id) {
        //li = $(this).find('li[elementId='+id+']');
    }
    
    this.checkFx = function(now, fx) {
            var slider = $(this).data('bsSlider');
            if (now < -slider.options.width) {
                fx.start += slider.elementsTotalWidth;
                fx.now += slider.elementsTotalWidth;
                fx.end += slider.elementsTotalWidth;
            }
            else if (now > slider.elementsBreakWidth) {
                fx.now -= slider.elementsTotalWidth;
                fx.start -= slider.elementsTotalWidth;
                fx.end -= slider.elementsTotalWidth;
            }
    }
    
    this.goToElement = function(element) {
        this._moveToElement(element);
    }
    
    this.right = function(n) {
        if (isNaN(n))
            n = 1;
        li = this.activeElement;
        for (;n>0;n--) li = this.getPrevious(li);
        this._moveToElement(li, true);
    }
    
    this.left = function(n) {
        if (isNaN(n))
            n = 1;
        li = this.activeElement;
        for (;n>0;n--) li = this.getNext(li);
        this._moveToElement(li);
    }
    
    this._moveToElement = function(element, inverse) {
        if (this.activeElement == element)
            return null;
        this.options.onShow.apply(this, [element]);
        this.activeElement = element;
        pixels = $(element).position().left;
        if (inverse)
            pixels = pixels-this.elementsTotalWidth;
        var str = (pixels > 0) ? "-=" + pixels : "+=" + (-pixels);
        $(this).find('li').stop().animate({left: str}, {step: this.checkFx, duration: 700, 'queue': true});
    }
    
    this.getNext = function(li) {
        var next = $(li).next();
        if (next.length==0)
            return $(li).parent().children().first();
        return next;
    }
    
    this.getPrevious = function(li) {
        var previous = $(li).prev();
        if (previous.length==0)
            return $(li).parent().children().last();
        return previous;
    }
    
    $(this).data('bsSlider', this);
    $(this).find('li').data('bsSlider', this);
    return this;
};
})(jQuery);
