(function(c) {
	function ga(z, s) {
		function m() {
			u = j.length;
			p = v * 2 / u;
			for (var b = 0; b < u; b++) ha(b);
			o(g);
			c.browser.msie || N(0);
			c(document).bind("mousemove", function(d) {
				k = d.pageX;
				q = d.pageY
			});
			z.onselectstart = function() {
				return false
			};
			a.settings.autoScroll && A();
			a.settings.mouseScroll && O();
			a.settings.mouseDrag && X();
			a.settings.mouseWheel && Y();
			a.settings.scrollbar && ia();
			a.settings.tooltip && c('<div class="tooltip"><p></p></div>').css("opacity", 0).appendTo(i)
		}
		function ha(b) {
			var d = c('<img class="carousel-item"/>').appendTo(i);
			Z.push(d);
			d.css({
				width: a.settings.itemWidth,
				h: a.settings.itemHeight
			}).data({
				w: a.settings.itemWidth,
				h: a.settings.itemHeight,
				index: b
			}).addClass("out").bind({
				mouseover: function() {
					c(this).hasClass("out") && c(this).removeClass("out").addClass("over");
					a.settings.tooltip && ja(b);
					if (a.settings.mouseScroll) B = a.settings.mouseScrollSpeedHover;
					var e = {
						type: "itemMouseOver",
						index: b,
						data: j[b]
					};
					c.isFunction(a.settings.itemMouseOver) && a.settings.itemMouseOver.call(this, e)
				},
				mouseout: function() {
					c(this).hasClass("over") && c(this).removeClass("over").addClass("out");
					a.settings.tooltip && ka();
					if (a.settings.mouseScroll) B = a.settings.mouseScrollSpeed;
					var e = {
						type: "itemMouseOut",
						index: b,
						data: j[b]
					};
					c.isFunction(a.settings.itemMouseOut) && a.settings.itemMouseOut.call(this, e)
				},
				click: function() {
					i.find(".click").removeClass("click").addClass("out");
					c(this).removeClass("over").addClass("click");
					a.settings.scrollOnClick && C(b);
					if (j[b].link) window.open(j[b].link, j[b].linkTarget || a.settings.linkTarget);
					var e = {
						type: "itemClick",
						index: b,
						data: j[b]
					};
					c.isFunction(a.settings.itemClick) && a.settings.itemClick.call(this, e)
				}
			});
			j[b].link && d.css("cursor", "pointer");
			c.browser.msie && N(b)
		}
		function N(b) {
			var d = j[b].path,
				e = Z[b];
			c("<img/>").load(function() {
				var h = parseInt(c(this).attr("width") || c(this).prop("width")),
					f = parseInt(c(this).attr("height") || c(this).prop("height"));
				if (a.settings.crop) e.css("background-image", "url(" + d + ")");
				else {
					e.attr("src", d);
					//e.css("background-image", "none")
				}
				if (a.settings.resize) if (a.settings.maintainAspectRatio) {
					scaleX = a.settings.itemWidth / h;
					scaleY = a.settings.itemHeight / f;
					if (scaleX < scaleY) {
						h *= scaleX;
						f *= scaleX
					} else {
						h *= scaleY;
						f *= scaleY
					}
				} else {
					h = a.settings.itemWidth;
					f = a.settings.itemHeigh
				}
				e.css({
					width: h,
					height: f
				});
				e.data({
					w: h,
					h: f
				});
				o(g);
				c.browser.msie || b < u - 1 && N(++b)
			}).attr("src", d)
		}
		function o(b) {
			i.find(".carousel-item").each(function(d) {
				var e = c(this),
					h = e.data("w"),
					f = e.data("h"),
					D = Math.sin(-(p * d) + v * 0.5 + b * w) * a.settings.verticalRadius + P - f * 0.5,
					r = (D - ($ - f * 0.5)) / (aa - $) * (1 - a.settings.scaleRatio) + a.settings.scaleRatio;
				e.css({
					width: h * r,
					height: f * r,
					left: Math.cos(-(p * d) + v * 0.5 + b * w) * a.settings.horizontalRadius + Q - h * 0.5 + h * (1 - r) / 2,
					top: D + f * (1 - r) / 2,
					"z-index": Math.floor(r * 10 * u)
				})
			});
			a.settings.scrollbar && !x && la(R())
		}
		function C(b) {
			l = b;
			var d = p * (180 / v) * b % 360;
			g %= 360;
			if (Math.abs(d - g) > 180) d += d > g ? -360 : 360;
			if (d - g > 180 && d > g) d -= 360;
			E();
			S = setInterval(function() {
				if (Math.abs(d - g) > 0.5) {
					g += (d - g) * (a.settings.scrollSpeed / 100);
					o(g)
				} else F()
			}, 30);
			b = {
				type: "itemSelect",
				index: l,
				data: j[l]
			};
			c.isFunction(a.settings.itemSelect) && a.settings.itemSelect.call(this, b)
		}

		function ba() {
			C(l == j.length - 1 ? 0 : l + 1)
		}
		function ca() {
			C(l == 0 ? j.length - 1 : l - 1)
		}
		function A() {
			if (!(G && a.settings.pauseAutoScrollIfTooltip)) {
				a.settings.autoScroll = true;
				t = setTimeout(function() {
					if (a.settings.autoScrollDirection == "next") ba();
					else a.settings.autoScrollDirection == "previous" && ca()
				}, a.settings.autoScrollDelay)
			}
		}
		function O() {
			a.settings.mouseScroll = true;
			B = a.settings.mouseScrollSpeed;
			var b = 0,
				d = a.settings.mouseScrollReverse ? -1 : 1;
			H = setInterval(function() {
				if (k > i.offset().left && k < i.offset().left + a.settings.width && q > i.offset().top && q < i.offset().top + a.settings.height) {
					b = d * (k - (i.offset().left + Q)) * (B / 1E3);
					g += b;
					o(g)
				} else if (Math.abs(b) > 0.1) {
					b *= a.settings.mouseScrollEase / 100;
					g += b;
					o(g)
				} else b = 0
			}, 30)
		}
		function X() {
			function b(f) {
				T = f.pageX;
				if (!I) {
					E();
					d()
				}
			}
			function d() {
				I = true;
				J = setInterval(function() {
					var f = (360 * (h * (T - da) / (100 * a.settings.mouseDragSpeed)) + e - g) * (a.settings.mouseDragEase / 100);
					if ((f >= 0 ? f : -f) > 0.1) {
						g += f;
						l = Math.round(g * w / p);
						o(g)
					} else F()
				}, 30)
			}
			a.settings.mouseDrag = true;
			var e = 0,
				h = a.settings.mouseDragReverse ? 1 : -1;
			c(document).bind("mousedown", function(f) {
				if (k > i.offset().left && k < i.offset().left + a.settings.width && q > i.offset().top && q < i.offset().top + a.settings.height) {
					T = da = f.pageX;
					e = g;
					c(document).bind("mousemove", b)
				}
			});
			c(document).bind("mouseup", function() {
				c(document).unbind("mousemove", b)
			})
		}
		function Y() {
			a.settings.mouseWheel = true;
			var b = 0,
				d = a.settings.mouseWheelReverse ? -1 : 1;
			i.bind("mousewheel", function(e, h) {
				e.preventDefault();
				if (!K) {
					E();
					K = true;
					b = g;
					L = setInterval(function() {
						if (Math.abs(b - g) > 0.5) {
							g += (b - g) * (a.settings.mouseWheelSpeed / 100);
							l = Math.round(g * w / p);
							o(g)
						} else F()
					}, 30)
				}
				b += d * h * 10
			})
		}
		function ia() {
			function b() {
				n = k - h.offset().left - ea;
				d()
			}
			function d() {
				if (n < 0) n = 0;
				else if (n > parseInt(h.css("width")) - parseInt(f.css("width"))) n = parseInt(h.css("width")) - parseInt(f.css("width"));
				x && f.css("left", n);
				U = n / (parseInt(h.css("width")) - parseInt(f.css("width")));
				if (!M) {
					E();
					M = true;
					g %= 360;
					V = setInterval(function() {
						if (Math.abs(R() - U) > 0.0010) {
							var W = (U - R()) * (a.settings.scrollbarEase / 100);
							g += W * 360;
							l = Math.round(g * w / p);
							o(g)
						} else M && F()
					}, 30)
				}
			}
			var e = c('<div class="scrollbar"></div>').appendTo(i),
				h = c('<div class="track"></div>').appendTo(e),
				f = c('<div class="thumb"></div>').appendTo(h),
				D = c('<div class="left"></div>').appendTo(e),
				r = c('<div class="right"></div>').appendTo(e),
				n = 0,
				ea;
			e.css({
				top: aa,
				left: Q - parseInt(e.css("width")) / 2
			});
			f.bind("mousedown", function(W) {
				W.preventDefault();
				ea = k - f.offset().left;
				x = true;
				c(document).bind("mousemove", b)
			});
			c(document).bind("mouseup", function() {
				if (x) {
					x = false;
					c(document).unbind("mousemove", b)
				}
			});
			D.bind("click", function() {
				n = parseInt(f.css("left")) - a.settings.arrowScrollAmount;
				d()
			});
			r.bind("click", function() {
				n = parseInt(f.css("left")) + a.settings.arrowScrollAmount;
				d()
			})
		}
		function la(b) {
			var d = i.find(".scrollbar").find(".track"),
				e = d.find(".thumb");
			e.css("left", b * (parseInt(d.css("width")) - parseInt(e.css("width"))))
		}
		function R() {
			var b = g % 360 / 360;
			if (b < 0) b += 1;
			return b
		}
		function E() {
			fa();
			if (!y) {
				y = true;
				c.isFunction(a.settings.scrollStart) && a.settings.scrollStart.call(this)
			}
		}
		function F() {
			fa();
			if (y) {
				y = false;
				c.isFunction(a.settings.scrollComplete) && a.settings.scrollComplete.call(this)
			}
			a.settings.mouseScroll && O();
			a.settings.autoScroll && A()
		}
		function fa() {
			H && clearInterval(H);
			if (J) {
				I = false;
				clearInterval(J)
			}
			if (L) {
				K = false;
				clearInterval(L)
			}
			if (V) {
				M = false;
				clearInterval(V)
			}
			S && clearInterval(S);
			t && clearTimeout(t)
		}
		function ja(b) {
			if (b = j[b].tooltip) {
				G = true;
				var d = i.find(".tooltip");
				d.find("p").html(b);
				d.stop().animate({
					opacity: 1
				}, 300);
				var e = -d.outerWidth() / 2,
					h = 0 - d.outerHeight() - parseInt(d.css("marginBottom"));
				d.css({
					left: k - i.offset().left + e,
					top: q - i.offset().top + h
				});
				c(document).bind("mousemove.tooltip", function() {
					d.css({
						left: k - i.offset().left + e,
						top: q - i.offset().top + h
					})
				});
				t && a.settings.pauseAutoScrollIfTooltip && clearTimeout(t)
			}
		}
		function ka() {
			if (G) {
				G = false;
				var b = i.find(".tooltip");
				b.stop().animate({
					opacity: 0
				}, 200, function() {
					c(document).unbind("mousemove.tooltip");
					b.css("left", -9999)
				});
				a.settings.autoScroll && a.settings.pauseAutoScrollIfTooltip && A()
			}
		}
		this.settings = c.extend({}, c.fn.carousel.defaults, s);
		var i = c(z),
			a = this,
			l = 0,
			j = [],
			Z = [],
			v = Math.PI,
			w = v / 180,
			S, t, H, J, L, V, B = a.settings.mouseScrollSpeed,
			k, q, T = 0,
			da = 0,
			I = false,
			K = false,
			x = false,
			M = false,
			U = 0,
			g = 0,
			Q = a.settings.width / 2,
			P = a.settings.height / 2,
			$ = P - a.settings.verticalRadius,
			aa = P + a.settings.verticalRadius,
			p, u, y = false,
			G = false;
		(function() {
			i.addClass("carousel").css({
				width: a.settings.width,
				height: a.settings.height
			});
			if (a.settings.xmlSource) {
				i.empty();
				c.ajax({
					type: "GET",
					url: a.settings.xmlSource,
					dataType: c.browser.msie ? "text" : "xml",
					success: function(b) {
						var d;
						if (c.browser.msie) {
							d = new ActiveXObject("Microsoft.XMLDOM");
							d.async = false;
							d.loadXML(b)
						} else d = b;
						c(d).find("item").each(function() {
							for (var e = {}, h = 0; h < c(this).children().length; h++) {
								var f = c(this).children()[h];
								e[f.nodeName] = c(this).find(f.nodeName).text()
							}
							j.push(e)
						});
						m()
					}
				})
			} else {
				i.children().each(function() {
					for (var b = {}, d = 0; d < c(this).children().length; d++) {
						var e = c(this).children()[d];
						if (c(e).is("a")) {
							b.path = c(e).find("img").attr("src");
							b.link = c(e).attr("href");
							if (c(e).attr("target")) b.linkTarget = c(e).attr("target")
						} else if (c(e).is("img")) b.path = c(e).attr("src");
						else b[c(e).attr("class")] = c(e).html()
					}
					j.push(b)
				});
				i.empty();
				m()
			}
		})();
		this.startAutoScroll = A;
		this.stopAutoScroll = function() {
			a.settings.autoScroll = false;
			clearTimeout(t)
		};
		this.startMouseScroll = O;
		this.stopMouseScroll = function() {
			a.settings.mouseScroll = false;
			clearInterval(H)
		};
		this.startMouseDrag = X;
		this.stopMouseDrag = function() {
			I = a.settings.mouseDrag = false;
			clearInterval(J)
		};
		this.startMouseWheel = Y;
		this.stopMouseWheel = function() {
			K = a.settings.mouseWheel = false;
			clearInterval(L)
		};
		this.scrollToItem = C;
		this.scrollToNext = ba;
		this.scrollToPrevious = ca;
		this.isScrolling = function() {
			return y
		}
	}
	c.fn.carousel = function(z) {
		for (var s = [], m = 0; m < this.length; m++) if (!this[m].carousel) {
			this[m].carousel = new ga(this[m], z);
			s.push(this[m].carousel)
		}
		return s.length > 1 ? s : s[0]
	};
	c.fn.carousel.defaults = {
		xmlSource: null,
		width: 500,
		height: 300,
		itemWidth: 100,
		itemHeight: 100,
		horizontalRadius: 250,
		verticalRadius: 100,
		resize: true,
		maintainAspectRatio: true,
		crop: false,
		scaleRatio: 0.5,
		mouseScroll: false,
		scrollOnClick: true,
		mouseDrag: false,
		scrollbar: false,
		arrowScrollAmount: 50,
		tooltip: true,
		mouseScrollEase: 90,
		mouseDragEase: 10,
		scrollbarEase: 10,
		scrollSpeed: 10,
		mouseDragSpeed: 20,
		mouseScrollSpeed: 10,
		mouseScrollSpeedHover: 3,
		mouseWheel: false,
		mouseWheelSpeed: 10,
		mouseScrollReverse: false,
		mouseDragReverse: false,
		mouseWheelReverse: false,
		autoScroll: false,
		autoScrollDirection: "next",
		autoScrollDelay: 3E3,
		pauseAutoScrollIfTooltip: true,
		linkTarget: "_blank",
		itemSelect: null,
		itemClick: null,
		itemMouseOver: null,
		itemMouseOut: null,
		scrollStart: null,
		scrollComplete: null
	}
})(jQuery);