
/*!
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */
(function (i) {
	var q = {vertical:false, rtl:false, start:1, offset:1, size:null, scroll:1, visible:null, animation:"normal", easing:"swing", auto:0, wrap:null, initCallback:null, reloadCallback:null, itemLoadCallback:null, itemFirstInCallback:null, itemFirstOutCallback:null, itemLastInCallback:null, itemLastOutCallback:null, itemVisibleInCallback:null, itemVisibleOutCallback:null, buttonNextHTML:"<div></div>", buttonPrevHTML:"<div></div>", buttonNextEvent:"click", buttonPrevEvent:"click", buttonNextCallback:null, buttonPrevCallback:null, itemFallbackDimension:null}, r = false;
	i(window).bind("load.jcarousel", function () {
		r = true;
	});
	i.jcarousel = function (a, c) {
		this.options = i.extend({}, q, c || {});
		this.autoStopped = this.locked = false;
		this.buttonPrevState = this.buttonNextState = this.buttonPrev = this.buttonNext = this.list = this.clip = this.container = null;
		if (!c || c.rtl === undefined) {
			this.options.rtl = (i(a).attr("dir") || i("html").attr("dir") || "").toLowerCase() == "rtl";
		}
		this.wh = !this.options.vertical ? "width" : "height";
		this.lt = !this.options.vertical ? this.options.rtl ? "right" : "left" : "top";
		for (var b = "", d = a.className.split(" "), f = 0; f < d.length; f++) {
			if (d[f].indexOf("jcarousel-skin") != -1) {
				i(a).removeClass(d[f]);
				b = d[f];
				break;
			}
		}
		if (a.nodeName.toUpperCase() == "UL" || a.nodeName.toUpperCase() == "OL") {
			this.list = i(a);
			this.container = this.list.parent();
			if (this.container.hasClass("jcarousel-clip")) {
				if (!this.container.parent().hasClass("jcarousel-container")) {
					this.container = this.container.wrap("<div></div>");
				}
				this.container = this.container.parent();
			} else {
				if (!this.container.hasClass("jcarousel-container")) {
					this.container = this.list.wrap("<div></div>").parent();
				}
			}
		} else {
			this.container = i(a);
			this.list = this.container.find("ul,ol").eq(0);
		}
		b !== "" && this.container.parent()[0].className.indexOf("jcarousel-skin") == -1 && this.container.wrap("<div class=\" " + b + "\"></div>");
		this.clip = this.list.parent();
		if (!this.clip.length || !this.clip.hasClass("jcarousel-clip")) {
			this.clip = this.list.wrap("<div></div>").parent();
		}
		this.buttonNext = i(".jcarousel-next", this.container);
		if (this.buttonNext.size() === 0 && this.options.buttonNextHTML !== null) {
			this.buttonNext = this.clip.after(this.options.buttonNextHTML).next();
		}
		this.buttonNext.addClass(this.className("jcarousel-next"));
		this.buttonPrev = i(".jcarousel-prev", this.container);
		if (this.buttonPrev.size() === 0 && this.options.buttonPrevHTML !== null) {
			this.buttonPrev = this.clip.after(this.options.buttonPrevHTML).next();
		}
		this.buttonPrev.addClass(this.className("jcarousel-prev"));
		this.clip.addClass(this.className("jcarousel-clip")).css({overflow:"hidden", position:"relative"});
		this.list.addClass(this.className("jcarousel-list")).css({overflow:"hidden", position:"relative", top:0, margin:0, padding:0}).css(this.options.rtl ? "right" : "left", 0);
		this.container.addClass(this.className("jcarousel-container")).css({position:"relative"});
		!this.options.vertical && this.options.rtl && this.container.addClass("jcarousel-direction-rtl").attr("dir", "rtl");
		var j = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null;
		b = this.list.children("li");
		var e = this;
		if (b.size() > 0) {
			var g = 0, k = this.options.offset;
			b.each(function () {
				e.format(this, k++);
				g += e.dimension(this, j);
			});
			this.list.css(this.wh, g + 100 + "px");
			if (!c || c.size === undefined) {
				this.options.size = b.size();
			}
		}
		this.container.css("display", "block");
		this.buttonNext.css("display", "block");
		this.buttonPrev.css("display", "block");
		this.funcNext = function () {
			e.next();
		};
		this.funcPrev = function () {
			e.prev();
		};
		this.funcResize = function () {
			e.reload();
		};
		this.options.initCallback !== null && this.options.initCallback(this, "init");
		if (!r && i.browser.safari) {
			this.buttons(false, false);
			i(window).bind("load.jcarousel", function () {
				e.setup();
			});
		} else {
			this.setup();
		}
	};
	var h = i.jcarousel;
	h.fn = h.prototype = {jcarousel:"0.2.7"};
	h.fn.extend = h.extend = i.extend;
	h.fn.extend({setup:function () {
		this.prevLast = this.prevFirst = this.last = this.first = null;
		this.animating = false;
		this.tail = this.timer = null;
		this.inTail = false;
		if (!this.locked) {
			this.list.css(this.lt, this.pos(this.options.offset) + "px");
			var a = this.pos(this.options.start, true);
			this.prevFirst = this.prevLast = null;
			this.animate(a, false);
			i(window).unbind("resize.jcarousel", this.funcResize).bind("resize.jcarousel", this.funcResize);
		}
	}, reset:function () {
		this.list.empty();
		this.list.css(this.lt, "0px");
		this.list.css(this.wh, "0px");
		this.options.initCallback !== null && this.options.initCallback(this, "reset");
		this.setup();
	}, reload:function () {
		this.tail !== null && this.inTail && this.list.css(this.lt, h.intval(this.list.css(this.lt)) + this.tail);
		this.tail = null;
		this.inTail = false;
		this.options.reloadCallback !== null && this.options.reloadCallback(this);
		if (this.options.visible !== null) {
			var a = this, c = Math.ceil(this.clipping() / this.options.visible), b = 0, d = 0;
			this.list.children("li").each(function (f) {
				b += a.dimension(this, c);
				if (f + 1 < a.first) {
					d = b;
				}
			});
			this.list.css(this.wh, b + "px");
			this.list.css(this.lt, -d + "px");
		}
		this.scroll(this.first, false);
	}, lock:function () {
		this.locked = true;
		this.buttons();
	}, unlock:function () {
		this.locked = false;
		this.buttons();
	}, size:function (a) {
		if (a !== undefined) {
			this.options.size = a;
			this.locked || this.buttons();
		}
		return this.options.size;
	}, has:function (a, c) {
		if (c === undefined || !c) {
			c = a;
		}
		if (this.options.size !== null && c > this.options.size) {
			c = this.options.size;
		}
		for (var b = a; b <= c; b++) {
			var d = this.get(b);
			if (!d.length || d.hasClass("jcarousel-item-placeholder")) {
				return false;
			}
		}
		return true;
	}, get:function (a) {
		return i(".jcarousel-item-" + a, this.list);
	}, add:function (a, c) {
		var b = this.get(a), d = 0, f = i(c);
		if (b.length === 0) {
			var j, e = h.intval(a);
			for (b = this.create(a); ; ) {
				j = this.get(--e);
				if (e <= 0 || j.length) {
					e <= 0 ? this.list.prepend(b) : j.after(b);
					break;
				}
			}
		} else {
			d = this.dimension(b);
		}
		if (f.get(0).nodeName.toUpperCase() == "LI") {
			b.replaceWith(f);
			b = f;
		} else {
			b.empty().append(c);
		}
		this.format(b.removeClass(this.className("jcarousel-item-placeholder")), a);
		f = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null;
		d = this.dimension(b, f) - d;
		a > 0 && a < this.first && this.list.css(this.lt, h.intval(this.list.css(this.lt)) - d + "px");
		this.list.css(this.wh, h.intval(this.list.css(this.wh)) + d + "px");
		return b;
	}, remove:function (a) {
		var c = this.get(a);
		if (!(!c.length || a >= this.first && a <= this.last)) {
			var b = this.dimension(c);
			a < this.first && this.list.css(this.lt, h.intval(this.list.css(this.lt)) + b + "px");
			c.remove();
			this.list.css(this.wh, h.intval(this.list.css(this.wh)) - b + "px");
		}
	}, next:function () {
		this.tail !== null && !this.inTail ? this.scrollTail(false) : this.scroll((this.options.wrap == "both" || this.options.wrap == "last") && this.options.size !== null && this.last == this.options.size ? 1 : this.first + this.options.scroll);
	}, prev:function () {
		this.tail !== null && this.inTail ? this.scrollTail(true) : this.scroll((this.options.wrap == "both" || this.options.wrap == "first") && this.options.size !== null && this.first == 1 ? this.options.size : this.first - this.options.scroll);
	}, scrollTail:function (a) {
		if (!(this.locked || this.animating || !this.tail)) {
			this.pauseAuto();
			var c = h.intval(this.list.css(this.lt));
			c = !a ? c - this.tail : c + this.tail;
			this.inTail = !a;
			this.prevFirst = this.first;
			this.prevLast = this.last;
			this.animate(c);
		}
	}, scroll:function (a, c) {
		if (!(this.locked || this.animating)) {
			this.pauseAuto();
			this.animate(this.pos(a), c);
		}
	}, pos:function (a, c) {
		var b = h.intval(this.list.css(this.lt));
		if (this.locked || this.animating) {
			return b;
		}
		if (this.options.wrap != "circular") {
			a = a < 1 ? 1 : this.options.size && a > this.options.size ? this.options.size : a;
		}
		for (var d = this.first > a, f = this.options.wrap != "circular" && this.first <= 1 ? 1 : this.first, j = d ? this.get(f) : this.get(this.last), e = d ? f : f - 1, g = null, k = 0, l = false, m = 0; d ? --e >= a : ++e < a; ) {
			g = this.get(e);
			l = !g.length;
			if (g.length === 0) {
				g = this.create(e).addClass(this.className("jcarousel-item-placeholder"));
				j[d ? "before" : "after"](g);
				if (this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size)) {
					j = this.get(this.index(e));
					if (j.length) {
						g = this.add(e, j.clone(true));
					}
				}
			}
			j = g;
			m = this.dimension(g);
			if (l) {
				k += m;
			}
			if (this.first !== null && (this.options.wrap == "circular" || e >= 1 && (this.options.size === null || e <= this.options.size))) {
				b = d ? b + m : b - m;
			}
		}
		f = this.clipping();
		var p = [], o = 0, n = 0;
		j = this.get(a - 1);
		for (e = a; ++o; ) {
			g = this.get(e);
			l = !g.length;
			if (g.length === 0) {
				g = this.create(e).addClass(this.className("jcarousel-item-placeholder"));
				j.length === 0 ? this.list.prepend(g) : j[d ? "before" : "after"](g);
				if (this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size)) {
					j = this.get(this.index(e));
					if (j.length) {
						g = this.add(e, j.clone(true));
					}
				}
			}
			j = g;
			m = this.dimension(g);
			if (m === 0) {
				throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
			}
			if (this.options.wrap != "circular" && this.options.size !== null && e > this.options.size) {
				p.push(g);
			} else {
				if (l) {
					k += m;
				}
			}
			n += m;
			if (n >= f) {
				break;
			}
			e++;
		}
		for (g = 0; g < p.length; g++) {
			p[g].remove();
		}
		if (k > 0) {
			this.list.css(this.wh, this.dimension(this.list) + k + "px");
			if (d) {
				b -= k;
				this.list.css(this.lt, h.intval(this.list.css(this.lt)) - k + "px");
			}
		}
		k = a + o - 1;
		if (this.options.wrap != "circular" && this.options.size && k > this.options.size) {
			k = this.options.size;
		}
		if (e > k) {
			o = 0;
			e = k;
			for (n = 0; ++o; ) {
				g = this.get(e--);
				if (!g.length) {
					break;
				}
				n += this.dimension(g);
				if (n >= f) {
					break;
				}
			}
		}
		e = k - o + 1;
		if (this.options.wrap != "circular" && e < 1) {
			e = 1;
		}
		if (this.inTail && d) {
			b += this.tail;
			this.inTail = false;
		}
		this.tail = null;
		if (this.options.wrap != "circular" && k == this.options.size && k - o + 1 >= 1) {
			d = h.margin(this.get(k), !this.options.vertical ? "marginRight" : "marginBottom");
			if (n - d > f) {
				this.tail = n - f - d;
			}
		}
		if (c && a === this.options.size && this.tail) {
			b -= this.tail;
			this.inTail = true;
		}
		for (; a-- > e; ) {
			b += this.dimension(this.get(a));
		}
		this.prevFirst = this.first;
		this.prevLast = this.last;
		this.first = e;
		this.last = k;
		return b;
	}, animate:function (a, c) {
		if (!(this.locked || this.animating)) {
			this.animating = true;
			var b = this, d = function () {
				b.animating = false;
				a === 0 && b.list.css(b.lt, 0);
				if (!b.autoStopped && (b.options.wrap == "circular" || b.options.wrap == "both" || b.options.wrap == "last" || b.options.size === null || b.last < b.options.size || b.last == b.options.size && b.tail !== null && !b.inTail)) {
					b.startAuto();
				}
				b.buttons();
				b.notify("onAfterAnimation");
				if (b.options.wrap == "circular" && b.options.size !== null) {
					for (var f = b.prevFirst; f <= b.prevLast; f++) {
						if (f !== null && !(f >= b.first && f <= b.last) && (f < 1 || f > b.options.size)) {
							b.remove(f);
						}
					}
				}
			};
			this.notify("onBeforeAnimation");
			if (!this.options.animation || c === false) {
				this.list.css(this.lt, a + "px");
				d();
			} else {
				this.list.animate(!this.options.vertical ? this.options.rtl ? {right:a} : {left:a} : {top:a}, this.options.animation, this.options.easing, d);
			}
		}
	}, startAuto:function (a) {
		if (a !== undefined) {
			this.options.auto = a;
		}
		if (this.options.auto === 0) {
			return this.stopAuto();
		}
		if (this.timer === null) {
			this.autoStopped = false;
			var c = this;
			this.timer = window.setTimeout(function () {
				c.next();
			}, this.options.auto * 1000);
		}
	}, stopAuto:function () {
		this.pauseAuto();
		this.autoStopped = true;
	}, pauseAuto:function () {
		if (this.timer !== null) {
			window.clearTimeout(this.timer);
			this.timer = null;
		}
	}, buttons:function (a, c) {
		if (a == null) {
			a = !this.locked && this.options.size !== 0 && (this.options.wrap && this.options.wrap != "first" || this.options.size === null || this.last < this.options.size);
			if (!this.locked && (!this.options.wrap || this.options.wrap == "first") && this.options.size !== null && this.last >= this.options.size) {
				a = this.tail !== null && !this.inTail;
			}
		}
		if (c == null) {
			c = !this.locked && this.options.size !== 0 && (this.options.wrap && this.options.wrap != "last" || this.first > 1);
			if (!this.locked && (!this.options.wrap || this.options.wrap == "last") && this.options.size !== null && this.first == 1) {
				c = this.tail !== null && this.inTail;
			}
		}
		var b = this;
		if (this.buttonNext.size() > 0) {
			this.buttonNext.unbind(this.options.buttonNextEvent + ".jcarousel", this.funcNext);
			a && this.buttonNext.bind(this.options.buttonNextEvent + ".jcarousel", this.funcNext);
			this.buttonNext[a ? "removeClass" : "addClass"](this.className("jcarousel-next-disabled")).attr("disabled", a ? false : true);
			this.options.buttonNextCallback !== null && this.buttonNext.data("jcarouselstate") != a && this.buttonNext.each(function () {
				b.options.buttonNextCallback(b, this, a);
			}).data("jcarouselstate", a);
		} else {
			this.options.buttonNextCallback !== null && this.buttonNextState != a && this.options.buttonNextCallback(b, null, a);
		}
		if (this.buttonPrev.size() > 0) {
			this.buttonPrev.unbind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev);
			c && this.buttonPrev.bind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev);
			this.buttonPrev[c ? "removeClass" : "addClass"](this.className("jcarousel-prev-disabled")).attr("disabled", c ? false : true);
			this.options.buttonPrevCallback !== null && this.buttonPrev.data("jcarouselstate") != c && this.buttonPrev.each(function () {
				b.options.buttonPrevCallback(b, this, c);
			}).data("jcarouselstate", c);
		} else {
			this.options.buttonPrevCallback !== null && this.buttonPrevState != c && this.options.buttonPrevCallback(b, null, c);
		}
		this.buttonNextState = a;
		this.buttonPrevState = c;
	}, notify:function (a) {
		var c = this.prevFirst === null ? "init" : this.prevFirst < this.first ? "next" : "prev";
		this.callback("itemLoadCallback", a, c);
		if (this.prevFirst !== this.first) {
			this.callback("itemFirstInCallback", a, c, this.first);
			this.callback("itemFirstOutCallback", a, c, this.prevFirst);
		}
		if (this.prevLast !== this.last) {
			this.callback("itemLastInCallback", a, c, this.last);
			this.callback("itemLastOutCallback", a, c, this.prevLast);
		}
		this.callback("itemVisibleInCallback", a, c, this.first, this.last, this.prevFirst, this.prevLast);
		this.callback("itemVisibleOutCallback", a, c, this.prevFirst, this.prevLast, this.first, this.last);
	}, callback:function (a, c, b, d, f, j, e) {
		if (!(this.options[a] == null || typeof this.options[a] != "object" && c != "onAfterAnimation")) {
			var g = typeof this.options[a] == "object" ? this.options[a][c] : this.options[a];
			if (i.isFunction(g)) {
				var k = this;
				if (d === undefined) {
					g(k, b, c);
				} else {
					if (f === undefined) {
						this.get(d).each(function () {
							g(k, this, d, b, c);
						});
					} else {
						a = function (m) {
							k.get(m).each(function () {
								g(k, this, m, b, c);
							});
						};
						for (var l = d; l <= f; l++) {
							l !== null && !(l >= j && l <= e) && a(l);
						}
					}
				}
			}
		}
	}, create:function (a) {
		return this.format("<li></li>", a);
	}, format:function (a, c) {
		a = i(a);
		for (var b = a.get(0).className.split(" "), d = 0; d < b.length; d++) {
			b[d].indexOf("jcarousel-") != -1 && a.removeClass(b[d]);
		}
		a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-" + c)).css({"float":this.options.rtl ? "right" : "left", "list-style":"none"}).attr("jcarouselindex", c);
		return a;
	}, className:function (a) {
		return a + " " + a + (!this.options.vertical ? "-horizontal" : "-vertical");
	}, dimension:function (a, c) {
		var b = a.jquery !== undefined ? a[0] : a, d = !this.options.vertical ? (b.offsetWidth || h.intval(this.options.itemFallbackDimension)) + h.margin(b, "marginLeft") + h.margin(b, "marginRight") : (b.offsetHeight || h.intval(this.options.itemFallbackDimension)) + h.margin(b, "marginTop") + h.margin(b, "marginBottom");
		if (c == null || d == c) {
			return d;
		}
		d = !this.options.vertical ? c - h.margin(b, "marginLeft") - h.margin(b, "marginRight") : c - h.margin(b, "marginTop") - h.margin(b, "marginBottom");
		i(b).css(this.wh, d + "px");
		return this.dimension(b);
	}, clipping:function () {
		return !this.options.vertical ? this.clip[0].offsetWidth - h.intval(this.clip.css("borderLeftWidth")) - h.intval(this.clip.css("borderRightWidth")) : this.clip[0].offsetHeight - h.intval(this.clip.css("borderTopWidth")) - h.intval(this.clip.css("borderBottomWidth"));
	}, index:function (a, c) {
		if (c == null) {
			c = this.options.size;
		}
		return Math.round(((a - 1) / c - Math.floor((a - 1) / c)) * c) + 1;
	}});
	h.extend({defaults:function (a) {
		return i.extend(q, a || {});
	}, margin:function (a, c) {
		if (!a) {
			return 0;
		}
		var b = a.jquery !== undefined ? a[0] : a;
		if (c == "marginRight" && i.browser.safari) {
			var d = {display:"block", "float":"none", width:"auto"}, f, j;
			i.swap(b, d, function () {
				f = b.offsetWidth;
			});
			d.marginRight = 0;
			i.swap(b, d, function () {
				j = b.offsetWidth;
			});
			return j - f;
		}
		return h.intval(i.css(b, c));
	}, intval:function (a) {
		a = parseInt(a, 10);
		return isNaN(a) ? 0 : a;
	}});
	i.fn.jcarousel = function (a) {
		if (typeof a == "string") {
			var c = i(this).data("jcarousel"), b = Array.prototype.slice.call(arguments, 1);
			return c[a].apply(c, b);
		} else {
			return this.each(function () {
				i(this).data("jcarousel", new h(this, a));
			});
		}
	};
})(jQuery);


