/*
 Galleria v 1.2.5 2011-08-03
 http://galleria.aino.se

 Copyright (c) 2011, Aino
 Licensed under the MIT license.
*/
(function (e) {
    var l = this,
        n = l.document,
        H = e(n),
        t = e(l),
        A = !0,
        B = 3E4,
        C = !1,
        x = navigator.userAgent.toLowerCase(),
        I = l.location.hash.replace(/#\//, ""),
        m = function () {
            var a = 3,
                b = n.createElement("div"),
                d = b.getElementsByTagName("i");
            do b.innerHTML = "<\!--[if gt IE " + ++a + "]><i></i><![endif]--\>";
            while (d[0]);
            return a > 4 ? a : void 0
        }(),
        u = function () {
            return {
                html: n.documentElement,
                body: n.body,
                head: n.getElementsByTagName("head")[0],
                title: n.title
            }
        },
        J = function () {
            var a = [];
            e.each("data ready thumbnail loadstart loadfinish image play pause progress fullscreen_enter fullscreen_exit idle_enter idle_exit rescale lightbox_open lightbox_close lightbox_image".split(" "), function (b, d) {
                a.push(d);
                /_/.test(d) && a.push(d.replace(/_/g, ""))
            });
            return a
        }(),
        K = function (a) {
            var b;
            if (typeof a !== "object") return a;
            e.each(a, function (d, c) {
                /^[a-z]+_/.test(d) && (b = "", e.each(d.split("_"), function (a, c) {
                    b += a > 0 ? c.substr(0, 1).toUpperCase() + c.substr(1) : c
                }), a[b] = c, delete a[d])
            });
            return a
        },
        D = function (a) {
            return e.inArray(a, J) > -1 ? Galleria[a.toUpperCase()] : a
        },
        v = {
            trunk: {},
            add: function (a, b, d, c) {
                c = c || !1;
                this.clear(a);
                if (c) var e = b,
                    b = function () {
                        e();
                        v.add(a, b, d)
                    };
                this.trunk[a] = l.setTimeout(b, d)
            },
            clear: function (a) {
                var b = function (a) {
                        l.clearTimeout(this.trunk[a]);
                        delete this.trunk[a]
                    },
                    d;
                if (a && a in this.trunk) b.call(v, a);
                else if (typeof a === "undefined") for (d in this.trunk) this.trunk.hasOwnProperty(d) && b.call(v, d)
            }
        },
        z = [],
        y = [],
        L = !1,
        s = !1,
        M = [],
        E = function (a) {
            Galleria.theme = a;
            e.each(M, function (a, d) {
                d._init.call(d)
            })
        },
        f = function () {
            return {
                array: function (a) {
                    return Array.prototype.slice.call(a, 0)
                },
                create: function (a, b) {
                    var d = n.createElement(b || "div");
                    d.className = a;
                    return d
                },
                getScriptPath: function (a) {
                    a = a || e("script:last").attr("src");
                    a = a.split("/");
                    if (a.length == 1) return "";
                    a.pop();
                    return a.join("/") + "/"
                },
                animate: function () {
                    var a = function (a) {
                            var b = "transition WebkitTransition MozTransition OTransition".split(" "),
                                c;
                            if (l.opera) return !1;
                            for (c = 0; b[c]; c++) if (typeof a[b[c]] !== "undefined") return b[c];
                            return !1
                        }((n.body || n.documentElement).style),
                        b = {
                            MozTransition: "transitionend",
                            OTransition: "oTransitionEnd",
                            WebkitTransition: "webkitTransitionEnd",
                            transition: "transitionend"
                        }[a],
                        d = {
                            _default: [0.25, 0.1, 0.25, 1],
                            galleria: [0.645, 0.045, 0.355, 1],
                            galleriaIn: [0.55, 0.085, 0.68, 0.53],
                            galleriaOut: [0.25, 0.46, 0.45, 0.94],
                            ease: [0.25, 0, 0.25, 1],
                            linear: [0.25, 0.25, 0.75, 0.75],
                            "ease-in": [0.42, 0, 1, 1],
                            "ease-out": [0, 0, 0.58, 1],
                            "ease-in-out": [0.42, 0, 0.58, 1]
                        },
                        c = function (a, b, c) {
                            var d = {},
                                c = c || "transition";
                            e.each("webkit moz ms o".split(" "), function () {
                                d["-" + this + "-" + c] = b
                            });
                            a.css(d)
                        },
                        i = function (a) {
                            c(a, "none", "transition");
                            Galleria.WEBKIT && Galleria.TOUCH && (c(a, "translate3d(0,0,0)", "transform"), a.data("revert") && (a.css(a.data("revert")), a.data("revert", null)))
                        },
                        j, h, g, k, p, w, F;
                    return function (o, q, r) {
                        r = e.extend({
                            duration: 400,
                            complete: function () {},
                            stop: !1
                        }, r);
                        o = e(o);
                        r.duration ? a ? (r.stop && (o.unbind(b), i(o)), j = !1, e.each(q, function (a, b) {
                            F = o.css(a);
                            f.parseValue(F) != f.parseValue(b) && (j = !0);
                            o.css(a, F)
                        }), j ? (h = [], g = r.easing in d ? d[r.easing] : d._default, k = " " + r.duration + "ms cubic-bezier(" + g.join(",") + ")", l.setTimeout(function () {
                            o.one(b, function (a) {
                                return function () {
                                    i(a);
                                    r.complete.call(a[0])
                                }
                            }(o));
                            if (Galleria.WEBKIT && Galleria.TOUCH && (p = {}, w = [0, 0, 0], e.each(["left", "top"], function (a, b) {
                                b in q && (w[a] = f.parseValue(q[b]) - f.parseValue(o.css(b)) + "px", p[b] = q[b], delete q[b])
                            }), w[0] || w[1])) o.data("revert", p), h.push("-webkit-transform" + k), c(o, "translate3d(" + w.join(",") + ")", "transform");
                            e.each(q, function (a) {
                                h.push(a + k)
                            });
                            c(o, h.join(","));
                            o.css(q)
                        }, 1)) : l.setTimeout(function () {
                            r.complete.call(o[0])
                        }, r.duration)) : o.animate(q, r) : (o.css(q), r.complete.call(o[0]))
                    }
                }(),
                removeAlpha: function (a) {
                    if (m < 9 && a) {
                        var b = a.style,
                            a = (a = a.currentStyle) && a.filter || b.filter || "";
                        if (/alpha/.test(a)) b.filter = a.replace(/alpha\([^)]*\)/i, "")
                    }
                },
                forceStyles: function (a, b) {
                    a = e(a);
                    a.attr("style") && a.data("styles", a.attr("style")).removeAttr("style");
                    a.css(b)
                },
                revertStyles: function () {
                    e.each(f.array(arguments), function (a, b) {
                        b = e(b);
                        b.removeAttr("style");
                        b.attr("style", "");
                        b.data("styles") && b.attr("style", b.data("styles")).data("styles", null)
                    })
                },
                moveOut: function (a) {
                    f.forceStyles(a, {
                        position: "absolute",
                        left: -1E4
                    })
                },
                moveIn: function () {
                    f.revertStyles.apply(f, f.array(arguments))
                },
                elem: function (a) {
                    return a instanceof
                    e ? {
                        $: a,
                        dom: a[0]
                    } : {
                        $: e(a),
                        dom: a
                    }
                },
                hide: function (a, b, d) {
                    var d = d ||
                    function () {}, c = f.elem(a), e = c.$, a = c.dom;
                    e.data("opacity") || e.data("opacity", e.css("opacity"));
                    c = {
                        opacity: 0
                    };
                    b ? f.animate(a, c, {
                        duration: b,
                        complete: m < 9 && a ?
                        function () {
                            f.removeAlpha(a);
                            a.style.visibility = "hidden";
                            d.call(a)
                        } : d,
                        stop: !0
                    }) : m < 9 && a ? (f.removeAlpha(a), a.style.visibility = "hidden") : e.css(c)
                },
                show: function (a, b, d) {
                    var d = d ||
                    function () {}, c = f.elem(a), e = c.$, a = c.dom, j = {
                        opacity: parseFloat(e.data("opacity")) || 1
                    };
                    if (b) {
                        if (m < 9) e.css("opacity", 0), a.style.visibility = "visible";
                        f.animate(a, j, {
                            duration: b,
                            complete: m < 9 && a ?
                            function () {
                                j.opacity == 1 && f.removeAlpha(a);
                                d.call(a)
                            } : d,
                            stop: !0
                        })
                    } else m < 9 && j.opacity == 1 && a ? (f.removeAlpha(a), a.style.visibility = "visible") : e.css(j)
                },
                optimizeTouch: function () {
                    var a, b, d, c, f = {},
                        j = function (a) {
                            a.preventDefault();
                            f = e.extend({}, a, !0)
                        },
                        h = function () {
                            this.evt = f
                        },
                        g = function () {
                            this.handler.call(a, this.evt)
                        };
                    return function (k) {
                        e(k).bind("touchend", function (k) {
                            a = k.target;
                            for (c = !0; a.parentNode && a != k.currentTarget && c;) b = e(a).data("events"), d = e(a).data("fakes"), b && "click" in b ? (c = !1, k.preventDefault(), e(a).click(j).click(), b.click.pop(), e.each(b.click, h), e(a).data("fakes", b.click), delete b.click) : d && (c = !1, k.preventDefault(), e.each(d, g)), a = a.parentNode
                        })
                    }
                }(),
                addTimer: function () {
                    v.add.apply(v, f.array(arguments));
                    return this
                },
                clearTimer: function () {
                    v.clear.apply(v, f.array(arguments));
                    return this
                },
                wait: function (a) {
                    var a = e.extend({
                        until: function () {
                            return !1
                        },
                        success: function () {},
                        error: function () {
                            Galleria.raise("Could not complete wait function.")
                        },
                        timeout: 3E3
                    }, a),
                        b = f.timestamp(),
                        d, c, i = function () {
                            c = f.timestamp();
                            d = c - b;
                            if (a.until(d)) return a.success(), !1;
                            if (c >= b + a.timeout) return a.error(), !1;
                            l.setTimeout(i, 10)
                        };
                    l.setTimeout(i, 10)
                },
                toggleQuality: function (a, b) {
                    if (!(m !== 7 && m !== 8) && a) typeof b === "undefined" && (b = a.style.msInterpolationMode === "nearest-neighbor"), a.style.msInterpolationMode = b ? "bicubic" : "nearest-neighbor"
                },
                insertStyleTag: function (a) {
                    var b = n.createElement("style");
                    u().head.appendChild(b);
                    b.styleSheet ? b.styleSheet.cssText = a : (a = n.createTextNode(a), b.appendChild(a))
                },
                loadScript: function (a, b) {
                    var d = !1,
                        c = e("<script>").attr({
                            src: a,
                            async: !0
                        }).get(0);
                    c.onload = c.onreadystatechange = function () {
                        if (!d && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) d = !0, c.onload = c.onreadystatechange = null, typeof b === "function" && b.call(this, this)
                    };
                    u().head.appendChild(c)
                },
                parseValue: function (a) {
                    return typeof a === "number" ? a : typeof a === "string" ? (a = a.match(/\-?\d|\./g)) && a.constructor === Array ? a.join("") * 1 : 0 : 0
                },
                timestamp: function () {
                    return (new Date).getTime()
                },
                loadCSS: function (a, b, d) {
                    var c, i = !1,
                        j;
                    e("link[rel=stylesheet]").each(function () {
                        if (RegExp(a).test(this.href)) return c = this, !1
                    });
                    typeof b === "function" && (d = b, b = void 0);
                    d = d ||
                    function () {};
                    if (c) return d.call(c, c), c;
                    j = n.styleSheets.length;
                    A && (a += "?" + f.timestamp());
                    e("#" + b).length ? (e("#" + b).attr("href", a), j--, i = !0) : (c = e("<link>").attr({
                        rel: "stylesheet",
                        href: a,
                        id: b
                    }).get(0), l.setTimeout(function () {
                        var b = e('link[rel="stylesheet"], style');
                        b.length ? b.get(0).parentNode.insertBefore(c, b[0]) : u().head.appendChild(c);
                        m ? j >= 31 ? Galleria.raise("You have reached the browser stylesheet limit (31)", !0) : c.onreadystatechange = function () {
                            if (!i && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) i = !0
                        } : /file:\/\//i.test(a) ? i = !0 : e.ajax({
                            url: a,
                            success: function () {
                                i = !0
                            },
                            error: function (a) {
                                a.isRejected() && Galleria.WEBKIT && (i = !0)
                            }
                        })
                    }, 10));
                    typeof d === "function" && f.wait({
                        until: function () {
                            return i && n.styleSheets.length > j
                        },
                        success: function () {
                            l.setTimeout(function () {
                                d.call(c, c)
                            }, 100)
                        },
                        error: function () {
                            Galleria.raise("Theme CSS could not load", !0)
                        },
                        timeout: 1E4
                    });
                    return c
                }
            }
        }(),
        G = function () {
            var a = function (a, d, c, i) {
                    var j = this.getOptions("easing"),
                        h = this.getStageWidth(),
                        g = {
                            left: h * (a.rewind ? -1 : 1)
                        },
                        k = {
                            left: 0
                        };
                    if (c) g.opacity = 0, k.opacity = 1;
                    e(a.next).css(g);
                    f.animate(a.next, k, {
                        duration: a.speed,
                        complete: function (a) {
                            return function () {
                                d();
                                a.css({
                                    left: 0
                                })
                            }
                        }(e(a.next).add(a.prev)),
                        queue: !1,
                        easing: j
                    });
                    if (i) a.rewind = !a.rewind;
                    if (a.prev) {
                        g = {
                            left: 0
                        };
                        k = {
                            left: h * (a.rewind ? 1 : -1)
                        };
                        if (c) g.opacity = 1, k.opacity = 0;
                        e(a.prev).css(g);
                        f.animate(a.prev, k, {
                            duration: a.speed,
                            queue: !1,
                            easing: j,
                            complete: function () {
                                e(this).css("opacity", 0)
                            }
                        })
                    }
                };
            return {
                fade: function (a, d) {
                    e(a.next).css("opacity", 0).show();
                    f.animate(a.next, {
                        opacity: 1
                    }, {
                        duration: a.speed,
                        complete: d
                    });
                    a.prev && (e(a.prev).css("opacity", 1).show(), f.animate(a.prev, {
                        opacity: 0
                    }, {
                        duration: a.speed
                    }))
                },
                flash: function (a, d) {
                    e(a.next).css("opacity", 0);
                    a.prev ? f.animate(a.prev, {
                        opacity: 0
                    }, {
                        duration: a.speed / 2,
                        complete: function () {
                            f.animate(a.next, {
                                opacity: 1
                            }, {
                                duration: a.speed,
                                complete: d
                            })
                        }
                    }) : f.animate(a.next, {
                        opacity: 1
                    }, {
                        duration: a.speed,
                        complete: d
                    })
                },
                pulse: function (a, d) {
                    a.prev && e(a.prev).hide();
                    e(a.next).css("opacity", 0).show();
                    f.animate(a.next, {
                        opacity: 1
                    }, {
                        duration: a.speed,
                        complete: d
                    })
                },
                slide: function (b, d) {
                    a.apply(this, f.array(arguments))
                },
                fadeslide: function (b, d) {
                    a.apply(this, f.array(arguments).concat([!0]))
                },
                doorslide: function (b, d) {
                    a.apply(this, f.array(arguments).concat([!1, !0]))
                }
            }
        }();
    Galleria = function () {
        var a = this;
        this._theme = void 0;
        this._options = {};
        this._playing = !1;
        this._playtime = 5E3;
        this._active = null;
        this._queue = {
            length: 0
        };
        this._data = [];
        this._dom = {};
        this._thumbnails = [];
        this._layers = [];
        this._firstrun = this._initialized = !1;
        this._stageHeight = this._stageWidth = 0;
        this._target = void 0;
        this._id = Math.random();
        e.each("container stage images image-nav image-nav-left image-nav-right info info-text info-title info-description thumbnails thumbnails-list thumbnails-container thumb-nav-left thumb-nav-right loader counter tooltip".split(" "), function (b, c) {
            a._dom[c] = f.create("galleria-" + c)
        });
        e.each("current total".split(" "), function (b, c) {
            a._dom[c] = f.create("galleria-" + c, "span")
        });
        var b = this._keyboard = {
            keys: {
                UP: 38,
                DOWN: 40,
                LEFT: 37,
                RIGHT: 39,
                RETURN: 13,
                ESCAPE: 27,
                BACKSPACE: 8,
                SPACE: 32
            },
            map: {},
            bound: !1,
            press: function (c) {
                var d = c.keyCode || c.which;
                d in b.map && typeof b.map[d] === "function" && b.map[d].call(a, c)
            },
            attach: function (a) {
                var c, d;
                for (c in a) a.hasOwnProperty(c) && (d = c.toUpperCase(), d in b.keys ? b.map[b.keys[d]] = a[c] : b.map[d] = a[c]);
                if (!b.bound) b.bound = !0, H.bind("keydown", b.press)
            },
            detach: function () {
                b.bound = !1;
                b.map = {};
                H.unbind("keydown", b.press)
            }
        },
            d = this._controls = {
                0: void 0,
                1: void 0,
                active: 0,
                swap: function () {
                    d.active = d.active ? 0 : 1
                },
                getActive: function () {
                    return d[d.active]
                },
                getNext: function () {
                    return d[1 - d.active]
                }
            },
            c = this._carousel = {
                next: a.$("thumb-nav-right"),
                prev: a.$("thumb-nav-left"),
                width: 0,
                current: 0,
                max: 0,
                hooks: [],
                update: function () {
                    var b = 0,
                        d = 0,
                        f = [0];
                    e.each(a._thumbnails, function (a, c) {
                        c.ready && (b += c.outerWidth || e(c.container).outerWidth(!0), f[a + 1] = b, d = Math.max(d, c.outerHeight || e(c.container).outerHeight(!0)))
                    });
                    a.$("thumbnails").css({
                        width: b,
                        height: d
                    });
                    c.max = b;
                    c.hooks = f;
                    c.width = a.$("thumbnails-list").width();
                    c.setClasses();
                    a.$("thumbnails-container").toggleClass("galleria-carousel", b > c.width);
                    c.width = a.$("thumbnails-list").width()
                },
                bindControls: function () {
                    var b;
                    c.next.bind("click", function (d) {
                        d.preventDefault();
                        if (a._options.carouselSteps === "auto") for (b = c.current; b < c.hooks.length; b++) {
                            if (c.hooks[b] - c.hooks[c.current] > c.width) {
                                c.set(b - 2);
                                break
                            }
                        } else c.set(c.current + a._options.carouselSteps)
                    });
                    c.prev.bind("click", function (d) {
                        d.preventDefault();
                        if (a._options.carouselSteps === "auto") for (b = c.current; b >= 0; b--) if (c.hooks[c.current] - c.hooks[b] > c.width) {
                            c.set(b + 2);
                            break
                        } else {
                            if (b === 0) {
                                c.set(0);
                                break
                            }
                        } else c.set(c.current - a._options.carouselSteps)
                    })
                },
                set: function (a) {
                    for (a = Math.max(a, 0); c.hooks[a - 1] + c.width >= c.max && a >= 0;) a--;
                    c.current = a;
                    c.animate()
                },
                getLast: function (a) {
                    return (a || c.current) - 1
                },
                follow: function (a) {
                    if (a === 0 || a === c.hooks.length - 2) c.set(a);
                    else {
                        for (var b = c.current; c.hooks[b] - c.hooks[c.current] < c.width && b <= c.hooks.length;) b++;
                        a - 1 < c.current ? c.set(a - 1) : a + 2 > b && c.set(a - b + c.current + 2)
                    }
                },
                setClasses: function () {
                    c.prev.toggleClass("disabled", !c.current);
                    c.next.toggleClass("disabled", c.hooks[c.current] + c.width >= c.max)
                },
                animate: function () {
                    c.setClasses();
                    var b = c.hooks[c.current] * -1;
                    isNaN(b) || f.animate(a.get("thumbnails"), {
                        left: b
                    }, {
                        duration: a._options.carouselSpeed,
                        easing: a._options.easing,
                        queue: !1
                    })
                }
            },
            i = this._tooltip = {
                initialized: !1,
                open: !1,
                init: function () {
                    i.initialized = !0;
                    f.insertStyleTag(".galleria-tooltip{padding:3px 8px;max-width:50%;background:#ffe;color:#000;z-index:3;position:absolute;font-size:11px;line-height:1.3opacity:0;box-shadow:0 0 2px rgba(0,0,0,.4);-moz-box-shadow:0 0 2px rgba(0,0,0,.4);-webkit-box-shadow:0 0 2px rgba(0,0,0,.4);}");
                    a.$("tooltip").css("opacity", 0.8);
                    f.hide(a.get("tooltip"))
                },
                move: function (b) {
                    var c = a.getMousePosition(b).x,
                        b = a.getMousePosition(b).y,
                        d = a.$("tooltip"),
                        e = b,
                        f = d.outerHeight(!0) + 1,
                        i = d.outerWidth(!0),
                        g = f + 15,
                        i = a.$("container").width() - i - 2,
                        f = a.$("container").height() - f - 2;
                    !isNaN(c) && !isNaN(e) && (c += 10, e -= 30, c = Math.max(0, Math.min(i, c)), e = Math.max(0, Math.min(f, e)), b < g && (e = g), d.css({
                        left: c,
                        top: e
                    }))
                },
                bind: function (b, c) {
                    if (!Galleria.TOUCH) {
                        i.initialized || i.init();
                        var d = function (b, c) {
                                i.define(b, c);
                                e(b).hover(function () {
                                    f.clearTimer("switch_tooltip");
                                    a.$("container").unbind("mousemove", i.move).bind("mousemove", i.move).trigger("mousemove");
                                    i.show(b);
                                    Galleria.utils.addTimer("tooltip", function () {
                                        a.$("tooltip").stop().show().animate({
                                            opacity: 1
                                        });
                                        i.open = !0
                                    }, i.open ? 0 : 500)
                                }, function () {
                                    a.$("container").unbind("mousemove", i.move);
                                    f.clearTimer("tooltip");
                                    a.$("tooltip").stop().animate({
                                        opacity: 0
                                    }, 200, function () {
                                        a.$("tooltip").hide();
                                        f.addTimer("switch_tooltip", function () {
                                            i.open = !1
                                        }, 1E3)
                                    })
                                })
                            };
                        typeof c === "string" ? d(b in a._dom ? a.get(b) : b, c) : e.each(b, function (b, c) {
                            d(a.get(b), c)
                        })
                    }
                },
                show: function (b) {
                    var b = e(b in a._dom ? a.get(b) : b),
                        c = b.data("tt"),
                        d = function (a) {
                            l.setTimeout(function (a) {
                                return function () {
                                    i.move(a)
                                }
                            }(a), 10);
                            b.unbind("mouseup", d)
                        };
                    if (c = typeof c === "function" ? c() : c) a.$("tooltip").html(c.replace(/\s/, "&nbsp;")), b.bind("mouseup", d)
                },
                define: function (b, c) {
                    if (typeof c !== "function") var d = c,
                        c = function () {
                            return d
                        };
                    b = e(b in a._dom ? a.get(b) : b).data("tt", c);
                    i.show(b)
                }
            },
            j = this._fullscreen = {
                scrolled: 0,
                crop: a._options.imageCrop,
                active: !1,
                keymap: a._keyboard.map,
                enter: function (b) {
                    j.active = !0;
                    f.hide(a.getActiveImage());
                    a.$("container").addClass("fullscreen");
                    j.scrolled = t.scrollTop();
                    f.forceStyles(a.get("container"), {
                        position: "fixed",
                        top: 0,
                        left: 0,
                        width: "100%",
                        height: "100%",
                        zIndex: 1E4
                    });
                    var c = {
                        height: "100%",
                        overflow: "hidden",
                        margin: 0,
                        padding: 0
                    },
                        d = a.getData();
                    f.forceStyles(u().html, c);
                    f.forceStyles(u().body, c);
                    j.keymap = e.extend({}, a._keyboard.map);
                    a.attachKeyboard({
                        escape: a.exitFullscreen,
                        right: a.next,
                        left: a.prev
                    });
                    if (a._options.fullscreenCrop !== void 0) a._options.imageCrop = a._options.fullscreenCrop;
                    if (d && d.big && d.image !== d.big) {
                        var c = new Galleria.Picture,
                            i = c.isCached(d.big),
                            g = a.getIndex(),
                            h = a._thumbnails[g];
                        a.trigger({
                            type: Galleria.LOADSTART,
                            cached: i,
                            rewind: !1,
                            index: g,
                            imageTarget: a.getActiveImage(),
                            thumbTarget: h
                        });
                        c.load(d.big, function (b) {
                            a._scaleImage(b, {
                                complete: function (b) {
                                    a.trigger({
                                        type: Galleria.LOADFINISH,
                                        cached: i,
                                        index: g,
                                        rewind: !1,
                                        imageTarget: b.image,
                                        thumbTarget: h
                                    });
                                    var c = a._controls.getActive().image;
                                    c && e(c).width(b.image.width).height(b.image.height).attr("style", e(b.image).attr("style")).attr("src", b.image.src)
                                }
                            })
                        })
                    }
                    a.rescale(function () {
                        f.addTimer("fullscreen_enter", function () {
                            f.show(a.getActiveImage());
                            typeof b === "function" && b.call(a)
                        }, 100);
                        a.trigger(Galleria.FULLSCREEN_ENTER)
                    });
                    t.resize(function () {
                        j.scale()
                    })
                },
                scale: function () {
                    a.rescale()
                },
                exit: function (b) {
                    j.active = !1;
                    f.hide(a.getActiveImage());
                    a.$("container").removeClass("fullscreen");
                    f.revertStyles(a.get("container"), u().html, u().body);
                    l.scrollTo(0, j.scrolled);
                    a.detachKeyboard();
                    a.attachKeyboard(j.keymap);
                    if (a._options.fullscreenCrop !== void 0) a._options.imageCrop = j.crop;
                    a.rescale(function () {
                        f.addTimer("fullscreen_exit", function () {
                            f.show(a.getActiveImage());
                            typeof b === "function" && b.call(a)
                        }, 50);
                        a.trigger(Galleria.FULLSCREEN_EXIT)
                    });
                    t.unbind("resize", j.scale)
                }
            },
            h = this._idle = {
                trunk: [],
                bound: !1,
                add: function (a, b) {
                    if (a) {
                        h.bound || h.addEvent();
                        var a = e(a),
                            c = {},
                            d;
                        for (d in b) b.hasOwnProperty(d) && (c[d] = a.css(d));
                        a.data("idle", {
                            from: c,
                            to: b,
                            complete: !0,
                            busy: !1
                        });
                        h.addTimer();
                        h.trunk.push(a)
                    }
                },
                remove: function (b) {
                    b = jQuery(b);
                    e.each(h.trunk, function (c, d) {
                        d.length && !d.not(b).length && (a._idle.show(b), a._idle.trunk.splice(c, 1))
                    });
                    h.trunk.length || (h.removeEvent(), f.clearTimer("idle"))
                },
                addEvent: function () {
                    h.bound = !0;
                    a.$("container").bind("mousemove click", h.showAll)
                },
                removeEvent: function () {
                    h.bound = !1;
                    a.$("container").unbind("mousemove click", h.showAll)
                },
                addTimer: function () {
                    f.addTimer("idle", function () {
                        a._idle.hide()
                    }, a._options.idleTime)
                },
                hide: function () {
                    a._options.idleMode && (a.trigger(Galleria.IDLE_ENTER), e.each(h.trunk, function (b, c) {
                        var d = c.data("idle");
                        if (d) c.data("idle").complete = !1, f.animate(c, d.to, {
                            duration: a._options.idleSpeed
                        })
                    }))
                },
                showAll: function () {
                    f.clearTimer("idle");
                    e.each(a._idle.trunk, function (b, c) {
                        a._idle.show(c)
                    })
                },
                show: function (b) {
                    var c = b.data("idle");
                    if (!c.busy && !c.complete) c.busy = !0, a.trigger(Galleria.IDLE_EXIT), f.clearTimer("idle"), f.animate(b, c.from, {
                        duration: a._options.idleSpeed / 2,
                        complete: function () {
                            e(this).data("idle").busy = !1;
                            e(this).data("idle").complete = !0
                        }
                    });
                    h.addTimer()
                }
            },
            g = this._lightbox = {
                width: 0,
                height: 0,
                initialized: !1,
                active: null,
                image: null,
                elems: {},
                keymap: !1,
                init: function () {
                    a.trigger(Galleria.LIGHTBOX_OPEN);
                    if (!g.initialized) {
                        g.initialized = !0;
                        var b = {},
                            c = a._options,
                            d = "",
                            c = {
                                overlay: "position:fixed;display:none;opacity:" + c.overlayOpacity + ";filter:alpha(opacity=" + c.overlayOpacity * 100 + ");top:0;left:0;width:100%;height:100%;background:" + c.overlayBackground + ";z-index:99990",
                                box: "position:fixed;display:none;width:400px;height:400px;top:50%;left:50%;margin-top:-200px;margin-left:-200px;z-index:99991",
                                shadow: "position:absolute;background:#000;width:100%;height:100%;",
                                content: "position:absolute;background-color:#fff;top:10px;left:10px;right:10px;bottom:10px;overflow:hidden",
                                info: "position:absolute;bottom:10px;left:10px;right:10px;color:#444;font:11px/13px arial,sans-serif;height:13px",
                                close: "position:absolute;top:10px;right:10px;height:20px;width:20px;background:#fff;text-align:center;cursor:pointer;color:#444;font:16px/22px arial,sans-serif;z-index:99999",
                                image: "position:absolute;top:10px;left:10px;right:10px;bottom:30px;overflow:hidden;display:block;",
                                prevholder: "position:absolute;width:50%;top:0;bottom:40px;cursor:pointer;",
                                nextholder: "position:absolute;width:50%;top:0;bottom:40px;right:-1px;cursor:pointer;",
                                prev: "position:absolute;top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;left:20px;display:none;text-align:center;color:#000;font:bold 16px/36px arial,sans-serif",
                                next: "position:absolute;top:50%;margin-top:-20px;height:40px;width:30px;background:#fff;right:20px;left:auto;display:none;font:bold 16px/36px arial,sans-serif;text-align:center;color:#000",
                                title: "float:left",
                                counter: "float:right;margin-left:8px;"
                            },
                            i = {};
                        m === 8 && (c.nextholder += "background:#000;filter:alpha(opacity=0);", c.prevholder += "background:#000;filter:alpha(opacity=0);");
                        e.each(c, function (a, b) {
                            d += ".galleria-lightbox-" + a + "{" + b + "}"
                        });
                        f.insertStyleTag(d);
                        e.each("overlay box content shadow title info close prevholder prev nextholder next counter image".split(" "), function (c, d) {
                            a.addElement("lightbox-" + d);
                            b[d] = g.elems[d] = a.get("lightbox-" + d)
                        });
                        g.image = new Galleria.Picture;
                        e.each({
                            box: "shadow content close prevholder nextholder",
                            info: "title counter",
                            content: "info image",
                            prevholder: "prev",
                            nextholder: "next"
                        }, function (a, b) {
                            var c = [];
                            e.each(b.split(" "), function (a, b) {
                                c.push("lightbox-" + b)
                            });
                            i["lightbox-" + a] = c
                        });
                        a.append(i);
                        e(b.image).append(g.image.container);
                        e(u().body).append(b.overlay, b.box);
                        f.optimizeTouch(b.box);
                        (function (a) {
                            return a.hover(function () {
                                e(this).css("color", "#bbb")
                            }, function () {
                                e(this).css("color", "#444")
                            })
                        })(e(b.close).bind("click", g.hide).html("&#215;"));
                        e.each(["Prev", "Next"], function (a, c) {
                            var d = e(b[c.toLowerCase()]).html(/v/.test(c) ? "&#8249;&nbsp;" : "&nbsp;&#8250;"),
                                f = e(b[c.toLowerCase() + "holder"]);
                            f.bind("click", function () {
                                g["show" + c]()
                            });
                            m < 8 || Galleria.TOUCH ? d.show() : f.hover(function () {
                                d.show()
                            }, function () {
                                d.stop().fadeOut(200)
                            })
                        });
                        e(b.overlay).bind("click", g.hide);
                        if (Galleria.IPAD) a._options.lightboxTransitionSpeed = 0
                    }
                },
                rescale: function (b) {
                    var c = Math.min(t.width() - 40, g.width),
                        d = Math.min(t.height() - 60, g.height),
                        d = Math.min(c / g.width, d / g.height),
                        c = Math.round(g.width * d) + 40,
                        d = Math.round(g.height * d) + 60,
                        c = {
                            width: c,
                            height: d,
                            "margin-top": Math.ceil(d / 2) * -1,
                            "margin-left": Math.ceil(c / 2) * -1
                        };
                    b ? e(g.elems.box).css(c) : e(g.elems.box).animate(c, {
                        duration: a._options.lightboxTransitionSpeed,
                        easing: a._options.easing,
                        complete: function () {
                            var b = g.image,
                                c = a._options.lightboxFadeSpeed;
                            a.trigger({
                                type: Galleria.LIGHTBOX_IMAGE,
                                imageTarget: b.image
                            });
                            e(b.container).show();
                            f.show(b.image, c);
                            f.show(g.elems.info, c)
                        }
                    })
                },
                hide: function () {
                    g.image.image = null;
                    t.unbind("resize", g.rescale);
                    e(g.elems.box).hide();
                    f.hide(g.elems.info);
                    a.detachKeyboard();
                    a.attachKeyboard(g.keymap);
                    g.keymap = !1;
                    f.hide(g.elems.overlay, 200, function () {
                        e(this).hide().css("opacity", a._options.overlayOpacity);
                        a.trigger(Galleria.LIGHTBOX_CLOSE)
                    })
                },
                showNext: function () {
                    g.show(a.getNext(g.active))
                },
                showPrev: function () {
                    g.show(a.getPrev(g.active))
                },
                show: function (b) {
                    g.active = b = typeof b === "number" ? b : a.getIndex();
                    g.initialized || g.init();
                    if (!g.keymap) g.keymap = e.extend({}, a._keyboard.map), a.attachKeyboard({
                        escape: g.hide,
                        right: g.showNext,
                        left: g.showPrev
                    });
                    t.unbind("resize", g.rescale);
                    var c = a.getData(b),
                        d = a.getDataLength();
                    f.hide(g.elems.info);
                    g.image.load(c.big || c.image, function (a) {
                        g.width = a.original.width;
                        g.height = a.original.height;
                        e(a.image).css({
                            width: "100.5%",
                            height: "100.5%",
                            top: 0,
                            zIndex: 99998
                        });
                        f.hide(a.image);
                        g.elems.title.innerHTML = c.title || "";
                        g.elems.counter.innerHTML = b + 1 + " / " + d;
                        t.resize(g.rescale);
                        g.rescale()
                    });
                    e(g.elems.overlay).show();
                    e(g.elems.box).show()
                }
            };
        return this
    };
    Galleria.prototype = {
        constructor: Galleria,
        init: function (a, b) {
            b = K(b);
            this._original = {
                target: a,
                options: b,
                data: null
            };
            this._target = this._dom.target = a.nodeName ? a : e(a).get(0);
            y.push(this);
            if (this._target) {
                this._options = {
                    autoplay: !1,
                    carousel: !0,
                    carouselFollow: !0,
                    carouselSpeed: 400,
                    carouselSteps: "auto",
                    clicknext: !1,
                    dataConfig: function () {
                        return {}
                    },
                    dataSelector: "img",
                    dataSource: this._target,
                    debug: void 0,
                    dummy: void 0,
                    easing: "galleria",
                    extend: function () {},
                    fullscreenCrop: void 0,
                    fullscreenDoubleTap: !0,
                    fullscreenTransition: void 0,
                    height: "auto",
                    idleMode: !1,
                    idleTime: 3E3,
                    idleSpeed: 200,
                    imageCrop: !1,
                    imageMargin: 0,
                    imagePan: !1,
                    imagePanSmoothness: 12,
                    imagePosition: "50%",
                    imageTimeout: void 0,
                    initialTransition: void 0,
                    keepSource: !1,
                    layerFollow: !0,
                    lightbox: !1,
                    lightboxFadeSpeed: 200,
                    lightboxTransitionSpeed: 200,
                    linkSourceImages: !0,
                    maxScaleRatio: void 0,
                    minScaleRatio: void 0,
                    overlayOpacity: 0.85,
                    overlayBackground: "#0b0b0b",
                    pauseOnInteraction: !0,
                    popupLinks: !1,
                    preload: 2,
                    queue: !0,
                    show: 0,
                    showInfo: !0,
                    showCounter: !0,
                    showImagenav: !0,
                    swipe: !0,
                    thumbCrop: !0,
                    thumbEventType: "click",
                    thumbFit: !0,
                    thumbMargin: 0,
                    thumbQuality: "auto",
                    thumbnails: !0,
                    touchTransition: void 0,
                    transition: "fade",
                    transitionInitial: void 0,
                    transitionSpeed: 400,
                    useCanvas: !1,
                    width: "auto"
                };
                this._options.initialTransition = this._options.initialTransition || this._options.transitionInitial;
                b && b.debug === !1 && (A = !1);
                if (b && typeof b.imageTimeout === "number") B = b.imageTimeout;
                if (b && typeof b.dummy === "string") C = b.dummy;
                e(this._target).children().hide();
                typeof Galleria.theme === "object" ? this._init() : M.push(this);
                return this
            } else Galleria.raise("Target not found.", !0)
        },
        _init: function () {
            var a = this;
            if (this._initialized) return Galleria.raise("Init failed: Gallery instance already initialized."), this;
            this._initialized = !0;
            if (!Galleria.theme) return Galleria.raise("Init failed: No theme found."), this;
            e.extend(!0, this._options, Galleria.theme.defaults, this._original.options);
            (function (a) {
                "getContext" in a && (s = s || {
                    elem: a,
                    context: a.getContext("2d"),
                    cache: {},
                    length: 0
                })
            })(n.createElement("canvas"));
            this.bind(Galleria.DATA, function () {
                this._original.data = this._data;
                this.get("total").innerHTML = this.getDataLength();
                var b = this.$("container"),
                    d = {
                        width: 0,
                        height: 0
                    },
                    j = function () {
                        return a.$("stage").height()
                    };
                f.wait({
                    until: function () {
                        e.each(["width", "height"], function (e, g) {
                            d[g] = a._options[g] && typeof a._options[g] === "number" ? a._options[g] : Math.max(f.parseValue(b.css(g)), f.parseValue(a.$("target").css(g)), b[g](), a.$("target")[g]());
                            b[g](d[g])
                        });
                        return j() && d.width && d.height > 10
                    },
                    success: function () {
                        Galleria.WEBKIT ? l.setTimeout(function () {
                            a._run()
                        }, 1) : a._run()
                    },
                    error: function () {
                        j() ? Galleria.raise("Could not extract sufficient width/height of the gallery container. Traced measures: width:" + d.width + "px, height: " + d.height + "px.", !0) : Galleria.raise("Could not extract a stage height from the CSS. Traced height: " + j() + "px.", !0)
                    },
                    timeout: 2E3
                })
            });
            this.append({
                "info-text": ["info-title", "info-description"],
                info: ["info-text"],
                "image-nav": ["image-nav-right", "image-nav-left"],
                stage: ["images", "loader", "counter", "image-nav"],
                "thumbnails-list": ["thumbnails"],
                "thumbnails-container": ["thumb-nav-left", "thumbnails-list", "thumb-nav-right"],
                container: ["stage", "thumbnails-container", "info", "tooltip"]
            });
            f.hide(this.$("counter").append(this.get("current"), " / ", this.get("total")));
            this.setCounter("&#8211;");
            f.hide(a.get("tooltip"));
            this.$("container").addClass(Galleria.TOUCH ? "touch" : "notouch");
            e.each(Array(2), function (b) {
                var d = new Galleria.Picture;
                e(d.container).css({
                    position: "absolute",
                    top: 0,
                    left: 0
                }).prepend(a._layers[b] = e(f.create("galleria-layer")).css({
                    position: "absolute",
                    top: 0,
                    left: 0,
                    right: 0,
                    bottom: 0,
                    zIndex: 2
                })[0]);
                a.$("images").append(d.container);
                a._controls[b] = d
            });
            this.$("images").css({
                position: "relative",
                top: 0,
                left: 0,
                width: "100%",
                height: "100%"
            });
            this.$("thumbnails, thumbnails-list").css({
                overflow: "hidden",
                position: "relative"
            });
            this.$("image-nav-right, image-nav-left").bind("click", function (b) {
                a._options.clicknext && b.stopPropagation();
                a._options.pauseOnInteraction && a.pause();
                b = /right/.test(this.className) ? "next" : "prev";
                a[b]()
            });
            e.each(["info", "counter", "image-nav"], function (b, d) {
                a._options["show" + d.substr(0, 1).toUpperCase() + d.substr(1).replace(/-/, "")] === !1 && f.moveOut(a.get(d.toLowerCase()))
            });
            this.load();
            if (!this._options.keep_source && !m) this._target.innerHTML = "";
            this.get("errors") && this.appendChild("target", "errors");
            this.appendChild("target", "container");
            if (this._options.carousel) {
                var b = 0,
                    d = this._options.show;
                this.bind(Galleria.THUMBNAIL, function () {
                    this.updateCarousel();
                    ++b == this.getDataLength() && typeof d == "number" && d > 0 && this._carousel.follow(d)
                })
            }
            this._options.swipe && (function (b) {
                var d = [0, 0],
                    e = [0, 0],
                    h = !1,
                    g = 0,
                    k, p = {
                        start: "touchstart",
                        move: "touchmove",
                        stop: "touchend"
                    },
                    l = function (a) {
                        a.originalEvent.touches && a.originalEvent.touches.length > 1 || (k = a.originalEvent.touches ? a.originalEvent.touches[0] : a, e = [k.pageX, k.pageY], d[0] || (d = e), Math.abs(d[0] - e[0]) > 10 && a.preventDefault())
                    },
                    m = function (k) {
                        b.unbind(p.move, l);
                        k.originalEvent.touches && k.originalEvent.touches.length || h ? h = !h : (f.timestamp() - g < 1E3 && Math.abs(d[0] - e[0]) > 30 && Math.abs(d[1] - e[1]) < 100 && (k.preventDefault(), a[d[0] > e[0] ? "next" : "prev"]()), d = e = [0, 0])
                    };
                b.bind(p.start, function (a) {
                    a.originalEvent.touches && a.originalEvent.touches.length > 1 || (k = a.originalEvent.touches ? a.originalEvent.touches[0] : a, g = f.timestamp(), d = e = [k.pageX, k.pageY], b.bind(p.move, l).one(p.stop, m))
                })
            }(a.$("images")), this._options.fullscreenDoubleTap && this.$("stage").bind("touchstart", function () {
                var b, d, e, f, g, k;
                return function (p) {
                    k = Galleria.utils.timestamp();
                    d = (p.originalEvent.touches ? p.originalEvent.touches[0] : p).pageX;
                    e = (p.originalEvent.touches ? p.originalEvent.touches[0] : p).pageY;
                    k - b < 500 && d - f < 20 && e - g < 20 ? (a.toggleFullscreen(), p.preventDefault(), a.$("stage").unbind("touchend", arguments.callee)) : (b = k, f = d, g = e)
                }
            }()));
            f.optimizeTouch(this.get("container"));
            return this
        },
        _createThumbnails: function () {
            this.get("total").innerHTML = this.getDataLength();
            var a, b, d, c, i, j = this,
                h = this._options,
                g = function () {
                    var a = j.$("thumbnails").find(".active");
                    return !a.length ? !1 : a.find("img").attr("src")
                }(),
                k = typeof h.thumbnails === "string" ? h.thumbnails.toLowerCase() : null,
                p = function (a) {
                    return n.defaultView && n.defaultView.getComputedStyle ? n.defaultView.getComputedStyle(d.container, null)[a] : i.css(a)
                },
                w = function (a, b, c) {
                    return function () {
                        e(c).append(a);
                        j.trigger({
                            type: Galleria.THUMBNAIL,
                            thumbTarget: a,
                            index: b
                        })
                    }
                },
                m = function (a) {
                    h.pauseOnInteraction && j.pause();
                    var b = e(a.currentTarget).data("index");
                    j.getIndex() !== b && j.show(b);
                    a.preventDefault()
                },
                o = function (a) {
                    a.scale({
                        width: a.data.width,
                        height: a.data.height,
                        crop: h.thumbCrop,
                        margin: h.thumbMargin,
                        canvas: h.useCanvas,
                        complete: function (a) {
                            var b = ["left", "top"],
                                c, d;
                            e.each(["Width", "Height"], function (f, g) {
                                c = g.toLowerCase();
                                if ((h.thumbCrop !== !0 || h.thumbCrop === c) && h.thumbFit) d = {}, d[c] = a[c], e(a.container).css(d), d = {}, d[b[f]] = 0, e(a.image).css(d);
                                a["outer" + g] = e(a.container)["outer" + g](!0)
                            });
                            f.toggleQuality(a.image, h.thumbQuality === !0 || h.thumbQuality === "auto" && a.original.width < a.width * 3);
                            j.trigger({
                                type: Galleria.THUMBNAIL,
                                thumbTarget: a.image,
                                index: a.data.order
                            })
                        }
                    })
                };
            this._thumbnails = [];
            this.$("thumbnails").empty();
            for (a = 0; this._data[a]; a++) c = this._data[a], h.thumbnails === !0 ? (d = new Galleria.Picture(a), b = c.thumb || c.image, this.$("thumbnails").append(d.container), i = e(d.container), d.data = {
                width: f.parseValue(p("width")),
                height: f.parseValue(p("height")),
                order: a
            }, h.thumbFit && h.thumbCrop !== !0 ? i.css({
                width: 0,
                height: 0
            }) : i.css({
                width: d.data.width,
                height: d.data.height
            }), d.load(b, o), h.preload === "all" && d.preload(c.image)) : k === "empty" || k === "numbers" ? (d = {
                container: f.create("galleria-image"),
                image: f.create("img", "span"),
                ready: !0
            }, k === "numbers" && e(d.image).text(a + 1), this.$("thumbnails").append(d.container), l.setTimeout(w(d.image, a, d.container), 50 + a * 20)) : d = {
                container: null,
                image: null
            }, e(d.container).add(h.keepSource && h.linkSourceImages ? c.original : null).data("index", a).bind(h.thumbEventType, m), g === b && e(d.container).addClass("active"), this._thumbnails.push(d)
        },
        _run: function () {
            var a = this;
            a._createThumbnails();
            f.wait({
                until: function () {
                    Galleria.OPERA && a.$("stage").css("display", "inline-block");
                    a._stageWidth = a.$("stage").width();
                    a._stageHeight = a.$("stage").height();
                    return a._stageWidth && a._stageHeight > 50
                },
                success: function () {
                    z.push(a);
                    f.show(a.get("counter"));
                    a._options.carousel && a._carousel.bindControls();
                    if (a._options.autoplay) {
                        a.pause();
                        if (typeof a._options.autoplay === "number") a._playtime = a._options.autoplay;
                        a.trigger(Galleria.PLAY);
                        a._playing = !0
                    }
                    a._firstrun ? typeof a._options.show === "number" && a.show(a._options.show) : (a._firstrun = !0, a._options.clicknext && !Galleria.TOUCH && (e.each(a._data, function (a, d) {
                        delete d.link
                    }), a.$("stage").css({
                        cursor: "pointer"
                    }).bind("click", function () {
                        a._options.pauseOnInteraction && a.pause();
                        a.next()
                    })), Galleria.History && Galleria.History.change(function (b) {
                        isNaN(b) ? l.history.go(-1) : a.show(b, void 0, !0)
                    }), e.each(Galleria.ready.callbacks, function () {
                        this.call(a, a._options)
                    }), a.trigger(Galleria.READY), Galleria.theme.init.call(a, a._options), a._options.extend.call(a, a._options), /^[0-9]{1,4}$/.test(I) && Galleria.History ? a.show(I, void 0, !0) : a._data[a._options.show] && a.show(a._options.show))
                },
                error: function () {
                    Galleria.raise("Stage width or height is too small to show the gallery. Traced measures: width:" + a._stageWidth + "px, height: " + a._stageHeight + "px.", !0)
                }
            })
        },
        load: function (a, b, d) {
            var c = this;
            this._data = [];
            this._thumbnails = [];
            this.$("thumbnails").empty();
            typeof b === "function" && (d = b, b = null);
            a = a || this._options.dataSource;
            b = b || this._options.dataSelector;
            d = d || this._options.dataConfig;
            /^function Object/.test(a.constructor) && (a = [a]);
            if (a.constructor === Array) return this.validate(a) ? (this._data = a, this._parseData().trigger(Galleria.DATA)) : Galleria.raise("Load failed: JSON Array not valid."), this;
            e(a).find(b).each(function (a, b) {
                var b = e(b),
                    f = {},
                    g = b.parent(),
                    k = g.attr("href"),
                    g = g.attr("rel");
                if (k) f.image = f.big = k;
                if (g) f.big = g;
                c._data.push(e.extend({
                    title: b.attr("title") || "",
                    thumb: b.attr("src"),
                    image: b.attr("src"),
                    big: b.attr("src"),
                    description: b.attr("alt") || "",
                    link: b.attr("longdesc"),
                    original: b.get(0)
                }, f, d(b)))
            });
            this.getDataLength() ? this.trigger(Galleria.DATA) : Galleria.raise("Load failed: no data found.");
            return this
        },
        _parseData: function () {
            var a = this;
            e.each(this._data, function (b, d) {
                if ("thumb" in d === !1) a._data[b].thumb = d.image;
                if (!1 in d) a._data[b].big = d.image
            });
            return this
        },
        splice: function () {
            Array.prototype.splice.apply(this._data, f.array(arguments));
            return this._parseData()._createThumbnails()
        },
        push: function () {
            Array.prototype.push.apply(this._data, f.array(arguments));
            return this._parseData()._createThumbnails()
        },
        _getActive: function () {
            return this._controls.getActive()
        },
        validate: function () {
            return !0
        },
        bind: function (a, b) {
            a = D(a);
            this.$("container").bind(a, this.proxy(b));
            return this
        },
        unbind: function (a) {
            a = D(a);
            this.$("container").unbind(a);
            return this
        },
        trigger: function (a) {
            a = typeof a === "object" ? e.extend(a, {
                scope: this
            }) : {
                type: D(a),
                scope: this
            };
            this.$("container").trigger(a);
            return this
        },
        addIdleState: function (a, b) {
            this._idle.add.apply(this._idle, f.array(arguments));
            return this
        },
        removeIdleState: function (a) {
            this._idle.remove.apply(this._idle, f.array(arguments));
            return this
        },
        enterIdleMode: function () {
            this._idle.hide();
            return this
        },
        exitIdleMode: function () {
            this._idle.showAll();
            return this
        },
        enterFullscreen: function (a) {
            this._fullscreen.enter.apply(this, f.array(arguments));
            return this
        },
        exitFullscreen: function (a) {
            this._fullscreen.exit.apply(this, f.array(arguments));
            return this
        },
        toggleFullscreen: function (a) {
            this._fullscreen[this.isFullscreen() ? "exit" : "enter"].apply(this, f.array(arguments));
            return this
        },
        bindTooltip: function (a, b) {
            this._tooltip.bind.apply(this._tooltip, f.array(arguments));
            return this
        },
        defineTooltip: function (a, b) {
            this._tooltip.define.apply(this._tooltip, f.array(arguments));
            return this
        },
        refreshTooltip: function (a) {
            this._tooltip.show.apply(this._tooltip, f.array(arguments));
            return this
        },
        openLightbox: function () {
            this._lightbox.show.apply(this._lightbox, f.array(arguments));
            return this
        },
        closeLightbox: function () {
            this._lightbox.hide.apply(this._lightbox, f.array(arguments));
            return this
        },
        getActiveImage: function () {
            return this._getActive().image || void 0
        },
        getActiveThumb: function () {
            return this._thumbnails[this._active].image || void 0
        },
        getMousePosition: function (a) {
            return {
                x: a.pageX - this.$("container").offset().left,
                y: a.pageY - this.$("container").offset().top
            }
        },
        addPan: function (a) {
            if (this._options.imageCrop !== !1) {
                var a = e(a || this.getActiveImage()),
                    b = this,
                    d = a.width() / 2,
                    c = a.height() / 2,
                    i = parseInt(a.css("left"), 10),
                    j = parseInt(a.css("top"), 10),
                    h = i || 0,
                    g = j || 0,
                    k = 0,
                    p = 0,
                    l = !1,
                    n = f.timestamp(),
                    o = 0,
                    q = 0,
                    r = function (b, c, d) {
                        if (b > 0 && (q = Math.round(Math.max(b * -1, Math.min(0, c))), o !== q)) if (o = q, m === 8) a.parent()["scroll" + d](q * -1);
                        else b = {}, b[d.toLowerCase()] = q, a.css(b)
                    },
                    N = function (a) {
                        if (!(f.timestamp() - n < 50)) l = !0, d = b.getMousePosition(a).x, c = b.getMousePosition(a).y
                    };
                m === 8 && (a.parent().scrollTop(g * -1).scrollLeft(h * -1), a.css({
                    top: 0,
                    left: 0
                }));
                this.$("stage").unbind("mousemove", N).bind("mousemove", N);
                f.addTimer("pan", function () {
                    l && (k = a.width() - b._stageWidth, p = a.height() - b._stageHeight, i = d / b._stageWidth * k * -1, j = c / b._stageHeight * p * -1, h += (i - h) / b._options.imagePanSmoothness, g += (j - g) / b._options.imagePanSmoothness, r(p, g, "Top"), r(k, h, "Left"))
                }, 50, !0);
                return this
            }
        },
        proxy: function (a, b) {
            if (typeof a !== "function") return function () {};
            b = b || this;
            return function () {
                return a.apply(b, f.array(arguments))
            }
        },
        removePan: function () {
            this.$("stage").unbind("mousemove");
            f.clearTimer("pan");
            return this
        },
        addElement: function (a) {
            var b = this._dom;
            e.each(f.array(arguments), function (a, c) {
                b[c] = f.create("galleria-" + c)
            });
            return this
        },
        attachKeyboard: function (a) {
            this._keyboard.attach.apply(this._keyboard, f.array(arguments));
            return this
        },
        detachKeyboard: function () {
            this._keyboard.detach.apply(this._keyboard, f.array(arguments));
            return this
        },
        appendChild: function (a, b) {
            this.$(a).append(this.get(b) || b);
            return this
        },
        prependChild: function (a, b) {
            this.$(a).prepend(this.get(b) || b);
            return this
        },
        remove: function (a) {
            this.$(f.array(arguments).join(",")).remove();
            return this
        },
        append: function (a) {
            var b, d;
            for (b in a) if (a.hasOwnProperty(b)) if (a[b].constructor === Array) for (d = 0; a[b][d]; d++) this.appendChild(b, a[b][d]);
            else this.appendChild(b, a[b]);
            return this
        },
        _scaleImage: function (a, b) {
            var a = a || this._controls.getActive(),
                d, c = function (a) {
                    e(a.container).children(":first").css({
                        top: Math.max(0, f.parseValue(a.image.style.top)),
                        left: Math.max(0, f.parseValue(a.image.style.left)),
                        width: f.parseValue(a.image.width),
                        height: f.parseValue(a.image.height)
                    })
                },
                b = e.extend({
                    width: this._stageWidth,
                    height: this._stageHeight,
                    crop: this._options.imageCrop,
                    max: this._options.maxScaleRatio,
                    min: this._options.minScaleRatio,
                    margin: this._options.imageMargin,
                    position: this._options.imagePosition
                }, b);
            this._options.layerFollow && this._options.imageCrop !== !0 ? typeof b.complete == "function" ? (d = b.complete, b.complete = function () {
                d.call(a, a);
                c(a)
            }) : b.complete = c : e(a.container).children(":first").css({
                top: 0,
                left: 0
            });
            a.scale(b);
            return this
        },
        updateCarousel: function () {
            this._carousel.update();
            return this
        },
        rescale: function (a, b, d) {
            var c = this;
            typeof a === "function" && (d = a, a = void 0);
            var e = function () {
                    c._stageWidth = a || c.$("stage").width();
                    c._stageHeight = b || c.$("stage").height();
                    c._scaleImage();
                    c._options.carousel && c.updateCarousel();
                    c.trigger(Galleria.RESCALE);
                    typeof d === "function" && d.call(c)
                };
            Galleria.WEBKIT && !a && !b ? f.addTimer("scale", e, 10) : e.call(c);
            return this
        },
        refreshImage: function () {
            this._scaleImage();
            this._options.imagePan && this.addPan();
            return this
        },
        show: function (a, b, d) {
            if (!(a === !1 || !this._options.queue && this._queue.stalled)) if (a = Math.max(0, Math.min(parseInt(a, 10), this.getDataLength() - 1)), b = typeof b !== "undefined" ? !! b : a < this.getIndex(), !d && Galleria.History) Galleria.History.set(a.toString());
            else return this._active = a, Array.prototype.push.call(this._queue, {
                index: a,
                rewind: b
            }), this._queue.stalled || this._show(), this
        },
        _show: function () {
            var a = this,
                b = this._queue[0],
                d = this.getData(b.index);
            if (d) {
                var c = this.isFullscreen() && "big" in d ? d.big : d.image,
                    i = this._controls.getActive(),
                    j = this._controls.getNext(),
                    h = j.isCached(c),
                    g = this._thumbnails[b.index],
                    k = function (b, c, d, g, h) {
                        return function () {
                            a._queue.stalled = !1;
                            f.toggleQuality(c.image, a._options.imageQuality);
                            a._layers[a._controls.active].innerHTML = "";
                            e(d.container).css({
                                zIndex: 0,
                                opacity: 0
                            }).show();
                            e(c.container).css({
                                zIndex: 1
                            }).show();
                            a._controls.swap();
                            a._options.imagePan && a.addPan(c.image);
                            (b.link || a._options.lightbox) && e(c.image).css({
                                cursor: "pointer"
                            }).bind("mouseup", function () {
                                b.link ? a._options.popupLinks ? l.open(b.link, "_blank") : l.location.href = b.link : a.openLightbox()
                            });
                            Array.prototype.shift.call(a._queue);
                            a._queue.length && a._show();
                            a._playCheck();
                            a.trigger({
                                type: Galleria.IMAGE,
                                index: g.index,
                                imageTarget: c.image,
                                thumbTarget: h.image
                            })
                        }
                    }(d, j, i, b, g);
                this._options.carousel && this._options.carouselFollow && this._carousel.follow(b.index);
                if (this._options.preload) {
                    var p, m, n = this.getNext(),
                        o;
                    try {
                        for (m = this._options.preload; m > 0; m--) p = new Galleria.Picture, o = a.getData(n), p.preload(this.isFullscreen() && "big" in o ? o.big : o.image), n = a.getNext(n)
                    } catch (q) {}
                }
                f.show(j.container);
                e(a._thumbnails[b.index].container).addClass("active").siblings(".active").removeClass("active");
                a.trigger({
                    type: Galleria.LOADSTART,
                    cached: h,
                    index: b.index,
                    rewind: b.rewind,
                    imageTarget: j.image,
                    thumbTarget: g.image
                });
                j.load(c, function (c) {
                    e(a._layers[1 - a._controls.active]).html(d.layer || "").hide();
                    a._scaleImage(c, {
                        complete: function (c) {
                            "image" in i && f.toggleQuality(i.image, !1);
                            f.toggleQuality(c.image, !1);
                            a._queue.stalled = !0;
                            a.removePan();
                            a.setInfo(b.index);
                            a.setCounter(b.index);
                            d.layer && e(a._layers[1 - a._controls.active]).show();
                            a.trigger({
                                type: Galleria.LOADFINISH,
                                cached: h,
                                index: b.index,
                                rewind: b.rewind,
                                imageTarget: c.image,
                                thumbTarget: a._thumbnails[b.index].image
                            });
                            var g = a._options.transition;
                            e.each({
                                initial: i.image === null,
                                touch: Galleria.TOUCH,
                                fullscreen: a.isFullscreen()
                            }, function (b, c) {
                                if (c && a._options[b + "Transition"] !== void 0) return g = a._options[b + "Transition"], !1
                            });
                            g in G === !1 ? k() : G[g].call(a, {
                                prev: i.container,
                                next: c.container,
                                rewind: b.rewind,
                                speed: a._options.transitionSpeed || 400
                            }, k)
                        }
                    })
                })
            }
        },
        getNext: function (a) {
            a = typeof a === "number" ? a : this.getIndex();
            return a === this.getDataLength() - 1 ? 0 : a + 1
        },
        getPrev: function (a) {
            a = typeof a === "number" ? a : this.getIndex();
            return a === 0 ? this.getDataLength() - 1 : a - 1
        },
        next: function () {
            this.getDataLength() > 1 && this.show(this.getNext(), !1);
            return this
        },
        prev: function () {
            this.getDataLength() > 1 && this.show(this.getPrev(), !0);
            return this
        },
        get: function (a) {
            return a in this._dom ? this._dom[a] : null
        },
        getData: function (a) {
            return a in this._data ? this._data[a] : this._data[this._active]
        },
        getDataLength: function () {
            return this._data.length
        },
        getIndex: function () {
            return typeof this._active === "number" ? this._active : !1
        },
        getStageHeight: function () {
            return this._stageHeight
        },
        getStageWidth: function () {
            return this._stageWidth
        },
        getOptions: function (a) {
            return typeof a === "undefined" ? this._options : this._options[a]
        },
        setOptions: function (a, b) {
            typeof a === "object" ? e.extend(this._options, a) : this._options[a] = b;
            return this
        },
        play: function (a) {
            this._playing = !0;
            this._playtime = a || this._playtime;
            this._playCheck();
            this.trigger(Galleria.PLAY);
            return this
        },
        pause: function () {
            this._playing = !1;
            this.trigger(Galleria.PAUSE);
            return this
        },
        playToggle: function (a) {
            return this._playing ? this.pause() : this.play(a)
        },
        isPlaying: function () {
            return this._playing
        },
        isFullscreen: function () {
            return this._fullscreen.active
        },
        _playCheck: function () {
            var a = this,
                b = 0,
                d = f.timestamp(),
                c = "play" + this._id;
            if (this._playing) {
                f.clearTimer(c);
                var e = function () {
                        b = f.timestamp() - d;
                        b >= a._playtime && a._playing ? (f.clearTimer(c), a.next()) : a._playing && (a.trigger({
                            type: Galleria.PROGRESS,
                            percent: Math.ceil(b / a._playtime * 100),
                            seconds: Math.floor(b / 1E3),
                            milliseconds: b
                        }), f.addTimer(c, e, 20))
                    };
                f.addTimer(c, e, 20)
            }
        },
        setPlaytime: function (a) {
            this._playtime = a;
            return this
        },
        setIndex: function (a) {
            this._active = a;
            return this
        },
        setCounter: function (a) {
            typeof a === "number" ? a++ : typeof a === "undefined" && (a = this.getIndex() + 1);
            this.get("current").innerHTML = a;
            if (m) {
                var a = this.$("counter"),
                    b = a.css("opacity");
                parseInt(b, 10) === 1 ? f.removeAlpha(a[0]) : this.$("counter").css("opacity", b)
            }
            return this
        },
        setInfo: function (a) {
            var b = this,
                d = this.getData(a);
            e.each(["title", "description"], function (a, e) {
                var f = b.$("info-" + e);
                d[e] ? f[d[e].length ? "show" : "hide"]().html(d[e]) : f.empty().hide()
            });
            return this
        },
        hasInfo: function (a) {
            var b = "title description".split(" "),
                d;
            for (d = 0; b[d]; d++) if (this.getData(a)[b[d]]) return !0;
            return !1
        },
        jQuery: function (a) {
            var b = this,
                d = [];
            e.each(a.split(","), function (a, c) {
                c = e.trim(c);
                b.get(c) && d.push(c)
            });
            var c = e(b.get(d.shift()));
            e.each(d, function (a, d) {
                c = c.add(b.get(d))
            });
            return c
        },
        $: function (a) {
            return this.jQuery.apply(this, f.array(arguments))
        }
    };
    e.each(J, function (a, b) {
        var d = /_/.test(b) ? b.replace(/_/g, "") : b;
        Galleria[b.toUpperCase()] = "galleria." + d
    });
    e.extend(Galleria, {
        IE9: m === 9,
        IE8: m === 8,
        IE7: m === 7,
        IE6: m === 6,
        IE: m,
        WEBKIT: /webkit/.test(x),
        SAFARI: /safari/.test(x),
        CHROME: /chrome/.test(x),
        QUIRK: m && n.compatMode && n.compatMode === "BackCompat",
        MAC: /mac/.test(navigator.platform.toLowerCase()),
        OPERA: !! l.opera,
        IPHONE: /iphone/.test(x),
        IPAD: /ipad/.test(x),
        ANDROID: /android/.test(x),
        TOUCH: "ontouchstart" in n
    });
    Galleria.addTheme = function (a) {
        a.name || Galleria.raise("No theme name specified");
        a.defaults = typeof a.defaults !== "object" ? {} : K(a.defaults);
        var b = !1,
            d;
        typeof a.css === "string" ? (e("link").each(function (c, e) {
            d = RegExp(a.css);
            if (d.test(e.href)) return b = !0, E(a), !1
        }), b || e("script").each(function (c, e) {
            d = RegExp("galleria\\." + a.name.toLowerCase() + "\\.");
            d.test(e.src) && (b = e.src.replace(/[^\/]*$/, "") + a.css, f.addTimer("css", function () {
                f.loadCSS(b, "galleria-theme", function () {
                    E(a)
                })
            }, 1))
        }), b || Galleria.raise("No theme CSS loaded")) : E(a);
        return a
    };
    Galleria.loadTheme = function (a, b) {
        var d = z.length,
            c = l.setTimeout(function () {
                Galleria.raise("Theme at " + a + " could not load, check theme path.", !0)
            }, 5E3);
        Galleria.theme = void 0;
        f.loadScript(a, function () {
            l.clearTimeout(c);
            if (d) {
                var a = [];
                e.each(Galleria.get(), function (c, d) {
                    var f = e.extend(d._original.options, {
                        data_source: d._data
                    }, b);
                    d.$("container").remove();
                    var k = new Galleria;
                    k._id = d._id;
                    k.init(d._original.target, f);
                    a.push(k)
                });
                z = a
            }
        })
    };
    Galleria.get = function (a) {
        if (y[a]) return y[a];
        else if (typeof a !== "number") return y;
        else Galleria.raise("Gallery index " + a + " not found")
    };
    Galleria.addTransition = function (a, b) {
        G[a] = b
    };
    Galleria.utils = f;
    Galleria.log = function () {
        return "console" in l && "log" in l.console ? l.console.log : function () {
            l.alert(f.array(arguments).join(", "))
        }
    }();
    Galleria.ready = function (a) {
        e.each(z, function (b, d) {
            a.call(d, d._options)
        });
        Galleria.ready.callbacks.push(a)
    };
    Galleria.ready.callbacks = [];
    Galleria.raise = function (a, b) {
        var d = b ? "Fatal error" : "Error",
            c = function (a) {
                var c = '<div style="padding:4px;margin:0 0 2px;background:#' + (b ? "811" : "222") + '";>' + (b ? "<strong>" + d + ": </strong>" : "") + a + "</div>";
                e.each(y, function () {
                    var a = this.$("errors"),
                        b = this.$("target");
                    a.length || (b.css("position", "relative"), a = this.addElement("errors").appendChild("target", "errors").$("errors").css({
                        color: "#fff",
                        position: "absolute",
                        top: 0,
                        left: 0,
                        zIndex: 1E5
                    }));
                    a.append(c)
                })
            };
        if (A) {
            if (c(a), b) throw Error(d + ": " + a);
        } else b && !L && (L = !0, b = !1, c("Image gallery could not load."))
    };
    Galleria.version = 1.25;
    Galleria.requires = function (a, b) {
        Galleria.version < a && Galleria.raise(b || "You need to upgrade Galleria to version " + a + " to use one or more components.", !0)
    };
    Galleria.Picture = function (a) {
        this.id = a || null;
        this.image = null;
        this.container = f.create("galleria-image");
        e(this.container).css({
            overflow: "hidden",
            position: "relative"
        });
        this.original = {
            width: 0,
            height: 0
        };
        this.ready = !1;
        this.tid = null
    };
    Galleria.Picture.prototype = {
        cache: {},
        show: function () {
            f.show(this.image)
        },
        hide: function () {
            f.moveOut(this.image)
        },
        clear: function () {
            this.image = null
        },
        isCached: function (a) {
            return !!this.cache[a]
        },
        preload: function (a) {
            e(new Image).load(function (a, d) {
                return function () {
                    d[a] = a
                }
            }(a, this.cache)).attr("src", a)
        },
        load: function (a, b) {
            this.tid = l.setTimeout(function (a) {
                return function () {
                    Galleria.raise("Image not loaded in " + Math.round(B / 1E3) + " seconds: " + a)
                }
            }(a), B);
            this.image = new Image;
            var d = !1,
                c = e(this.container),
                i = e(this.image),
                j = function (a, b, c) {
                    return function () {
                        var d = function () {
                                a.original = {
                                    height: this.height,
                                    width: this.width
                                };
                                a.cache[c] = c;
                                l.clearTimeout(a.tid);
                                typeof b == "function" && l.setTimeout(function () {
                                    b.call(a, a)
                                }, 1)
                            };
                        !this.width || !this.height ? l.setTimeout(function (a) {
                            return function () {
                                a.width && a.height ? d.call(a) : Galleria.raise("Could not extract width/height from image: " + a.src + ". Traced measures: width:" + a.width + "px, height: " + a.height + "px.")
                            }
                        }(this), 2) : d.call(this)
                    }
                }(this, b, a);
            c.find("img").remove();
            i.css("display", "block").appendTo(this.container);
            f.hide(this.image);
            if (this.cache[a]) return this.image.src = a, j.call(this.image), this.container;
            e(this.image).load(j).error(function () {
                d ? C ? e(this).attr("src", C) : Galleria.raise("Image not found: " + a) : (d = !0, l.setTimeout(function (a, b) {
                    return function () {
                        a.attr("src", b + "?" + f.timestamp())
                    }
                }(e(this), a), 50))
            }).attr("src", a);
            return this.container
        },
        scale: function (a) {
            a = e.extend({
                width: 0,
                height: 0,
                min: void 0,
                max: void 0,
                margin: 0,
                complete: function () {},
                position: "center",
                crop: !1,
                canvas: !1
            }, a);
            if (!this.image) return this.container;
            var b, d, c = this,
                i = e(c.container),
                j;
            f.wait({
                until: function () {
                    b = a.width || i.width() || f.parseValue(i.css("width"));
                    d = a.height || i.height() || f.parseValue(i.css("height"));
                    return b && d
                },
                success: function () {
                    var h = (b - a.margin * 2) / c.original.width,
                        g = (d - a.margin * 2) / c.original.height,
                        i = {
                            "true": Math.max(h, g),
                            width: h,
                            height: g,
                            "false": Math.min(h, g)
                        }[a.crop.toString()],
                        h = "";
                    a.max && (i = Math.min(a.max, i));
                    a.min && (i = Math.max(a.min, i));
                    e.each(["width", "height"], function (a, b) {
                        e(c.image)[b](c[b] = c.image[b] = Math.round(c.original[b] * i))
                    });
                    e(c.container).width(b).height(d);
                    if (a.canvas && s) s.elem.width = c.width, s.elem.height = c.height, h = c.image.src + ":" + c.width + "x" + c.height, c.image.src = s.cache[h] ||
                    function (a) {
                        s.context.drawImage(c.image, 0, 0, c.original.width * i, c.original.height * i);
                        try {
                            return j = s.elem.toDataURL(), s.length += j.length, s.cache[a] = j
                        } catch (b) {
                            return c.image.src
                        }
                    }(h);
                    var l = {},
                        m = {},
                        h = function (a, b, d) {
                            var g = 0;
                            /\%/.test(a) ? (a = parseInt(a, 10) / 100, b = c.image[b] || e(c.image)[b](), g = Math.ceil(b * -1 * a + d * a)) : g = f.parseValue(a);
                            return g
                        },
                        n = {
                            top: {
                                top: 0
                            },
                            left: {
                                left: 0
                            },
                            right: {
                                left: "100%"
                            },
                            bottom: {
                                top: "100%"
                            }
                        };
                    e.each(a.position.toLowerCase().split(" "), function (a, b) {
                        b === "center" && (b = "50%");
                        l[a ? "top" : "left"] = b
                    });
                    e.each(l, function (a, b) {
                        n.hasOwnProperty(b) && e.extend(m, n[b])
                    });
                    l = l.top ? e.extend(l, m) : m;
                    l = e.extend({
                        top: "50%",
                        left: "50%"
                    }, l);
                    e(c.image).css({
                        position: "absolute",
                        top: h(l.top, "height", d),
                        left: h(l.left, "width", b)
                    });
                    c.show();
                    c.ready = !0;
                    a.complete.call(c, c)
                },
                error: function () {
                    Galleria.raise("Could not scale image: " + c.image.src)
                },
                timeout: 1E3
            });
            return this
        }
    };
    e.extend(e.easing, {
        galleria: function (a, b, d, c, e) {
            return (b /= e / 2) < 1 ? c / 2 * b * b * b + d : c / 2 * ((b -= 2) * b * b + 2) + d
        },
        galleriaIn: function (a, b, d, c, e) {
            return c * (b /= e) * b + d
        },
        galleriaOut: function (a, b, d, c, e) {
            return -c * (b /= e) * (b - 2) + d
        }
    });
    e.fn.galleria = function (a) {
        return this.each(function () {
            e(this).data("galleria", (new Galleria).init(this, a))
        })
    }
})(jQuery);
