
$.fn.carousel = function (auto, param) {
	return this.each(function () {
		var is_auto = false;
		var wrapper = $(this);
		var slider = wrapper.find('> ul');
		var items = slider.find('> li');
		var single = items.filter(':first');
		var margins = parseInt(single.css('margin-left')) + parseInt(single.css('margin-right'));
		var singleWidth = single.outerWidth() + margins;
		var visible = Math.ceil((wrapper.innerWidth()-margins) / singleWidth);
		var currentPage = 0;
		var pages = items.length;

		items.filter(':first').before(items.slice(- visible).clone().addClass('cloned'));
		items.filter(':last').after(items.slice(0, visible).clone().addClass('cloned'));

		slider.css('left',singleWidth*visible * -1 + 'px');

		function gotoPage(page) {
			var dir = page < currentPage ? -1 : 1;
			var left = singleWidth * dir * -1;
			slider.filter(':not(:animated)').animate({
				left : '-=' + left * -1
			}, 500, function () {
				if (page == visible * -1) {
					page = page+pages;
					slider.css('left', singleWidth*(visible+page) * -1+'px');
				} else if (page == pages) {
					page = page-pages;
					slider.css('left', singleWidth*(visible+page) * -1+'px');
				}
				currentPage = page;
			});
		}
		if(param != undefined && param.back != undefined && param.forward != undefined) {
			var back = $(param.back);
			var forward = $(param.forward);
		} else {
			wrapper.after('<a class="arrow back"></a><a class="arrow forward"></a>');
			var back = $('a.back', this);
			var forward = $('a.forward', this);
		}
		back.click(function () {
			return gotoPage(currentPage + 1);
		});
		forward.click(function () {
			return gotoPage(currentPage - 1);
		});
		$(this).bind('goto', function (event, page) {
			gotoPage(page);
		});
		if(auto != undefined && auto !== false) {
			is_auto=true;
			setInterval(function() {
				if(is_auto==true) {
					gotoPage(currentPage + 1);
				}
			}, auto);
			$([slider, back, forward]).each(function(){
				this.hover(function(){
					is_auto=false;
				}, function(){
					is_auto=true;
				});
			});
		}
	});
};



