// Lightbox 1.6, Extended version of Slimbox with some fixes for Mootools 1.2 by Aeron Glemann. Copyright (c) 2007 Samuel Birch <http://phatfusion.net>, MIT Style License.

var Lightbox = new Class({
    Implements: [Events, Options],
    options: {
        resizeDuration: 400,
        resizeTransition: Fx.Transitions.Sine.easeInOut,
        initialWidth: 250,
        initialHeight: 250,
        animateCaption: {
            In: true,
            Out: true
        },
        showControls: false,
        showNumbers: true,
        descriptions: false,
        opacity: 0.8,
        onClose: $empty,
        onOpen: $empty
    },
    initialize: function(A) {
        this.setOptions(A);
        this.options.container = document.body;
        this.anchors = [];
        $$("a[rel]").each(function(C) {
            if (C.rel.test(/^lightbox/i)) {
                C.onclick = this.click.pass(C, this);
                this.anchors.push(C)
            }
        },
        this);
        this.eventPosition = this.position.bind(this);
        this.overlay = new Element("div").set("id", "lbOverlay").inject(this.options.container);
        this.center = new Element("div").set("id", "lbCenter").setStyles({
            width: this.options.initialWidth + "px",
            height: this.options.initialHeight + "px",
            marginLeft: "-" + (this.options.initialWidth / 2) + "px",
            display: "none"
        }).inject(this.options.container);
        this.image = new Element("div").set("id", "lbImage").inject(this.center);
        this.bottomContainer = new Element("div").set("id", "lbBottomContainer").setStyle("display", "none").inject(this.options.container);
        this.bottom = new Element("div").set("id", "lbBottom").inject(this.bottomContainer);
        if (this.options.showControls) {
            this.controlDiv = new Element("div").set("id", "lbControls").inject(this.bottom)
        } else {
            this.controlDiv = this.image
        }
        this.prevLink = new Element("a").setProperties({
            id: "lbPrevLink",
            href: "#"
        }).setStyle("display", "none").inject(this.controlDiv);
        this.nextLink = this.prevLink.clone().set("id", "lbNextLink").inject(this.controlDiv);
        this.prevLink.onclick = this.previous.bind(this);
        this.nextLink.onclick = this.next.bind(this);
        this.closeButton = new Element("a").setProperties({
            id: "lbCloseLink",
            href: "#"
        }).inject(this.bottom);
        this.closeButton.onclick = this.overlay.onclick = this.close.bind(this);
        this.caption = new Element("div").set("id", "lbCaption").inject(this.bottom);
        if (this.options.descriptions != false) {
            this.options.descriptions = $$(this.options.descriptions);
            this.description = new Element("div").set("id", "lbDescription").inject(this.bottom)
        }
        if (this.options.showNumbers) {
            this.number = new Element("div").set("id", "lbNumber").inject(this.bottom)
        }
        new Element("div").setStyle("clear", "both").inject(this.bottom);
        var B = this.nextEffect.bind(this);
        this.fx = {
            overlay: new Fx.Tween(this.overlay, "opacity", {
                duration: 500
            }),
            resize: new Fx.Morph(this.center, {
                duration: this.options.resizeDuration,
                transition: this.options.resizeTransition,
                onComplete: B
            }),
            image: new Fx.Tween(this.image, "opacity", {
                duration: 500,
                onComplete: B
            }),
            bottom: new Fx.Tween(this.bottom, "margin-top", {
                duration: 400,
                onComplete: B
            })
        };
        this.overlay.fade("hide");
        this.preloadPrev = new Image();
        this.preloadNext = new Image();
        return this
    },
    click: function(D) {
        if (this.options.descriptions != false) {
            this.options.descriptions.each(function(F, E) {
                if (F.hasClass(D.id)) {
                    this.linkLoc = E
                }
            },
            this)
        }
        if (D.rel.length == 8) {
            return this.show(D.href, D.title)
        }
        var C, B, A = [];
        this.anchors.each(function(E) {
            if (E.rel == D.rel) {
                for (C = 0; C < A.length; C++) {
                    if (A[C][0] == E.href) {
                        break
                    }
                }
                if (C == A.length) {
                    A.push([E.href, E.title]);
                    if (E.href == D.href) {
                        B = C
                    }
                }
            }
        },
        this);
        return this.open(A, B)
    },
    show: function(A, B) {
        return this.open([[A, B]], 0)
    },
    open: function(A, B) {
        this.images = A;
        this.position();
        this.setup(true);
        this.top = window.getScrollTop() + (window.getHeight() / 15);
        this.window = {};
        this.window.height = window.getScrollHeight();
        this.window.width = window.getScrollWidth();
        this.window.top = window.getScrollTop();
        this.window.left = window.getScrollLeft();
        this.center.setStyles({
            top: this.top + "px",
            display: ""
        });
        this.overlay.fade(this.options.opacity);
        this.fireEvent("onOpen");
        return this.changeImage(B)
    },
    position: function() {
        if (this.options.container == document.body) {
            var B = window.getScrollHeight() + "px";
            var A = window.getScrollWidth() + "px";
            this.overlay.setStyles({
                top: "0px",
                height: B,
                width: A
            })
        } else {
            var C = this.options.container.getCoordinates();
            this.overlay.setStyles({
                top: C.top + "px",
                height: C.height + "px",
                left: C.left + "px",
                width: C.width + "px"
            })
        }
    },
    setup: function(A) {
        var C = $A(document.getElementsByTagName("object"));
        if (window.ie) {
            C.extend(document.getElementsByTagName("select"))
        }
        C.each(function(D) {
            D.style.visibility = A ? "hidden": ""
        });
        var B = A ? "addEvent": "removeEvent";
        window[B]("scroll", this.eventPosition)[B]("resize", this.eventPosition);
        this.step = 0
    },
    previous: function() {
        this.linkLoc--;
        return this.changeImage(this.activeImage - 1)
    },
    next: function() {
        this.linkLoc++;
        return this.changeImage(this.activeImage + 1)
    },
    changeImage: function(A) {
        if (this.step || (A < 0) || (A >= this.images.length)) {
            return false
        }
        this.step = 1;
        this.activeImage = A;
        if (this.options.animateCaption.In && this.bottom.offsetHeight) {
            this.prevLink.style.display = this.nextLink.style.display = "none";
            this.bottom.set("tween", {
                duration: 300,
                onComplete: this.loadImage.bind(this)
            }).tween("margin-top", -this.bottom.offsetHeight)
        } else {
            this.bottomContainer.style.display = this.prevLink.style.display = this.nextLink.style.display = "none";
            this.loadImage()
        }
        this.image.fade("hide");
        this.center.className = "lbLoading";
        return false
    },
    loadImage: function() {
        this.preload = new Image();
        this.preload.onload = this.nextEffect.bind(this);
        this.preload.src = this.images[this.activeImage][0]
    },
    nextEffect: function() {
        switch (this.step++) {
        case 1:
            this.center.className = "";
            this.image.style.backgroundImage = "url(" + this.images[this.activeImage][0] + ")";
            this.image.style.width = this.bottom.style.width = this.preload.width + "px";
            if (this.options.showControls) {
                this.image.style.height = this.preload.height + "px"
            } else {
                this.image.style.height = this.prevLink.style.height = this.nextLink.style.height = this.preload.height + "px"
            }
            this.caption.set("html", this.images[this.activeImage][1] || "");
            if (this.options.descriptions != false) {
                if (this.description.getFirst()) {
                    this.description.getFirst().remove()
                }
                var B = this.options.descriptions[this.linkLoc].clone();
                B.setStyle("display", "block").inject(this.description)
            }
            if (this.options.showNumbers) {
                this.number.set("html", (this.images.length == 1) ? "": "Image " + (this.activeImage + 1) + " of " + this.images.length)
            }
            if (this.activeImage) {
                this.preloadPrev.src = this.images[this.activeImage - 1][0]
            }
            if (this.activeImage != (this.images.length - 1)) {
                this.preloadNext.src = this.images[this.activeImage + 1][0]
            }
            if (this.center.clientHeight != this.image.offsetHeight) {
                this.fx.resize.start({
                    height: this.image.offsetHeight
                });
                break
            }
            this.step++;
        case 2:
            if (this.center.clientWidth != this.image.offsetWidth) {
                this.fx.resize.start({
                    width: this.image.offsetWidth,
                    marginLeft: -this.image.offsetWidth / 2
                });
                break
            }
            this.step++;
        case 3:
            this.bottomContainer.setStyles({
                top:
                (this.top + this.center.clientHeight) + "px",
                height: "0px",
                marginLeft: this.center.style.marginLeft,
                display: ""
            });
            this.image.fade("in");
            var A = this.caption.getStyle("height").toInt();
            if (this.options.descriptions != false) {
                A += this.description.getStyle("height").toInt()
            }
            if (this.options.showControls) {
                A += this.controlDiv.getStyle("height").toInt()
            }
            if (this.options.showNumbers) {
                A += this.number.getStyle("height").toInt()
            }
            var C = (A - (this.closeButton.getStyle("height").toInt() * 2));
            if (C < 0) {
                C = 0
            }
            this.closeButton.setStyle("marginTop", C + "px");
            if (this.activeImage != 0) {
                this.prevLink.style.display = ""
            }
            if (this.activeImage != (this.images.length - 1)) {
                this.nextLink.style.display = ""
            }
            break;
        case 4:
            if (this.options.animateCaption.Out) {
                this.fx.bottom.set( - this.bottom.offsetHeight);
                this.bottomContainer.style.height = "";
                this.fx.bottom.start(0);
                break
            }
            this.bottomContainer.style.height = "";
        case 5:
            this.step = 0
        }
    },
    close: function() {
        if (this.step < 0) {
            return
        }
        this.step = -1;
        if (this.preload) {
            this.preload.onload = $empty;
            this.preload = null
        }
        for (var A in this.fx) {
            this.fx[A].cancel()
        }
        this.center.style.display = this.bottomContainer.style.display = "none";
        this.overlay.fade("out");
        this.setup.pass(false, this);
        this.overlay.setStyles({
            height: this.window.height + "px",
            width: this.window.width + "px"
        });
        this.fireEvent("onClose");
        return false
    }
});
