/*
 * CrossSlide jQuery plugin v0.6.2
 *
 * Copyright 2007-2010 by Tobia Conforto <tobia.conforto@gmail.com>
 *
 * 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 2 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, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
(function() {
	var d = jQuery, a = (d.fn.startAnimation ? "startAnimation" : "animate"), c = "pause plugin missing.";
	function e(h) {
		for ( var g = 1; g < arguments.length; g++) {
			h = h.replace(new RegExp("\\{" + (g - 1) + "}", "g"), arguments[g])
		}
		return h
	}
	function f() {
		arguments[0] = "CrossSlide: " + arguments[0];
		throw new Error(e.apply(null, arguments))
	}
	function b(i) {
		var g = 1;
		var h = i.replace(/^\s*|\s*$/g, "").split(/\s+/);
		if (h.length > 3) {
			throw new Error()
		}
		if (h[0] == "center") {
			if (h.length == 1) {
				h = [ "center", "center" ]
			} else {
				if (h.length == 2 && h[1].match(/^[\d.]+x$/i)) {
					h = [ "center", "center", h[1] ]
				}
			}
		}
		if (h.length == 3) {
			g = parseFloat(h[2].match(/^([\d.]+)x$/i)[1])
		}
		var j = h[0] + " " + h[1];
		if (j == "left top" || j == "top left") {
			return {
				xrel : 0,
				yrel : 0,
				zoom : g
			}
		}
		if (j == "left center" || j == "center left") {
			return {
				xrel : 0,
				yrel : 0.5,
				zoom : g
			}
		}
		if (j == "left bottom" || j == "bottom left") {
			return {
				xrel : 0,
				yrel : 1,
				zoom : g
			}
		}
		if (j == "center top" || j == "top center") {
			return {
				xrel : 0.5,
				yrel : 0,
				zoom : g
			}
		}
		if (j == "center center") {
			return {
				xrel : 0.5,
				yrel : 0.5,
				zoom : g
			}
		}
		if (j == "center bottom" || j == "bottom center") {
			return {
				xrel : 0.5,
				yrel : 1,
				zoom : g
			}
		}
		if (j == "right top" || j == "top right") {
			return {
				xrel : 1,
				yrel : 0,
				zoom : g
			}
		}
		if (j == "right center" || j == "center right") {
			return {
				xrel : 1,
				yrel : 0.5,
				zoom : g
			}
		}
		if (j == "right bottom" || j == "bottom right") {
			return {
				xrel : 1,
				yrel : 1,
				zoom : g
			}
		}
		return {
			xrel : parseInt(h[0].match(/^(\d+)%$/)[1]) / 100,
			yrel : parseInt(h[1].match(/^(\d+)%$/)[1]) / 100,
			zoom : g
		}
	}
	d.fn.crossSlide = function(i, k, l) {
		var g = this, j = this.width(), h = this.height();
		if (g.length != 1) {
			f("crossSlide() must be called on exactly 1 element")
		}
		g.get(0).crossSlideArgs = [ i, k, l ];
		k = d.map(k, function(m) {
			return d.extend({}, m)
		});
		if (!i.easing) {
			i.easing = i.variant ? "swing" : "linear"
		}
		if (!l) {
			l = function() {
			}
		}
		(function(o) {
			var m = 0;
			function n(q, p) {
				p.onload = function(r) {
					m++;
					k[q].width = p.width;
					k[q].height = p.height;
					if (m == k.length) {
						o()
					}
				};
				p.src = k[q].src;
				if (q + 1 < k.length) {
					n(q + 1, new Image())
				}
			}
			n(0, new Image())
		})
				(function() {
					if (!i.fade) {
						f("missing fade parameter.")
					}
					if (i.speed && i.sleep) {
						f("you cannot set both speed and sleep at the same time.")
					}
					var A = Math.round(i.fade * 1000);
					if (i.sleep) {
						var z = Math.round(i.sleep * 1000)
					}
					if (i.speed) {
						var o = i.speed / 1000, v = Math.round(A * o)
					}
					g.empty().css({
						overflow : "hidden",
						padding : 0
					});
					if (!/^(absolute|relative|fixed)$/.test(g.css("position"))) {
						g.css({
							position : "relative"
						})
					}
					if (!g.width() || !g.height()) {
						f("container element does not have its own width and height")
					}
					if (i.shuffle) {
						k.sort(function() {
							return Math.random() - 0.5
						})
					}
					for ( var t = 0; t < k.length; ++t) {
						var m = k[t];
						if (!m.src) {
							f("missing src parameter in picture {0}.", t + 1)
						}
						if (o) {
							switch (m.dir) {
							case "up":
								m.from = {
									xrel : 0.5,
									yrel : 0,
									zoom : 1
								};
								m.to = {
									xrel : 0.5,
									yrel : 1,
									zoom : 1
								};
								var x = m.height - h - 2 * v;
								break;
							case "down":
								m.from = {
									xrel : 0.5,
									yrel : 1,
									zoom : 1
								};
								m.to = {
									xrel : 0.5,
									yrel : 0,
									zoom : 1
								};
								var x = m.height - h - 2 * v;
								break;
							case "left":
								m.from = {
									xrel : 0,
									yrel : 0.5,
									zoom : 1
								};
								m.to = {
									xrel : 1,
									yrel : 0.5,
									zoom : 1
								};
								var x = m.width - j - 2 * v;
								break;
							case "right":
								m.from = {
									xrel : 1,
									yrel : 0.5,
									zoom : 1
								};
								m.to = {
									xrel : 0,
									yrel : 0.5,
									zoom : 1
								};
								var x = m.width - j - 2 * v;
								break;
							default:
								f(
										"missing or malformed dir parameter in picture {0}.",
										t + 1)
							}
							if (x <= 0) {
								f(
										"impossible animation: either picture {0} is too small or div is too large or fade duration too long.",
										t + 1)
							}
							m.time_ms = Math.round(x / o)
						} else {
							if (!z) {
								if (!m.from || !m.to || !m.time) {
									f(
											"missing either speed/sleep option, or from/to/time params in picture {0}.",
											t + 1)
								}
								try {
									m.from = b(m.from)
								} catch (w) {
									f(
											'malformed "from" parameter in picture {0}.',
											t + 1)
								}
								try {
									m.to = b(m.to)
								} catch (w) {
									f(
											'malformed "to" parameter in picture {0}.',
											t + 1)
								}
								if (!m.time) {
									f(
											'missing "time" parameter in picture {0}.',
											t + 1)
								}
								m.time_ms = Math.round(m.time * 1000)
							}
						}
						if (m.from) {
							d.each([ m.from, m.to ], function(p, C) {
								C.width = Math.round(m.width * C.zoom);
								C.height = Math.round(m.height * C.zoom);
								C.left = Math.round((j - C.width) * C.xrel);
								C.top = Math.round((h - C.height) * C.yrel)
							})
						}
						var s, y;
						y = s = d(e('<img src="{0}"/>', m.src));
						if (m.href) {
							y = d(e('<a href="{0}"></a>', m.href)).append(s)
						}
						if (m.onclick) {
							y.click(m.onclick)
						}
						if (m.alt) {
							s.attr("alt", m.alt)
						}
						if (m.rel) {
							y.attr("rel", m.rel)
						}
						if (m.href && m.target) {
							y.attr("target", m.target)
						}
						y.appendTo(g)
					}
					delete o;
					function n(D, C) {
						var E = [ 0, A / (D.time_ms + 2 * A),
								1 - A / (D.time_ms + 2 * A), 1 ][C];
						return {
							left : Math.round(D.from.left + E
									* (D.to.left - D.from.left)),
							top : Math.round(D.from.top + E
									* (D.to.top - D.from.top)),
							width : Math.round(D.from.width + E
									* (D.to.width - D.from.width)),
							height : Math.round(D.from.height + E
									* (D.to.height - D.from.height))
						}
					}
					var u = g.find("img").css({
						position : "absolute",
						visibility : "hidden",
						top : 0,
						left : 0,
						border : 0
					});
					u.eq(0).css({
						visibility : "visible"
					});
					if (!z) {
						u.eq(0).css(n(k[0], i.variant ? 0 : 1))
					}
					var B = i.loop;
					function q(O, p) {
						if (O % 2 == 0) {
							if (z) {
								var E = O / 2, S = (E - 1 + k.length)
										% k.length, P = u.eq(E), M = u.eq(S);
								var L = function() {
									l(E, P.get(0));
									M.css("visibility", "hidden");
									setTimeout(p, z)
								}
							} else {
								var H = O / 2, S = (H - 1 + k.length)
										% k.length, R = u.eq(H), M = u.eq(S), F = k[H].time_ms, N = n(
										k[H], i.variant ? 3 : 2);
								var L = function() {
									l(H, R.get(0));
									M.css("visibility", "hidden");
									R[a](N, F, i.easing, p)
								}
							}
						} else {
							var D = Math.floor(O / 2), G = Math.ceil(O / 2)
									% k.length, Q = u.eq(D), C = u.eq(G), T = {}, K = {
								visibility : "visible"
							}, J = {};
							if (G > D) {
								K.opacity = 0;
								J.opacity = 1;
								if (i.doubleFade) {
									T.opacity = 0
								}
							} else {
								T.opacity = 0;
								if (i.doubleFade) {
									K.opacity = 0;
									J.opacity = 1
								}
							}
							if (!z) {
								d.extend(K, n(k[G], 0));
								if (!i.variant) {
									d.extend(T, n(k[D], 3));
									d.extend(J, n(k[G], 1))
								}
							}
							if (d.isEmptyObject(J)) {
								var L = function() {
									l(G, C.get(0), D, Q.get(0));
									C.css(K);
									Q[a](T, A, "linear", p)
								}
							} else {
								if (d.isEmptyObject(T)) {
									var L = function() {
										l(G, C.get(0), D, Q.get(0));
										C.css(K);
										C[a](J, A, "linear", p)
									}
								} else {
									var L = function() {
										l(G, C.get(0), D, Q.get(0));
										C.css(K);
										C[a](J, A, "linear");
										Q[a](T, A, "linear", p)
									}
								}
							}
						}
						if (i.loop && O == k.length * 2 - 2) {
							var I = L;
							L = function() {
								if (--B) {
									I()
								}
							}
						}
						if (O > 0) {
							return q(O - 1, L)
						} else {
							return L
						}
					}
					var r = q(k.length * 2 - 1, function() {
						return r()
					});
					r()
				});
		return g
	};
	d.fn.crossSlideFreeze = function() {
		this.find("img").stop()
	};
	d.fn.crossSlideStop = function() {
		this.find("img").stop().remove()
	};
	d.fn.crossSlideRestart = function() {
		this.find("img").stop().remove();
		d.fn.crossSlide.apply(this, this.get(0).crossSlideArgs)
	};
	d.fn.crossSlidePause = function() {
		if (!d.fn.pause) {
			f(c)
		}
		this.find("img").pause()
	};
	d.fn.crossSlideResume = function() {
		if (!d.fn.pause) {
			f(c)
		}
		this.find("img").resume()
	}
})();
