var Slimbox;
(function () {
    var state = 0,
        options, images, activeImage, prevImage, nextImage, top, fx, preload, preloadPrev = new Image(),
        preloadNext = new Image(),
        overlay, center, image, iframe, prevLink, nextLink, bottomContainer, bottom, caption, number;
    window.addEvent("domready", function () {
        $(document.body).adopt($$([overlay = new Element("div", {
            id: "lbOverlay"
        }).addEvent("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(prevLink = new Element("a", {
            id: "lbPrevLink",
            href: "#"
        }).addEvent("click", previous), nextLink = new Element("a", {
            id: "lbNextLink",
            href: "#"
        }).addEvent("click", next));
        iframe = new Element("iframe", {
            id: "lbImage"
        }).addEvent("load", nextEffect).injectInside(image);
        bottom = new Element("div", {
            id: "lbBottom"
        }).injectInside(bottomContainer).adopt(new Element("a", {
            id: "lbCloseLink",
            href: "#"
        }).addEvent("click", close), caption = new Element("div", {
            id: "lbCaption"
        }), number = new Element("div", {
            id: "lbNumber"
        }), new Element("div", {
            styles: {
                clear: "both"
            }
        }));
        fx = {
            overlay: new Fx.Tween(overlay, {
                property: "opacity",
                duration: 500
            }).set(0),
            image: new Fx.Tween(image, {
                property: "opacity",
                duration: 500,
                onComplete: nextEffect
            }),
            bottom: new Fx.Tween(bottom, {
                property: "margin-top",
                duration: 400
            })
        };
    });
    Slimbox = {
        open: function (_images, startImage, _options) {
			if (_images[startImage][2]==undefined) {
				sirka = 772;
			} else {
				sirka = _images[startImage][2];
			}
			if (_images[startImage][3]==undefined) {
				vyska = 580;
			} else {
				vyska = _images[startImage][3];
			}
            options = $extend({
                loop: false,
                overlayOpacity: 0.8,
                resizeDuration: 400,
                resizeTransition: false,
                initialWidth: 250,
                initialHeight: 250,
                animateCaption: true,
                showCounter: true,
                counterText: "Foto {x} z {y}",
                defaultIframeWidth: sirka,
                defaultIframeHeight: vyska
            }, _options || {});
            if (typeof _images == "string") {
                _images = [
                    [_images, startImage]
                ];
                startImage = 0;
            }
            images = _images;
            options.loop = options.loop && (images.length > 1);
            position();
            setup(true);
            top = window.getScrollTop() + (window.getHeight() / 15);
            fx.resize = new Fx.Morph(center, $extend({
                duration: options.resizeDuration,
                onComplete: nextEffect
            }, options.resizeTransition ? {
                transition: options.resizeTransition
            } : {}));
            center.setStyles({
                top: top,
                width: options.initialWidth,
                height: options.initialHeight,
                marginLeft: -(options.initialWidth / 2),
                display: ""
            });
            fx.overlay.start(options.overlayOpacity);
            state = 1;
            return changeImage(startImage);
        }
    };
    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, el.sirka, el.vyska];
            };
            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;
        }
    });

    function position() {
        overlay.setStyles({
            top: window.getScrollTop(),
            height: window.getHeight()
        });
    }
    function setup(open) {
        ["object", window.ie ? "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";
        window[fn]("scroll", position)[fn]("resize", position);
        document[fn]("keydown", keyDown);
    }
    function keyDown(event) {
        switch (event.code) {
        case 27:
        case 88:
        case 67:
            close();
            break;
        case 37:
        case 80:
            previous();
            break;
        case 39:
        case 78:
            next();
        }
        return false;
    }
    function previous() {
        return changeImage(prevImage);
    }
    function next() {
        return changeImage(nextImage);
    }
    function changeImage(imageIndex) {
        if ((state == 1) && (imageIndex >= 0)) {
            state = 2;
            activeImage = imageIndex;
            prevImage = ((activeImage || !options.loop) ? activeImage : images.length) - 1;
            nextImage = activeImage + 1;
            if (nextImage == images.length) {
                nextImage = options.loop ? 0 : -1;
            }
            $$(prevLink, nextLink, image, iframe, bottomContainer).setStyle("display", "none");
            fx.bottom.cancel().set(0);
            fx.image.set(0);
            center.className = "lbLoading";
            var url = images[activeImage][0];
            var re_imageURL = /\.(jpe?g|png|gif|bmp)/i;
            if (url.match(re_imageURL)) {
                preload = new Image();
                preload.datatype = "image";
                preload.onload = nextEffect;
                preload.src = url;
            } else {
                preload = new Object();
                preload.datatype = "iframe";
				
				if (images[activeImage][2]==undefined) {
					sirka = 772;
				} else {
					sirka = images[activeImage][2];
				}
				
				if (images[activeImage][3]==undefined) {
					vyska = 580;
				} else {
					vyska = images[activeImage][3];
				}				
				
                preload.w = sirka; //nastavim sirku a vysku
                preload.h = vyska;
                iframe.setProperties({
                    id: "lbFrame_" + new Date().getTime(),
                    width: preload.w,
                    height: preload.h,
                    scrolling: "no",
                    frameBorder: 0,
                    src: url
                });
            }
        }
        return false;
    }
    function nextEffect() {
        switch (state++) {
        case 2:
            center.className = "";
            if (preload.datatype == "image") {
                image.setStyles({
                    backgroundImage: "url(" + preload.src + ")",
                    display: ""
                });
                $$(image, bottom).setStyle("width", preload.width);
                $$(image, prevLink, nextLink).setStyle("height", preload.height);
                $$(prevLink, nextLink).setStyle("width", "50%");
            } else {
                image.setStyles({
                    backgroundImage: "",
                    display: ""
                });
                $$(image, bottom).setStyle("width", preload.w);
                $$(image).setStyle("height", preload.h);
                $$(prevLink, nextLink).setStyle("height", "35px");
                $$(prevLink, nextLink).setStyle("width", "65px");
                iframe.setStyles({
                    display: ""
                });
            }
            caption.set("html", images[activeImage][1] || "");
            number.set("html", (options.showCounter && (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];
            }
            if (center.clientHeight != image.offsetHeight) {
                fx.resize.start({
                    height: image.offsetHeight
                });
                break;
            }
            state++;
        case 3:
            if (center.clientWidth != image.offsetWidth) {
                fx.resize.start({
                    width: image.offsetWidth,
                    marginLeft: -image.offsetWidth / 2
                });
                break;
            }
            state++;
        case 4:
            bottomContainer.setStyles({
                top: top + center.clientHeight,
                marginLeft: center.style.marginLeft,
                visibility: "hidden",
                display: ""
            });
            fx.image.start(1);
            break;
        case 5:
            if (prevImage >= 0) {
                prevLink.style.display = "";
            }
            if (nextImage >= 0) {
                nextLink.style.display = "";
            }
            if (options.animateCaption) {
                fx.bottom.set(-bottom.offsetHeight).start(0);
            }
            bottomContainer.style.visibility = "";
            state = 1;
        }
    }
    function close() {
        if (state) {
            state = 0;
            preload.onload = $empty;
            for (var f in fx) {
                fx[f].cancel();
            }
            $$(center, bottomContainer).setStyle("display", "none");
            fx.overlay.chain(setup).start(0);
        }
        return false;
    }
})();
Slimbox.scanPage = function () {
    var links = $$("a").filter(function (el) {
        return el.rel && el.rel.test(/^lightbox/i);
    });
    $$(links).slimbox({}, null, function (el) {
        return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
    });
};
window.addEvent("domready", Slimbox.scanPage);
