/*
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.8.0r4
 */
( function() {
	var B = YAHOO.util;
	var A = function(D, C, E, F) {
		if (!D) {
		}
		this.init(D, C, E, F);
	};
	A.NAME = "Anim";
	A.prototype = {
		toString : function() {
			var C = this.getEl() || {};
			var D = C.id || C.tagName;
			return (this.constructor.NAME + ": " + D);
		},
		patterns : {
			noNegatives : /width|height|opacity|padding/i,
			offsetAttribute : /^((width|height)|(top|left))$/,
			defaultUnit : /width|height|top$|bottom$|left$|right$/i,
			offsetUnit : /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i
		},
		doMethod : function(C, E, D) {
			return this.method(this.currentFrame, E, D - E, this.totalFrames);
		},
		setAttribute : function(C, F, E) {
			var D = this.getEl();
			if (this.patterns.noNegatives.test(C)) {
				F = (F > 0) ? F : 0;
			}
			if (C in D && !("style" in D && C in D.style)) {
				D[C] = F;
			} else {
				B.Dom.setStyle(D, C, F + E);
			}
		},
		getAttribute : function(C) {
			var E = this.getEl();
			var G = B.Dom.getStyle(E, C);
			if (G !== "auto" && !this.patterns.offsetUnit.test(G)) {
				return parseFloat(G);
			}
			var D = this.patterns.offsetAttribute.exec(C) || [];
			var H = !!(D[3]);
			var F = !!(D[2]);
			if ("style" in E) {
				if (F || (B.Dom.getStyle(E, "position") == "absolute" && H)) {
					G = E["offset" + D[0].charAt(0).toUpperCase()
							+ D[0].substr(1)];
				} else {
					G = 0;
				}
			} else {
				if (C in E) {
					G = E[C];
				}
			}
			return G;
		},
		getDefaultUnit : function(C) {
			if (this.patterns.defaultUnit.test(C)) {
				return "px";
			}
			return "";
		},
		setRuntimeAttribute : function(D) {
			var I;
			var E;
			var F = this.attributes;
			this.runtimeAttributes[D] = {};
			var H = function(J) {
				return (typeof J !== "undefined");
			};
			if (!H(F[D]["to"]) && !H(F[D]["by"])) {
				return false;
			}
			I = (H(F[D]["from"])) ? F[D]["from"] : this.getAttribute(D);
			if (H(F[D]["to"])) {
				E = F[D]["to"];
			} else {
				if (H(F[D]["by"])) {
					if (I.constructor == Array) {
						E = [];
						for ( var G = 0, C = I.length; G < C; ++G) {
							E[G] = I[G] + F[D]["by"][G] * 1;
						}
					} else {
						E = I + F[D]["by"] * 1;
					}
				}
			}
			this.runtimeAttributes[D].start = I;
			this.runtimeAttributes[D].end = E;
			this.runtimeAttributes[D].unit = (H(F[D].unit)) ? F[D]["unit"]
					: this.getDefaultUnit(D);
			return true;
		},
		init : function(E, J, I, C) {
			var D = false;
			var F = null;
			var H = 0;
			E = B.Dom.get(E);
			this.attributes = J || {};
			this.duration = !YAHOO.lang.isUndefined(I) ? I : 1;
			this.method = C || B.Easing.easeNone;
			this.useSeconds = true;
			this.currentFrame = 0;
			this.totalFrames = B.AnimMgr.fps;
			this.setEl = function(M) {
				E = B.Dom.get(M);
			};
			this.getEl = function() {
				return E;
			};
			this.isAnimated = function() {
				return D;
			};
			this.getStartTime = function() {
				return F;
			};
			this.runtimeAttributes = {};
			this.animate = function() {
				if (this.isAnimated()) {
					return false;
				}
				this.currentFrame = 0;
				this.totalFrames = (this.useSeconds) ? Math.ceil(B.AnimMgr.fps
						* this.duration) : this.duration;
				if (this.duration === 0 && this.useSeconds) {
					this.totalFrames = 1;
				}
				B.AnimMgr.registerElement(this);
				return true;
			};
			this.stop = function(M) {
				if (!this.isAnimated()) {
					return false;
				}
				if (M) {
					this.currentFrame = this.totalFrames;
					this._onTween.fire();
				}
				B.AnimMgr.stop(this);
			};
			var L = function() {
				this.onStart.fire();
				this.runtimeAttributes = {};
				for ( var M in this.attributes) {
					this.setRuntimeAttribute(M);
				}
				D = true;
				H = 0;
				F = new Date();
			};
			var K = function() {
				var O = {
					duration : new Date() - this.getStartTime(),
					currentFrame : this.currentFrame
				};
				O.toString = function() {
					return ("duration: " + O.duration + ", currentFrame: " + O.currentFrame);
				};
				this.onTween.fire(O);
				var N = this.runtimeAttributes;
				for ( var M in N) {
					this.setAttribute(M,
							this.doMethod(M, N[M].start, N[M].end), N[M].unit);
				}
				H += 1;
			};
			var G = function() {
				var M = (new Date() - F) / 1000;
				var N = {
					duration : M,
					frames : H,
					fps : H / M
				};
				N.toString = function() {
					return ("duration: " + N.duration + ", frames: " + N.frames
							+ ", fps: " + N.fps);
				};
				D = false;
				H = 0;
				this.onComplete.fire(N);
			};
			this._onStart = new B.CustomEvent("_start", this, true);
			this.onStart = new B.CustomEvent("start", this);
			this.onTween = new B.CustomEvent("tween", this);
			this._onTween = new B.CustomEvent("_tween", this, true);
			this.onComplete = new B.CustomEvent("complete", this);
			this._onComplete = new B.CustomEvent("_complete", this, true);
			this._onStart.subscribe(L);
			this._onTween.subscribe(K);
			this._onComplete.subscribe(G);
		}
	};
	B.Anim = A;
})();
YAHOO.util.AnimMgr = new function() {
	var C = null;
	var B = [];
	var A = 0;
	this.fps = 1000;
	this.delay = 1;
	this.registerElement = function(F) {
		B[B.length] = F;
		A += 1;
		F._onStart.fire();
		this.start();
	};
	this.unRegister = function(G, F) {
		F = F || E(G);
		if (!G.isAnimated() || F === -1) {
			return false;
		}
		G._onComplete.fire();
		B.splice(F, 1);
		A -= 1;
		if (A <= 0) {
			this.stop();
		}
		return true;
	};
	this.start = function() {
		if (C === null) {
			C = setInterval(this.run, this.delay);
		}
	};
	this.stop = function(H) {
		if (!H) {
			clearInterval(C);
			for ( var G = 0, F = B.length; G < F; ++G) {
				this.unRegister(B[0], 0);
			}
			B = [];
			C = null;
			A = 0;
		} else {
			this.unRegister(H);
		}
	};
	this.run = function() {
		for ( var H = 0, F = B.length; H < F; ++H) {
			var G = B[H];
			if (!G || !G.isAnimated()) {
				continue;
			}
			if (G.currentFrame < G.totalFrames || G.totalFrames === null) {
				G.currentFrame += 1;
				if (G.useSeconds) {
					D(G);
				}
				G._onTween.fire();
			} else {
				YAHOO.util.AnimMgr.stop(G, H);
			}
		}
	};
	var E = function(H) {
		for ( var G = 0, F = B.length; G < F; ++G) {
			if (B[G] === H) {
				return G;
			}
		}
		return -1;
	};
	var D = function(G) {
		var J = G.totalFrames;
		var I = G.currentFrame;
		var H = (G.currentFrame * G.duration * 1000 / G.totalFrames);
		var F = (new Date() - G.getStartTime());
		var K = 0;
		if (F < G.duration * 1000) {
			K = Math.round((F / H - 1) * G.currentFrame);
		} else {
			K = J - (I + 1);
		}
		if (K > 0 && isFinite(K)) {
			if (G.currentFrame + K >= J) {
				K = J - (I + 1);
			}
			G.currentFrame += K;
		}
	};
	this._queue = B;
	this._getIndex = E;
};
YAHOO.util.Bezier = new function() {
	this.getPosition = function(E, D) {
		var F = E.length;
		var C = [];
		for ( var B = 0; B < F; ++B) {
			C[B] = [ E[B][0], E[B][1] ];
		}
		for ( var A = 1; A < F; ++A) {
			for (B = 0; B < F - A; ++B) {
				C[B][0] = (1 - D) * C[B][0] + D * C[parseInt(B + 1, 10)][0];
				C[B][1] = (1 - D) * C[B][1] + D * C[parseInt(B + 1, 10)][1];
			}
		}
		return [ C[0][0], C[0][1] ];
	};
};
( function() {
	var A = function(F, E, G, H) {
		A.superclass.constructor.call(this, F, E, G, H);
	};
	A.NAME = "ColorAnim";
	A.DEFAULT_BGCOLOR = "#fff";
	var C = YAHOO.util;
	YAHOO.extend(A, C.Anim);
	var D = A.superclass;
	var B = A.prototype;
	B.patterns.color = /color$/i;
	B.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
	B.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
	B.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
	B.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/;
	B.parseColor = function(E) {
		if (E.length == 3) {
			return E;
		}
		var F = this.patterns.hex.exec(E);
		if (F && F.length == 4) {
			return [ parseInt(F[1], 16), parseInt(F[2], 16), parseInt(F[3], 16) ];
		}
		F = this.patterns.rgb.exec(E);
		if (F && F.length == 4) {
			return [ parseInt(F[1], 10), parseInt(F[2], 10), parseInt(F[3], 10) ];
		}
		F = this.patterns.hex3.exec(E);
		if (F && F.length == 4) {
			return [ parseInt(F[1] + F[1], 16), parseInt(F[2] + F[2], 16),
					parseInt(F[3] + F[3], 16) ];
		}
		return null;
	};
	B.getAttribute = function(E) {
		var G = this.getEl();
		if (this.patterns.color.test(E)) {
			var I = YAHOO.util.Dom.getStyle(G, E);
			var H = this;
			if (this.patterns.transparent.test(I)) {
				var F = YAHOO.util.Dom.getAncestorBy(G, function(J) {
					return !H.patterns.transparent.test(I);
				});
				if (F) {
					I = C.Dom.getStyle(F, E);
				} else {
					I = A.DEFAULT_BGCOLOR;
				}
			}
		} else {
			I = D.getAttribute.call(this, E);
		}
		return I;
	};
	B.doMethod = function(F, J, G) {
		var I;
		if (this.patterns.color.test(F)) {
			I = [];
			for ( var H = 0, E = J.length; H < E; ++H) {
				I[H] = D.doMethod.call(this, F, J[H], G[H]);
			}
			I = "rgb(" + Math.floor(I[0]) + "," + Math.floor(I[1]) + ","
					+ Math.floor(I[2]) + ")";
		} else {
			I = D.doMethod.call(this, F, J, G);
		}
		return I;
	};
	B.setRuntimeAttribute = function(F) {
		D.setRuntimeAttribute.call(this, F);
		if (this.patterns.color.test(F)) {
			var H = this.attributes;
			var J = this.parseColor(this.runtimeAttributes[F].start);
			var G = this.parseColor(this.runtimeAttributes[F].end);
			if (typeof H[F]["to"] === "undefined"
					&& typeof H[F]["by"] !== "undefined") {
				G = this.parseColor(H[F].by);
				for ( var I = 0, E = J.length; I < E; ++I) {
					G[I] = J[I] + G[I];
				}
			}
			this.runtimeAttributes[F].start = J;
			this.runtimeAttributes[F].end = G;
		}
	};
	C.ColorAnim = A;
})();
/*
 * TERMS OF USE - EASING EQUATIONS Open source under the BSD License. Copyright
 * 2001 Robert Penner All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer. Redistributions in binary
 * form must reproduce the above copyright notice, this list of conditions and
 * the following disclaimer in the documentation and/or other materials provided
 * with the distribution. Neither the name of the author nor the names of
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
YAHOO.util.Easing = {
	easeNone : function(B, A, D, C) {
		return D * B / C + A;
	},
	easeIn : function(B, A, D, C) {
		return D * (B /= C) * B + A;
	},
	easeOut : function(B, A, D, C) {
		return -D * (B /= C) * (B - 2) + A;
	},
	easeBoth : function(B, A, D, C) {
		if ((B /= C / 2) < 1) {
			return D / 2 * B * B + A;
		}
		return -D / 2 * ((--B) * (B - 2) - 1) + A;
	},
	easeInStrong : function(B, A, D, C) {
		return D * (B /= C) * B * B * B + A;
	},
	easeOutStrong : function(B, A, D, C) {
		return -D * ((B = B / C - 1) * B * B * B - 1) + A;
	},
	easeBothStrong : function(B, A, D, C) {
		if ((B /= C / 2) < 1) {
			return D / 2 * B * B * B * B + A;
		}
		return -D / 2 * ((B -= 2) * B * B * B - 2) + A;
	},
	elasticIn : function(C, A, G, F, B, E) {
		if (C == 0) {
			return A;
		}
		if ((C /= F) == 1) {
			return A + G;
		}
		if (!E) {
			E = F * 0.3;
		}
		if (!B || B < Math.abs(G)) {
			B = G;
			var D = E / 4;
		} else {
			var D = E / (2 * Math.PI) * Math.asin(G / B);
		}
		return -(B * Math.pow(2, 10 * (C -= 1)) * Math.sin((C * F - D)
				* (2 * Math.PI) / E))
				+ A;
	},
	elasticOut : function(C, A, G, F, B, E) {
		if (C == 0) {
			return A;
		}
		if ((C /= F) == 1) {
			return A + G;
		}
		if (!E) {
			E = F * 0.3;
		}
		if (!B || B < Math.abs(G)) {
			B = G;
			var D = E / 4;
		} else {
			var D = E / (2 * Math.PI) * Math.asin(G / B);
		}
		return B * Math.pow(2, -10 * C)
				* Math.sin((C * F - D) * (2 * Math.PI) / E) + G + A;
	},
	elasticBoth : function(C, A, G, F, B, E) {
		if (C == 0) {
			return A;
		}
		if ((C /= F / 2) == 2) {
			return A + G;
		}
		if (!E) {
			E = F * (0.3 * 1.5);
		}
		if (!B || B < Math.abs(G)) {
			B = G;
			var D = E / 4;
		} else {
			var D = E / (2 * Math.PI) * Math.asin(G / B);
		}
		if (C < 1) {
			return -0.5
					* (B * Math.pow(2, 10 * (C -= 1)) * Math.sin((C * F - D)
							* (2 * Math.PI) / E)) + A;
		}
		return B * Math.pow(2, -10 * (C -= 1))
				* Math.sin((C * F - D) * (2 * Math.PI) / E) * 0.5 + G + A;
	},
	backIn : function(B, A, E, D, C) {
		if (typeof C == "undefined") {
			C = 1.70158;
		}
		return E * (B /= D) * B * ((C + 1) * B - C) + A;
	},
	backOut : function(B, A, E, D, C) {
		if (typeof C == "undefined") {
			C = 1.70158;
		}
		return E * ((B = B / D - 1) * B * ((C + 1) * B + C) + 1) + A;
	},
	backBoth : function(B, A, E, D, C) {
		if (typeof C == "undefined") {
			C = 1.70158;
		}
		if ((B /= D / 2) < 1) {
			return E / 2 * (B * B * (((C *= (1.525)) + 1) * B - C)) + A;
		}
		return E / 2 * ((B -= 2) * B * (((C *= (1.525)) + 1) * B + C) + 2) + A;
	},
	bounceIn : function(B, A, D, C) {
		return D - YAHOO.util.Easing.bounceOut(C - B, 0, D, C) + A;
	},
	bounceOut : function(B, A, D, C) {
		if ((B /= C) < (1 / 2.75)) {
			return D * (7.5625 * B * B) + A;
		} else {
			if (B < (2 / 2.75)) {
				return D * (7.5625 * (B -= (1.5 / 2.75)) * B + 0.75) + A;
			} else {
				if (B < (2.5 / 2.75)) {
					return D * (7.5625 * (B -= (2.25 / 2.75)) * B + 0.9375) + A;
				}
			}
		}
		return D * (7.5625 * (B -= (2.625 / 2.75)) * B + 0.984375) + A;
	},
	bounceBoth : function(B, A, D, C) {
		if (B < C / 2) {
			return YAHOO.util.Easing.bounceIn(B * 2, 0, D, C) * 0.5 + A;
		}
		return YAHOO.util.Easing.bounceOut(B * 2 - C, 0, D, C) * 0.5 + D * 0.5
				+ A;
	}
};
( function() {
	var A = function(H, G, I, J) {
		if (H) {
			A.superclass.constructor.call(this, H, G, I, J);
		}
	};
	A.NAME = "Motion";
	var E = YAHOO.util;
	YAHOO.extend(A, E.ColorAnim);
	var F = A.superclass;
	var C = A.prototype;
	C.patterns.points = /^points$/i;
	C.setAttribute = function(G, I, H) {
		if (this.patterns.points.test(G)) {
			H = H || "px";
			F.setAttribute.call(this, "left", I[0], H);
			F.setAttribute.call(this, "top", I[1], H);
		} else {
			F.setAttribute.call(this, G, I, H);
		}
	};
	C.getAttribute = function(G) {
		if (this.patterns.points.test(G)) {
			var H = [ F.getAttribute.call(this, "left"),
					F.getAttribute.call(this, "top") ];
		} else {
			H = F.getAttribute.call(this, G);
		}
		return H;
	};
	C.doMethod = function(G, K, H) {
		var J = null;
		if (this.patterns.points.test(G)) {
			var I = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;
			J = E.Bezier.getPosition(this.runtimeAttributes[G], I);
		} else {
			J = F.doMethod.call(this, G, K, H);
		}
		return J;
	};
	C.setRuntimeAttribute = function(P) {
		if (this.patterns.points.test(P)) {
			var H = this.getEl();
			var J = this.attributes;
			var G;
			var L = J["points"]["control"] || [];
			var I;
			var M, O;
			if (L.length > 0 && !(L[0] instanceof Array)) {
				L = [ L ];
			} else {
				var K = [];
				for (M = 0, O = L.length; M < O; ++M) {
					K[M] = L[M];
				}
				L = K;
			}
			if (E.Dom.getStyle(H, "position") == "static") {
				E.Dom.setStyle(H, "position", "relative");
			}
			if (D(J["points"]["from"])) {
				E.Dom.setXY(H, J["points"]["from"]);
			} else {
				E.Dom.setXY(H, E.Dom.getXY(H));
			}
			G = this.getAttribute("points");
			if (D(J["points"]["to"])) {
				I = B.call(this, J["points"]["to"], G);
				var N = E.Dom.getXY(this.getEl());
				for (M = 0, O = L.length; M < O; ++M) {
					L[M] = B.call(this, L[M], G);
				}
			} else {
				if (D(J["points"]["by"])) {
					I = [ G[0] + J["points"]["by"][0],
							G[1] + J["points"]["by"][1] ];
					for (M = 0, O = L.length; M < O; ++M) {
						L[M] = [ G[0] + L[M][0], G[1] + L[M][1] ];
					}
				}
			}
			this.runtimeAttributes[P] = [ G ];
			if (L.length > 0) {
				this.runtimeAttributes[P] = this.runtimeAttributes[P].concat(L);
			}
			this.runtimeAttributes[P][this.runtimeAttributes[P].length] = I;
		} else {
			F.setRuntimeAttribute.call(this, P);
		}
	};
	var B = function(G, I) {
		var H = E.Dom.getXY(this.getEl());
		G = [ G[0] - H[0] + I[0], G[1] - H[1] + I[1] ];
		return G;
	};
	var D = function(G) {
		return (typeof G !== "undefined");
	};
	E.Motion = A;
})();
( function() {
	var D = function(F, E, G, H) {
		if (F) {
			D.superclass.constructor.call(this, F, E, G, H);
		}
	};
	D.NAME = "Scroll";
	var B = YAHOO.util;
	YAHOO.extend(D, B.ColorAnim);
	var C = D.superclass;
	var A = D.prototype;
	A.doMethod = function(E, H, F) {
		var G = null;
		if (E == "scroll") {
			G = [
					this.method(this.currentFrame, H[0], F[0] - H[0],
							this.totalFrames),
					this.method(this.currentFrame, H[1], F[1] - H[1],
							this.totalFrames) ];
		} else {
			G = C.doMethod.call(this, E, H, F);
		}
		return G;
	};
	A.getAttribute = function(E) {
		var G = null;
		var F = this.getEl();
		if (E == "scroll") {
			G = [ F.scrollLeft, F.scrollTop ];
		} else {
			G = C.getAttribute.call(this, E);
		}
		return G;
	};
	A.setAttribute = function(E, H, G) {
		var F = this.getEl();
		if (E == "scroll") {
			F.scrollLeft = H[0];
			F.scrollTop = H[1];
		} else {
			C.setAttribute.call(this, E, H, G);
		}
	};
	B.Scroll = D;
})();
YAHOO.register("animation", YAHOO.util.Anim, {
	version : "2.8.0r4",
	build : "2446"
});
