var Slimbox = (
function () {
	var win = window,
	ie6 = Browser.Engine.trident4,
	options, images, activeImage = -1,
	activeURL, prevImage, nextImage, compatibleOverlay, middle, centerWidth, centerHeight, preload = {},
	preloadPrev = new Image(),
	preloadNext = new Image(),
	overlay,
	center,
	image,
	sizer,
	prevLink,
	nextLink,
	bottomContainer,
	bottom,
	caption,
	number,
	currentImage = false,
	delayResize = false,
	fxOverlay,
	fxResize,
	fxImage,
	fxBottom;
	win.addEvent("domready", function () {
		$(document.body).adopt($$(overlay = new Element("div", {
			id: "lbOverlay",
			events: {
				click: close
			}
		}), center = new Element("div", {
			id: "lbCenter"
		}), bottomContainer = new Element("div", {
			id: "lbBottomContainer"
		})).setStyle("display", "none"));
		image = new Element("div", {
			id: "lbImage"
		}).injectInside(center).adopt(sizer = new Element("div", {
			styles: {
				position: "relative"
			}
		}).adopt(prevLink = new Element("a", {
			id: "lbPrevLink",
			href: "#",
			events: {
				click: previous
			}
		}), nextLink = new Element("a", {
			id: "lbNextLink",
			href: "#",
			events: {
				click: next
			}
		})));
		bottom = new Element("div", {
			id: "lbBottom"
		}).injectInside(bottomContainer).adopt(new Element("a", {
			id: "lbCloseLink",
			href: "#",
			events: {
				click: close
			}
		}), caption = new Element("div", {
			id: "lbCaption"
		}), number = new Element("div", {
			id: "lbNumber"
		}), new Element("div", {
			styles: {
				clear: "both"
			}
		}));
		win.addEvent('resize', function () {
			checkResizeImage();
		});
	});
	function position() {
		middle = win.getScrollTop() + (win.getHeight() / 2);
		centerHeight = image.getSize().y;
		var top = Math.max(0, middle - (centerHeight / 2) - 25);
		var scroll = win.getScroll(),
		size = win.getSize();
		$$(center, bottomContainer).setStyle("left", scroll.x + (size.x / 2));
		$(center).setStyle("top", top);
		$(bottomContainer).setStyle("top", top + centerHeight);
		if (compatibleOverlay) overlay.setStyles({
			left: scroll.x,
			top: scroll.y,
			width: size.x,
			height: size.y
		});
	}
	function setup(open) {
		["object", ie6 ? "select" : "embed"].forEach(function (tag) {
			Array.forEach(document.getElementsByTagName(tag), function (el) {
				if (open) el._slimbox = el.style.visibility;
				el.style.visibility = open ? "hidden" : el._slimbox;
			});
		});
		overlay.style.display = open ? "" : "none";
		var fn = open ? "addEvent" : "removeEvent";
		win[fn]("scroll", position)[fn]("resize", position);
		document[fn]("keydown", keyDown);
	}
	function keyDown(event) {
		var code = event.code;
		return options.closeKeys.contains(code) ? close() : options.nextKeys.contains(code) ? next() : options.previousKeys.contains(code) ? previous() : true;
	}
	function previous() {
		return changeImage(prevImage);
	}
	function next() {
		return changeImage(nextImage);
	}
	function changeImage(imageIndex) {
		if (imageIndex >= 0) {
			activeImage = imageIndex;
			activeURL = images[imageIndex][0];
			prevImage = (activeImage || (options.loop ? images.length : 0)) - 1;
			nextImage = ((activeImage + 1) % images.length) || (options.loop ? 0 : -1);
			stop();
			center.className = "lbLoading";
			preload = new Image();
			preload.onload = animateBox;
			preload.src = activeURL;
		}
		return false;
	}
	function checkResizeImage() {
		if (currentImage != false) {
			$clear(delayResize);
			delayResize = animateBox.delay(500);
		};
	}
	function animateBox() {
		var winsize = document.body.getSize();
		var winratio = (winsize.x - 50) / (winsize.y - 100);
		var imageratio = preload.width / preload.height;
		temp = {
			height: preload.height,
			width: preload.width
		};
		var temp = new Hash(temp).getClean();
		if (winratio >= imageratio) {
			if (temp.height > winsize.y - 100) {
				temp.height = winsize.y - 100;
				temp.width = temp.height * imageratio;
			}
		} else {
			if (temp.width > winsize.x - 50) {
				temp.width = winsize.x - 50;
				temp.height = temp.width / imageratio;
			}
		}
		center.className = "";
		fxImage.set(0);
		image.setStyle('display', "");
		if (currentImage != false) {
			currentImage.dispose()
		};
		currentImage = new Element('img', {
			src: activeURL,
			alt: images[activeImage][1] || "",
			styles: {
				width: temp.width,
				height: temp.height
			}
		}).inject(sizer, 'top');
		sizer.setStyle("width", temp.width);
		if (nextImage >= 0) preloadNext.src = currentImage.addEvent('click', next).setStyle('cursor', 'pointer');
		$$(sizer, prevLink, nextLink).setStyle("height", temp.height);
		caption.set("html", (images[activeImage][1] || "") + ' <a href="'+activeURL+'">(in Originalgröße öffnen)</a>');
		number.set("html", (((images.length > 1) && options.counterText) || "").replace(/{x}/, activeImage + 1).replace(/{y}/, images.length));
		if (prevImage >= 0) preloadPrev.src = images[prevImage][0];
		if (nextImage >= 0) preloadNext.src = images[nextImage][0];
		var oldmiddle = middle;
		middle = win.getScrollTop() + (win.getHeight() / 2);
		centerWidth = image.getSize().x;
		centerHeight = image.getSize().y;
		var top = Math.max(0, middle - (centerHeight / 2) - 25),
		check = 0,
		fn;
		if (middle != oldmiddle || center.offsetHeight != centerHeight || center.offsetWidth != centerWidth) {
			check = fxResize.cancel().start({
				height: centerHeight,
				top: top,
				width: centerWidth,
				marginLeft: -centerWidth / 2
			});
		}
		fn = function () {
			fxImage.start(1);
		};
		bottomContainer.setStyles({
			width: centerWidth,
			top: top + centerHeight,
			marginLeft: -centerWidth / 2,
			visibility: "hidden",
			display: ""
		});
		if (check) {
			fxResize.chain(fn);
		} else {
			fn();
		}
	}
	function animateCaption() {
		if (prevImage >= 0) prevLink.style.display = "";
		if (nextImage >= 0) nextLink.style.display = "";
		fxBottom.set(-bottom.offsetHeight).start(0);
		bottomContainer.style.visibility = "";
	}
	function stop() {
		preload.onload = $empty;
		preload.src = preloadPrev.src = preloadNext.src = activeURL;
		fxResize.cancel();
		fxImage.cancel();
		fxBottom.cancel();
		$$(prevLink, nextLink, image, bottomContainer).setStyle("display", "none");
	}
	function close() {
		if (activeImage >= 0) {
			stop();
			activeImage = prevImage = nextImage = -1;
			center.style.display = "none";
			fxOverlay.cancel().chain(setup).start(0);
		}
		return false;
	}
	Element.implement({
		slimbox: function (_options, linkMapper) {
			$$(this).slimbox(_options, linkMapper);
			return this;
		}
	});
	Elements.implement({
		slimbox: function (_options, linkMapper, linksFilter) {
			linkMapper = linkMapper ||
			function (el) {
				return[el.href, el.title];
			};
			linksFilter = linksFilter ||
			function () {
				return true;
			};
			var links = this;
			links.removeEvents("click").addEvent("click", function () {
				var filteredLinks = links.filter(linksFilter, this);
				return Slimbox.open(filteredLinks.map(linkMapper), filteredLinks.indexOf(this), _options);
			});
			return links;
		}
	});
	return {
		open: function (_images, startImage, _options) {
			options = $extend({
				loop: false,
				overlayOpacity: 0.8,
				overlayFadeDuration: 400,
				resizeDuration: 400,
				resizeTransition: false,
				initialWidth: 250,
				initialHeight: 250,
				imageFadeDuration: 400,
				captionAnimationDuration: 400,
				counterText: "Image {x} of {y}",
				closeKeys: [27, 88, 67],
				previousKeys: [37, 80],
				nextKeys: [39, 78]
			},
			_options || {});
			fxOverlay = new Fx.Tween(overlay, {
				property: "opacity",
				duration: options.overlayFadeDuration
			});
			fxResize = new Fx.Morph(center, $extend({
				duration: options.resizeDuration,
				link: "chain"
			},
			options.resizeTransition ? {
				transition: options.resizeTransition
			} : {}));
			fxImage = new Fx.Tween(image, {
				property: "opacity",
				duration: options.imageFadeDuration,
				onComplete: animateCaption
			});
			fxBottom = new Fx.Tween(bottom, {
				property: "margin-top",
				duration: options.captionAnimationDuration
			});
			if (typeof _images == "string") {
				_images = [
					[_images, startImage]];
				startImage = 0;
			}
			middle = win.getScrollTop() + (win.getHeight() / 2);
			centerWidth = options.initialWidth;
			centerHeight = options.initialHeight;
			center.setStyles({
				top: Math.max(0, middle - (centerHeight / 2)),
				width: centerWidth,
				height: centerHeight,
				marginLeft: -centerWidth / 2,
				display: ""
			});
			compatibleOverlay = ie6 || (overlay.currentStyle && (overlay.currentStyle.position != "fixed"));
			if (compatibleOverlay) overlay.style.position = "absolute";
			fxOverlay.set(0).start(options.overlayOpacity);
			position();
			setup(1);
			images = _images;
			options.loop = options.loop && (images.length > 1);
			return changeImage(startImage);
		}
	};
})();
Slimbox.scanPage = function () {
	$$(document.links).filter(function (el) {
		return el.rel && el.rel.test(/^lightbox/i);
	}).slimbox({
		counterText: "Bild {x} von {y}",
		loop: 1
	},
	null, function (el) {
		return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
	});
};
window.addEvent("domready", Slimbox.scanPage);
