//MooTools More, <http://mootools.net/more>. Copyright (c) 2006-2009 Aaron Newton <http://clientcide.com/>, Valerio Proietti <http://mad4milk.net> & the MooTools team <http://mootools.net/developers>, MIT Style License.
MooTools.More = {version:"1.2.4.4", build:"6f6057dc645fdb7547689183b2311063bd653ddf"};
Class.Mutators.Binds = function (a) {
	return a;
};
Class.Mutators.initialize = function (a) {
	return function () {
		$splat(this.Binds).each(function (b) {
			var c = this[b];
			if (c) {
				this[b] = c.bind(this);
			}
		}, this);
		return a.apply(this, arguments);
	};
};
Class.Occlude = new Class({occlude:function (c, b) {
	b = document.id(b || this.element);
	var a = b.retrieve(c || this.property);
	if (a && !$defined(this.occluded)) {
		return this.occluded = a;
	}
	this.occluded = false;
	b.store(c || this.property, this);
	return this.occluded;
}});
Element.implement({measure:function (e) {
	var g = function (h) {
		return !!(!h || h.offsetHeight || h.offsetWidth);
	};
	if (g(this)) {
		return e.apply(this);
	}
	var d = this.getParent(), f = [], b = [];
	while (!g(d) && d != document.body) {
		b.push(d.expose());
		d = d.getParent();
	}
	var c = this.expose();
	var a = e.apply(this);
	c();
	b.each(function (h) {
		h();
	});
	return a;
}, expose:function () {
	if (this.getStyle("display") != "none") {
		return $empty;
	}
	var a = this.style.cssText;
	this.setStyles({display:"block", position:"absolute", visibility:"hidden"});
	return function () {
		this.style.cssText = a;
	}.bind(this);
}, getDimensions:function (a) {
	a = $merge({computeSize:false}, a);
	var f = {};
	var d = function (g, e) {
		return (e.computeSize) ? g.getComputedSize(e) : g.getSize();
	};
	var b = this.getParent("body");
	if (b && this.getStyle("display") == "none") {
		f = this.measure(function () {
			return d(this, a);
		});
	} else {
		if (b) {
			try {
				f = d(this, a);
			}
			catch (c) {
			}
		} else {
			f = {x:0, y:0};
		}
	}
	return $chk(f.x) ? $extend(f, {width:f.x, height:f.y}) : $extend(f, {x:f.width, y:f.height});
}, getComputedSize:function (a) {
	a = $merge({styles:["padding", "border"], plains:{height:["top", "bottom"], width:["left", "right"]}, mode:"both"}, a);
	var c = {width:0, height:0};
	switch (a.mode) {
	  case "vertical":
		delete c.width;
		delete a.plains.width;
		break;
	  case "horizontal":
		delete c.height;
		delete a.plains.height;
		break;
	}
	var b = [];
	$each(a.plains, function (g, f) {
		g.each(function (h) {
			a.styles.each(function (i) {
				b.push((i == "border") ? i + "-" + h + "-width" : i + "-" + h);
			});
		});
	});
	var e = {};
	b.each(function (f) {
		e[f] = this.getComputedStyle(f);
	}, this);
	var d = [];
	$each(a.plains, function (g, f) {
		var h = f.capitalize();
		c["total" + h] = c["computed" + h] = 0;
		g.each(function (i) {
			c["computed" + i.capitalize()] = 0;
			b.each(function (k, j) {
				if (k.test(i)) {
					e[k] = e[k].toInt() || 0;
					c["total" + h] = c["total" + h] + e[k];
					c["computed" + i.capitalize()] = c["computed" + i.capitalize()] + e[k];
				}
				if (k.test(i) && f != k && (k.test("border") || k.test("padding")) && !d.contains(k)) {
					d.push(k);
					c["computed" + h] = c["computed" + h] - e[k];
				}
			});
		});
	});
	["Width", "Height"].each(function (g) {
		var f = g.toLowerCase();
		if (!$chk(c[f])) {
			return;
		}
		c[f] = c[f] + this["offset" + g] + c["computed" + g];
		c["total" + g] = c[f] + c["total" + g];
		delete c["computed" + g];
	}, this);
	return $extend(e, c);
}});
(function () {
	var a = Element.prototype.position;
	Element.implement({position:function (g) {
		if (g && ($defined(g.x) || $defined(g.y))) {
			return a ? a.apply(this, arguments) : this;
		}
		$each(g || {}, function (u, t) {
			if (!$defined(u)) {
				delete g[t];
			}
		});
		g = $merge({relativeTo:document.body, position:{x:"center", y:"center"}, edge:false, offset:{x:0, y:0}, returnPos:false, relFixedPosition:false, ignoreMargins:false, ignoreScroll:false, allowNegative:false}, g);
		var r = {x:0, y:0}, e = false;
		var c = this.measure(function () {
			return document.id(this.getOffsetParent());
		});
		if (c && c != this.getDocument().body) {
			r = c.measure(function () {
				return this.getPosition();
			});
			e = c != document.id(g.relativeTo);
			g.offset.x = g.offset.x - r.x;
			g.offset.y = g.offset.y - r.y;
		}
		var s = function (t) {
			if ($type(t) != "string") {
				return t;
			}
			t = t.toLowerCase();
			var u = {};
			if (t.test("left")) {
				u.x = "left";
			} else {
				if (t.test("right")) {
					u.x = "right";
				} else {
					u.x = "center";
				}
			}
			if (t.test("upper") || t.test("top")) {
				u.y = "top";
			} else {
				if (t.test("bottom")) {
					u.y = "bottom";
				} else {
					u.y = "center";
				}
			}
			return u;
		};
		g.edge = s(g.edge);
		g.position = s(g.position);
		if (!g.edge) {
			if (g.position.x == "center" && g.position.y == "center") {
				g.edge = {x:"center", y:"center"};
			} else {
				g.edge = {x:"left", y:"top"};
			}
		}
		this.setStyle("position", "absolute");
		var f = document.id(g.relativeTo) || document.body, d = f == document.body ? window.getScroll() : f.getPosition(), l = d.y, h = d.x;
		var n = this.getDimensions({computeSize:true, styles:["padding", "border", "margin"]});
		var j = {}, o = g.offset.y, q = g.offset.x, k = window.getSize();
		switch (g.position.x) {
		  case "left":
			j.x = h + q;
			break;
		  case "right":
			j.x = h + q + f.offsetWidth;
			break;
		  default:
			j.x = h + ((f == document.body ? k.x : f.offsetWidth) / 2) + q;
			break;
		}
		switch (g.position.y) {
		  case "top":
			j.y = l + o;
			break;
		  case "bottom":
			j.y = l + o + f.offsetHeight;
			break;
		  default:
			j.y = l + ((f == document.body ? k.y : f.offsetHeight) / 2) + o;
			break;
		}
		if (g.edge) {
			var b = {};
			switch (g.edge.x) {
			  case "left":
				b.x = 0;
				break;
			  case "right":
				b.x = -n.x - n.computedRight - n.computedLeft;
				break;
			  default:
				b.x = -(n.totalWidth / 2);
				break;
			}
			switch (g.edge.y) {
			  case "top":
				b.y = 0;
				break;
			  case "bottom":
				b.y = -n.y - n.computedTop - n.computedBottom;
				break;
			  default:
				b.y = -(n.totalHeight / 2);
				break;
			}
			j.x += b.x;
			j.y += b.y;
		}
		j = {left:((j.x >= 0 || e || g.allowNegative) ? j.x : 0).toInt(), top:((j.y >= 0 || e || g.allowNegative) ? j.y : 0).toInt()};
		var i = {left:"x", top:"y"};
		["minimum", "maximum"].each(function (t) {
			["left", "top"].each(function (u) {
				var v = g[t] ? g[t][i[u]] : null;
				if (v != null && j[u] < v) {
					j[u] = v;
				}
			});
		});
		if (f.getStyle("position") == "fixed" || g.relFixedPosition) {
			var m = window.getScroll();
			j.top += m.y;
			j.left += m.x;
		}
		if (g.ignoreScroll) {
			var p = f.getScroll();
			j.top -= p.y;
			j.left -= p.x;
		}
		if (g.ignoreMargins) {
			j.left += (g.edge.x == "right" ? n["margin-right"] : g.edge.x == "center" ? -n["margin-left"] + ((n["margin-right"] + n["margin-left"]) / 2) : -n["margin-left"]);
			j.top += (g.edge.y == "bottom" ? n["margin-bottom"] : g.edge.y == "center" ? -n["margin-top"] + ((n["margin-bottom"] + n["margin-top"]) / 2) : -n["margin-top"]);
		}
		j.left = Math.ceil(j.left);
		j.top = Math.ceil(j.top);
		if (g.returnPos) {
			return j;
		} else {
			this.setStyles(j);
		}
		return this;
	}});
})();
Element.implement({isDisplayed:function () {
	return this.getStyle("display") != "none";
}, isVisible:function () {
	var a = this.offsetWidth, b = this.offsetHeight;
	return (a == 0 && b == 0) ? false : (a > 0 && b > 0) ? true : this.isDisplayed();
}, toggle:function () {
	return this[this.isDisplayed() ? "hide" : "show"]();
}, hide:function () {
	var b;
	try {
		b = this.getStyle("display");
	}
	catch (a) {
	}
	return this.store("originalDisplay", b || "").setStyle("display", "none");
}, show:function (a) {
	a = a || this.retrieve("originalDisplay") || "block";
	return this.setStyle("display", (a == "none") ? "block" : a);
}, swapClass:function (a, b) {
	return this.removeClass(a).addClass(b);
}});
Fx.Elements = new Class({Extends:Fx.CSS, initialize:function (b, a) {
	this.elements = this.subject = $$(b);
	this.parent(a);
}, compute:function (g, h, j) {
	var c = {};
	for (var d in g) {
		var a = g[d], e = h[d], f = c[d] = {};
		for (var b in a) {
			f[b] = this.parent(a[b], e[b], j);
		}
	}
	return c;
}, set:function (b) {
	for (var c in b) {
		var a = b[c];
		for (var d in a) {
			this.render(this.elements[c], d, a[d], this.options.unit);
		}
	}
	return this;
}, start:function (c) {
	if (!this.check(c)) {
		return this;
	}
	var h = {}, j = {};
	for (var d in c) {
		var f = c[d], a = h[d] = {}, g = j[d] = {};
		for (var b in f) {
			var e = this.prepare(this.elements[d], b, f[b]);
			a[b] = e.from;
			g[b] = e.to;
		}
	}
	return this.parent(h, j);
}});
Fx.Accordion = new Class({Extends:Fx.Elements, options:{display:0, show:false, height:true, width:false, opacity:true, alwaysHide:false, trigger:"click", initialDisplayFx:true, returnHeightToAuto:true}, initialize:function () {
	var c = Array.link(arguments, {container:Element.type, options:Object.type, togglers:$defined, elements:$defined});
	this.parent(c.elements, c.options);
	this.togglers = $$(c.togglers);
	this.previous = -1;
	this.internalChain = new Chain();
	if (this.options.alwaysHide) {
		this.options.wait = true;
	}
	if ($chk(this.options.show)) {
		this.options.display = false;
		this.previous = this.options.show;
	}
	if (this.options.start) {
		this.options.display = false;
		this.options.show = false;
	}
	this.effects = {};
	if (this.options.opacity) {
		this.effects.opacity = "fullOpacity";
	}
	if (this.options.width) {
		this.effects.width = this.options.fixedWidth ? "fullWidth" : "offsetWidth";
	}
	if (this.options.height) {
		this.effects.height = this.options.fixedHeight ? "fullHeight" : "scrollHeight";
	}
	for (var b = 0, a = this.togglers.length; b < a; b++) {
		this.addSection(this.togglers[b], this.elements[b]);
	}
	this.elements.each(function (e, d) {
		if (this.options.show === d) {
			this.fireEvent("active", [this.togglers[d], e]);
		} else {
			for (var f in this.effects) {
				e.setStyle(f, 0);
			}
		}
	}, this);
	if ($chk(this.options.display) || this.options.initialDisplayFx === false) {
		this.display(this.options.display, this.options.initialDisplayFx);
	}
	if (this.options.fixedHeight !== false) {
		this.options.returnHeightToAuto = false;
	}
	this.addEvent("complete", this.internalChain.callChain.bind(this.internalChain));
}, addSection:function (e, c) {
	e = document.id(e);
	c = document.id(c);
	var f = this.togglers.contains(e);
	this.togglers.include(e);
	this.elements.include(c);
	var a = this.togglers.indexOf(e);
	var b = this.display.bind(this, a);
	e.store("accordion:display", b);
	e.addEvent(this.options.trigger, b);
	if (this.options.height) {
		c.setStyles({"padding-top":0, "border-top":"none", "padding-bottom":0, "border-bottom":"none"});
	}
	if (this.options.width) {
		c.setStyles({"padding-left":0, "border-left":"none", "padding-right":0, "border-right":"none"});
	}
	c.fullOpacity = 1;
	if (this.options.fixedWidth) {
		c.fullWidth = this.options.fixedWidth;
	}
	if (this.options.fixedHeight) {
		c.fullHeight = this.options.fixedHeight;
	}
	c.setStyle("overflow", "hidden");
	if (!f) {
		for (var d in this.effects) {
			c.setStyle(d, 0);
		}
	}
	return this;
}, detach:function () {
	this.togglers.each(function (a) {
		a.removeEvent(this.options.trigger, a.retrieve("accordion:display"));
	}, this);
}, display:function (a, b) {
	if (!this.check(a, b)) {
		return this;
	}
	b = $pick(b, true);
	if (this.options.returnHeightToAuto) {
		var d = this.elements[this.previous];
		if (d && !this.selfHidden) {
			for (var c in this.effects) {
				d.setStyle(c, d[this.effects[c]]);
			}
		}
	}
	a = ($type(a) == "element") ? this.elements.indexOf(a) : a;
	if ((this.timer && this.options.wait) || (a === this.previous && !this.options.alwaysHide)) {
		return this;
	}
	this.previous = a;
	var e = {};
	this.elements.each(function (h, g) {
		e[g] = {};
		var f;
		if (g != a) {
			f = true;
		} else {
			if (this.options.alwaysHide && ((h.offsetHeight > 0 && this.options.height) || h.offsetWidth > 0 && this.options.width)) {
				f = true;
				this.selfHidden = true;
			}
		}
		this.fireEvent(f ? "background" : "active", [this.togglers[g], h]);
		for (var j in this.effects) {
			e[g][j] = f ? 0 : h[this.effects[j]];
		}
	}, this);
	this.internalChain.chain(function () {
		if (this.options.returnHeightToAuto && !this.selfHidden) {
			var f = this.elements[a];
			if (f) {
				f.setStyle("height", "auto");
			}
		}
	}.bind(this));
	return b ? this.start(e) : this.set(e);
}});

var Slider = new Class({Implements:[Events, Options], options:{onTick:function (A) {
	if (this.options.snap) {
		A = this.toPosition(this.step);
	}
	this.knob.setStyle(this.property, A);
}, snap:false, offset:0, range:false, wheel:false, steps:100, mode:"horizontal"}, initialize:function (E, A, D) {
	this.setOptions(D);
	this.element = $(E);
	this.knob = $(A);
	this.previousChange = this.previousEnd = this.step = -1;
	this.element.addEvent("mousedown", this.clickedElement.bind(this));
	if (this.options.wheel) {
		this.element.addEvent("mousewheel", this.scrolledElement.bindWithEvent(this));
	}
	var F, B = {}, C = {x:false, y:false};
	switch (this.options.mode) {
	  case "vertical":
		this.axis = "y";
		this.property = "top";
		F = "offsetHeight";
		break;
	  case "horizontal":
		this.axis = "x";
		this.property = "left";
		F = "offsetWidth";
	}
	this.half = this.knob[F] / 2;
	this.full = this.element[F] - this.knob[F] + (this.options.offset * 2);
	this.min = $chk(this.options.range[0]) ? this.options.range[0] : 0;
	this.max = $chk(this.options.range[1]) ? this.options.range[1] : this.options.steps;
	this.range = this.max - this.min;
	this.steps = this.options.steps || this.full;
	this.stepSize = Math.abs(this.range) / this.steps;
	this.stepWidth = this.stepSize * this.full / Math.abs(this.range);
	this.knob.setStyle("position", "relative").setStyle(this.property, -this.options.offset);
	C[this.axis] = this.property;
	B[this.axis] = [-this.options.offset, this.full - this.options.offset];
	this.drag = new Drag(this.knob, {snap:0, limit:B, modifiers:C, onDrag:this.draggedKnob.bind(this), onStart:this.draggedKnob.bind(this), onComplete:function () {
		this.draggedKnob();
		this.end();
	}.bind(this)});
	if (this.options.snap) {
		this.drag.options.grid = Math.ceil(this.stepWidth);
		this.drag.options.limit[this.axis][1] = this.full;
	}
}, set:function (A) {
	if (!((this.range > 0) ^ (A < this.min))) {
		A = this.min;
	}
	if (!((this.range > 0) ^ (A > this.max))) {
		A = this.max;
	}
	this.step = Math.round(A);
	this.checkStep();
	this.end();
	this.fireEvent("tick", this.toPosition(this.step));
	return this;
}, clickedElement:function (C) {
	var B = this.range < 0 ? -1 : 1;
	var A = C.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
	A = A.limit(-this.options.offset, this.full - this.options.offset);
	this.step = Math.round(this.min + B * this.toStep(A));
	this.checkStep();
	this.end();
	this.fireEvent("tick", A);
}, scrolledElement:function (A) {
	var B = (this.options.mode == "horizontal") ? (A.wheel < 0) : (A.wheel > 0);
	this.set(B ? this.step - this.stepSize : this.step + this.stepSize);
	A.stop();
}, draggedKnob:function () {
	var B = this.range < 0 ? -1 : 1;
	var A = this.drag.value.now[this.axis];
	A = A.limit(-this.options.offset, this.full - this.options.offset);
	this.step = Math.round(this.min + B * this.toStep(A));
	this.checkStep();
}, checkStep:function () {
	if (this.previousChange != this.step) {
		this.previousChange = this.step;
		this.fireEvent("change", this.step);
	}
}, end:function () {
	if (this.previousEnd !== this.step) {
		this.previousEnd = this.step;
		this.fireEvent("complete", this.step + "");
	}
}, toStep:function (A) {
	var B = (A + this.options.offset) * this.stepSize / this.full * this.steps;
	return this.options.steps ? Math.round(B -= B % this.stepSize) : B;
}, toPosition:function (A) {
	return (this.full * Math.abs(this.min - A)) / (this.steps * this.stepSize) - this.options.offset;
}});
var Asset = new Hash({javascript:function (F, D) {
	D = $extend({onload:$empty, document:document, check:$lambda(true)}, D);
	var B = new Element("script", {src:F, type:"text/javascript"});
	var E = D.onload.bind(B), A = D.check, G = D.document;
	delete D.onload;
	delete D.check;
	delete D.document;
	B.addEvents({load:E, readystatechange:function () {
		if (["loaded", "complete"].contains(this.readyState)) {
			E();
		}
	}}).setProperties(D);
	if (Browser.Engine.webkit419) {
		var C = (function () {
			if (!$try(A)) {
				return;
			}
			$clear(C);
			E();
		}).periodical(50);
	}
	return B.inject(G.head);
}, css:function (B, A) {
	return new Element("link", $merge({rel:"stylesheet", media:"screen", type:"text/css", href:B}, A)).inject(document.head);
}, image:function (C, B) {
	B = $merge({onload:$empty, onabort:$empty, onerror:$empty}, B);
	var D = new Image();
	var A = $(D) || new Element("img");
	["load", "abort", "error"].each(function (E) {
		var F = "on" + E;
		var G = B[F];
		delete B[F];
		D[F] = function () {
			if (!D) {
				return;
			}
			if (!A.parentNode) {
				A.width = D.width;
				A.height = D.height;
			}
			D = D.onload = D.onabort = D.onerror = null;
			G.delay(1, A, A);
			A.fireEvent(E, A, 1);
		};
	});
	D.src = A.src = C;
	if (D && D.complete) {
		D.onload.delay(1);
	}
	return A.setProperties(B);
}, images:function (D, C) {
	C = $merge({onComplete:$empty, onProgress:$empty}, C);
	if (!D.push) {
		D = [D];
	}
	var A = [];
	var B = 0;
	D.each(function (F) {
		var E = new Asset.image(F, {onload:function () {
			C.onProgress.call(this, B, D.indexOf(F));
			B++;
			if (B == D.length) {
				C.onComplete();
			}
		}});
		A.push(E);
	});
	return new Elements(A);
}});


var Scroller = new Class({Implements:[Events, Options], options:{area:20, velocity:1, onChange:function (A, B) {
	this.element.scrollTo(A, B);
}}, initialize:function (B, A) {
	this.setOptions(A);
	this.element = $(B);
	this.listener = ($type(this.element) != "element") ? $(this.element.getDocument().body) : this.element;
	this.timer = null;
	this.coord = this.getCoords.bind(this);
}, start:function () {
	this.listener.addEvent("mousemove", this.coord);
}, stop:function () {
	this.listener.removeEvent("mousemove", this.coord);
	this.timer = $clear(this.timer);
}, getCoords:function (A) {
	this.page = (this.listener.get("tag") == "body") ? A.client : A.page;
	if (!this.timer) {
		this.timer = this.scroll.periodical(50, this);
	}
}, scroll:function () {
	var B = this.element.getSize(), A = this.element.getScroll(), E = this.element.getPosition(), D = {x:0, y:0};
	for (var C in this.page) {
		if (this.page[C] < (this.options.area + E[C]) && A[C] != 0) {
			D[C] = (this.page[C] - this.options.area - E[C]) * this.options.velocity;
		} else {
			if (this.page[C] + this.options.area > (B[C] + E[C]) && B[C] + B[C] != A[C]) {
				D[C] = (this.page[C] - B[C] + this.options.area - E[C]) * this.options.velocity;
			}
		}
	}
	if (D.y || D.x) {
		this.fireEvent("change", [A.x + D.x, A.y + D.y]);
	}
}});
var Accordion = new Class({Extends:Fx.Accordion, initialize:function () {
	this.parent.apply(this, arguments);
	var a = Array.link(arguments, {container:Element.type});
	this.container = a.container;
}, addSection:function (c, b, e) {
	c = document.id(c);
	b = document.id(b);
	var d = this.togglers.contains(c);
	var a = this.togglers.length;
	if (a && (!d || e)) {
		e = $pick(e, a - 1);
		c.inject(this.togglers[e], "before");
		b.inject(c, "after");
	} else {
		if (this.container && !d) {
			c.inject(this.container);
			b.inject(this.container);
		}
	}
	return this.parent.apply(this, arguments);
}});
Fx.Move = new Class({Extends:Fx.Morph, options:{relativeTo:document.body, position:"center", edge:false, offset:{x:0, y:0}}, start:function (a) {
	return this.parent(this.element.position($merge(this.options, a, {returnPos:true})));
}});
Element.Properties.move = {set:function (a) {
	var b = this.retrieve("move");
	if (b) {
		b.cancel();
	}
	return this.eliminate("move").store("move:options", $extend({link:"cancel"}, a));
}, get:function (a) {
	if (a || !this.retrieve("move")) {
		if (a || !this.retrieve("move:options")) {
			this.set("move", a);
		}
		this.store("move", new Fx.Move(this, this.retrieve("move:options")));
	}
	return this.retrieve("move");
}};
Element.implement({move:function (a) {
	this.get("move").start(a);
	return this;
}});
Fx.Reveal = new Class({Extends:Fx.Morph, options:{link:"cancel", styles:["padding", "border", "margin"], transitionOpacity:!Browser.Engine.trident4, mode:"vertical", display:"block", hideInputs:Browser.Engine.trident ? "select, input, textarea, object, embed" : false}, dissolve:function () {
	try {
		if (!this.hiding && !this.showing) {
			if (this.element.getStyle("display") != "none") {
				this.hiding = true;
				this.showing = false;
				this.hidden = true;
				this.cssText = this.element.style.cssText;
				var d = this.element.getComputedSize({styles:this.options.styles, mode:this.options.mode});
				this.element.setStyle("display", this.options.display);
				if (this.options.transitionOpacity) {
					d.opacity = 1;
				}
				var b = {};
				$each(d, function (f, e) {
					b[e] = [f, 0];
				}, this);
				this.element.setStyle("overflow", "hidden");
				var a = this.options.hideInputs ? this.element.getElements(this.options.hideInputs) : null;
				this.$chain.unshift(function () {
					if (this.hidden) {
						this.hiding = false;
						$each(d, function (f, e) {
							d[e] = f;
						}, this);
						this.element.style.cssText = this.cssText;
						this.element.setStyle("display", "none");
						if (a) {
							a.setStyle("visibility", "visible");
						}
					}
					this.fireEvent("hide", this.element);
					this.callChain();
				}.bind(this));
				if (a) {
					a.setStyle("visibility", "hidden");
				}
				this.start(b);
			} else {
				this.callChain.delay(10, this);
				this.fireEvent("complete", this.element);
				this.fireEvent("hide", this.element);
			}
		} else {
			if (this.options.link == "chain") {
				this.chain(this.dissolve.bind(this));
			} else {
				if (this.options.link == "cancel" && !this.hiding) {
					this.cancel();
					this.dissolve();
				}
			}
		}
	}
	catch (c) {
		this.hiding = false;
		this.element.setStyle("display", "none");
		this.callChain.delay(10, this);
		this.fireEvent("complete", this.element);
		this.fireEvent("hide", this.element);
	}
	return this;
}, reveal:function () {
	try {
		if (!this.showing && !this.hiding) {
			if (this.element.getStyle("display") == "none" || this.element.getStyle("visiblity") == "hidden" || this.element.getStyle("opacity") == 0) {
				this.showing = true;
				this.hiding = this.hidden = false;
				var d;
				this.cssText = this.element.style.cssText;
				this.element.measure(function () {
					d = this.element.getComputedSize({styles:this.options.styles, mode:this.options.mode});
				}.bind(this));
				$each(d, function (f, e) {
					d[e] = f;
				});
				if ($chk(this.options.heightOverride)) {
					d.height = this.options.heightOverride.toInt();
				}
				if ($chk(this.options.widthOverride)) {
					d.width = this.options.widthOverride.toInt();
				}
				if (this.options.transitionOpacity) {
					this.element.setStyle("opacity", 0);
					d.opacity = 1;
				}
				var b = {height:0, display:this.options.display};
				$each(d, function (f, e) {
					b[e] = 0;
				});
				this.element.setStyles($merge(b, {overflow:"hidden"}));
				var a = this.options.hideInputs ? this.element.getElements(this.options.hideInputs) : null;
				if (a) {
					a.setStyle("visibility", "hidden");
				}
				this.start(d);
				this.$chain.unshift(function () {
					this.element.style.cssText = this.cssText;
					this.element.setStyle("display", this.options.display);
					if (!this.hidden) {
						this.showing = false;
					}
					if (a) {
						a.setStyle("visibility", "visible");
					}
					this.callChain();
					this.fireEvent("show", this.element);
				}.bind(this));
			} else {
				this.callChain();
				this.fireEvent("complete", this.element);
				this.fireEvent("show", this.element);
			}
		} else {
			if (this.options.link == "chain") {
				this.chain(this.reveal.bind(this));
			} else {
				if (this.options.link == "cancel" && !this.showing) {
					this.cancel();
					this.reveal();
				}
			}
		}
	}
	catch (c) {
		this.element.setStyles({display:this.options.display, visiblity:"visible", opacity:1});
		this.showing = false;
		this.callChain.delay(10, this);
		this.fireEvent("complete", this.element);
		this.fireEvent("show", this.element);
	}
	return this;
}, toggle:function () {
	if (this.element.getStyle("display") == "none" || this.element.getStyle("visiblity") == "hidden" || this.element.getStyle("opacity") == 0) {
		this.reveal();
	} else {
		this.dissolve();
	}
	return this;
}, cancel:function () {
	this.parent.apply(this, arguments);
	this.element.style.cssText = this.cssText;
	this.hidding = false;
	this.showing = false;
}});
Element.Properties.reveal = {set:function (a) {
	var b = this.retrieve("reveal");
	if (b) {
		b.cancel();
	}
	return this.eliminate("reveal").store("reveal:options", a);
}, get:function (a) {
	if (a || !this.retrieve("reveal")) {
		if (a || !this.retrieve("reveal:options")) {
			this.set("reveal", a);
		}
		this.store("reveal", new Fx.Reveal(this, this.retrieve("reveal:options")));
	}
	return this.retrieve("reveal");
}};
Element.Properties.dissolve = Element.Properties.reveal;
Element.implement({reveal:function (a) {
	this.get("reveal", a).reveal();
	return this;
}, dissolve:function (a) {
	this.get("reveal", a).dissolve();
	return this;
}, nix:function () {
	var a = Array.link(arguments, {destroy:Boolean.type, options:Object.type});
	this.get("reveal", a.options).dissolve().chain(function () {
		this[a.destroy ? "destroy" : "dispose"]();
	}.bind(this));
	return this;
}, wink:function () {
	var b = Array.link(arguments, {duration:Number.type, options:Object.type});
	var a = this.get("reveal", b.options);
	a.reveal().chain(function () {
		(function () {
			a.dissolve();
		}).delay(b.duration || 2000);
	});
}});
Fx.Scroll = new Class({Extends:Fx, options:{offset:{x:0, y:0}, wheelStops:true}, initialize:function (b, a) {
	this.element = this.subject = document.id(b);
	this.parent(a);
	var d = this.cancel.bind(this, false);
	if ($type(this.element) != "element") {
		this.element = document.id(this.element.getDocument().body);
	}
	var c = this.element;
	if (this.options.wheelStops) {
		this.addEvent("start", function () {
			c.addEvent("mousewheel", d);
		}, true);
		this.addEvent("complete", function () {
			c.removeEvent("mousewheel", d);
		}, true);
	}
}, set:function () {
	var a = Array.flatten(arguments);
	if (Browser.Engine.gecko) {
		a = [Math.round(a[0]), Math.round(a[1])];
	}
	this.element.scrollTo(a[0], a[1]);
}, compute:function (c, b, a) {
	return [0, 1].map(function (d) {
		return Fx.compute(c[d], b[d], a);
	});
}, start:function (c, g) {
	if (!this.check(c, g)) {
		return this;
	}
	var e = this.element.getScrollSize(), b = this.element.getScroll(), d = {x:c, y:g};
	for (var f in d) {
		var a = e[f];
		if ($chk(d[f])) {
			d[f] = ($type(d[f]) == "number") ? d[f] : a;
		} else {
			d[f] = b[f];
		}
		d[f] += this.options.offset[f];
	}
	return this.parent([b.x, b.y], [d.x, d.y]);
}, toTop:function () {
	return this.start(false, 0);
}, toLeft:function () {
	return this.start(0, false);
}, toRight:function () {
	return this.start("right", false);
}, toBottom:function () {
	return this.start(false, "bottom");
}, toElement:function (b) {
	var a = document.id(b).getPosition(this.element);
	return this.start(a.x, a.y);
}, scrollIntoView:function (c, e, d) {
	e = e ? $splat(e) : ["x", "y"];
	var h = {};
	c = document.id(c);
	var f = c.getPosition(this.element);
	var i = c.getSize();
	var g = this.element.getScroll();
	var a = this.element.getSize();
	var b = {x:f.x + i.x, y:f.y + i.y};
	["x", "y"].each(function (j) {
		if (e.contains(j)) {
			if (b[j] > g[j] + a[j]) {
				h[j] = b[j] - a[j];
			}
			if (f[j] < g[j]) {
				h[j] = f[j];
			}
		}
		if (h[j] == null) {
			h[j] = g[j];
		}
		if (d && d[j]) {
			h[j] = h[j] + d[j];
		}
	}, this);
	if (h.x != g.x || h.y != g.y) {
		this.start(h.x, h.y);
	}
	return this;
}, scrollToCenter:function (c, e, d) {
	e = e ? $splat(e) : ["x", "y"];
	c = $(c);
	var h = {}, f = c.getPosition(this.element), i = c.getSize(), g = this.element.getScroll(), a = this.element.getSize(), b = {x:f.x + i.x, y:f.y + i.y};
	["x", "y"].each(function (j) {
		if (e.contains(j)) {
			h[j] = f[j] - (a[j] - i[j]) / 2;
		}
		if (h[j] == null) {
			h[j] = g[j];
		}
		if (d && d[j]) {
			h[j] = h[j] + d[j];
		}
	}, this);
	if (h.x != g.x || h.y != g.y) {
		this.start(h.x, h.y);
	}
	return this;
}});
Fx.Slide = new Class({Extends:Fx, options:{mode:"vertical", wrapper:false, hideOverflow:true}, initialize:function (b, a) {
	this.addEvent("complete", function () {
		this.open = (this.wrapper["offset" + this.layout.capitalize()] != 0);
		if (this.open) {
			this.wrapper.setStyle("height", "");
		}
		if (this.open && Browser.Engine.webkit419) {
			this.element.dispose().inject(this.wrapper);
		}
	}, true);
	this.element = this.subject = document.id(b);
	this.parent(a);
	var d = this.element.retrieve("wrapper");
	var c = this.element.getStyles("margin", "position", "overflow");
	if (this.options.hideOverflow) {
		c = $extend(c, {overflow:"hidden"});
	}
	if (this.options.wrapper) {
		d = document.id(this.options.wrapper).setStyles(c);
	}
	this.wrapper = d || new Element("div", {styles:c}).wraps(this.element);
	this.element.store("wrapper", this.wrapper).setStyle("margin", 0);
	this.now = [];
	this.open = true;
}, vertical:function () {
	this.margin = "margin-top";
	this.layout = "height";
	this.offset = this.element.offsetHeight;
}, horizontal:function () {
	this.margin = "margin-left";
	this.layout = "width";
	this.offset = this.element.offsetWidth;
}, set:function (a) {
	this.element.setStyle(this.margin, a[0]);
	this.wrapper.setStyle(this.layout, a[1]);
	return this;
}, compute:function (c, b, a) {
	return [0, 1].map(function (d) {
		return Fx.compute(c[d], b[d], a);
	});
}, start:function (b, e) {
	if (!this.check(b, e)) {
		return this;
	}
	this[e || this.options.mode]();
	var d = this.element.getStyle(this.margin).toInt();
	var c = this.wrapper.getStyle(this.layout).toInt();
	var a = [[d, c], [0, this.offset]];
	var g = [[d, c], [-this.offset, 0]];
	var f;
	switch (b) {
	  case "in":
		f = a;
		break;
	  case "out":
		f = g;
		break;
	  case "toggle":
		f = (c == 0) ? a : g;
	}
	return this.parent(f[0], f[1]);
}, slideIn:function (a) {
	return this.start("in", a);
}, slideOut:function (a) {
	return this.start("out", a);
}, hide:function (a) {
	this[a || this.options.mode]();
	this.open = false;
	return this.set([-this.offset, 0]);
}, show:function (a) {
	this[a || this.options.mode]();
	this.open = true;
	return this.set([0, this.offset]);
}, toggle:function (a) {
	return this.start("toggle", a);
}});
Element.Properties.slide = {set:function (b) {
	var a = this.retrieve("slide");
	if (a) {
		a.cancel();
	}
	return this.eliminate("slide").store("slide:options", $extend({link:"cancel"}, b));
}, get:function (a) {
	if (a || !this.retrieve("slide")) {
		if (a || !this.retrieve("slide:options")) {
			this.set("slide", a);
		}
		this.store("slide", new Fx.Slide(this, this.retrieve("slide:options")));
	}
	return this.retrieve("slide");
}};
Element.implement({slide:function (d, e) {
	d = d || "toggle";
	var b = this.get("slide"), a;
	switch (d) {
	  case "hide":
		b.hide(e);
		break;
	  case "show":
		b.show(e);
		break;
	  case "toggle":
		var c = this.retrieve("slide:flag", b.open);
		b[c ? "slideOut" : "slideIn"](e);
		this.store("slide:flag", !c);
		a = true;
		break;
	  default:
		b.start(d, e);
	}
	if (!a) {
		this.eliminate("slide:flag");
	}
	return this;
}});
var SmoothScroll = Fx.SmoothScroll = new Class({Extends:Fx.Scroll, initialize:function (b, c) {
	c = c || document;
	this.doc = c.getDocument();
	var d = c.getWindow();
	this.parent(this.doc, b);
	this.links = $$(this.options.links || this.doc.links);
	var a = d.location.href.match(/^[^#]*/)[0] + "#";
	this.links.each(function (f) {
		if (f.href.indexOf(a) != 0) {
			return;
		}
		var e = f.href.substr(a.length);
		if (e) {
			this.useLink(f, e);
		}
	}, this);
	if (!Browser.Engine.webkit419) {
		this.addEvent("complete", function () {
			d.location.hash = this.anchor;
		}, true);
	}
}, useLink:function (c, a) {
	var b;
	c.addEvent("click", function (d) {
		if (b !== false && !b) {
			b = document.id(a) || this.doc.getElement("a[name=" + a + "]");
		}
		if (b) {
			d.preventDefault();
			this.anchor = a;
			this.toElement(b).chain(function () {
				this.fireEvent("scrolledTo", [c, b]);
			}.bind(this));
			c.blur();
		}
	}.bind(this));
}});
Fx.Sort = new Class({Extends:Fx.Elements, options:{mode:"vertical"}, initialize:function (b, a) {
	this.parent(b, a);
	this.elements.each(function (c) {
		if (c.getStyle("position") == "static") {
			c.setStyle("position", "relative");
		}
	});
	this.setDefaultOrder();
}, setDefaultOrder:function () {
	this.currentOrder = this.elements.map(function (b, a) {
		return a;
	});
}, sort:function (e) {
	if ($type(e) != "array") {
		return false;
	}
	var i = 0, a = 0, c = {}, h = {}, d = this.options.mode == "vertical";
	var f = this.elements.map(function (m, j) {
		var l = m.getComputedSize({styles:["border", "padding", "margin"]});
		var n;
		if (d) {
			n = {top:i, margin:l["margin-top"], height:l.totalHeight};
			i += n.height - l["margin-top"];
		} else {
			n = {left:a, margin:l["margin-left"], width:l.totalWidth};
			a += n.width;
		}
		var k = d ? "top" : "left";
		h[j] = {};
		var o = m.getStyle(k).toInt();
		h[j][k] = o || 0;
		return n;
	}, this);
	this.set(h);
	e = e.map(function (j) {
		return j.toInt();
	});
	if (e.length != this.elements.length) {
		this.currentOrder.each(function (j) {
			if (!e.contains(j)) {
				e.push(j);
			}
		});
		if (e.length > this.elements.length) {
			e.splice(this.elements.length - 1, e.length - this.elements.length);
		}
	}
	var b = i = a = 0;
	e.each(function (l, j) {
		var k = {};
		if (d) {
			k.top = i - f[l].top - b;
			i += f[l].height;
		} else {
			k.left = a - f[l].left;
			a += f[l].width;
		}
		b = b + f[l].margin;
		c[l] = k;
	}, this);
	var g = {};
	$A(e).sort().each(function (j) {
		g[j] = c[j];
	});
	this.start(g);
	this.currentOrder = e;
	return this;
}, rearrangeDOM:function (a) {
	a = a || this.currentOrder;
	var b = this.elements[0].getParent();
	var c = [];
	this.elements.setStyle("opacity", 0);
	a.each(function (d) {
		c.push(this.elements[d].inject(b).setStyles({top:0, left:0}));
	}, this);
	this.elements.setStyle("opacity", 1);
	this.elements = $$(c);
	this.setDefaultOrder();
	return this;
}, getDefaultOrder:function () {
	return this.elements.map(function (b, a) {
		return a;
	});
}, forward:function () {
	return this.sort(this.getDefaultOrder());
}, backward:function () {
	return this.sort(this.getDefaultOrder().reverse());
}, reverse:function () {
	return this.sort(this.currentOrder.reverse());
}, sortByElements:function (a) {
	return this.sort(a.map(function (b) {
		return this.elements.indexOf(b);
	}, this));
}, swap:function (c, b) {
	if ($type(c) == "element") {
		c = this.elements.indexOf(c);
	}
	if ($type(b) == "element") {
		b = this.elements.indexOf(b);
	}
	var a = $A(this.currentOrder);
	a[this.currentOrder.indexOf(c)] = b;
	a[this.currentOrder.indexOf(b)] = c;
	return this.sort(a);
}});


