(function($) {
	$.fn.tscarousel = function(o) {
        return this.each(function() {
        	new $jc(this, o);
        });
    };
    var defaults = {
        vertical: false,
        scroll: 1,
        animation: 'normal',
        easing: 'swing',
        auto: 0,
        delay:3000,
        way:1,//up
        prevBtn:'#next',
		nextBtn:'#prev',
		step:68,
		onSlided:function(){},
        wrap: null
    };
    $.tscarousel = function(e, o) {
        this.options    = $.extend({}, defaults, o || {});
        this.clip       = null;
        this.list       = null;
        this.list = $(e);
        this.container = this.list.parent();
        this.container.css({position:'relative'})
        this.list.css({position:'absolute'})
        var self = this;
        var first=$("li:first",this.list)
        this.step=this.options.step
        var size=$('li',this.list).size();
        for(var i=0; i<size;i++)
        {	first.addClass('ts_carousel-'+i);
        	first=first.next()
        }
        this.options.totalItem=i;
        $(self.options.prevBtn).click(function(){self.scrolls(1)})
		$(self.options.nextBtn).click(function(){self.scrolls(-1)})
        // For whatever reason, .show() does not work in Safari...
        this.container.css('display', 'block');
        if ($.browser.safari) {
            this.buttons(false, false);
            $(window).bind('load', function() { self.setup(this.options.way); });
        }else
        this.setup(this.options.way)
    };

    // Create shortcut for internal use
    var $jc = $.tscarousel;

    $jc.fn = $jc.prototype = {
        tscarousel: '0.0.1'
    };
    $jc.fn.extend = $jc.extend = $.extend;
    $jc.fn.extend({
        setup: function(val) {
			this.animating = false;
            this.timer     = null;
            this.way=val
			this.auto=this.options.auto
			this.roll(1)
            if(this.auto) this.restart(val)
			this.onSlided=this.options.onSlided
        },
        pause:function(val)
        {	this.stop()
        },
        scrolls: function(val) {
        	if(this.animating) return;
        	this.animating=true;
        	var self=this
        	var reload = function(){
				self.roll(val);
				if(self.auto)
					self.restart(val);
				else self.stop();
				self.onSlided()
			}
        	var o = !this.options.vertical ? {'left': this.list.position().left+val*this.step} : {'top': this.list.position().top+val*this.step};
        	this.list.animate(o,this.options.animation,'swing',reload)
        },
        restart: function(val)
        {	var self=this;
        	this.stop();
        	this.timer = setTimeout(function() { self.scrolls(val)}, this.options.auto * this.options.delay);
        },
        stop: function()
        {	clearTimeout(this.timer);
        	this.timer = null;
        	this.animating=false;
        },
        start: function(val) {
        	var self=this;
        	if(val>0)
        	{	self.roll(val)
        	}
        	this.timer = setTimeout(function() { self.scrolls(self.way)}, 1 * this.options.delay);
        },
        roll:function(val){
        	var self=this;
        	var obj 
        	if(val==-1)
        	{	obj=$("li:first",self.list)
        		obj.appendTo(self.list)
        	}
        	else
        	{	obj=$("li:last",self.list)
        		objs=$("li:not(:last)",self.list)
        		objs.appendTo(self.list)
        	}
        	var o = !this.options.vertical ? {'left': this.list.position().left-val*this.step} : {'top': this.list.position().top-val*this.step};
        	self.list.css(o)
        }
    });

    $jc.extend({
        defaults: function(d) {
            return $.extend(defaults, d || {});
        },
        margin: function(e, p) {
            if (!e)
                return 0;

            var el = e.jquery != undefined ? e[0] : e;

            if (p == 'marginRight' && $.browser.safari) {
                var old = {'display': 'block', 'float': 'none', 'width': 'auto'}, oWidth, oWidth2;

                $.swap(el, old, function() { oWidth = el.offsetWidth; });

                old['marginRight'] = 0;
                $.swap(el, old, function() { oWidth2 = el.offsetWidth; });

                return oWidth2 - oWidth;
            }

            return $jc.intval($.css(el, p));
        },
        intval: function(v) {
            v = parseInt(v);
            return isNaN(v) ? 0 : v;
        }
    });

})(jQuery);

