(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
		node_size:0,
		prevBtn:'.c_prev',
		prevNtn:'.c_next',
        wrap: null ,
		autoFlow: false
    };
    $.tscarousel = function(e, o) {
        this.options    = $.extend({}, defaults, o || {});
        this.clip       = null;
        this.list       = null;
       
        this.list = $('ul',e);
        this.container = this.list.parent();
		this.container.css({position:'relative'})
		this.list.css({position:'absolute'})
		this.list.css({top:'0', left:'-4'})
		
		var self = this;
        var first=$("li:first",this.list)
        this.step=this.options.node_size;
        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;
		
        $(e).hover(function(){ self.pause()},function(){self.restart()});
        $(this.options.prevBtn).click(function(){self.scrolls(1)})
		$(this.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(); });
        }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.start(val);
        },
        pause:function(val)
        {	this.stop()
        },
        scrolls: function(val) {
        	if(this.animating) return;
        	this.animating=true;
        	var self=this
        	var reload = function(){self.roll(val);self.restart(val); }
        	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();
			if(this.options.autoFlow)
	        	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)
        	}
			if(this.options.autoFlow)
        		this.timer = setTimeout(function() { self.scrolls(self.way)}, this.options.auto * 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);

