
/*
 * Shadowbox.js, version 3.0.3
 * http://shadowbox-js.com/
 *
 * Copyright 2007-2010, Michael J. I. Jackson
 * Date: 2010-08-02 20:27:27 +0000
 */
(function (window, undefined) {
	var S = {version:"3.0.3"};
	var ua = navigator.userAgent.toLowerCase();
	if (ua.indexOf("windows") > -1 || ua.indexOf("win32") > -1) {
		S.isWindows = true;
	} else {
		if (ua.indexOf("macintosh") > -1 || ua.indexOf("mac os x") > -1) {
			S.isMac = true;
		} else {
			if (ua.indexOf("linux") > -1) {
				S.isLinux = true;
			}
		}
	}
	S.isIE = ua.indexOf("msie") > -1;
	S.isIE6 = ua.indexOf("msie 6") > -1;
	S.isIE7 = ua.indexOf("msie 7") > -1;
	S.isGecko = ua.indexOf("gecko") > -1 && ua.indexOf("safari") == -1;
	S.isWebKit = ua.indexOf("applewebkit/") > -1;
	var inlineId = /#(.+)$/, galleryName = /^(light|shadow)box\[(.*?)\]/i, inlineParam = /\s*([a-z_]*?)\s*=\s*(.+)\s*/, fileExtension = /[0-9a-z]+$/i, scriptPath = /(.+\/)shadowbox\.js/i;
	var open = false, initialized = false, lastOptions = {}, slideDelay = 0, slideStart, slideTimer;
	S.current = -1;
	S.dimensions = null;
	S.ease = function (state) {
		return 1 + Math.pow(state - 1, 3);
	};
	S.errorInfo = {fla:{name:"Flash", url:"http://www.adobe.com/products/flashplayer/"}, qt:{name:"QuickTime", url:"http://www.apple.com/quicktime/download/"}, wmp:{name:"Windows Media Player", url:"http://www.microsoft.com/windows/windowsmedia/"}, f4m:{name:"Flip4Mac", url:"http://www.flip4mac.com/wmv_download.htm"}};
	S.gallery = [];
	S.onReady = noop;
	S.path = null;
	S.player = null;
	S.playerId = "sb-player";
	S.options = {animate:true, animateFade:true, autoplayMovies:true, continuous:false, enableKeys:true, flashParams:{bgcolor:"#000000", allowfullscreen:true}, flashVars:{}, flashVersion:"9.0.115", handleOversize:"resize", handleUnsupported:"link", onChange:noop, onClose:noop, onFinish:noop, onOpen:noop, showMovieControls:true, skipSetup:false, slideshowDelay:0, viewportPadding:20};
	S.getCurrent = function () {
		return S.current > -1 ? S.gallery[S.current] : null;
	};
	S.hasNext = function () {
		return S.gallery.length > 1 && (S.current != S.gallery.length - 1 || S.options.continuous);
	};
	S.isOpen = function () {
		return open;
	};
	S.isPaused = function () {
		return slideTimer == "pause";
	};
	S.applyOptions = function (options) {
		lastOptions = apply({}, S.options);
		apply(S.options, options);
	};
	S.revertOptions = function () {
		apply(S.options, lastOptions);
	};
	S.init = function (options, callback) {
		if (initialized) {
			return;
		}
		initialized = true;
		if (S.skin.options) {
			apply(S.options, S.skin.options);
		}
		if (options) {
			apply(S.options, options);
		}
		if (!S.path) {
			var path, scripts = document.getElementsByTagName("script");
			for (var i = 0, len = scripts.length; i < len; ++i) {
				path = scriptPath.exec(scripts[i].src);
				if (path) {
					S.path = path[1];
					break;
				}
			}
		}
		if (callback) {
			S.onReady = callback;
		}
		bindLoad();
	};
	S.open = function (obj) {
		if (open) {
			return;
		}
		var gc = S.makeGallery(obj);
		S.gallery = gc[0];
		S.current = gc[1];
		obj = S.getCurrent();
		if (obj == null) {
			return;
		}
		S.applyOptions(obj.options || {});
		filterGallery();
		if (S.gallery.length) {
			obj = S.getCurrent();
			if (S.options.onOpen(obj) === false) {
				return;
			}
			open = true;
			S.skin.onOpen(obj, load);
		}
	};
	S.close = function () {
		if (!open) {
			return;
		}
		open = false;
		if (S.player) {
			S.player.remove();
			S.player = null;
		}
		if (typeof slideTimer == "number") {
			clearTimeout(slideTimer);
			slideTimer = null;
		}
		slideDelay = 0;
		listenKeys(false);
		S.options.onClose(S.getCurrent());
		S.skin.onClose();
		S.revertOptions();
	};
	S.play = function () {
		if (!S.hasNext()) {
			return;
		}
		if (!slideDelay) {
			slideDelay = S.options.slideshowDelay * 1000;
		}
		if (slideDelay) {
			slideStart = now();
			slideTimer = setTimeout(function () {
				slideDelay = slideStart = 0;
				S.next();
			}, slideDelay);
			if (S.skin.onPlay) {
				S.skin.onPlay();
			}
		}
	};
	S.pause = function () {
		if (typeof slideTimer != "number") {
			return;
		}
		slideDelay = Math.max(0, slideDelay - (now() - slideStart));
		if (slideDelay) {
			clearTimeout(slideTimer);
			slideTimer = "pause";
			if (S.skin.onPause) {
				S.skin.onPause();
			}
		}
	};
	S.change = function (index) {
		if (!(index in S.gallery)) {
			if (S.options.continuous) {
				index = (index < 0 ? S.gallery.length + index : 0);
				if (!(index in S.gallery)) {
					return;
				}
			} else {
				return;
			}
		}
		S.current = index;
		if (typeof slideTimer == "number") {
			clearTimeout(slideTimer);
			slideTimer = null;
			slideDelay = slideStart = 0;
		}
		S.options.onChange(S.getCurrent());
		load(true);
	};
	S.next = function () {
		S.change(S.current + 1);
	};
	S.previous = function () {
		S.change(S.current - 1);
	};
	S.setDimensions = function (height, width, maxHeight, maxWidth, topBottom, leftRight, padding, preserveAspect) {
		var originalHeight = height, originalWidth = width;
		var extraHeight = 2 * padding + topBottom;
		if (height + extraHeight > maxHeight) {
			height = maxHeight - extraHeight;
		}
		var extraWidth = 2 * padding + leftRight;
		if (width + extraWidth > maxWidth) {
			width = maxWidth - extraWidth;
		}
		var changeHeight = (originalHeight - height) / originalHeight, changeWidth = (originalWidth - width) / originalWidth, oversized = (changeHeight > 0 || changeWidth > 0);
		if (preserveAspect && oversized) {
			if (changeHeight > changeWidth) {
				width = Math.round((originalWidth / originalHeight) * height);
			} else {
				if (changeWidth > changeHeight) {
					height = Math.round((originalHeight / originalWidth) * width);
				}
			}
		}
		S.dimensions = {height:height + topBottom, width:width + leftRight, innerHeight:height, innerWidth:width, top:Math.floor((maxHeight - (height + extraHeight)) / 2 + padding), left:Math.floor((maxWidth - (width + extraWidth)) / 2 + padding), oversized:oversized};
		return S.dimensions;
	};
	S.makeGallery = function (obj) {
		var gallery = [], current = -1;
		if (typeof obj == "string") {
			obj = [obj];
		}
		if (typeof obj.length == "number") {
			each(obj, function (i, o) {
				if (o.content) {
					gallery[i] = o;
				} else {
					gallery[i] = {content:o};
				}
			});
			current = 0;
		} else {
			if (obj.tagName) {
				var cacheObj = S.getCache(obj);
				obj = cacheObj ? cacheObj : S.makeObject(obj);
			}
			if (obj.gallery) {
				gallery = [];
				var o;
				for (var key in S.cache) {
					o = S.cache[key];
					if (o.gallery && o.gallery == obj.gallery) {
						if (current == -1 && o.content == obj.content) {
							current = gallery.length;
						}
						gallery.push(o);
					}
				}
				if (current == -1) {
					gallery.unshift(obj);
					current = 0;
				}
			} else {
				gallery = [obj];
				current = 0;
			}
		}
		each(gallery, function (i, o) {
			gallery[i] = apply({}, o);
		});
		return [gallery, current];
	};
	S.makeObject = function (link, options) {
		var obj = {content:link.href, title:link.getAttribute("title") || "", link:link};
		if (options) {
			options = apply({}, options);
			each(["player", "title", "height", "width", "gallery"], function (i, o) {
				if (typeof options[o] != "undefined") {
					obj[o] = options[o];
					delete options[o];
				}
			});
			obj.options = options;
		} else {
			obj.options = {};
		}
		if (!obj.player) {
			obj.player = S.getPlayer(obj.content);
		}
		var rel = link.getAttribute("rel");
		if (rel) {
			var match = rel.match(galleryName);
			if (match) {
				obj.gallery = escape(match[2]);
			}
			each(rel.split(";"), function (i, p) {
				match = p.match(inlineParam);
				if (match) {
					obj[match[1]] = match[2];
				}
			});
		}
		return obj;
	};
	S.getPlayer = function (content) {
		if (content.indexOf("#") > -1 && content.indexOf(document.location.href) == 0) {
			return "inline";
		}
		var q = content.indexOf("?");
		if (q > -1) {
			content = content.substring(0, q);
		}
		var ext, m = content.match(fileExtension);
		if (m) {
			ext = m[0].toLowerCase();
		}
		if (ext) {
			if (S.img && S.img.ext.indexOf(ext) > -1) {
				return "img";
			}
			if (S.swf && S.swf.ext.indexOf(ext) > -1) {
				return "swf";
			}
			if (S.flv && S.flv.ext.indexOf(ext) > -1) {
				return "flv";
			}
			if (S.qt && S.qt.ext.indexOf(ext) > -1) {
				if (S.wmp && S.wmp.ext.indexOf(ext) > -1) {
					return "qtwmp";
				} else {
					return "qt";
				}
			}
			if (S.wmp && S.wmp.ext.indexOf(ext) > -1) {
				return "wmp";
			}
		}
		return "iframe";
	};
	function filterGallery() {
		var err = S.errorInfo, plugins = S.plugins, obj, remove, needed, m, format, replace, inlineEl, flashVersion;
		for (var i = 0; i < S.gallery.length; ++i) {
			obj = S.gallery[i];
			remove = false;
			needed = null;
			switch (obj.player) {
			  case "flv":
			  case "swf":
				if (!plugins.fla) {
					needed = "fla";
				}
				break;
			  case "qt":
				if (!plugins.qt) {
					needed = "qt";
				}
				break;
			  case "wmp":
				if (S.isMac) {
					if (plugins.qt && plugins.f4m) {
						obj.player = "qt";
					} else {
						needed = "qtf4m";
					}
				} else {
					if (!plugins.wmp) {
						needed = "wmp";
					}
				}
				break;
			  case "qtwmp":
				if (plugins.qt) {
					obj.player = "qt";
				} else {
					if (plugins.wmp) {
						obj.player = "wmp";
					} else {
						needed = "qtwmp";
					}
				}
				break;
			}
			if (needed) {
				if (S.options.handleUnsupported == "link") {
					switch (needed) {
					  case "qtf4m":
						format = "shared";
						replace = [err.qt.url, err.qt.name, err.f4m.url, err.f4m.name];
						break;
					  case "qtwmp":
						format = "either";
						replace = [err.qt.url, err.qt.name, err.wmp.url, err.wmp.name];
						break;
					  default:
						format = "single";
						replace = [err[needed].url, err[needed].name];
					}
					obj.player = "html";
					obj.content = "<div class=\"sb-message\">" + sprintf(S.lang.errors[format], replace) + "</div>";
				} else {
					remove = true;
				}
			} else {
				if (obj.player == "inline") {
					m = inlineId.exec(obj.content);
					if (m) {
						inlineEl = get(m[1]);
						if (inlineEl) {
							obj.content = inlineEl.innerHTML;
						} else {
							remove = true;
						}
					} else {
						remove = true;
					}
				} else {
					if (obj.player == "swf" || obj.player == "flv") {
						flashVersion = (obj.options && obj.options.flashVersion) || S.options.flashVersion;
						if (S.flash && !S.flash.hasFlashPlayerVersion(flashVersion)) {
							obj.width = 310;
							obj.height = 177;
						}
					}
				}
			}
			if (remove) {
				S.gallery.splice(i, 1);
				if (i < S.current) {
					--S.current;
				} else {
					if (i == S.current) {
						S.current = i > 0 ? i - 1 : i;
					}
				}
				--i;
			}
		}
	}
	function listenKeys(on) {
		if (!S.options.enableKeys) {
			return;
		}
		(on ? addEvent : removeEvent)(document, "keydown", handleKey);
	}
	function handleKey(e) {
		if (e.metaKey || e.shiftKey || e.altKey || e.ctrlKey) {
			return;
		}
		var code = keyCode(e), handler;
		switch (code) {
		  case 81:
		  case 88:
		  case 27:
			handler = S.close;
			break;
		  case 37:
			handler = S.previous;
			break;
		  case 39:
			handler = S.next;
			break;
		  case 32:
			handler = typeof slideTimer == "number" ? S.pause : S.play;
			break;
		}
		if (handler) {
			preventDefault(e);
			handler();
		}
	}
	function load(changing) {
		listenKeys(false);
		var obj = S.getCurrent();
		var player = (obj.player == "inline" ? "html" : obj.player);
		if (typeof S[player] != "function") {
			throw "unknown player " + player;
		}
		if (changing) {
			S.player.remove();
			S.revertOptions();
			S.applyOptions(obj.options || {});
		}
		S.player = new S[player](obj, S.playerId);
		if (S.gallery.length > 1) {
			var next = S.gallery[S.current + 1] || S.gallery[0];
			if (next.player == "img") {
				var a = new Image();
				a.src = next.content;
			}
			var prev = S.gallery[S.current - 1] || S.gallery[S.gallery.length - 1];
			if (prev.player == "img") {
				var b = new Image();
				b.src = prev.content;
			}
		}
		S.skin.onLoad(changing, waitReady);
	}
	function waitReady() {
		if (!open) {
			return;
		}
		if (typeof S.player.ready != "undefined") {
			var timer = setInterval(function () {
				if (open) {
					if (S.player.ready) {
						clearInterval(timer);
						timer = null;
						S.skin.onReady(show);
					}
				} else {
					clearInterval(timer);
					timer = null;
				}
			}, 10);
		} else {
			S.skin.onReady(show);
		}
	}
	function show() {
		if (!open) {
			return;
		}
		S.player.append(S.skin.body, S.dimensions);
		S.skin.onShow(finish);
	}
	function finish() {
		if (!open) {
			return;
		}
		if (S.player.onLoad) {
			S.player.onLoad();
		}
		S.options.onFinish(S.getCurrent());
		if (!S.isPaused()) {
			S.play();
		}
		listenKeys(true);
	}
	if (!Array.prototype.indexOf) {
		Array.prototype.indexOf = function (obj, from) {
			var len = this.length >>> 0;
			from = from || 0;
			if (from < 0) {
				from += len;
			}
			for (; from < len; ++from) {
				if (from in this && this[from] === obj) {
					return from;
				}
			}
			return -1;
		};
	}
	function now() {
		return (new Date).getTime();
	}
	function apply(original, extension) {
		for (var property in extension) {
			original[property] = extension[property];
		}
		return original;
	}
	function each(obj, callback) {
		var i = 0, len = obj.length;
		for (var value = obj[0]; i < len && callback.call(value, i, value) !== false; value = obj[++i]) {
		}
	}
	function sprintf(str, replace) {
		return str.replace(/\{(\w+?)\}/g, function (match, i) {
			return replace[i];
		});
	}
	function noop() {
	}
	function get(id) {
		return document.getElementById(id);
	}
	function remove(el) {
		el.parentNode.removeChild(el);
	}
	var supportsOpacity = true, supportsFixed = true;
	function checkSupport() {
		var body = document.body, div = document.createElement("div");
		supportsOpacity = typeof div.style.opacity === "string";
		div.style.position = "fixed";
		div.style.margin = 0;
		div.style.top = "20px";
		body.appendChild(div, body.firstChild);
		supportsFixed = div.offsetTop == 20;
		body.removeChild(div);
	}
	S.getStyle = (function () {
		var opacity = /opacity=([^)]*)/, getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
		return function (el, style) {
			var ret;
			if (!supportsOpacity && style == "opacity" && el.currentStyle) {
				ret = opacity.test(el.currentStyle.filter || "") ? (parseFloat(RegExp.$1) / 100) + "" : "";
				return ret === "" ? "1" : ret;
			}
			if (getComputedStyle) {
				var computedStyle = getComputedStyle(el, null);
				if (computedStyle) {
					ret = computedStyle[style];
				}
				if (style == "opacity" && ret == "") {
					ret = "1";
				}
			} else {
				ret = el.currentStyle[style];
			}
			return ret;
		};
	})();
	S.appendHTML = function (el, html) {
		if (el.insertAdjacentHTML) {
			el.insertAdjacentHTML("BeforeEnd", html);
		} else {
			if (el.lastChild) {
				var range = el.ownerDocument.createRange();
				range.setStartAfter(el.lastChild);
				var frag = range.createContextualFragment(html);
				el.appendChild(frag);
			} else {
				el.innerHTML = html;
			}
		}
	};
	S.getWindowSize = function (dimension) {
		if (document.compatMode === "CSS1Compat") {
			return document.documentElement["client" + dimension];
		}
		return document.body["client" + dimension];
	};
	S.setOpacity = function (el, opacity) {
		var style = el.style;
		if (supportsOpacity) {
			style.opacity = (opacity == 1 ? "" : opacity);
		} else {
			style.zoom = 1;
			if (opacity == 1) {
				if (typeof style.filter == "string" && (/alpha/i).test(style.filter)) {
					style.filter = style.filter.replace(/\s*[\w\.]*alpha\([^\)]*\);?/gi, "");
				}
			} else {
				style.filter = (style.filter || "").replace(/\s*[\w\.]*alpha\([^\)]*\)/gi, "") + " alpha(opacity=" + (opacity * 100) + ")";
			}
		}
	};
	S.clearOpacity = function (el) {
		S.setOpacity(el, 1);
	};
	function getTarget(e) {
		var target = e.target ? e.target : e.srcElement;
		return target.nodeType == 3 ? target.parentNode : target;
	}
	function getPageXY(e) {
		var x = e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)), y = e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
		return [x, y];
	}
	function preventDefault(e) {
		e.preventDefault();
	}
	function keyCode(e) {
		return e.which ? e.which : e.keyCode;
	}
	function addEvent(el, type, handler) {
		if (el.addEventListener) {
			el.addEventListener(type, handler, false);
		} else {
			if (el.nodeType === 3 || el.nodeType === 8) {
				return;
			}
			if (el.setInterval && (el !== window && !el.frameElement)) {
				el = window;
			}
			if (!handler.__guid) {
				handler.__guid = addEvent.guid++;
			}
			if (!el.events) {
				el.events = {};
			}
			var handlers = el.events[type];
			if (!handlers) {
				handlers = el.events[type] = {};
				if (el["on" + type]) {
					handlers[0] = el["on" + type];
				}
			}
			handlers[handler.__guid] = handler;
			el["on" + type] = addEvent.handleEvent;
		}
	}
	addEvent.guid = 1;
	addEvent.handleEvent = function (event) {
		var result = true;
		event = event || addEvent.fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
		var handlers = this.events[event.type];
		for (var i in handlers) {
			this.__handleEvent = handlers[i];
			if (this.__handleEvent(event) === false) {
				result = false;
			}
		}
		return result;
	};
	addEvent.preventDefault = function () {
		this.returnValue = false;
	};
	addEvent.stopPropagation = function () {
		this.cancelBubble = true;
	};
	addEvent.fixEvent = function (e) {
		e.preventDefault = addEvent.preventDefault;
		e.stopPropagation = addEvent.stopPropagation;
		return e;
	};
	function removeEvent(el, type, handler) {
		if (el.removeEventListener) {
			el.removeEventListener(type, handler, false);
		} else {
			if (el.events && el.events[type]) {
				delete el.events[type][handler.__guid];
			}
		}
	}
	var loaded = false, DOMContentLoaded;
	if (document.addEventListener) {
		DOMContentLoaded = function () {
			document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
			S.load();
		};
	} else {
		if (document.attachEvent) {
			DOMContentLoaded = function () {
				if (document.readyState === "complete") {
					document.detachEvent("onreadystatechange", DOMContentLoaded);
					S.load();
				}
			};
		}
	}
	function doScrollCheck() {
		if (loaded) {
			return;
		}
		try {
			document.documentElement.doScroll("left");
		}
		catch (e) {
			setTimeout(doScrollCheck, 1);
			return;
		}
		S.load();
	}
	function bindLoad() {
		if (document.readyState === "complete") {
			return S.load();
		}
		if (document.addEventListener) {
			document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
			window.addEventListener("load", S.load, false);
		} else {
			if (document.attachEvent) {
				document.attachEvent("onreadystatechange", DOMContentLoaded);
				window.attachEvent("onload", S.load);
				var topLevel = false;
				try {
					topLevel = window.frameElement === null;
				}
				catch (e) {
				}
				if (document.documentElement.doScroll && topLevel) {
					doScrollCheck();
				}
			}
		}
	}
	S.load = function () {
		if (loaded) {
			return;
		}
		if (!document.body) {
			return setTimeout(S.load, 13);
		}
		loaded = true;
		checkSupport();
		S.onReady();
		if (!S.options.skipSetup) {
			S.setup();
		}
		S.skin.init();
	};
	S.plugins = {};
	if (navigator.plugins && navigator.plugins.length) {
		var names = [];
		each(navigator.plugins, function (i, p) {
			names.push(p.name);
		});
		names = names.join(",");
		var f4m = names.indexOf("Flip4Mac") > -1;
		S.plugins = {fla:names.indexOf("Shockwave Flash") > -1, qt:names.indexOf("QuickTime") > -1, wmp:!f4m && names.indexOf("Windows Media") > -1, f4m:f4m};
	} else {
		var detectPlugin = function (name) {
			var axo;
			try {
				axo = new ActiveXObject(name);
			}
			catch (e) {
			}
			return !!axo;
		};
		S.plugins = {fla:detectPlugin("ShockwaveFlash.ShockwaveFlash"), qt:detectPlugin("QuickTime.QuickTime"), wmp:detectPlugin("wmplayer.ocx"), f4m:false};
	}
	var relAttr = /^(light|shadow)box/i, expando = "shadowboxCacheKey", cacheKey = 1;
	S.cache = {};
	S.select = function (selector) {
		var links = [];
		if (!selector) {
			var rel;
			each(document.getElementsByTagName("a"), function (i, el) {
				rel = el.getAttribute("rel");
				if (rel && relAttr.test(rel)) {
					links.push(el);
				}
			});
		} else {
			var length = selector.length;
			if (length) {
				if (typeof selector == "string") {
					if (S.find) {
						links = S.find(selector);
					}
				} else {
					if (length == 2 && typeof selector[0] == "string" && selector[1].nodeType) {
						if (S.find) {
							links = S.find(selector[0], selector[1]);
						}
					} else {
						for (var i = 0; i < length; ++i) {
							links[i] = selector[i];
						}
					}
				}
			} else {
				links.push(selector);
			}
		}
		return links;
	};
	S.setup = function (selector, options) {
		each(S.select(selector), function (i, link) {
			S.addCache(link, options);
		});
	};
	S.teardown = function (selector) {
		each(S.select(selector), function (i, link) {
			S.removeCache(link);
		});
	};
	S.addCache = function (link, options) {
		var key = link[expando];
		if (key == undefined) {
			key = cacheKey++;
			link[expando] = key;
			addEvent(link, "click", handleClick);
		}
		S.cache[key] = S.makeObject(link, options);
	};
	S.removeCache = function (link) {
		removeEvent(link, "click", handleClick);
		delete S.cache[link[expando]];
		link[expando] = null;
	};
	S.getCache = function (link) {
		var key = link[expando];
		return (key in S.cache && S.cache[key]);
	};
	S.clearCache = function () {
		for (var key in S.cache) {
			S.removeCache(S.cache[key].link);
		}
		S.cache = {};
	};
	function handleClick(e) {
		S.open(this);
		if (S.gallery.length) {
			preventDefault(e);
		}
	}
	/*
 * Sizzle CSS Selector Engine - v1.0
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 *
 * Modified for inclusion in Shadowbox.js
 */
	S.find = (function () {
		var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true;
		[0, 0].sort(function () {
			baseHasDuplicate = false;
			return 0;
		});
		var Sizzle = function (selector, context, results, seed) {
			results = results || [];
			var origContext = context = context || document;
			if (context.nodeType !== 1 && context.nodeType !== 9) {
				return [];
			}
			if (!selector || typeof selector !== "string") {
				return results;
			}
			var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), soFar = selector;
			while ((chunker.exec(""), m = chunker.exec(soFar)) !== null) {
				soFar = m[3];
				parts.push(m[1]);
				if (m[2]) {
					extra = m[3];
					break;
				}
			}
			if (parts.length > 1 && origPOS.exec(selector)) {
				if (parts.length === 2 && Expr.relative[parts[0]]) {
					set = posProcess(parts[0] + parts[1], context);
				} else {
					set = Expr.relative[parts[0]] ? [context] : Sizzle(parts.shift(), context);
					while (parts.length) {
						selector = parts.shift();
						if (Expr.relative[selector]) {
							selector += parts.shift();
						}
						set = posProcess(selector, set);
					}
				}
			} else {
				if (!seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1])) {
					var ret = Sizzle.find(parts.shift(), context, contextXML);
					context = ret.expr ? Sizzle.filter(ret.expr, ret.set)[0] : ret.set[0];
				}
				if (context) {
					var ret = seed ? {expr:parts.pop(), set:makeArray(seed)} : Sizzle.find(parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML);
					set = ret.expr ? Sizzle.filter(ret.expr, ret.set) : ret.set;
					if (parts.length > 0) {
						checkSet = makeArray(set);
					} else {
						prune = false;
					}
					while (parts.length) {
						var cur = parts.pop(), pop = cur;
						if (!Expr.relative[cur]) {
							cur = "";
						} else {
							pop = parts.pop();
						}
						if (pop == null) {
							pop = context;
						}
						Expr.relative[cur](checkSet, pop, contextXML);
					}
				} else {
					checkSet = parts = [];
				}
			}
			if (!checkSet) {
				checkSet = set;
			}
			if (!checkSet) {
				throw "Syntax error, unrecognized expression: " + (cur || selector);
			}
			if (toString.call(checkSet) === "[object Array]") {
				if (!prune) {
					results.push.apply(results, checkSet);
				} else {
					if (context && context.nodeType === 1) {
						for (var i = 0; checkSet[i] != null; i++) {
							if (checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i]))) {
								results.push(set[i]);
							}
						}
					} else {
						for (var i = 0; checkSet[i] != null; i++) {
							if (checkSet[i] && checkSet[i].nodeType === 1) {
								results.push(set[i]);
							}
						}
					}
				}
			} else {
				makeArray(checkSet, results);
			}
			if (extra) {
				Sizzle(extra, origContext, results, seed);
				Sizzle.uniqueSort(results);
			}
			return results;
		};
		Sizzle.uniqueSort = function (results) {
			if (sortOrder) {
				hasDuplicate = baseHasDuplicate;
				results.sort(sortOrder);
				if (hasDuplicate) {
					for (var i = 1; i < results.length; i++) {
						if (results[i] === results[i - 1]) {
							results.splice(i--, 1);
						}
					}
				}
			}
			return results;
		};
		Sizzle.matches = function (expr, set) {
			return Sizzle(expr, null, null, set);
		};
		Sizzle.find = function (expr, context, isXML) {
			var set, match;
			if (!expr) {
				return [];
			}
			for (var i = 0, l = Expr.order.length; i < l; i++) {
				var type = Expr.order[i], match;
				if ((match = Expr.leftMatch[type].exec(expr))) {
					var left = match[1];
					match.splice(1, 1);
					if (left.substr(left.length - 1) !== "\\") {
						match[1] = (match[1] || "").replace(/\\/g, "");
						set = Expr.find[type](match, context, isXML);
						if (set != null) {
							expr = expr.replace(Expr.match[type], "");
							break;
						}
					}
				}
			}
			if (!set) {
				set = context.getElementsByTagName("*");
			}
			return {set:set, expr:expr};
		};
		Sizzle.filter = function (expr, set, inplace, not) {
			var old = expr, result = [], curLoop = set, match, anyFound, isXMLFilter = set && set[0] && isXML(set[0]);
			while (expr && set.length) {
				for (var type in Expr.filter) {
					if ((match = Expr.match[type].exec(expr)) != null) {
						var filter = Expr.filter[type], found, item;
						anyFound = false;
						if (curLoop === result) {
							result = [];
						}
						if (Expr.preFilter[type]) {
							match = Expr.preFilter[type](match, curLoop, inplace, result, not, isXMLFilter);
							if (!match) {
								anyFound = found = true;
							} else {
								if (match === true) {
									continue;
								}
							}
						}
						if (match) {
							for (var i = 0; (item = curLoop[i]) != null; i++) {
								if (item) {
									found = filter(item, match, i, curLoop);
									var pass = not ^ !!found;
									if (inplace && found != null) {
										if (pass) {
											anyFound = true;
										} else {
											curLoop[i] = false;
										}
									} else {
										if (pass) {
											result.push(item);
											anyFound = true;
										}
									}
								}
							}
						}
						if (found !== undefined) {
							if (!inplace) {
								curLoop = result;
							}
							expr = expr.replace(Expr.match[type], "");
							if (!anyFound) {
								return [];
							}
							break;
						}
					}
				}
				if (expr === old) {
					if (anyFound == null) {
						throw "Syntax error, unrecognized expression: " + expr;
					} else {
						break;
					}
				}
				old = expr;
			}
			return curLoop;
		};
		var Expr = Sizzle.selectors = {order:["ID", "NAME", "TAG"], match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/}, leftMatch:{}, attrMap:{"class":"className", "for":"htmlFor"}, attrHandle:{href:function (elem) {
			return elem.getAttribute("href");
		}}, relative:{"+":function (checkSet, part) {
			var isPartStr = typeof part === "string", isTag = isPartStr && !/\W/.test(part), isPartStrNotTag = isPartStr && !isTag;
			if (isTag) {
				part = part.toLowerCase();
			}
			for (var i = 0, l = checkSet.length, elem; i < l; i++) {
				if ((elem = checkSet[i])) {
					while ((elem = elem.previousSibling) && elem.nodeType !== 1) {
					}
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part;
				}
			}
			if (isPartStrNotTag) {
				Sizzle.filter(part, checkSet, true);
			}
		}, ">":function (checkSet, part) {
			var isPartStr = typeof part === "string";
			if (isPartStr && !/\W/.test(part)) {
				part = part.toLowerCase();
				for (var i = 0, l = checkSet.length; i < l; i++) {
					var elem = checkSet[i];
					if (elem) {
						var parent = elem.parentNode;
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
					}
				}
			} else {
				for (var i = 0, l = checkSet.length; i < l; i++) {
					var elem = checkSet[i];
					if (elem) {
						checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part;
					}
				}
				if (isPartStr) {
					Sizzle.filter(part, checkSet, true);
				}
			}
		}, "":function (checkSet, part, isXML) {
			var doneName = done++, checkFn = dirCheck;
			if (typeof part === "string" && !/\W/.test(part)) {
				var nodeCheck = part = part.toLowerCase();
				checkFn = dirNodeCheck;
			}
			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
		}, "~":function (checkSet, part, isXML) {
			var doneName = done++, checkFn = dirCheck;
			if (typeof part === "string" && !/\W/.test(part)) {
				var nodeCheck = part = part.toLowerCase();
				checkFn = dirNodeCheck;
			}
			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
		}}, find:{ID:function (match, context, isXML) {
			if (typeof context.getElementById !== "undefined" && !isXML) {
				var m = context.getElementById(match[1]);
				return m ? [m] : [];
			}
		}, NAME:function (match, context) {
			if (typeof context.getElementsByName !== "undefined") {
				var ret = [], results = context.getElementsByName(match[1]);
				for (var i = 0, l = results.length; i < l; i++) {
					if (results[i].getAttribute("name") === match[1]) {
						ret.push(results[i]);
					}
				}
				return ret.length === 0 ? null : ret;
			}
		}, TAG:function (match, context) {
			return context.getElementsByTagName(match[1]);
		}}, preFilter:{CLASS:function (match, curLoop, inplace, result, not, isXML) {
			match = " " + match[1].replace(/\\/g, "") + " ";
			if (isXML) {
				return match;
			}
			for (var i = 0, elem; (elem = curLoop[i]) != null; i++) {
				if (elem) {
					if (not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0)) {
						if (!inplace) {
							result.push(elem);
						}
					} else {
						if (inplace) {
							curLoop[i] = false;
						}
					}
				}
			}
			return false;
		}, ID:function (match) {
			return match[1].replace(/\\/g, "");
		}, TAG:function (match, curLoop) {
			return match[1].toLowerCase();
		}, CHILD:function (match) {
			if (match[1] === "nth") {
				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test(match[2]) && "0n+" + match[2] || match[2]);
				match[2] = (test[1] + (test[2] || 1)) - 0;
				match[3] = test[3] - 0;
			}
			match[0] = done++;
			return match;
		}, ATTR:function (match, curLoop, inplace, result, not, isXML) {
			var name = match[1].replace(/\\/g, "");
			if (!isXML && Expr.attrMap[name]) {
				match[1] = Expr.attrMap[name];
			}
			if (match[2] === "~=") {
				match[4] = " " + match[4] + " ";
			}
			return match;
		}, PSEUDO:function (match, curLoop, inplace, result, not) {
			if (match[1] === "not") {
				if ((chunker.exec(match[3]) || "").length > 1 || /^\w/.test(match[3])) {
					match[3] = Sizzle(match[3], null, null, curLoop);
				} else {
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
					if (!inplace) {
						result.push.apply(result, ret);
					}
					return false;
				}
			} else {
				if (Expr.match.POS.test(match[0]) || Expr.match.CHILD.test(match[0])) {
					return true;
				}
			}
			return match;
		}, POS:function (match) {
			match.unshift(true);
			return match;
		}}, filters:{enabled:function (elem) {
			return elem.disabled === false && elem.type !== "hidden";
		}, disabled:function (elem) {
			return elem.disabled === true;
		}, checked:function (elem) {
			return elem.checked === true;
		}, selected:function (elem) {
			elem.parentNode.selectedIndex;
			return elem.selected === true;
		}, parent:function (elem) {
			return !!elem.firstChild;
		}, empty:function (elem) {
			return !elem.firstChild;
		}, has:function (elem, i, match) {
			return !!Sizzle(match[3], elem).length;
		}, header:function (elem) {
			return /h\d/i.test(elem.nodeName);
		}, text:function (elem) {
			return "text" === elem.type;
		}, radio:function (elem) {
			return "radio" === elem.type;
		}, checkbox:function (elem) {
			return "checkbox" === elem.type;
		}, file:function (elem) {
			return "file" === elem.type;
		}, password:function (elem) {
			return "password" === elem.type;
		}, submit:function (elem) {
			return "submit" === elem.type;
		}, image:function (elem) {
			return "image" === elem.type;
		}, reset:function (elem) {
			return "reset" === elem.type;
		}, button:function (elem) {
			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
		}, input:function (elem) {
			return /input|select|textarea|button/i.test(elem.nodeName);
		}}, setFilters:{first:function (elem, i) {
			return i === 0;
		}, last:function (elem, i, match, array) {
			return i === array.length - 1;
		}, even:function (elem, i) {
			return i % 2 === 0;
		}, odd:function (elem, i) {
			return i % 2 === 1;
		}, lt:function (elem, i, match) {
			return i < match[3] - 0;
		}, gt:function (elem, i, match) {
			return i > match[3] - 0;
		}, nth:function (elem, i, match) {
			return match[3] - 0 === i;
		}, eq:function (elem, i, match) {
			return match[3] - 0 === i;
		}}, filter:{PSEUDO:function (elem, match, i, array) {
			var name = match[1], filter = Expr.filters[name];
			if (filter) {
				return filter(elem, i, match, array);
			} else {
				if (name === "contains") {
					return (elem.textContent || elem.innerText || getText([elem]) || "").indexOf(match[3]) >= 0;
				} else {
					if (name === "not") {
						var not = match[3];
						for (var i = 0, l = not.length; i < l; i++) {
							if (not[i] === elem) {
								return false;
							}
						}
						return true;
					} else {
						throw "Syntax error, unrecognized expression: " + name;
					}
				}
			}
		}, CHILD:function (elem, match) {
			var type = match[1], node = elem;
			switch (type) {
			  case "only":
			  case "first":
				while ((node = node.previousSibling)) {
					if (node.nodeType === 1) {
						return false;
					}
				}
				if (type === "first") {
					return true;
				}
				node = elem;
			  case "last":
				while ((node = node.nextSibling)) {
					if (node.nodeType === 1) {
						return false;
					}
				}
				return true;
			  case "nth":
				var first = match[2], last = match[3];
				if (first === 1 && last === 0) {
					return true;
				}
				var doneName = match[0], parent = elem.parentNode;
				if (parent && (parent.sizcache !== doneName || !elem.nodeIndex)) {
					var count = 0;
					for (node = parent.firstChild; node; node = node.nextSibling) {
						if (node.nodeType === 1) {
							node.nodeIndex = ++count;
						}
					}
					parent.sizcache = doneName;
				}
				var diff = elem.nodeIndex - last;
				if (first === 0) {
					return diff === 0;
				} else {
					return (diff % first === 0 && diff / first >= 0);
				}
			}
		}, ID:function (elem, match) {
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
		}, TAG:function (elem, match) {
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
		}, CLASS:function (elem, match) {
			return (" " + (elem.className || elem.getAttribute("class")) + " ").indexOf(match) > -1;
		}, ATTR:function (elem, match) {
			var name = match[1], result = Expr.attrHandle[name] ? Expr.attrHandle[name](elem) : elem[name] != null ? elem[name] : elem.getAttribute(name), value = result + "", type = match[2], check = match[4];
			return result == null ? type === "!=" : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false;
		}, POS:function (elem, match, i, array) {
			var name = match[2], filter = Expr.setFilters[name];
			if (filter) {
				return filter(elem, i, match, array);
			}
		}}};
		var origPOS = Expr.match.POS;
		for (var type in Expr.match) {
			Expr.match[type] = new RegExp(Expr.match[type].source + /(?![^\[]*\])(?![^\(]*\))/.source);
			Expr.leftMatch[type] = new RegExp(/(^(?:.|\r|\n)*?)/.source + Expr.match[type].source);
		}
		var makeArray = function (array, results) {
			array = Array.prototype.slice.call(array, 0);
			if (results) {
				results.push.apply(results, array);
				return results;
			}
			return array;
		};
		try {
			Array.prototype.slice.call(document.documentElement.childNodes, 0);
		}
		catch (e) {
			makeArray = function (array, results) {
				var ret = results || [];
				if (toString.call(array) === "[object Array]") {
					Array.prototype.push.apply(ret, array);
				} else {
					if (typeof array.length === "number") {
						for (var i = 0, l = array.length; i < l; i++) {
							ret.push(array[i]);
						}
					} else {
						for (var i = 0; array[i]; i++) {
							ret.push(array[i]);
						}
					}
				}
				return ret;
			};
		}
		var sortOrder;
		if (document.documentElement.compareDocumentPosition) {
			sortOrder = function (a, b) {
				if (!a.compareDocumentPosition || !b.compareDocumentPosition) {
					if (a == b) {
						hasDuplicate = true;
					}
					return a.compareDocumentPosition ? -1 : 1;
				}
				var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
				if (ret === 0) {
					hasDuplicate = true;
				}
				return ret;
			};
		} else {
			if ("sourceIndex" in document.documentElement) {
				sortOrder = function (a, b) {
					if (!a.sourceIndex || !b.sourceIndex) {
						if (a == b) {
							hasDuplicate = true;
						}
						return a.sourceIndex ? -1 : 1;
					}
					var ret = a.sourceIndex - b.sourceIndex;
					if (ret === 0) {
						hasDuplicate = true;
					}
					return ret;
				};
			} else {
				if (document.createRange) {
					sortOrder = function (a, b) {
						if (!a.ownerDocument || !b.ownerDocument) {
							if (a == b) {
								hasDuplicate = true;
							}
							return a.ownerDocument ? -1 : 1;
						}
						var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
						aRange.setStart(a, 0);
						aRange.setEnd(a, 0);
						bRange.setStart(b, 0);
						bRange.setEnd(b, 0);
						var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
						if (ret === 0) {
							hasDuplicate = true;
						}
						return ret;
					};
				}
			}
		}
		function getText(elems) {
			var ret = "", elem;
			for (var i = 0; elems[i]; i++) {
				elem = elems[i];
				if (elem.nodeType === 3 || elem.nodeType === 4) {
					ret += elem.nodeValue;
				} else {
					if (elem.nodeType !== 8) {
						ret += getText(elem.childNodes);
					}
				}
			}
			return ret;
		}
		(function () {
			var form = document.createElement("div"), id = "script" + (new Date).getTime();
			form.innerHTML = "<a name='" + id + "'/>";
			var root = document.documentElement;
			root.insertBefore(form, root.firstChild);
			if (document.getElementById(id)) {
				Expr.find.ID = function (match, context, isXML) {
					if (typeof context.getElementById !== "undefined" && !isXML) {
						var m = context.getElementById(match[1]);
						return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
					}
				};
				Expr.filter.ID = function (elem, match) {
					var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
					return elem.nodeType === 1 && node && node.nodeValue === match;
				};
			}
			root.removeChild(form);
			root = form = null;
		})();
		(function () {
			var div = document.createElement("div");
			div.appendChild(document.createComment(""));
			if (div.getElementsByTagName("*").length > 0) {
				Expr.find.TAG = function (match, context) {
					var results = context.getElementsByTagName(match[1]);
					if (match[1] === "*") {
						var tmp = [];
						for (var i = 0; results[i]; i++) {
							if (results[i].nodeType === 1) {
								tmp.push(results[i]);
							}
						}
						results = tmp;
					}
					return results;
				};
			}
			div.innerHTML = "<a href='#'></a>";
			if (div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#") {
				Expr.attrHandle.href = function (elem) {
					return elem.getAttribute("href", 2);
				};
			}
			div = null;
		})();
		if (document.querySelectorAll) {
			(function () {
				var oldSizzle = Sizzle, div = document.createElement("div");
				div.innerHTML = "<p class='TEST'></p>";
				if (div.querySelectorAll && div.querySelectorAll(".TEST").length === 0) {
					return;
				}
				Sizzle = function (query, context, extra, seed) {
					context = context || document;
					if (!seed && context.nodeType === 9 && !isXML(context)) {
						try {
							return makeArray(context.querySelectorAll(query), extra);
						}
						catch (e) {
						}
					}
					return oldSizzle(query, context, extra, seed);
				};
				for (var prop in oldSizzle) {
					Sizzle[prop] = oldSizzle[prop];
				}
				div = null;
			})();
		}
		(function () {
			var div = document.createElement("div");
			div.innerHTML = "<div class='test e'></div><div class='test'></div>";
			if (!div.getElementsByClassName || div.getElementsByClassName("e").length === 0) {
				return;
			}
			div.lastChild.className = "e";
			if (div.getElementsByClassName("e").length === 1) {
				return;
			}
			Expr.order.splice(1, 0, "CLASS");
			Expr.find.CLASS = function (match, context, isXML) {
				if (typeof context.getElementsByClassName !== "undefined" && !isXML) {
					return context.getElementsByClassName(match[1]);
				}
			};
			div = null;
		})();
		function dirNodeCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) {
			for (var i = 0, l = checkSet.length; i < l; i++) {
				var elem = checkSet[i];
				if (elem) {
					elem = elem[dir];
					var match = false;
					while (elem) {
						if (elem.sizcache === doneName) {
							match = checkSet[elem.sizset];
							break;
						}
						if (elem.nodeType === 1 && !isXML) {
							elem.sizcache = doneName;
							elem.sizset = i;
						}
						if (elem.nodeName.toLowerCase() === cur) {
							match = elem;
							break;
						}
						elem = elem[dir];
					}
					checkSet[i] = match;
				}
			}
		}
		function dirCheck(dir, cur, doneName, checkSet, nodeCheck, isXML) {
			for (var i = 0, l = checkSet.length; i < l; i++) {
				var elem = checkSet[i];
				if (elem) {
					elem = elem[dir];
					var match = false;
					while (elem) {
						if (elem.sizcache === doneName) {
							match = checkSet[elem.sizset];
							break;
						}
						if (elem.nodeType === 1) {
							if (!isXML) {
								elem.sizcache = doneName;
								elem.sizset = i;
							}
							if (typeof cur !== "string") {
								if (elem === cur) {
									match = true;
									break;
								}
							} else {
								if (Sizzle.filter(cur, [elem]).length > 0) {
									match = elem;
									break;
								}
							}
						}
						elem = elem[dir];
					}
					checkSet[i] = match;
				}
			}
		}
		var contains = document.compareDocumentPosition ? function (a, b) {
			return a.compareDocumentPosition(b) & 16;
		} : function (a, b) {
			return a !== b && (a.contains ? a.contains(b) : true);
		};
		var isXML = function (elem) {
			var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
			return documentElement ? documentElement.nodeName !== "HTML" : false;
		};
		var posProcess = function (selector, context) {
			var tmpSet = [], later = "", match, root = context.nodeType ? [context] : context;
			while ((match = Expr.match.PSEUDO.exec(selector))) {
				later += match[0];
				selector = selector.replace(Expr.match.PSEUDO, "");
			}
			selector = Expr.relative[selector] ? selector + "*" : selector;
			for (var i = 0, l = root.length; i < l; i++) {
				Sizzle(selector, root[i], tmpSet);
			}
			return Sizzle.filter(later, tmpSet);
		};
		return Sizzle;
	})();
	/*
 * SWFObject v2.1 <http://code.google.com/p/swfobject/>
 * Copyright (c) 2007-2008 Geoff Stearns, Michael Williams, and Bobby van der Sluis
 * This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 *
 * Modified for inclusion in Shadowbox.js
 */
	S.flash = (function () {
		var swfobject = function () {
			var UNDEF = "undefined", OBJECT = "object", SHOCKWAVE_FLASH = "Shockwave Flash", SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", FLASH_MIME_TYPE = "application/x-shockwave-flash", EXPRESS_INSTALL_ID = "SWFObjectExprInst", win = window, doc = document, nav = navigator, domLoadFnArr = [], regObjArr = [], objIdArr = [], listenersArr = [], script, timer = null, storedAltContent = null, storedAltContentId = null, isDomLoaded = false, isExpressInstallActive = false;
			var ua = function () {
				var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, playerVersion = [0, 0, 0], d = null;
				if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
					d = nav.plugins[SHOCKWAVE_FLASH].description;
					if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) {
						d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
						playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
						playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
						playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
					}
				} else {
					if (typeof win.ActiveXObject != UNDEF) {
						var a = null, fp6Crash = false;
						try {
							a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
						}
						catch (e) {
							try {
								a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
								playerVersion = [6, 0, 21];
								a.AllowScriptAccess = "always";
							}
							catch (e) {
								if (playerVersion[0] == 6) {
									fp6Crash = true;
								}
							}
							if (!fp6Crash) {
								try {
									a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
								}
								catch (e) {
								}
							}
						}
						if (!fp6Crash && a) {
							try {
								d = a.GetVariable("$version");
								if (d) {
									d = d.split(" ")[1].split(",");
									playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
								}
							}
							catch (e) {
							}
						}
					}
				}
				var u = nav.userAgent.toLowerCase(), p = nav.platform.toLowerCase(), webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, ie = false, windows = p ? /win/.test(p) : /win/.test(u), mac = p ? /mac/.test(p) : /mac/.test(u);
				/*@cc_on
			ie = true;
			@if (@_win32)
				windows = true;
			@elif (@_mac)
				mac = true;
			@end
		@*/
				return {w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac};
			}();
			var onDomLoad = function () {
				if (!ua.w3cdom) {
					return;
				}
				addDomLoadEvent(main);
				if (ua.ie && ua.win) {
					try {
						doc.write("<script id=__ie_ondomload defer=true src=//:></script>");
						script = getElementById("__ie_ondomload");
						if (script) {
							addListener(script, "onreadystatechange", checkReadyState);
						}
					}
					catch (e) {
					}
				}
				if (ua.webkit && typeof doc.readyState != UNDEF) {
					timer = setInterval(function () {
						if (/loaded|complete/.test(doc.readyState)) {
							callDomLoadFunctions();
						}
					}, 10);
				}
				if (typeof doc.addEventListener != UNDEF) {
					doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
				}
				addLoadEvent(callDomLoadFunctions);
			}();
			function checkReadyState() {
				if (script.readyState == "complete") {
					script.parentNode.removeChild(script);
					callDomLoadFunctions();
				}
			}
			function callDomLoadFunctions() {
				if (isDomLoaded) {
					return;
				}
				if (ua.ie && ua.win) {
					var s = createElement("span");
					try {
						var t = doc.getElementsByTagName("body")[0].appendChild(s);
						t.parentNode.removeChild(t);
					}
					catch (e) {
						return;
					}
				}
				isDomLoaded = true;
				if (timer) {
					clearInterval(timer);
					timer = null;
				}
				var dl = domLoadFnArr.length;
				for (var i = 0; i < dl; i++) {
					domLoadFnArr[i]();
				}
			}
			function addDomLoadEvent(fn) {
				if (isDomLoaded) {
					fn();
				} else {
					domLoadFnArr[domLoadFnArr.length] = fn;
				}
			}
			function addLoadEvent(fn) {
				if (typeof win.addEventListener != UNDEF) {
					win.addEventListener("load", fn, false);
				} else {
					if (typeof doc.addEventListener != UNDEF) {
						doc.addEventListener("load", fn, false);
					} else {
						if (typeof win.attachEvent != UNDEF) {
							addListener(win, "onload", fn);
						} else {
							if (typeof win.onload == "function") {
								var fnOld = win.onload;
								win.onload = function () {
									fnOld();
									fn();
								};
							} else {
								win.onload = fn;
							}
						}
					}
				}
			}
			function main() {
				var rl = regObjArr.length;
				for (var i = 0; i < rl; i++) {
					var id = regObjArr[i].id;
					if (ua.pv[0] > 0) {
						var obj = getElementById(id);
						if (obj) {
							regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
							regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
							if (hasPlayerVersion(regObjArr[i].swfVersion)) {
								if (ua.webkit && ua.webkit < 312) {
									fixParams(obj);
								}
								setVisibility(id, true);
							} else {
								if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
									showExpressInstall(regObjArr[i]);
								} else {
									displayAltContent(obj);
								}
							}
						}
					} else {
						setVisibility(id, true);
					}
				}
			}
			function fixParams(obj) {
				var nestedObj = obj.getElementsByTagName(OBJECT)[0];
				if (nestedObj) {
					var e = createElement("embed"), a = nestedObj.attributes;
					if (a) {
						var al = a.length;
						for (var i = 0; i < al; i++) {
							if (a[i].nodeName == "DATA") {
								e.setAttribute("src", a[i].nodeValue);
							} else {
								e.setAttribute(a[i].nodeName, a[i].nodeValue);
							}
						}
					}
					var c = nestedObj.childNodes;
					if (c) {
						var cl = c.length;
						for (var j = 0; j < cl; j++) {
							if (c[j].nodeType == 1 && c[j].nodeName == "PARAM") {
								e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
							}
						}
					}
					obj.parentNode.replaceChild(e, obj);
				}
			}
			function showExpressInstall(regObj) {
				isExpressInstallActive = true;
				var obj = getElementById(regObj.id);
				if (obj) {
					if (regObj.altContentId) {
						var ac = getElementById(regObj.altContentId);
						if (ac) {
							storedAltContent = ac;
							storedAltContentId = regObj.altContentId;
						}
					} else {
						storedAltContent = abstractAltContent(obj);
					}
					if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
						regObj.width = "310";
					}
					if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
						regObj.height = "137";
					}
					doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
					var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", dt = doc.title, fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt, replaceId = regObj.id;
					if (ua.ie && ua.win && obj.readyState != 4) {
						var newObj = createElement("div");
						replaceId += "SWFObjectNew";
						newObj.setAttribute("id", replaceId);
						obj.parentNode.insertBefore(newObj, obj);
						obj.style.display = "none";
						var fn = function () {
							obj.parentNode.removeChild(obj);
						};
						addListener(win, "onload", fn);
					}
					createSWF({data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height}, {flashvars:fv}, replaceId);
				}
			}
			function displayAltContent(obj) {
				if (ua.ie && ua.win && obj.readyState != 4) {
					var el = createElement("div");
					obj.parentNode.insertBefore(el, obj);
					el.parentNode.replaceChild(abstractAltContent(obj), el);
					obj.style.display = "none";
					var fn = function () {
						obj.parentNode.removeChild(obj);
					};
					addListener(win, "onload", fn);
				} else {
					obj.parentNode.replaceChild(abstractAltContent(obj), obj);
				}
			}
			function abstractAltContent(obj) {
				var ac = createElement("div");
				if (ua.win && ua.ie) {
					ac.innerHTML = obj.innerHTML;
				} else {
					var nestedObj = obj.getElementsByTagName(OBJECT)[0];
					if (nestedObj) {
						var c = nestedObj.childNodes;
						if (c) {
							var cl = c.length;
							for (var i = 0; i < cl; i++) {
								if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
									ac.appendChild(c[i].cloneNode(true));
								}
							}
						}
					}
				}
				return ac;
			}
			function createSWF(attObj, parObj, id) {
				var r, el = getElementById(id);
				if (el) {
					if (typeof attObj.id == UNDEF) {
						attObj.id = id;
					}
					if (ua.ie && ua.win) {
						var att = "";
						for (var i in attObj) {
							if (attObj[i] != Object.prototype[i]) {
								if (i.toLowerCase() == "data") {
									parObj.movie = attObj[i];
								} else {
									if (i.toLowerCase() == "styleclass") {
										att += " class=\"" + attObj[i] + "\"";
									} else {
										if (i.toLowerCase() != "classid") {
											att += " " + i + "=\"" + attObj[i] + "\"";
										}
									}
								}
							}
						}
						var par = "";
						for (var j in parObj) {
							if (parObj[j] != Object.prototype[j]) {
								par += "<param name=\"" + j + "\" value=\"" + parObj[j] + "\" />";
							}
						}
						el.outerHTML = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"" + att + ">" + par + "</object>";
						objIdArr[objIdArr.length] = attObj.id;
						r = getElementById(attObj.id);
					} else {
						if (ua.webkit && ua.webkit < 312) {
							var e = createElement("embed");
							e.setAttribute("type", FLASH_MIME_TYPE);
							for (var k in attObj) {
								if (attObj[k] != Object.prototype[k]) {
									if (k.toLowerCase() == "data") {
										e.setAttribute("src", attObj[k]);
									} else {
										if (k.toLowerCase() == "styleclass") {
											e.setAttribute("class", attObj[k]);
										} else {
											if (k.toLowerCase() != "classid") {
												e.setAttribute(k, attObj[k]);
											}
										}
									}
								}
							}
							for (var l in parObj) {
								if (parObj[l] != Object.prototype[l]) {
									if (l.toLowerCase() != "movie") {
										e.setAttribute(l, parObj[l]);
									}
								}
							}
							el.parentNode.replaceChild(e, el);
							r = e;
						} else {
							var o = createElement(OBJECT);
							o.setAttribute("type", FLASH_MIME_TYPE);
							for (var m in attObj) {
								if (attObj[m] != Object.prototype[m]) {
									if (m.toLowerCase() == "styleclass") {
										o.setAttribute("class", attObj[m]);
									} else {
										if (m.toLowerCase() != "classid") {
											o.setAttribute(m, attObj[m]);
										}
									}
								}
							}
							for (var n in parObj) {
								if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") {
									createObjParam(o, n, parObj[n]);
								}
							}
							el.parentNode.replaceChild(o, el);
							r = o;
						}
					}
				}
				return r;
			}
			function createObjParam(el, pName, pValue) {
				var p = createElement("param");
				p.setAttribute("name", pName);
				p.setAttribute("value", pValue);
				el.appendChild(p);
			}
			function removeSWF(id) {
				var obj = getElementById(id);
				if (obj && (obj.nodeName == "OBJECT" || obj.nodeName == "EMBED")) {
					if (ua.ie && ua.win) {
						if (obj.readyState == 4) {
							removeObjectInIE(id);
						} else {
							win.attachEvent("onload", function () {
								removeObjectInIE(id);
							});
						}
					} else {
						obj.parentNode.removeChild(obj);
					}
				}
			}
			function removeObjectInIE(id) {
				var obj = getElementById(id);
				if (obj) {
					for (var i in obj) {
						if (typeof obj[i] == "function") {
							obj[i] = null;
						}
					}
					obj.parentNode.removeChild(obj);
				}
			}
			function getElementById(id) {
				var el = null;
				try {
					el = doc.getElementById(id);
				}
				catch (e) {
				}
				return el;
			}
			function createElement(el) {
				return doc.createElement(el);
			}
			function addListener(target, eventType, fn) {
				target.attachEvent(eventType, fn);
				listenersArr[listenersArr.length] = [target, eventType, fn];
			}
			function hasPlayerVersion(rv) {
				var pv = ua.pv, v = rv.split(".");
				v[0] = parseInt(v[0], 10);
				v[1] = parseInt(v[1], 10) || 0;
				v[2] = parseInt(v[2], 10) || 0;
				return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
			}
			function createCSS(sel, decl) {
				if (ua.ie && ua.mac) {
					return;
				}
				var h = doc.getElementsByTagName("head")[0], s = createElement("style");
				s.setAttribute("type", "text/css");
				s.setAttribute("media", "screen");
				if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
					s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
				}
				h.appendChild(s);
				if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
					var ls = doc.styleSheets[doc.styleSheets.length - 1];
					if (typeof ls.addRule == OBJECT) {
						ls.addRule(sel, decl);
					}
				}
			}
			function setVisibility(id, isVisible) {
				var v = isVisible ? "visible" : "hidden";
				if (isDomLoaded && getElementById(id)) {
					getElementById(id).style.visibility = v;
				} else {
					createCSS("#" + id, "visibility:" + v);
				}
			}
			function urlEncodeIfNecessary(s) {
				var regex = /[\\\"<>\.;]/;
				var hasBadChars = regex.exec(s) != null;
				return hasBadChars ? encodeURIComponent(s) : s;
			}
			var cleanup = function () {
				if (ua.ie && ua.win) {
					window.attachEvent("onunload", function () {
						var ll = listenersArr.length;
						for (var i = 0; i < ll; i++) {
							listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
						}
						var il = objIdArr.length;
						for (var j = 0; j < il; j++) {
							removeSWF(objIdArr[j]);
						}
						for (var k in ua) {
							ua[k] = null;
						}
						ua = null;
						for (var l in swfobject) {
							swfobject[l] = null;
						}
						swfobject = null;
					});
				}
			}();
			return {registerObject:function (objectIdStr, swfVersionStr, xiSwfUrlStr) {
				if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
					return;
				}
				var regObj = {};
				regObj.id = objectIdStr;
				regObj.swfVersion = swfVersionStr;
				regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
				regObjArr[regObjArr.length] = regObj;
				setVisibility(objectIdStr, false);
			}, getObjectById:function (objectIdStr) {
				var r = null;
				if (ua.w3cdom) {
					var o = getElementById(objectIdStr);
					if (o) {
						var n = o.getElementsByTagName(OBJECT)[0];
						if (!n || (n && typeof o.SetVariable != UNDEF)) {
							r = o;
						} else {
							if (typeof n.SetVariable != UNDEF) {
								r = n;
							}
						}
					}
				}
				return r;
			}, embedSWF:function (swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
				if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
					return;
				}
				widthStr += "";
				heightStr += "";
				if (hasPlayerVersion(swfVersionStr)) {
					setVisibility(replaceElemIdStr, false);
					var att = {};
					if (attObj && typeof attObj === OBJECT) {
						for (var i in attObj) {
							if (attObj[i] != Object.prototype[i]) {
								att[i] = attObj[i];
							}
						}
					}
					att.data = swfUrlStr;
					att.width = widthStr;
					att.height = heightStr;
					var par = {};
					if (parObj && typeof parObj === OBJECT) {
						for (var j in parObj) {
							if (parObj[j] != Object.prototype[j]) {
								par[j] = parObj[j];
							}
						}
					}
					if (flashvarsObj && typeof flashvarsObj === OBJECT) {
						for (var k in flashvarsObj) {
							if (flashvarsObj[k] != Object.prototype[k]) {
								if (typeof par.flashvars != UNDEF) {
									par.flashvars += "&" + k + "=" + flashvarsObj[k];
								} else {
									par.flashvars = k + "=" + flashvarsObj[k];
								}
							}
						}
					}
					addDomLoadEvent(function () {
						createSWF(att, par, replaceElemIdStr);
						if (att.id == replaceElemIdStr) {
							setVisibility(replaceElemIdStr, true);
						}
					});
				} else {
					if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
						isExpressInstallActive = true;
						setVisibility(replaceElemIdStr, false);
						addDomLoadEvent(function () {
							var regObj = {};
							regObj.id = regObj.altContentId = replaceElemIdStr;
							regObj.width = widthStr;
							regObj.height = heightStr;
							regObj.expressInstall = xiSwfUrlStr;
							showExpressInstall(regObj);
						});
					}
				}
			}, getFlashPlayerVersion:function () {
				return {major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2]};
			}, hasFlashPlayerVersion:hasPlayerVersion, createSWF:function (attObj, parObj, replaceElemIdStr) {
				if (ua.w3cdom) {
					return createSWF(attObj, parObj, replaceElemIdStr);
				} else {
					return undefined;
				}
			}, removeSWF:function (objElemIdStr) {
				if (ua.w3cdom) {
					removeSWF(objElemIdStr);
				}
			}, createCSS:function (sel, decl) {
				if (ua.w3cdom) {
					createCSS(sel, decl);
				}
			}, addDomLoadEvent:addDomLoadEvent, addLoadEvent:addLoadEvent, getQueryParamValue:function (param) {
				var q = doc.location.search || doc.location.hash;
				if (param == null) {
					return urlEncodeIfNecessary(q);
				}
				if (q) {
					var pairs = q.substring(1).split("&");
					for (var i = 0; i < pairs.length; i++) {
						if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
							return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
						}
					}
				}
				return "";
			}, expressInstallCallback:function () {
				if (isExpressInstallActive && storedAltContent) {
					var obj = getElementById(EXPRESS_INSTALL_ID);
					if (obj) {
						obj.parentNode.replaceChild(storedAltContent, obj);
						if (storedAltContentId) {
							setVisibility(storedAltContentId, true);
							if (ua.ie && ua.win) {
								storedAltContent.style.display = "block";
							}
						}
						storedAltContent = null;
						storedAltContentId = null;
						isExpressInstallActive = false;
					}
				}
			}};
		}();
		return swfobject;
	})();
	S.lang = {code:"en", of:"of", loading:"loading", cancel:"Cancel", next:"Next", previous:"Previous", play:"Play", pause:"Pause", close:"Close", errors:{single:"You must install the <a href=\"{0}\">{1}</a> browser plugin to view this content.", shared:"You must install both the <a href=\"{0}\">{1}</a> and <a href=\"{2}\">{3}</a> browser plugins to view this content.", either:"You must install either the <a href=\"{0}\">{1}</a> or the <a href=\"{2}\">{3}</a> browser plugin to view this content."}};
	var pre, proxyId = "sb-drag-proxy", dragData, dragProxy, dragTarget;
	function resetDrag() {
		dragData = {x:0, y:0, startX:null, startY:null};
	}
	function updateProxy() {
		var dims = S.dimensions;
		apply(dragProxy.style, {height:dims.innerHeight + "px", width:dims.innerWidth + "px"});
	}
	function enableDrag() {
		resetDrag();
		var style = ["position:absolute", "cursor:" + (S.isGecko ? "-moz-grab" : "move"), "background-color:" + (S.isIE ? "#fff;filter:alpha(opacity=0)" : "transparent")].join(";");
		S.appendHTML(S.skin.body, "<div id=\"" + proxyId + "\" style=\"" + style + "\"></div>");
		dragProxy = get(proxyId);
		updateProxy();
		addEvent(dragProxy, "mousedown", startDrag);
	}
	function disableDrag() {
		if (dragProxy) {
			removeEvent(dragProxy, "mousedown", startDrag);
			remove(dragProxy);
			dragProxy = null;
		}
		dragTarget = null;
	}
	function startDrag(e) {
		preventDefault(e);
		var xy = getPageXY(e);
		dragData.startX = xy[0];
		dragData.startY = xy[1];
		dragTarget = get(S.player.id);
		addEvent(document, "mousemove", positionDrag);
		addEvent(document, "mouseup", endDrag);
		if (S.isGecko) {
			dragProxy.style.cursor = "-moz-grabbing";
		}
	}
	function positionDrag(e) {
		var player = S.player, dims = S.dimensions, xy = getPageXY(e);
		var moveX = xy[0] - dragData.startX;
		dragData.startX += moveX;
		dragData.x = Math.max(Math.min(0, dragData.x + moveX), dims.innerWidth - player.width);
		var moveY = xy[1] - dragData.startY;
		dragData.startY += moveY;
		dragData.y = Math.max(Math.min(0, dragData.y + moveY), dims.innerHeight - player.height);
		apply(dragTarget.style, {left:dragData.x + "px", top:dragData.y + "px"});
	}
	function endDrag() {
		removeEvent(document, "mousemove", positionDrag);
		removeEvent(document, "mouseup", endDrag);
		if (S.isGecko) {
			dragProxy.style.cursor = "-moz-grab";
		}
	}
	S.img = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.ready = false;
		var self = this;
		pre = new Image();
		pre.onload = function () {
			self.height = obj.height ? parseInt(obj.height, 10) : pre.height;
			self.width = obj.width ? parseInt(obj.width, 10) : pre.width;
			self.ready = true;
			pre.onload = null;
			pre = null;
		};
		pre.src = obj.content;
	};
	S.img.ext = ["bmp", "gif", "jpg", "jpeg", "png"];
	S.img.prototype = {append:function (body, dims) {
		var img = document.createElement("img");
		img.id = this.id;
		img.src = this.obj.content;
		img.style.position = "absolute";
		var height, width;
		if (dims.oversized && S.options.handleOversize == "resize") {
			height = dims.innerHeight;
			width = dims.innerWidth;
		} else {
			height = this.height;
			width = this.width;
		}
		img.setAttribute("height", height);
		img.setAttribute("width", width);
		body.appendChild(img);
	}, remove:function () {
		var el = get(this.id);
		if (el) {
			remove(el);
		}
		disableDrag();
		if (pre) {
			pre.onload = null;
			pre = null;
		}
	}, onLoad:function () {
		var dims = S.dimensions;
		if (dims.oversized && S.options.handleOversize == "drag") {
			enableDrag();
		}
	}, onWindowResize:function () {
		var dims = S.dimensions;
		switch (S.options.handleOversize) {
		  case "resize":
			var el = get(this.id);
			el.height = dims.innerHeight;
			el.width = dims.innerWidth;
			break;
		  case "drag":
			if (dragTarget) {
				var top = parseInt(S.getStyle(dragTarget, "top")), left = parseInt(S.getStyle(dragTarget, "left"));
				if (top + this.height < dims.innerHeight) {
					dragTarget.style.top = dims.innerHeight - this.height + "px";
				}
				if (left + this.width < dims.innerWidth) {
					dragTarget.style.left = dims.innerWidth - this.width + "px";
				}
				updateProxy();
			}
			break;
		}
	}};
	S.iframe = function (obj, id) {
		this.obj = obj;
		this.id = id;
		var overlay = get("sb-overlay");
		this.height = obj.height ? parseInt(obj.height, 10) : overlay.offsetHeight;
		this.width = obj.width ? parseInt(obj.width, 10) : overlay.offsetWidth;
	};
	S.iframe.prototype = {append:function (body, dims) {
		var html = "<iframe id=\"" + this.id + "\" name=\"" + this.id + "\" height=\"100%\" width=\"100%\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" style=\"visibility:hidden\" onload=\"this.style.visibility='visible'\" scrolling=\"auto\"";
		if (S.isIE) {
			html += " allowtransparency=\"true\"";
			if (S.isIE6) {
				html += " src=\"javascript:false;document.write('');\"";
			}
		}
		html += "></iframe>";
		body.innerHTML = html;
	}, remove:function () {
		var el = get(this.id);
		if (el) {
			remove(el);
			if (S.isGecko) {
				delete window.frames[this.id];
			}
		}
	}, onLoad:function () {
		var win = S.isIE ? get(this.id).contentWindow : window.frames[this.id];
		win.location.href = this.obj.content;
	}};
	S.html = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.height = obj.height ? parseInt(obj.height, 10) : 300;
		this.width = obj.width ? parseInt(obj.width, 10) : 500;
	};
	S.html.prototype = {append:function (body, dims) {
		var div = document.createElement("div");
		div.id = this.id;
		div.className = "html";
		div.innerHTML = this.obj.content;
		body.appendChild(div);
	}, remove:function () {
		var el = get(this.id);
		if (el) {
			remove(el);
		}
	}};
	S.swf = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.height = obj.height ? parseInt(obj.height, 10) : 300;
		this.width = obj.width ? parseInt(obj.width, 10) : 300;
	};
	S.swf.ext = ["swf"];
	S.swf.prototype = {append:function (body, dims) {
		var tmp = document.createElement("div");
		tmp.id = this.id;
		body.appendChild(tmp);
		var height = dims.innerHeight, width = dims.innerWidth, swf = this.obj.content, version = S.options.flashVersion, express = S.path + "expressInstall.swf", flashvars = S.options.flashVars, params = S.options.flashParams;
		S.flash.embedSWF(swf, this.id, width, height, version, express, flashvars, params);
	}, remove:function () {
		S.flash.expressInstallCallback();
		S.flash.removeSWF(this.id);
	}, onWindowResize:function () {
		var dims = S.dimensions, el = get(this.id);
		el.height = dims.innerHeight;
		el.width = dims.innerWidth;
	}};
	var jwControllerHeight = 20;
	S.flv = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.height = obj.height ? parseInt(obj.height, 10) : 300;
		if (S.options.showMovieControls) {
			this.height += jwControllerHeight;
		}
		this.width = obj.width ? parseInt(obj.width, 10) : 300;
	};
	S.flv.ext = ["flv", "m4v"];
	S.flv.prototype = {append:function (body, dims) {
		var tmp = document.createElement("div");
		tmp.id = this.id;
		body.appendChild(tmp);
		var height = dims.innerHeight, width = dims.innerWidth, swf = S.path + "player.swf", version = S.options.flashVersion, express = S.path + "expressInstall.swf", flashvars = apply({file:this.obj.content, height:height, width:width, autostart:(S.options.autoplayMovies ? "true" : "false"), controlbar:(S.options.showMovieControls ? "bottom" : "none"), backcolor:"0x000000", frontcolor:"0xCCCCCC", lightcolor:"0x557722"}, S.options.flashVars), params = S.options.flashParams;
		S.flash.embedSWF(swf, this.id, width, height, version, express, flashvars, params);
	}, remove:function () {
		S.flash.expressInstallCallback();
		S.flash.removeSWF(this.id);
	}, onWindowResize:function () {
		var dims = S.dimensions, el = get(this.id);
		el.height = dims.innerHeight;
		el.width = dims.innerWidth;
	}};
	var qtControllerHeight = 16;
	S.qt = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.height = obj.height ? parseInt(obj.height, 10) : 300;
		if (S.options.showMovieControls) {
			this.height += qtControllerHeight;
		}
		this.width = obj.width ? parseInt(obj.width, 10) : 300;
	};
	S.qt.ext = ["dv", "mov", "moov", "movie", "mp4", "avi", "mpg", "mpeg"];
	S.qt.prototype = {append:function (body, dims) {
		var opt = S.options, autoplay = String(opt.autoplayMovies), controls = String(opt.showMovieControls);
		var html = "<object", movie = {id:this.id, name:this.id, height:this.height, width:this.width, kioskmode:"true"};
		if (S.isIE) {
			movie.classid = "clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B";
			movie.codebase = "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";
		} else {
			movie.type = "video/quicktime";
			movie.data = this.obj.content;
		}
		for (var m in movie) {
			html += " " + m + "=\"" + movie[m] + "\"";
		}
		html += ">";
		var params = {src:this.obj.content, scale:"aspect", controller:controls, autoplay:autoplay};
		for (var p in params) {
			html += "<param name=\"" + p + "\" value=\"" + params[p] + "\">";
		}
		html += "</object>";
		body.innerHTML = html;
	}, remove:function () {
		try {
			document[this.id].Stop();
		}
		catch (e) {
		}
		var el = get(this.id);
		if (el) {
			remove(el);
		}
	}};
	var wmpControllerHeight = (S.isIE ? 70 : 45);
	S.wmp = function (obj, id) {
		this.obj = obj;
		this.id = id;
		this.height = obj.height ? parseInt(obj.height, 10) : 300;
		if (S.options.showMovieControls) {
			this.height += wmpControllerHeight;
		}
		this.width = obj.width ? parseInt(obj.width, 10) : 300;
	};
	S.wmp.ext = ["asf", "avi", "mpg", "mpeg", "wm", "wmv"];
	S.wmp.prototype = {append:function (body, dims) {
		var opt = S.options, autoplay = opt.autoplayMovies ? 1 : 0;
		var movie = "<object id=\"" + this.id + "\" name=\"" + this.id + "\" height=\"" + this.height + "\" width=\"" + this.width + "\"", params = {autostart:opt.autoplayMovies ? 1 : 0};
		if (S.isIE) {
			movie += " classid=\"clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6\"";
			params.url = this.obj.content;
			params.uimode = opt.showMovieControls ? "full" : "none";
		} else {
			movie += " type=\"video/x-ms-wmv\"";
			movie += " data=\"" + this.obj.content + "\"";
			params.showcontrols = opt.showMovieControls ? 1 : 0;
		}
		movie += ">";
		for (var p in params) {
			movie += "<param name=\"" + p + "\" value=\"" + params[p] + "\">";
		}
		movie += "</object>";
		body.innerHTML = movie;
	}, remove:function () {
		if (S.isIE) {
			try {
				window[this.id].controls.stop();
				window[this.id].URL = "movie" + now() + ".wmv";
				window[this.id] = function () {
				};
			}
			catch (e) {
			}
		}
		var el = get(this.id);
		if (el) {
			setTimeout(function () {
				remove(el);
			}, 10);
		}
	}};
	var overlayOn = false, visibilityCache = [], pngIds = ["sb-nav-close", "sb-nav-next", "sb-nav-play", "sb-nav-pause", "sb-nav-previous"], container, overlay, wrapper, doWindowResize = true;
	function animate(el, property, to, duration, callback) {
		var isOpacity = (property == "opacity"), anim = isOpacity ? S.setOpacity : function (el, value) {
			el.style[property] = "" + value + "px";
		};
		if (duration == 0 || (!isOpacity && !S.options.animate) || (isOpacity && !S.options.animateFade)) {
			anim(el, to);
			if (callback) {
				callback();
			}
			return;
		}
		var from = parseFloat(S.getStyle(el, property)) || 0;
		var delta = to - from;
		if (delta == 0) {
			if (callback) {
				callback();
			}
			return;
		}
		duration *= 1000;
		var begin = now(), ease = S.ease, end = begin + duration, time;
		var interval = setInterval(function () {
			time = now();
			if (time >= end) {
				clearInterval(interval);
				interval = null;
				anim(el, to);
				if (callback) {
					callback();
				}
			} else {
				anim(el, from + ease((time - begin) / duration) * delta);
			}
		}, 10);
	}
	function setSize() {
		container.style.height = S.getWindowSize("Height") + "px";
		container.style.width = S.getWindowSize("Width") + "px";
	}
	function setPosition() {
		container.style.top = document.documentElement.scrollTop + "px";
		container.style.left = document.documentElement.scrollLeft + "px";
	}
	function toggleTroubleElements(on) {
		if (on) {
			each(visibilityCache, function (i, el) {
				el[0].style.visibility = el[1] || "";
			});
		} else {
			visibilityCache = [];
			each(S.options.troubleElements, function (i, tag) {
				each(document.getElementsByTagName(tag), function (j, el) {
					visibilityCache.push([el, el.style.visibility]);
					el.style.visibility = "hidden";
				});
			});
		}
	}
	function toggleNav(id, on) {
		var el = get("sb-nav-" + id);
		if (el) {
			el.style.display = on ? "" : "none";
		}
	}
	function toggleLoading(on, callback) {
		var loading = get("sb-loading"), playerName = S.getCurrent().player, anim = (playerName == "img" || playerName == "html");
		if (on) {
			S.setOpacity(loading, 0);
			loading.style.display = "block";
			var wrapped = function () {
				S.clearOpacity(loading);
				if (callback) {
					callback();
				}
			};
			if (anim) {
				animate(loading, "opacity", 1, S.options.fadeDuration, wrapped);
			} else {
				wrapped();
			}
		} else {
			var wrapped = function () {
				loading.style.display = "none";
				S.clearOpacity(loading);
				if (callback) {
					callback();
				}
			};
			if (anim) {
				animate(loading, "opacity", 0, S.options.fadeDuration, wrapped);
			} else {
				wrapped();
			}
		}
	}
	function buildBars(callback) {
		var obj = S.getCurrent();
		get("sb-title-inner").innerHTML = obj.title || "";
		var close, next, play, pause, previous;
		if (S.options.displayNav) {
			close = true;
			var len = S.gallery.length;
			if (len > 1) {
				if (S.options.continuous) {
					next = previous = true;
				} else {
					next = (len - 1) > S.current;
					previous = S.current > 0;
				}
			}
			if (S.options.slideshowDelay > 0 && S.hasNext()) {
				pause = !S.isPaused();
				play = !pause;
			}
		} else {
			close = next = play = pause = previous = false;
		}
		toggleNav("close", close);
		toggleNav("next", next);
		toggleNav("play", play);
		toggleNav("pause", pause);
		toggleNav("previous", previous);
		var counter = "";
		if (S.options.displayCounter && S.gallery.length > 1) {
			var len = S.gallery.length;
			if (S.options.counterType == "skip") {
				var i = 0, end = len, limit = parseInt(S.options.counterLimit) || 0;
				if (limit < len && limit > 2) {
					var h = Math.floor(limit / 2);
					i = S.current - h;
					if (i < 0) {
						i += len;
					}
					end = S.current + (limit - h);
					if (end > len) {
						end -= len;
					}
				}
				while (i != end) {
					if (i == len) {
						i = 0;
					}
					counter += "<a onclick=\"Shadowbox.change(" + i + ");\"";
					if (i == S.current) {
						counter += " class=\"sb-counter-current\"";
					}
					counter += ">" + (++i) + "</a>";
				}
			} else {
				counter = [S.current + 1, S.lang.of, len].join(" ");
			}
		}
		get("sb-counter").innerHTML = counter;
		callback();
	}
	function showBars(callback) {
		var titleInner = get("sb-title-inner"), infoInner = get("sb-info-inner"), duration = 0.35;
		titleInner.style.visibility = infoInner.style.visibility = "";
		if (titleInner.innerHTML != "") {
			animate(titleInner, "marginTop", 0, duration);
		}
		animate(infoInner, "marginTop", 0, duration, callback);
	}
	function hideBars(anim, callback) {
		var title = get("sb-title"), info = get("sb-info"), titleHeight = title.offsetHeight, infoHeight = info.offsetHeight, titleInner = get("sb-title-inner"), infoInner = get("sb-info-inner"), duration = (anim ? 0.35 : 0);
		animate(titleInner, "marginTop", titleHeight, duration);
		animate(infoInner, "marginTop", infoHeight * -1, duration, function () {
			titleInner.style.visibility = infoInner.style.visibility = "hidden";
			callback();
		});
	}
	function adjustHeight(height, top, anim, callback) {
		var wrapperInner = get("sb-wrapper-inner"), duration = (anim ? S.options.resizeDuration : 0);
		animate(wrapper, "top", top, duration);
		animate(wrapperInner, "height", height, duration, callback);
	}
	function adjustWidth(width, left, anim, callback) {
		var duration = (anim ? S.options.resizeDuration : 0);
		animate(wrapper, "left", left, duration);
		animate(wrapper, "width", width, duration, callback);
	}
	function setDimensions(height, width) {
		var bodyInner = get("sb-body-inner"), height = parseInt(height), width = parseInt(width), topBottom = wrapper.offsetHeight - bodyInner.offsetHeight, leftRight = wrapper.offsetWidth - bodyInner.offsetWidth, maxHeight = overlay.offsetHeight, maxWidth = overlay.offsetWidth, padding = parseInt(S.options.viewportPadding) || 20, preserveAspect = (S.player && S.options.handleOversize != "drag");
		return S.setDimensions(height, width, maxHeight, maxWidth, topBottom, leftRight, padding, preserveAspect);
	}
	var K = {};
	K.markup = "<div id=\"sb-container\"><div id=\"sb-overlay\"></div><div id=\"sb-wrapper\"><div id=\"sb-title\"><div id=\"sb-title-inner\"></div></div><div id=\"sb-wrapper-inner\"><div id=\"sb-body\"><div id=\"sb-body-inner\"></div><div id=\"sb-loading\"><div id=\"sb-loading-inner\"><span>{loading}</span></div></div></div></div><div id=\"sb-info\"><div id=\"sb-info-inner\"><div id=\"sb-counter\"></div><div id=\"sb-nav\"><a id=\"sb-nav-close\" title=\"{close}\" onclick=\"Shadowbox.close()\"></a><a id=\"sb-nav-next\" title=\"{next}\" onclick=\"Shadowbox.next()\"></a><a id=\"sb-nav-play\" title=\"{play}\" onclick=\"Shadowbox.play()\"></a><a id=\"sb-nav-pause\" title=\"{pause}\" onclick=\"Shadowbox.pause()\"></a><a id=\"sb-nav-previous\" title=\"{previous}\" onclick=\"Shadowbox.previous()\"></a></div></div></div></div></div>";
	K.options = {animSequence:"sync", counterLimit:10, counterType:"default", displayCounter:true, displayNav:true, fadeDuration:0.35, initialHeight:160, initialWidth:320, modal:false, overlayColor:"#000", overlayOpacity:0.5, resizeDuration:0.35, showOverlay:true, troubleElements:["select", "object", "embed", "canvas"]};
	K.init = function () {
		S.appendHTML(document.body, sprintf(K.markup, S.lang));
		K.body = get("sb-body-inner");
		container = get("sb-container");
		overlay = get("sb-overlay");
		wrapper = get("sb-wrapper");
		if (!supportsFixed) {
			container.style.position = "absolute";
		}
		if (!supportsOpacity) {
			var el, m, re = /url\("(.*\.png)"\)/;
			each(pngIds, function (i, id) {
				el = get(id);
				if (el) {
					m = S.getStyle(el, "backgroundImage").match(re);
					if (m) {
						el.style.backgroundImage = "none";
						el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,src=" + m[1] + ",sizingMethod=scale);";
					}
				}
			});
		}
		var timer;
		addEvent(window, "resize", function () {
			if (timer) {
				clearTimeout(timer);
				timer = null;
			}
			if (open) {
				timer = setTimeout(K.onWindowResize, 10);
			}
		});
	};
	K.onOpen = function (obj, callback) {
		doWindowResize = false;
		container.style.display = "block";
		setSize();
		var dims = setDimensions(S.options.initialHeight, S.options.initialWidth);
		adjustHeight(dims.innerHeight, dims.top);
		adjustWidth(dims.width, dims.left);
		if (S.options.showOverlay) {
			overlay.style.backgroundColor = S.options.overlayColor;
			S.setOpacity(overlay, 0);
			if (!S.options.modal) {
				addEvent(overlay, "click", S.close);
			}
			overlayOn = true;
		}
		if (!supportsFixed) {
			setPosition();
			addEvent(window, "scroll", setPosition);
		}
		toggleTroubleElements();
		container.style.visibility = "visible";
		if (overlayOn) {
			animate(overlay, "opacity", S.options.overlayOpacity, S.options.fadeDuration, callback);
		} else {
			callback();
		}
	};
	K.onLoad = function (changing, callback) {
		toggleLoading(true);
		while (K.body.firstChild) {
			remove(K.body.firstChild);
		}
		hideBars(changing, function () {
			if (!open) {
				return;
			}
			if (!changing) {
				wrapper.style.visibility = "visible";
			}
			buildBars(callback);
		});
	};
	K.onReady = function (callback) {
		if (!open) {
			return;
		}
		var player = S.player, dims = setDimensions(player.height, player.width);
		var wrapped = function () {
			showBars(callback);
		};
		switch (S.options.animSequence) {
		  case "hw":
			adjustHeight(dims.innerHeight, dims.top, true, function () {
				adjustWidth(dims.width, dims.left, true, wrapped);
			});
			break;
		  case "wh":
			adjustWidth(dims.width, dims.left, true, function () {
				adjustHeight(dims.innerHeight, dims.top, true, wrapped);
			});
			break;
		  default:
			adjustWidth(dims.width, dims.left, true);
			adjustHeight(dims.innerHeight, dims.top, true, wrapped);
		}
	};
	K.onShow = function (callback) {
		toggleLoading(false, callback);
		doWindowResize = true;
	};
	K.onClose = function () {
		if (!supportsFixed) {
			removeEvent(window, "scroll", setPosition);
		}
		removeEvent(overlay, "click", S.close);
		wrapper.style.visibility = "hidden";
		var callback = function () {
			container.style.visibility = "hidden";
			container.style.display = "none";
			toggleTroubleElements(true);
		};
		if (overlayOn) {
			animate(overlay, "opacity", 0, S.options.fadeDuration, callback);
		} else {
			callback();
		}
	};
	K.onPlay = function () {
		toggleNav("play", false);
		toggleNav("pause", true);
	};
	K.onPause = function () {
		toggleNav("pause", false);
		toggleNav("play", true);
	};
	K.onWindowResize = function () {
		if (!doWindowResize) {
			return;
		}
		setSize();
		var player = S.player, dims = setDimensions(player.height, player.width);
		adjustWidth(dims.width, dims.left);
		adjustHeight(dims.innerHeight, dims.top);
		if (player.onWindowResize) {
			player.onWindowResize();
		}
	};
	S.skin = K;
	window.Shadowbox = S;
})(window);


