(function($) {
	$.fn.jCarouselLite = function(o) {
		o = $.extend({
			btnPrev : null,
			btnNext : null,
			btnGo : null,
			mouseWheel : false,
			auto : null,
			speed : 200,
			easing : null,
			vertical : false,
			circular : true,
			visible : 3,
			start : 0,
			scroll : 1,
			beforeStart : null,
			afterEnd : null
		}, o || {});
		return this.each(function() {
			var b = false, animCss = o.vertical ? "top" : "left", sizeCss = o.vertical ? "height" : "width";
			var c = $(this), ul = $("ul", c), tLi = $("li", ul), tl = tLi.size(), v = o.visible;
			if(o.circular) {ul.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());
				o.start += v
			}
			var f = $("li", ul), itemLength = f.size(), curr = o.start;
			c.css("visibility", "visible");
			f.css({
				overflow : "hidden",
				float : o.vertical ? "none" : "left"
			});
			ul.css({
				margin : "0",
				padding : "0",
				position : "relative",
				"list-style-type" : "none",
				"z-index" : "1"
			});
			c.css({
				overflow : "hidden",
				position : "relative",
				"z-index" : "2",
				left : "0px"
			});
			var g = o.vertical ? height(f) : width(f);
			var h = g * itemLength;
			var j = g * v;
			f.css({
				width : f.width(),
				height : f.height()
			});
			ul.css(sizeCss,h+"px").css(animCss, -(curr * g));
			c.css(sizeCss, j + "px");
			if(o.btnPrev)
				$(o.btnPrev).click(function() {
					return go( curr - o.scroll)
				});
			if(o.btnNext)
				$(o.btnNext).click(function() {
					return go(curr + o.scroll)
				});
			if(o.btnGo)
				$.each(o.btnGo, function(i, a) {$(a).click(function() {
						return go(o.circular ? o.visible + i : i)
					})
				});
			if(o.mouseWheel && c.mousewheel)
				c.mousewheel(function(e, d) {
					return d > 0 ? go( curr - o.scroll) : go(curr + o.scroll)
				});
			if(o.auto)
				setInterval(function() {go(curr + o.scroll)
				}, o.auto + o.speed);
			function vis() {
				return f.slice(curr).slice(0, v)
			};

			function go(a) {
				if(!b) {
					if(o.beforeStart)
						o.beforeStart.call(this, vis());
					if(o.circular) {
						if(a <= o.start - v - 1) {ul.css(animCss, -(( itemLength - (v * 2)) * g) + "px");
							curr = a == o.start - v - 1 ? itemLength - (v * 2) - 1 : itemLength - (v * 2) - o.scroll
						} else if(a >= itemLength - v + 1) {ul.css(animCss, -((v) * g) + "px");
							curr = a == itemLength - v + 1 ? v + 1 : v + o.scroll
						} else
							curr = a
					} else {
						if(a < 0 || a > itemLength - v)
							return;
						else
							curr = a
					}
					b = true;
					ul.animate(animCss == "left" ? {
						left : -(curr * g)
					} : {
						top : -(curr * g)
					}, o.speed, o.easing, function() {
						if(o.afterEnd)
							o.afterEnd.call(this, vis());
						b = false
					});
					if(!o.circular) {$(o.btnPrev+","+o.btnNext).removeClass("disabled");
						$((curr-o.scroll<0&&o.btnPrev)||(curr+o.scroll>itemLength-v&&o.btnNext)||[]).addClass("disabled")
					}
				}
				return false
			}

		})
	};
	function css(a, b) {
		return parseInt($.css(a[0], b)) || 0
	};

	function width(a) {
		return a[0].offsetWidth + css(a, 'marginLeft') + css(a, 'marginRight')
	};

	function height(a) {
		return a[0].offsetHeight + css(a, 'marginTop') + css(a, 'marginBottom')
	}

})(jQuery);

