/*
 * 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(g) {
	var q = {
		vertical : !1,
		rtl : !1,
		start : 1,
		offset : 1,
		size : null,
		scroll : 3,
		visible : null,
		animation : "normal",
		easing : "swing",
		auto : 0,
		wrap : null,
		initCallback : null,
		setupCallback : null,
		reloadCallback : null,
		itemLoadCallback : null,
		itemFirstInCallback : null,
		itemFirstOutCallback : null,
		itemLastInCallback : null,
		itemLastOutCallback : null,
		itemVisibleInCallback : null,
		itemVisibleOutCallback : null,
		animationStepCallback : null,
		buttonNextHTML : "<div></div>",
		buttonPrevHTML : "<div></div>",
		buttonNextEvent : "click",
		buttonPrevEvent : "click",
		buttonNextCallback : null,
		buttonPrevCallback : null,
		itemFallbackDimension : null
	}, m = !1;
	g(window).bind("load.jcarousel", function() {
		m = !0
	});
	g.jcarousel = function(a, c) {
		this.options = g.extend({}, q, c || {});
		this.autoStopped = this.locked = !1;
		this.buttonPrevState = this.buttonNextState = this.buttonPrev = this.buttonNext = this.list = this.clip = this.container = null;
		if(!c || c.rtl ===
			void 0)
			this.options.rtl = (g(a).attr("dir") || g("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) {
			g(a).removeClass(d[f]);
			b = d[f];
			break
		}a.nodeName.toUpperCase() == "UL" || a.nodeName.toUpperCase() == "OL" ? (this.list = g(a), this.clip = this.list.parents(".jcarousel-clip"), this.container = this.list.parents(".jcarousel-container")) : (this.container = g(a), this.list = this.container.find("ul,ol").eq(0), this.clip = this.container.find(".jcarousel-clip"));
		if(this.clip.size() === 0)
			this.clip = this.list.wrap("<div></div>").parent();
		if(this.container.size() === 0)
			this.container = this.clip.wrap("<div></div>").parent();
		b !== "" && this.container.parent()[0].className.indexOf("jcarousel-skin") == -1 && this.container.wrap('<div class=" ' + b + '"></div>');
		this.buttonPrev = g(".jcarousel-prev", this.container);
		if(this.buttonPrev.size() === 0 && this.options.buttonPrevHTML !== null)
			this.buttonPrev = g(this.options.buttonPrevHTML).appendTo(this.container);
		this.buttonPrev.addClass(this.className("jcarousel-prev"));
		this.buttonNext = g(".jcarousel-next", this.container);
		if(this.buttonNext.size() === 0 && this.options.buttonNextHTML !== null)
			this.buttonNext = g(this.options.buttonNextHTML).appendTo(this.container);
		this.buttonNext.addClass(this.className("jcarousel-next"));
		this.clip.addClass(this.className("jcarousel-clip")).css({
			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"), e = this;
		if(b.size() > 0) {
			var h = 0, i = this.options.offset;
			b.each(function() {
				e.format(this, i++);
				h += e.dimension(this, j)
			});
			this.list.css(this.wh, h + 100 + "px");
			if(!c || c.size ===
				void 0)
				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.resizeTimer && clearTimeout(e.resizeTimer);
			e.resizeTimer = setTimeout(function() {
				e.reload()
			}, 100)
		};
		this.options.initCallback !== null && this.options.initCallback(this, "init");
		!m && g.browser.safari ? (this.buttons(!1, !1), g(window).bind("load.jcarousel", function() {
			e.setup()
		})) : this.setup()
	};
	var f = g.jcarousel;
	f.fn = f.prototype = {
		jcarousel : "0.2.8"
	};
	f.fn.extend = f.extend = g.extend;
	f.fn.extend({
		setup : function() {
			this.prevLast = this.prevFirst = this.last = this.first = null;
			this.animating = !1;
			this.tail = this.resizeTimer = this.timer = null;
			this.inTail = !1;
			if(!this.locked) {
				this.list.css(this.lt, this.pos(this.options.offset) + "px");
				var a = this.pos(this.options.start, !0);
				this.prevFirst = this.prevLast = null;
				this.animate(a, !1);
				g(window).unbind("resize.jcarousel", this.funcResize).bind("resize.jcarousel", this.funcResize);
				this.options.setupCallback !== null && this.options.setupCallback(this)
			}
		},
		reset : function() {
			this.list.empty();
			this.list.css(this.lt, "0px");
			this.list.css(this.wh, "10px");
			this.options.initCallback !== null && this.options.initCallback(this, "reset");
			this.setup()
		},
		reload : function() {this.tail !== null && this.inTail && this.list.css(this.lt, f.intval(this.list.css(this.lt)) + this.tail);
			this.tail = null;
			this.inTail = !1;
			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);
					f + 1 < a.first && ( d = b)
				});
				this.list.css(this.wh, b + "px");
				this.list.css(this.lt, -d + "px")
			}
			this.scroll(this.first, !1)
		},
		lock : function() {
			this.locked = !0;
			this.buttons()
		},
		unlock : function() {
			this.locked = !1;
			this.buttons()
		},
		size : function(a) {
			if(a !==
				void 0)
				this.options.size = a, this.locked || this.buttons()
			return this.options.size
		},
		has : function(a, c) {
			if(c ===
				void 0 || !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 !1
			}
			return !0
		},
		get : function(a) {
			return g(">.jcarousel-item-" + a, this.list)
		},
		add : function(a, c) {
			var b = this.get(a), d = 0, p = g(c);
			if(b.length === 0)
				for(var j, e = f.intval(a), b = this.create(a); ; ) {
					if( j = this.get(--e), e <= 0 || j.length) {e <= 0 ? this.list.prepend(b) : j.after(b);
						break
					}
				}
			else
				d = this.dimension(b);
			p.get(0).nodeName.toUpperCase() == "LI" ? (b.replaceWith(p), b = p) : b.empty().append(c);
			this.format(b.removeClass(this.className("jcarousel-item-placeholder")), a);
			p = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null;
			d = this.dimension(b, p) - d;
			a > 0 && a < this.first && this.list.css(this.lt, f.intval(this.list.css(this.lt)) - d + "px");
			this.list.css(this.wh, f.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, f.intval(this.list.css(this.lt)) + b + "px");
				c.remove();
				this.list.css(this.wh, f.intval(this.list.css(this.wh)) - b + "px")
			}
		},
		next : function() {this.tail !== null && !this.inTail ? this.scrollTail(!1) : 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(!0) : 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 = f.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) {!this.locked && !this.animating && (this.pauseAuto(), this.animate(this.pos(a), c))
		},
		pos : function(a, c) {
			var b = f.intval(this.list.css(this.lt));
			if(this.locked || this.animating)
				return b;
			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, g = this.options.wrap != "circular" && this.first <= 1 ? 1 : this.first, j = d ? this.get(g) : this.get(this.last), e = d ? g : g - 1, h = null, i = 0, k = !1, l = 0; d ? --e >= a : ++e < a; ) {
				h = this.get(e);
				k = !h.length;
				if(h.length === 0 && ( h = this.create(e).addClass(this.className("jcarousel-item-placeholder")), j[d?"before":"after"](h), this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size)))
					j = this.get(this.index(e)), j.length && ( h = this.add(e, j.clone(!0)))
				j = h;
				l = this.dimension(h);
				k && (i += l);
				if(this.first !== null && (this.options.wrap == "circular" || e >= 1 && (this.options.size === null || e <= this.options.size)))
					b = d ? b + l : b - l
			}
			for(var g = this.clipping(), m = [], o = 0, n = 0, j = this.get(a - 1), e = a; ++o; ) {
				h = this.get(e);
				k = !h.length;
				if(h.length === 0) {
					h = this.create(e).addClass(this.className("jcarousel-item-placeholder"));
					if(j.length === 0)
						this.list.prepend(h);
					else
						j[d?"before":"after"](h);
					if(this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size))
						j = this.get(this.index(e)), j.length && ( h = this.add(e, j.clone(!0)))
				}
				j = h;
				l = this.dimension(h);
				if(l === 0)
					throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
				this.options.wrap != "circular" && this.options.size !== null && e > this.options.size ? m.push(h) : k && (i += l);
				n += l;
				if(n >= g)
					break;
				e++
			}
			for( h = 0; h < m.length; h++)
			m[h].remove();
			i > 0 && (this.list.css(this.wh, this.dimension(this.list) + i + "px"), d && (b -= i, this.list.css(this.lt, f.intval(this.list.css(this.lt)) - i + "px")));
			i = a + o - 1;
			if(this.options.wrap != "circular" && this.options.size && i > this.options.size)
				i = this.options.size;
			if(e > i) {
				o = 0;
				e = i;
				for( n = 0; ++o; ) {
					h = this.get(e--);
					if(!h.length)
						break;
					n += this.dimension(h);
					if(n >= g)
						break
				}
			}
			e = i - o + 1;
			this.options.wrap != "circular" && e < 1 && ( e = 1);
			if(this.inTail && d)
				b += this.tail, this.inTail = !1
			this.tail = null;
			if(this.options.wrap != "circular" && i == this.options.size && i - o + 1 >= 1 && ( d = f.intval(this.get(i).css(!this.options.vertical ? "marginRight" : "marginBottom")), n - d > g))
				this.tail = n - g - d;
			if(c && a === this.options.size && this.tail)
				b -= this.tail, this.inTail = !0
			for(; a-- > e; )
			b += this.dimension(this.get(a));
			this.prevFirst = this.first;
			this.prevLast = this.last;
			this.first = e;
			this.last = i;
			return b
		},
		animate : function(a, c) {
			if(!this.locked && !this.animating) {
				this.animating = !0;
				var b = this, d = function() {
					b.animating = !1;
					a === 0 && b.list.css(b.lt, 0);
					!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 c = b.prevFirst; c <= b.prevLast; c++)c !== null && !(c >= b.first && c <= b.last) && (c < 1 || c > b.options.size) && b.remove(c)
				};
				this.notify("onBeforeAnimation");
				if(!this.options.animation || c === !1)
					this.list.css(this.lt, a + "px"), d()
				else {
					var f = !this.options.vertical ? this.options.rtl ? {
						right : a
					} : {
						left : a
					} : {
						top : a
					}, d = {
						duration : this.options.animation,
						easing : this.options.easing,
						complete : d
					};
					if(g.isFunction(this.options.animationStepCallback))
						d.step = this.options.animationStepCallback;
					this.list.animate(f, d)
				}
			}
		},
		startAuto : function(a) {
			if(a !==
				void 0)
				this.options.auto = a;
			if(this.options.auto === 0)
				return this.stopAuto();
			if(this.timer === null) {
				this.autoStopped = !1;
				var c = this;
				this.timer = window.setTimeout(function() {
					c.next()
				}, this.options.auto * 1E3)
			}
		},
		stopAuto : function() {
			this.pauseAuto();
			this.autoStopped = !0
		},
		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), !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), !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;
			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 ? !1 : !0), this.options.buttonNextCallback !== null && this.buttonNext.data("jcarouselstate") != a && this.buttonNext.each(function() {
				b.options.buttonNextCallback(b, this, a)
			}).data("jcarouselstate", a)) : this.options.buttonNextCallback !== null && this.buttonNextState != a && this.options.buttonNextCallback(b, null, a);
			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 ? !1 : !0), this.options.buttonPrevCallback !== null && this.buttonPrev.data("jcarouselstate") != c && this.buttonPrev.each(function() {
				b.options.buttonPrevCallback(b, this, c)
			}).data("jcarouselstate", c)) : 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);
			this.prevFirst !== this.first && (this.callback("itemFirstInCallback", a, c, this.first), this.callback("itemFirstOutCallback", a, c, this.prevFirst));
			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 h = typeof this.options[a] == "object" ? this.options[a][c] : this.options[a];
				if(g.isFunction(h)) {
					var i = this;
					if(d ===
						void 0)
						h(i, b, c);
					else if(f ===
						void 0)
						this.get(d).each(function() {h(i, this, d, b, c)
						});
					else
						for(var a = function(a) {
							i.get(a).each(function() {h(i, this, a, b, c)
							})
						}, k = d; k <= f; k++)k !== null && !(k >= j && k <= e) && a(k)
				}
			}
		},
		create : function(a) {
			return this.format("<li></li>", a)
		},
		format : function(a, c) {
			for(var a = g(a), 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 = g(a);
			if(c == null)
				return !this.options.vertical ? b.outerWidth(!0) || f.intval(this.options.itemFallbackDimension) : b.outerHeight(!0) || f.intval(this.options.itemFallbackDimension);
			else {
				var d = !this.options.vertical ? c - f.intval(b.css("marginLeft")) - f.intval(b.css("marginRight")) : c - f.intval(b.css("marginTop")) - f.intval(b.css("marginBottom"));
				g(b).css(this.wh, d + "px");
				return this.dimension(b)
			}
		},
		clipping : function() {
			return !this.options.vertical ? this.clip[0].offsetWidth - f.intval(this.clip.css("borderLeftWidth")) - f.intval(this.clip.css("borderRightWidth")) : this.clip[0].offsetHeight - f.intval(this.clip.css("borderTopWidth")) - f.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
		}
	});
	f.extend({
		defaults : function(a) {
			return g.extend(q, a || {})
		},
		intval : function(a) {
			a = parseInt(a, 10);
			return isNaN(a) ? 0 : a
		},
		windowLoaded : function() {
			m = !0
		}
	});
	g.fn.jcarousel = function(a) {
		if( typeof a == "string") {
			var c = g(this).data("jcarousel"), b = Array.prototype.slice.call(arguments, 1);
			return c[a].apply(c, b)
		} else
			return this.each(function() {
				var b = g(this).data("jcarousel");
				b ? (a && g.extend(b.options, a), b.reload()) : g(this).data("jcarousel", new f(this, a))
			})
	}
})(jQuery);

/*  10/11/2011
 PikaChoose
 Jquery plugin for photo galleries
 Copyright (C) 2011 Jeremy Fry

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
(function($) {
	var bttNext = false;
	var bttPrev = false;
	var prevCur = 0;
	var defaults = {
		autoPlay : false,
		speed : 5000,
		text : {
			play : "",
			stop : "",
			previous : "",
			next : ""
		},
		transition : [1],
		showCaption : true,
		IESafe : false,
		showTooltips : false,
		carousel : false,
		carouselVertical : false,
		animationFinished : null,
		buildFinished : null,
		bindFinished : null,
		startOn : 0,
		thumbOpacity : 0.4,
		hoverPause : false,
		animationSpeed : 600,
		fadeThumbsIn : false,
		carouselOptions : {}
	};
	$.fn.PikaChoose = function(o) {
		return this.each(function() {
			$(this).data('pikachoose', new $pc(this, o))
		})
	};
	$.PikaChoose = function(e, o) {
		this.options = $.extend({}, defaults, o || {});
		this.list = null;
		this.image = null;
		this.anchor = null;
		this.caption = null;
		this.imgNav = null;
		this.imgPlay = null;
		this.imgPrev = null;
		this.imgNext = null;
		this.textNext = null;
		this.textPrev = null;
		this.previous = null;
		this.next = null;
		this.aniWrap = null;
		this.aniDiv = null;
		this.aniImg = null;
		this.thumbs = null;
		this.transition = null;
		this.active = null;
		this.tooltip = null;
		this.animating = false;
		this.stillOut = null;
		this.counter = null;
		this.timeOut = null;
		if( typeof (this.options.data) != "undefined") {
			e = $("<ul></ul>").appendTo(e);
			$.each(this.options.data, function() {
				if( typeof (this.link) != "undefined") {
					var tmp = $("<li><a href='" + this.link + "'><img></a></li>").appendTo(e);
					if( typeof (this.title) != "undefined") {
						tmp.find('a').attr('title', this.title)
					}
				} else {
					var tmp = $("<li><img></li>").appendTo(e)
				}
				if( typeof (this.caption) != "undefined") {
					tmp.append("<span>" + this.caption + "</span>")
				}
				if( typeof (this.thumbnail) != "undefined") {
					tmp.find('img').attr('ref', this.image);
					tmp.find('img').attr('src', this.thumbnail)
				} else {
					tmp.find('img').attr('src', this.image)
				}
			})
		}
		if(e.nodeName.toUpperCase() == 'UL' || e.nodeName.toUpperCase() == 'OL' || e instanceof jQuery) {
			this.list = $(e);
			this.list.hide();
			this.build();
			this.bindEvents()
		} else {
			return
		}
		var y = 0;
		var x = 0;
		for(var t = 0; t < 25; t++) {
			var a = '<div col="' + y + '" row="' + x + '"></div>';
			this.aniDiv.append(a);
			y++;
			if(y == 5) {
				x++;
				y = 0
			}
		}
	};
	var $pc = $.PikaChoose;
	$pc.fn = $pc.prototype = {
		pikachoose : '4.3.5'
	};
	$.fn.pikachoose = $.fn.PikaChoose;
	$pc.fn.extend = $pc.extend = $.extend;
	$pc.fn.extend({
		build : function() {
			this.step = 0;
			this.wrap = $("<div class='pika-stage'></div>").insertBefore(this.list);
			this.image = $("<img>").appendTo(this.wrap);
			this.imgNav = $("<div class='pika-imgnav'></div>").insertAfter(this.image);
			this.imgPlay = $("<a></a>").appendTo(this.imgNav);
			this.counter = $("<span class='pika-counter'></span>").appendTo(this.imgNav);
			if(this.options.autoPlay) {
				this.imgPlay.addClass('pause')
			} else {
				this.imgPlay.addClass('play')
			}
			this.imgPrev = $("<a class='previous'></a>").insertAfter(this.imgPlay);
			this.imgNext = $("<a class='next'></a>").insertAfter(this.imgPrev);
			this.caption = $("<div class='caption'></div>").insertAfter(this.imgNav).hide();
			this.tooltip = $("<div class='pika-tooltip'></div>").insertAfter(this.list).hide();
			this.aniWrap = $("<div class='pika-aniwrap'></div>").insertAfter(this.caption);
			this.aniImg = $("<img>").appendTo(this.aniWrap).hide();
			this.aniDiv = $("<div class='pika-ani'></div>").appendTo(this.aniWrap);
			this.textNav = $("<div class='pika-textnav'></div>").insertAfter(this.aniWrap);
			this.textPrev = $("<a class='previous'>" + this.options.text.previous + "</a>").appendTo(this.textNav);
			this.textNext = $("<a class='next'>" + this.options.text.next + "</a>").appendTo(this.textNav);
			this.list.addClass('pika-thumbs');
			this.list.children('li').wrapInner("<div class='clip' />");
			this.thumbs = this.list.find('img');
			this.active = this.thumbs.eq(this.options.startOn);
			this.finishAnimating({
				'source' : this.active.attr('ref') || this.active.attr('src'),
				'caption' : this.active.parents('li:first').find('span:first').html(),
				'clickThrough' : this.active.parent().attr('href') || "",
				'clickThroughTitle' : this.active.parent().attr('title') || ""
			});
			var self = this;
			this.thumbs.each(function() {
				self.createThumb($(this), self)
			});
			if(this.options.fadeThumbsIn) {
				this.list.fadeIn()
			} else {
				this.list.show()
			}
			if(this.options.carousel) {
				var carouselDefaults = {
					vertical : this.options.carouselVertical,
					initCallback : function(carousel) {
						jQuery(carousel.list).find('img').click(function(e, x) {
							if( typeof (x) !== 'undefined' && x.how == "auto") {
								if(self.options.autoPlay == false) {
									return false
								}
							}
							var clicked = parseInt(jQuery(this).parents('.jcarousel-item').attr('jcarouselindex'));
							var last = (jQuery(this).parents('ul').find('li:last').attr('jcarouselindex') == clicked - 1) ? true : false;
							if(!last) {
								clicked = (clicked - 2 <= 0) ? 0 : clicked - 2
							}
							clicked++;
							carousel.scroll(clicked)
						})
					}
				};
				var carouselOptions = $.extend({}, carouselDefaults, this.options.carouselOptions || {});
				this.list.jcarousel(carouselOptions)
			}
			if( typeof (this.options.buildFinished) == 'function') {
				this.options.buildFinished(this)
			}
		},
		createThumb : function(ele) {
			var self = ele;
			var that = this;
			self.hide();
			$.data(ele[0], 'clickThrough', self.parent('a').attr('href') || "");
			$.data(ele[0], 'clickThroughTitle', self.parent('a').attr('title') || "");
			if(self.parent('a').length > 0) {
				self.unwrap()
			}
			$.data(ele[0], 'caption', self.next('span').html() || "");
			self.next('span').remove();
			$.data(ele[0], 'source', self.attr('ref') || self.attr('src'));
			$.data(ele[0], 'order', self.closest('ul').find('li').index(self.parents('li')));
			var data = $.data(ele[0]);
			$('<img />').bind('load', {
				data : data
			}, function() {
				if( typeof (that.options.buildThumbStart) == 'function') {
					that.options.buildThumbStart(that)
				}
				var img = $(this);
				var w = this.width;
				var h = this.height;
				if(w === 0) {
					w = img.attr("width")
				}
				if(h === 0) {
					h = img.attr("height")
				}
				var ph = parseInt(self.parents('.clip').css('height').slice(0, -2));
				var pw = parseInt(self.parents('.clip').css('width').slice(0, -2));
				if(pw == 0) {
					pw = self.parents('li:first').outerWidth();
				}
				if(ph == 0) {
					ph = self.parents('li:first').outerHeight()
				}
				var rw = pw / w;
				var rh = ph / h;
				var ratio;
				if(rw < rh) {
					ratio = rh;
					var left = ((w * ratio - pw) / 2) * -1;
					left = Math.round(left);
					self.css({
						left : left
					})
				} else {
					ratio = rw;
					self.css({
						top : 0
					})
				}
				var width = Math.round(w * ratio);
				var height = Math.round(h * ratio);
				self.css("position", "relative");
				var imgcss = {
					width : width + "px",
					height : height + "px"
				};
				self.css(imgcss);
				self.hover(function(e) {clearTimeout(that.stillOut);
					$(this).stop(true, true).fadeTo(250, 1);
					if(!that.options.showTooltips) {
						return
					}
					that.tooltip.show().stop(true, true).html(data.caption).animate({
						top : $(this).parent().position().top,
						left : $(this).parent().position().left,
						opacity : 1.0
					}, 'fast')
				}, function(e) {
					if(!$(this).hasClass("active")) {
						$(this).stop(true, true).fadeTo(250, that.options.thumbOpacity);
						that.stillOut = setTimeout(that.hideTooltip, 700)
					}
				});
				if(data.order == that.options.startOn) {
					self.fadeTo(250, 1);
					self.addClass('active');
					self.parents('li').eq(0).addClass('active')
				} else {
					self.fadeTo(250, that.options.thumbOpacity)
				}
				if( typeof (that.options.buildThumbFinish) == 'function') {
					that.options.buildThumbFinish(that)
				}
			}).attr('src', self.attr('src'))
		},
		bindEvents : function() {
			this.thumbs.bind('click', {
				self : this
			}, this.imgClick);
			this.imgNext.bind('click', {
				self : this
			}, this.nextClick);
			this.textNext.bind('click', {
				self : this
			}, this.nextClick);
			this.imgPrev.bind('click', {
				self : this
			}, this.prevClick);
			this.textPrev.bind('click', {
				self : this
			}, this.prevClick);
			this.imgPlay.bind('click', {
				self : this
			}, this.playClick);
			this.wrap.bind('mouseenter', {
				self : this
			}, function(e) {
				e.data.self.imgNav.stop(true, true).fadeIn('slow');
				if(e.data.self.options.hoverPause == true) {clearTimeout(e.data.self.timeOut)
				}
			});
			this.wrap.bind('mouseleave', {
				self : this
			}, function(e) {
				e.data.self.imgNav.stop(true, true).fadeOut('slow');
				if(e.data.self.options.autoPlay == true && e.data.self.options.hoverPause) {
					e.data.self.timeOut = setTimeout((function(self) {
						return function() {
							self.nextClick()
						}
					})(e.data.self), e.data.self.options.speed)
				}
			});
			this.tooltip.bind('mouseenter', {
				self : this
			}, function(e) {clearTimeout(e.data.self.stillOut)
			});
			this.tooltip.bind('mouseleave', {
				self : this
			}, function(e) {
				e.data.self.stillOut = setTimeout(e.data.self.hideTooltip, 700)
			});
			if( typeof (this.options.bindsFinished) == 'function') {
				this.options.bindsFinished(this)
			}
		},
		hideTooltip : function(e) {
			$(".pika-tooltip").animate({
				opacity : 0.01
			})
		},
		imgClick : function(e, x) {
			var self = e.data.self;
			var data = $.data(this);
			if(self.animating) {
				return
			}
			if( typeof (x) == 'undefined' || x.how != "auto") {
				if(self.options.autoPlay) {
					self.imgPlay.trigger('click')
				}
			} else {
				if(self.options.autoPlay == false) {
					return false
				}
			}
			self.caption.fadeOut('slow');
			self.animating = true;
			self.active.fadeTo(300, self.options.thumbOpacity).removeClass('active');
			self.active.parents('.active').eq(0).removeClass('active');
			self.active = $(this);
			self.active.addClass('active').fadeTo(200, 1);
			self.active.parents('li').eq(0).addClass('active');
			$('<img />').bind('load', {
				self : self,
				data : data
			}, function() {
				self.aniDiv.css({
					height : self.image.height(),
					width : self.image.width()
				}).fadeIn('fast');
				self.aniDiv.children('div').css({
					'width' : '20%',
					'height' : '20%',
					'float' : 'left'
				});
				var n = 0;
				if(self.options.transition[0] == -1) {
					n = Math.floor(Math.random() * 7) + 1
				} else {
					n = self.options.transition[self.step];
					self.step++;
					if(self.step >= self.options.transition.length) {
						self.step = 0
					}
				}
				if(self.options.IESafe && $.browser.msie) {
					n = 1
				}

				self.doAnimation(n, data)
			}).attr('src', $.data(this).source)
		},
		doAnimation : function(n, data) {

				var self = this;
				var cur = this.list.find('img').index(this.active);
				var total = this.list.find('img').length;
				var last = total - 1;
				if(cur == 0 && prevCur == last){
					bttNext = true;
				}else{
					if(cur == last && prevCur == 0){
						bttPrev = true;
					}else{
						if(cur < prevCur){
							bttPrev = true;
						}else{
							if(cur > prevCur){
							bttNext = true;
							}else{
								self.finishAnimating(data);
								return;
							}						
						}
					}
				}
				prevCur = cur;
				cur++;
				this.counter.html(cur + "/" + total);
			
			self.image.stop(true, false);
			self.caption.stop().fadeOut();
			var aWidth = self.aniDiv.children('div').eq(0).width();
			var aHeight = self.aniDiv.children('div').eq(0).height();
			var img = new Image();
			$(img).attr('src', data.source);
			if(img.height != self.image.height() || img.width != self.image.width()) {
				if(n != 0 && n != 1 && n != 7) {
					n = 0;
				}
			}
			self.aniDiv.css({
				height : img.height,
				width : img.width
			});
			self.aniDiv.children().each(function() {
				var div = $(this);
				var xOffset = Math.floor(div.parent().width() / 5) * div.attr('col');
				var yOffset = Math.floor(div.parent().height() / 5) * div.attr('row');
				div.css({
					'background' : 'url(' + data.source + ') -' + xOffset + 'px -' + yOffset + 'px',
					'width' : '0px',
					'height' : '0px',
					'position' : 'absolute',
					'top' : yOffset + 'px',
					'left' : xOffset + 'px',
					'float' : 'none'
				})
			});
			self.aniDiv.hide();
			self.aniImg.hide();

			
			switch(n) {
				case 0:
					self.image.stop(true, true).fadeOut(self.options.animationSpeed, function() {
						self.image.attr('src', data.source).fadeIn(self.options.animationSpeed, function() {
							self.finishAnimating(data)
						})
					});
					break;
				case 1:
					self.aniDiv.hide();
					self.aniImg.height(self.image.height()).hide().attr('src', data.source);
					$.when(self.image.fadeOut(self.options.animationSpeed), self.aniImg.eq(0).fadeIn(self.options.animationSpeed)).done(function() {
						self.finishAnimating(data)
					});
					break;
				case 2:
					self.aniDiv.show().children().hide().each(function(index) {
						var delay = index * 30;
						$(this).css({
							opacity : 0.1
						}).show().delay(delay).animate({
							opacity : 1,
							"width" : aWidth,
							"height" : aHeight
						}, 200, 'linear', function() {
							if(self.aniDiv.find("div").index(this) == 24) {
								self.finishAnimating(data)
							}
						})
					});
					break;
				case 3:
					self.aniDiv.show().children("div:lt(5)").hide().each(function(index) {
						var delay = $(this).attr('col') * 100;
						$(this).css({
							opacity : 0.1,
							"width" : aWidth
						}).show().delay(delay).animate({
							opacity : 1,
							"height" : self.image.height()
						}, self.options.animationSpeed, 'linear', function() {
							if(self.aniDiv.find(" div").index(this) == 4) {
								self.finishAnimating(data)
							}
						})
					});
					break;
				case 4:
					self.aniDiv.show().children().hide().each(function(index) {
						if(index > 4) {
							return
						}
						var delay = $(this).attr('col') * 10;
						aHeight = self.gapper($(this), aHeight);
						$(this).css({
							opacity : 0.1,
							"height" : "100%"
						}).show().animate({
							opacity : 1,
							"width" : aWidth
						}, self.options.animationSpeed, 'linear', function() {
							if(self.aniDiv.find(" div").index(this) == 4) {
								self.finishAnimating(data)
							}
						})
					});
					break;
				case 5:
					self.aniDiv.show().children().show().each(function(index) {
						var delay = index * Math.floor(Math.random() * 5) * 7;
						aHeight = self.gapper($(this), aHeight);
						if($(".animation div").index(this) == 24) {
							delay = 600
						}
						$(this).css({
							"height" : aHeight,
							"width" : aWidth,
							"opacity" : .01
						}).delay(delay).animate({
							"opacity" : 1
						}, self.options.animationSpeed, function() {
							if(self.aniDiv.find(" div").index(this) == 24) {
								self.finishAnimating(data)
							}
						})
					});
					break;
				case 6:
					self.aniDiv.height(self.image.height()).hide().css({
						'background' : 'url(' + data.source + ') top left no-repeat'
					});
					self.aniDiv.children('div').hide();
					self.aniDiv.css({
						width : 0
					}).show().animate({
						width : self.image.width()
					}, self.options.animationSpeed, function() {
						self.finishAnimating(data);
						self.aniDiv.css({
							'background' : 'transparent'
						})
					});
					break;
				case 7:
					var mns = "-";
					if(bttNext == true){
						var mnsN = mns;
						var mnsP = '';
					}else{
						if(bttPrev == true){
							var mnsP = mns;
							var mnsN = '';
						}else{
							var mnsN = mns;
							var mnsP = '';
						}
					}
					bttNext = false;
					bttPrev = false;
					self.wrap.css({
						overflow : 'hidden'
					});
					self.aniImg.height(self.image.height()).hide().attr('src', data.source);
					self.aniDiv.hide();
					self.image.css({
						position : 'relative'
					}).animate({
						left : mnsN + self.wrap.outerWidth() + "px"
					});
					self.aniImg.show();
					self.aniWrap.css({
						left : mnsP + self.wrap.outerWidth() + "px"
					}).show().animate({
						left : "0px"
					}, self.options.animationSpeed, function() {
						self.finishAnimating(data)
					});
					break
			}
		},
		finishAnimating : function(data) {
			this.animating = false;
			this.image.attr('src', data.source);
			this.image.css({
				left : "0",
				border : "none"
			});
			this.image.show();
			var self = this;
			$('<img />').bind('load', function() {
				self.aniImg.hide();
				self.aniDiv.hide()
			}).attr('src', data.source);
			var cur = this.list.find('img').index(this.active);
			cur++;
			var total = this.list.find('img').length;
			this.counter.html(cur + "/" + total);
			if(data.clickThrough != "") {
				if(this.anchor == null) {
					this.anchor = this.image.wrap("<a>").parent()
				}
				this.anchor.attr('href', data.clickThrough);
				this.anchor.attr('title', data.clickThroughTitle)
			} else {
				if(this.image.parent('a').length > 0) {
					this.image.unwrap()
				}
				this.anchor = null
			}
			if(this.options.showCaption && data.caption != "" && data.caption != null) {
				this.caption.html(data.caption).fadeTo('slow', 1)
			}
			if(this.options.autoPlay == true) {
				var self = this;
				this.timeOut = setTimeout((function(self) {
					return function() {
						self.nextClick()
					}
				})(this), this.options.speed, this.timeOut)
			}
			if( typeof (this.options.animationFinished) == 'function') {
				this.options.animationFinished(this)
			}
		},
		gapper : function(ele, aHeight) {
			if(ele.attr('row') == 9 && ele.attr('col') == 0) {
				var gap = ani_divs.height() - (aHeight * 9);
				return gap
			}
			return aHeight
		},
		nextClick : function(e) {
			var how = "natural";
			try {
				var self = e.data.self;
				if( typeof (e.data.self.options.next) == 'function') {
					e.data.self.options.next(this)
				}
			} catch(err) {
				var self = this;
				how = "auto"
			}
			var next = self.active.parents('li:first').next().find('img');
			if(next.length == 0) {
				next = self.list.find('img').eq(0)
			};
			next.trigger('click', {
				how : how
			})
		},
		prevClick : function(e) {
			if( typeof (e.data.self.options.previous) == 'function') {
				e.data.self.options.previous(this)
			}
			var self = e.data.self;
			var prev = self.active.parents('li:first').prev().find('img');
			if(prev.length == 0) {
				prev = self.list.find('img:last')
			};
			prev.trigger('click')
		},
		playClick : function(e) {
			var self = e.data.self;
			self.options.autoPlay = !self.options.autoPlay;
			self.imgPlay.toggleClass('play').toggleClass('pause');
			if(self.options.autoPlay) {
				self.nextClick()
			}
		}
	})
})(jQuery);

