/**
 *  @Website: apollotheme.com - prestashop template provider
 *  @author Apollotheme <apollotheme@gmail.com>
 *  @copyright  2007-2018 Apollotheme
 *  @description: 
 */

var LeoImage360 = (function() {
    var s, u;
    s = u = (function() {
        var N = {
            version: "v3.3-b5",
            UUID: 0,
            storage: {},
            $uuid: function(R) {
                return (R.$J_UUID || (R.$J_UUID = ++H.UUID))
            },
            getStorage: function(R) {
                return (H.storage[R] || (H.storage[R] = {}))
            },
            $F: function() {},
            leofalse: function() {
                return false
            },
            leotrue: function() {
                return true
            },
            stylesId: "mjs-" + Math.floor(Math.random() * new Date().getTime()),
            defined: function(R) {
                return (undefined != R)
            },
            ifndef: function(S, R) {
                return (undefined != S) ? S : R
            },
            exists: function(R) {
                return !!(R)
            },
            jTypeOf: function(R) {
                if (!H.defined(R)) {
                    return false
                }
                if (R.$J_TYPE) {
                    return R.$J_TYPE
                }
                if (!!R.nodeType) {
                    if (1 == R.nodeType) {
                        return "element"
                    }
                    if (3 == R.nodeType) {
                        return "textnode"
                    }
                }
                if (R.length && R.item) {
                    return "collection"
                }
                if (R.length && R.callee) {
                    return "arguments"
                }
                if ((R instanceof window.Object || R instanceof window.Function) && R.constructor === H.Class) {
                    return "class"
                }
                if (R instanceof window.Array) {
                    return "array"
                }
                if (R instanceof window.Function) {
                    return "function"
                }
                if (R instanceof window.String) {
                    return "string"
                }
                if (H.browser.trident) {
                    if (H.defined(R.cancelBubble)) {
                        return "event"
                    }
                } else {
                    if (R === window.event || R.constructor == window.Event || R.constructor == window.MouseEvent || R.constructor == window.UIEvent || R.constructor == window.KeyboardEvent || R.constructor == window.KeyEvent) {
                        return "event"
                    }
                }
                if (R instanceof window.Date) {
                    return "date"
                }
                if (R instanceof window.RegExp) {
                    return "regexp"
                }
                if (R === window) {
                    return "window"
                }
                if (R === document) {
                    return "document"
                }
                return typeof(R)
            },
            extend: function(W, V) {
                if (!(W instanceof window.Array)) {
                    W = [W]
                }
                if (!V) {
                    return W[0]
                }
                for (var U = 0, S = W.length; U < S; U++) {
                    if (!H.defined(W)) {
                        continue
                    }
                    for (var T in V) {
                        if (!Object.prototype.hasOwnProperty.call(V, T)) {
                            continue
                        }
                        try {
                            W[U][T] = V[T]
                        } catch (R) {}
                    }
                }
                return W[0]
            },
            implement: function(V, U) {
                if (!(V instanceof window.Array)) {
                    V = [V]
                }
                for (var T = 0, R = V.length; T < R; T++) {
                    if (!H.defined(V[T])) {
                        continue
                    }
                    if (!V[T].prototype) {
                        continue
                    }
                    for (var S in (U || {})) {
                        if (!V[T].prototype[S]) {
                            V[T].prototype[S] = U[S]
                        }
                    }
                }
                return V[0]
            },
            nativize: function(T, S) {
                if (!H.defined(T)) {
                    return T
                }
                for (var R in (S || {})) {
                    if (!T[R]) {
                        T[R] = S[R]
                    }
                }
                return T
            },
            $try: function() {
                for (var S = 0, R = arguments.length; S < R; S++) {
                    try {
                        return arguments[S]()
                    } catch (T) {}
                }
                return null
            },
            $A: function(T) {
                if (!H.defined(T)) {
                    return H.$([])
                }
                if (T.toArray) {
                    return H.$(T.toArray())
                }
                if (T.item) {
                    var S = T.length || 0,
                        R = new Array(S);
                    while (S--) {
                        R[S] = T[S]
                    }
                    return H.$(R)
                }
                return H.$(Array.prototype.slice.call(T))
            },
            now: function() {
                return new Date().getTime()
            },
            detach: function(V) {
                var T;
                switch (H.jTypeOf(V)) {
                    case "object":
                        T = {};
                        for (var U in V) {
                            T[U] = H.detach(V[U])
                        }
                        break;
                    case "array":
                        T = [];
                        for (var S = 0, R = V.length; S < R; S++) {
                            T[S] = H.detach(V[S])
                        }
                        break;
                    default:
                        return V
                }
                return H.$(T)
            },
            $: function(T) {
                var R = true;
                if (!H.defined(T)) {
                    return null
                }
                if (T.$J_EXT) {
                    return T
                }
                switch (H.jTypeOf(T)) {
                    case "array":
                        T = H.nativize(T, H.extend(H.Array, {
                            $J_EXT: H.$F
                        }));
                        T.jEach = T.forEach;
                        return T;
                        break;
                    case "string":
                        var S = document.getElementById(T);
                        if (H.defined(S)) {
                            return H.$(S)
                        }
                        return null;
                        break;
                    case "window":
                    case "document":
                        H.$uuid(T);
                        T = H.extend(T, H.Doc);
                        break;
                    case "element":
                        H.$uuid(T);
                        T = H.extend(T, H.Element);
                        break;
                    case "event":
                        T = H.extend(T, H.Event);
                        break;
                    case "textnode":
                    case "function":
                    case "array":
                    case "date":
                    default:
                        R = false;
                        break
                }
                if (R) {
                    return H.extend(T, {
                        $J_EXT: H.$F
                    })
                } else {
                    return T
                }
            },
            $new: function(R, T, S) {
                return H.$(H.doc.createElement(R)).setProps(T || {}).jSetCss(S || {})
            },
            addCSS: function(S, U, Y) {
                var V, T, W, X = [],
                    R = -1;
                Y || (Y = H.stylesId);
                V = H.$(Y) || H.$new("style", {
                    id: Y,
                    type: "text/css"
                }).jAppendTo((document.head || document.body), "top");
                T = V.sheet || V.styleSheet;
                if ("string" != H.jTypeOf(U)) {
                    for (var W in U) {
                        X.push(W + ":" + U[W])
                    }
                    U = X.join(";")
                }
                if (T.insertRule) {
                    R = T.insertRule(S + " {" + U + "}", T.cssRules.length)
                } else {
                    R = T.addRule(S, U)
                }
                return R
            },
            removeCSS: function(U, R) {
                var T, S;
                T = H.$(U);
                if ("element" !== H.jTypeOf(T)) {
                    return
                }
                S = T.sheet || T.styleSheet;
                if (S.deleteRule) {
                    S.deleteRule(R)
                } else {
                    if (S.removeRule) {
                        S.removeRule(R)
                    }
                }
            },
            generateUUID: function() {
                return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(T) {
                    var S = Math.random() * 16 | 0,
                        R = T == "x" ? S : (S & 3 | 8);
                    return R.toString(16)
                }).toUpperCase()
            },
            getAbsoluteURL: (function() {
                var R;
                return function(S) {
                    if (!R) {
                        R = document.createElement("a")
                    }
                    R.setAttribute("href", S);
                    return ("!!" + R.href).replace("!!", "")
                }
            })(),
            getHashCode: function(T) {
                var U = 0,
                    R = T.length;
                for (var S = 0; S < R; ++S) {
                    U = 31 * U + T.charCodeAt(S);
                    U %= 4294967296
                }
                return U
            }
        };
        var H = N;
        var I = N.$;
        if (!window.leoimageJS) {
            window.leoimageJS = N;
            window.$mjs = N.$
        }
        H.Array = {
            $J_TYPE: "array",
            indexOf: function(U, V) {
                var R = this.length;
                for (var S = this.length, T = (V < 0) ? Math.max(0, S + V) : V || 0; T < S; T++) {
                    if (this[T] === U) {
                        return T
                    }
                }
                return -1
            },
            contains: function(R, S) {
                return this.indexOf(R, S) != -1
            },
            forEach: function(R, U) {
                for (var T = 0, S = this.length; T < S; T++) {
                    if (T in this) {
                        R.call(U, this[T], T, this)
                    }
                }
            },
            filter: function(R, W) {
                var V = [];
                for (var U = 0, S = this.length; U < S; U++) {
                    if (U in this) {
                        var T = this[U];
                        if (R.call(W, this[U], U, this)) {
                            V.push(T)
                        }
                    }
                }
                return V
            },
            map: function(R, V) {
                var U = [];
                for (var T = 0, S = this.length; T < S; T++) {
                    if (T in this) {
                        U[T] = R.call(V, this[T], T, this)
                    }
                }
                return U
            }
        };
        H.implement(String, {
            $J_TYPE: "string",
            jTrim: function() {
                return this.replace(/^\s+|\s+$/g, "")
            },
            eq: function(R, S) {
                return (S || false) ? (this.toString() === R.toString()) : (this.toLowerCase().toString() === R.toLowerCase().toString())
            },
            jCamelize: function() {
                return this.replace(/-\D/g, function(R) {
                    return R.charAt(1).toUpperCase()
                })
            },
            dashize: function() {
                return this.replace(/[A-Z]/g, function(R) {
                    return ("-" + R.charAt(0).toLowerCase())
                })
            },
            jToInt: function(R) {
                return parseInt(this, R || 10)
            },
            toFloat: function() {
                return parseFloat(this)
            },
            jToBool: function() {
                return !this.replace(/true/i, "").jTrim()
            },
            has: function(S, R) {
                R = R || "";
                return (R + this + R).indexOf(R + S + R) > -1
            }
        });
        N.implement(Function, {
            $J_TYPE: "function",
            jBind: function() {
                var S = H.$A(arguments),
                    R = this,
                    T = S.shift();
                return function() {
                    return R.apply(T || null, S.concat(H.$A(arguments)))
                }
            },
            jBindAsEvent: function() {
                var S = H.$A(arguments),
                    R = this,
                    T = S.shift();
                return function(U) {
                    return R.apply(T || null, H.$([U || (H.browser.ieMode ? window.event : null)]).concat(S))
                }
            },
            jDelay: function() {
                var S = H.$A(arguments),
                    R = this,
                    T = S.shift();
                return window.setTimeout(function() {
                    return R.apply(R, S)
                }, T || 0)
            },
            jDefer: function() {
                var S = H.$A(arguments),
                    R = this;
                return function() {
                    return R.jDelay.apply(R, S)
                }
            },
            interval: function() {
                var S = H.$A(arguments),
                    R = this,
                    T = S.shift();
                return window.setInterval(function() {
                    return R.apply(R, S)
                }, T || 0)
            }
        });
        var O = {},
            G = navigator.userAgent.toLowerCase(),
            F = G.match(/(webkit|gecko|trident|presto)\/(\d+\.?\d*)/i),
            K = G.match(/(edge|opr)\/(\d+\.?\d*)/i) || G.match(/(crios|chrome|safari|firefox|opera|opr)\/(\d+\.?\d*)/i),
            M = G.match(/version\/(\d+\.?\d*)/i),
            B = document.documentElement.style;

        function C(S) {
            var R = S.charAt(0).toUpperCase() + S.slice(1);
            return S in B || ("Webkit" + R) in B || ("Moz" + R) in B || ("ms" + R) in B || ("O" + R) in B
        }
        H.browser = {
            features: {
                xpath: !!(document.evaluate),
                air: !!(window.runtime),
                query: !!(document.querySelector),
                fullScreen: !!(document.fullscreenEnabled || document.msFullscreenEnabled || document.exitFullscreen || document.cancelFullScreen || document.webkitexitFullscreen || document.webkitCancelFullScreen || document.mozCancelFullScreen || document.oCancelFullScreen || document.msCancelFullScreen),
                xhr2: !!(window.ProgressEvent) && !!(window.FormData) && (window.XMLHttpRequest && "withCredentials" in new XMLHttpRequest),
                transition: C("transition"),
                transform: C("transform"),
                perspective: C("perspective"),
                animation: C("animation"),
                requestAnimationFrame: false,
                multibackground: false,
                cssFilters: false,
                canvas: false,
                svg: (function() {
                    return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1")
                })()
            },
            touchScreen: function() {
                return "ontouchstart" in window || (window.DocumentTouch && document instanceof DocumentTouch) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)
            }(),
            mobile: G.match(/(android|bb\d+|meego).+|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/) ? true : false,
            engine: (F && F[1]) ? F[1].toLowerCase() : (window.opera) ? "presto" : !!(window.ActiveXObject) ? "trident" : (undefined !== document.getBoxObjectFor || null != window.mozInnerScreenY) ? "gecko" : (null !== window.WebKitPoint || !navigator.taintEnabled) ? "webkit" : "unknown",
            version: (F && F[2]) ? parseFloat(F[2]) : 0,
            uaName: (K && K[1]) ? K[1].toLowerCase() : "",
            uaVersion: (K && K[2]) ? parseFloat(K[2]) : 0,
            cssPrefix: "",
            cssDomPrefix: "",
            domPrefix: "",
            ieMode: 0,
            platform: G.match(/ip(?:ad|od|hone)/) ? "ios" : (G.match(/(?:webos|android)/) || navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(),
            backCompat: document.compatMode && "backcompat" == document.compatMode.toLowerCase(),
            scrollbarsWidth: 0,
            getDoc: function() {
                return (document.compatMode && "backcompat" == document.compatMode.toLowerCase()) ? document.body : document.documentElement
            },
            requestAnimationFrame: window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || undefined,
            cancelAnimationFrame: window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame || window.msCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || undefined,
            ready: false,
            onready: function() {
                if (H.browser.ready) {
                    return
                }
                var U, T;
                H.browser.ready = true;
                H.body = H.$(document.body);
                H.win = H.$(window);
                try {
                    var S = H.$new("div").jSetCss({
                        width: 100,
                        height: 100,
                        overflow: "scroll",
                        position: "absolute",
                        top: -9999
                    }).jAppendTo(document.body);
                    H.browser.scrollbarsWidth = S.offsetWidth - S.clientWidth;
                    S.jRemove()
                } catch (R) {}
                try {
                    U = H.$new("div");
                    T = U.style;
                    T.cssText = "background:url(https://),url(https://),red url(https://)";
                    H.browser.features.multibackground = (/(url\s*\(.*?){3}/).test(T.background);
                    T = null;
                    U = null
                } catch (R) {}
                if (!H.browser.cssTransformProp) {
                    H.browser.cssTransformProp = H.normalizeCSS("transform").dashize()
                }
                try {
                    U = H.$new("div");
                    U.style.cssText = H.normalizeCSS("filter").dashize() + ":blur(2px);";
                    H.browser.features.cssFilters = !!U.style.length && (!H.browser.ieMode || H.browser.ieMode > 9);
                    U = null
                } catch (R) {}
                if (!H.browser.features.cssFilters) {
                    H.$(document.documentElement).jAddClass("no-cssfilters-leoimage")
                }
                try {
                    H.browser.features.canvas = (function() {
                        var V = H.$new("canvas");
                        return !!(V.getContext && V.getContext("2d"))
                    })()
                } catch (R) {}
                if (undefined === window.TransitionEvent && undefined !== window.WebKitTransitionEvent) {
                    O.transitionend = "webkitTransitionEnd"
                }
                H.Doc.jCallEvent.call(H.$(document), "domready")
            }
        };
        (function() {
            var W = [],
                V, U, S;

            function R() {
                return !!(arguments.callee.caller)
            }
            switch (H.browser.engine) {
                case "trident":
                    if (!H.browser.version) {
                        H.browser.version = !!(window.XMLHttpRequest) ? 3 : 2
                    }
                    break;
                case "gecko":
                    H.browser.version = (K && K[2]) ? parseFloat(K[2]) : 0;
                    break
            }
            H.browser[H.browser.engine] = true;
            if (K && "crios" === K[1]) {
                H.browser.uaName = "chrome"
            }
            if (!!window.chrome) {
                H.browser.chrome = true
            }
            if (K && "opr" === K[1]) {
                H.browser.uaName = "opera";
                H.browser.opera = true
            }
            if ("safari" === H.browser.uaName && (M && M[1])) {
                H.browser.uaVersion = parseFloat(M[1])
            }
            if ("android" == H.browser.platform && H.browser.webkit && (M && M[1])) {
                H.browser.androidBrowser = true
            }
            V = ({
                gecko: ["-moz-", "Moz", "moz"],
                webkit: ["-webkit-", "Webkit", "webkit"],
                trident: ["-ms-", "ms", "ms"],
                presto: ["-o-", "O", "o"]
            })[H.browser.engine] || ["", "", ""];
            H.browser.cssPrefix = V[0];
            H.browser.cssDomPrefix = V[1];
            H.browser.domPrefix = V[2];
            H.browser.ieMode = (!H.browser.trident) ? undefined : (document.documentMode) ? document.documentMode : function() {
                var X = 0;
                if (H.browser.backCompat) {
                    return 5
                }
                switch (H.browser.version) {
                    case 2:
                        X = 6;
                        break;
                    case 3:
                        X = 7;
                        break
                }
                return X
            }();
            W.push(H.browser.platform + "-leoimage");
            if (H.browser.mobile) {
                W.push("mobile-leoimage")
            }
            if (H.browser.androidBrowser) {
                W.push("android-browser-leoimage")
            }
            if (H.browser.ieMode) {
                H.browser.uaName = "ie";
                H.browser.uaVersion = H.browser.ieMode;
                W.push("ie" + H.browser.ieMode + "-leoimage");
                for (U = 11; U > H.browser.ieMode; U--) {
                    W.push("lt-ie" + U + "-leoimage")
                }
            }
            if (H.browser.webkit && H.browser.version < 536) {
                H.browser.features.fullScreen = false
            }
            if (H.browser.requestAnimationFrame) {
                H.browser.requestAnimationFrame.call(window, function() {
                    H.browser.features.requestAnimationFrame = true
                })
            }
            if (H.browser.features.svg) {
                W.push("svg-leoimage")
            } else {
                W.push("no-svg-leoimage")
            }
            S = (document.documentElement.className || "").match(/\S+/g) || [];
            document.documentElement.className = H.$(S).concat(W).join(" ");
            try {
                document.documentElement.setAttribute("data-leoimage-ua", H.browser.uaName);
                document.documentElement.setAttribute("data-leoimage-ua-ver", H.browser.uaVersion)
            } catch (T) {}
            if (H.browser.ieMode && H.browser.ieMode < 9) {
                document.createElement("figure");
                document.createElement("figcaption")
            }
        })();
        (function() {
            H.browser.fullScreen = {
                capable: H.browser.features.fullScreen,
                enabled: function() {
                    return !!(document.fullscreenElement || document[H.browser.domPrefix + "FullscreenElement"] || document.fullScreen || document.webkitIsFullScreen || document[H.browser.domPrefix + "FullScreen"])
                },
                request: function(R, S) {
                    S || (S = {});
                    if (this.capable) {
                        H.$(document).jAddEvent(this.changeEventName, this.onchange = function(T) {
                            if (this.enabled()) {
                                S.onEnter && S.onEnter()
                            } else {
                                H.$(document).jRemoveEvent(this.changeEventName, this.onchange);
                                S.onExit && S.onExit()
                            }
                        }.jBindAsEvent(this));
                        H.$(document).jAddEvent(this.errorEventName, this.onerror = function(T) {
                            S.fallback && S.fallback();
                            H.$(document).jRemoveEvent(this.errorEventName, this.onerror)
                        }.jBindAsEvent(this));
                        (R[H.browser.domPrefix + "RequestFullscreen"] || R[H.browser.domPrefix + "RequestFullScreen"] || R.requestFullscreen || function() {}).call(R)
                    } else {
                        if (S.fallback) {
                            S.fallback()
                        }
                    }
                },
                cancel: (document.exitFullscreen || document.cancelFullScreen || document[H.browser.domPrefix + "ExitFullscreen"] || document[H.browser.domPrefix + "CancelFullScreen"] || function() {}).jBind(document),
                changeEventName: document.msExitFullscreen ? "MSFullscreenChange" : (document.exitFullscreen ? "" : H.browser.domPrefix) + "fullscreenchange",
                errorEventName: document.msExitFullscreen ? "MSFullscreenError" : (document.exitFullscreen ? "" : H.browser.domPrefix) + "fullscreenerror",
                prefix: H.browser.domPrefix,
                activeElement: null
            }
        })();
        var Q = /\S+/g,
            E = /^(border(Top|Bottom|Left|Right)Width)|((padding|margin)(Top|Bottom|Left|Right))$/,
            J = {
                "float": ("undefined" === typeof(B.styleFloat)) ? "cssFloat" : "styleFloat"
            },
            L = {
                fontWeight: true,
                lineHeight: true,
                opacity: true,
                zIndex: true,
                zoom: true
            },
            D = (window.getComputedStyle) ? function(T, R) {
                var S = window.getComputedStyle(T, null);
                return S ? S.getPropertyValue(R) || S[R] : null
            } : function(U, S) {
                var T = U.currentStyle,
                    R = null;
                R = T ? T[S] : null;
                if (null == R && U.style && U.style[S]) {
                    R = U.style[S]
                }
                return R
            };

        function P(T) {
            var R, S;
            S = (H.browser.webkit && "filter" == T) ? false : (T in B);
            if (!S) {
                R = H.browser.cssDomPrefix + T.charAt(0).toUpperCase() + T.slice(1);
                if (R in B) {
                    return R
                }
            }
            return T
        }
        H.normalizeCSS = P;
        H.Element = {
            jHasClass: function(R) {
                return !(R || "").has(" ") && (this.className || "").has(R, " ")
            },
            jAddClass: function(V) {
                var S = (this.className || "").match(Q) || [],
                    U = (V || "").match(Q) || [],
                    R = U.length,
                    T = 0;
                for (; T < R; T++) {
                    if (!H.$(S).contains(U[T])) {
                        S.push(U[T])
                    }
                }
                this.className = S.join(" ");
                return this
            },
            jRemoveClass: function(W) {
                var S = (this.className || "").match(Q) || [],
                    V = (W || "").match(Q) || [],
                    R = V.length,
                    U = 0,
                    T;
                for (; U < R; U++) {
                    if ((T = H.$(S).indexOf(V[U])) > -1) {
                        S.splice(T, 1)
                    }
                }
                this.className = W ? S.join(" ") : "";
                return this
            },
            jToggleClass: function(R) {
                return this.jHasClass(R) ? this.jRemoveClass(R) : this.jAddClass(R)
            },
            jGetCss: function(S) {
                var T = S.jCamelize(),
                    R = null;
                S = J[T] || (J[T] = P(T));
                R = D(this, S);
                if ("auto" === R) {
                    R = null
                }
                if (null !== R) {
                    if ("opacity" == S) {
                        return H.defined(R) ? parseFloat(R) : 1
                    }
                    if (E.test(S)) {
                        R = parseInt(R, 10) ? R : "0px"
                    }
                }
                return R
            },
            jSetCssProp: function(S, R) {
                var U = S.jCamelize();
                try {
                    if ("opacity" == S) {
                        this.jSetOpacity(R);
                        return this
                    }
                    S = J[U] || (J[U] = P(U));
                    this.style[S] = R + (("number" == H.jTypeOf(R) && !L[U]) ? "px" : "")
                } catch (T) {}
                return this
            },
            jSetCss: function(S) {
                for (var R in S) {
                    this.jSetCssProp(R, S[R])
                }
                return this
            },
            jGetStyles: function() {
                var R = {};
                H.$A(arguments).jEach(function(S) {
                    R[S] = this.jGetCss(S)
                }, this);
                return R
            },
            jSetOpacity: function(T, R) {
                var S;
                R = R || false;
                this.style.opacity = T;
                T = parseInt(parseFloat(T) * 100);
                if (R) {
                    if (0 === T) {
                        if ("hidden" != this.style.visibility) {
                            this.style.visibility = "hidden"
                        }
                    } else {
                        if ("visible" != this.style.visibility) {
                            this.style.visibility = "visible"
                        }
                    }
                }
                if (H.browser.ieMode && H.browser.ieMode < 9) {
                    if (!isNaN(T)) {
                        if (!~this.style.filter.indexOf("Alpha")) {
                            this.style.filter += " progid:DXImageTransform.Microsoft.Alpha(Opacity=" + T + ")"
                        } else {
                            this.style.filter = this.style.filter.replace(/Opacity=\d*/i, "Opacity=" + T)
                        }
                    } else {
                        this.style.filter = this.style.filter.replace(/progid:DXImageTransform.Microsoft.Alpha\(Opacity=\d*\)/i, "").jTrim();
                        if ("" === this.style.filter) {
                            this.style.removeAttribute("filter")
                        }
                    }
                }
                return this
            },
            setProps: function(R) {
                for (var S in R) {
                    if ("class" === S) {
                        this.jAddClass("" + R[S])
                    } else {
                        this.setAttribute(S, "" + R[S])
                    }
                }
                return this
            },
            jGetTransitionDuration: function() {
                var S = 0,
                    R = 0;
                S = this.jGetCss("transition-duration");
                R = this.jGetCss("transition-delay");
                S = S.indexOf("ms") > -1 ? parseFloat(S) : S.indexOf("s") > -1 ? parseFloat(S) * 1000 : 0;
                R = R.indexOf("ms") > -1 ? parseFloat(R) : R.indexOf("s") > -1 ? parseFloat(R) * 1000 : 0;
                return S + R
            },
            hide: function() {
                return this.jSetCss({
                    display: "none",
                    visibility: "hidden"
                })
            },
            show: function() {
                return this.jSetCss({
                    display: "",
                    visibility: "visible"
                })
            },
            jGetSize: function() {
                return {
                    width: this.offsetWidth,
                    height: this.offsetHeight
                }
            },
            getInnerSize: function(S) {
                var R = this.jGetSize();
                R.width -= (parseFloat(this.jGetCss("border-left-width") || 0) + parseFloat(this.jGetCss("border-right-width") || 0));
                R.height -= (parseFloat(this.jGetCss("border-top-width") || 0) + parseFloat(this.jGetCss("border-bottom-width") || 0));
                if (!S) {
                    R.width -= (parseFloat(this.jGetCss("padding-left") || 0) + parseFloat(this.jGetCss("padding-right") || 0));
                    R.height -= (parseFloat(this.jGetCss("padding-top") || 0) + parseFloat(this.jGetCss("padding-bottom") || 0))
                }
                return R
            },
            jGetScroll: function() {
                return {
                    top: this.scrollTop,
                    left: this.scrollLeft
                }
            },
            jGetFullScroll: function() {
                var R = this,
                    S = {
                        top: 0,
                        left: 0
                    };
                do {
                    S.left += R.scrollLeft || 0;
                    S.top += R.scrollTop || 0;
                    R = R.parentNode
                } while (R);
                return S
            },
            jGetPosition: function() {
                var V = this,
                    S = 0,
                    U = 0;
                if (H.defined(document.documentElement.getBoundingClientRect)) {
                    var R = this.getBoundingClientRect(),
                        T = H.$(document).jGetScroll(),
                        W = H.browser.getDoc();
                    return {
                        top: R.top + T.y - W.clientTop,
                        left: R.left + T.x - W.clientLeft
                    }
                }
                do {
                    S += V.offsetLeft || 0;
                    U += V.offsetTop || 0;
                    V = V.offsetParent
                } while (V && !(/^(?:body|html)$/i).test(V.tagName));
                return {
                    top: U,
                    left: S
                }
            },
            jGetRect: function() {
                var S = this.jGetPosition();
                var R = this.jGetSize();
                return {
                    top: S.top,
                    bottom: S.top + R.height,
                    left: S.left,
                    right: S.left + R.width
                }
            },
            changeContent: function(S) {
                try {
                    this.innerHTML = S
                } catch (R) {
                    this.innerText = S
                }
                return this
            },
            jRemove: function() {
                return (this.parentNode) ? this.parentNode.removeChild(this) : this
            },
            kill: function() {
                H.$A(this.childNodes).jEach(function(R) {
                    if (3 == R.nodeType || 8 == R.nodeType) {
                        return
                    }
                    H.$(R).kill()
                });
                this.jRemove();
                this.jClearEvents();
                if (this.$J_UUID) {
                    H.storage[this.$J_UUID] = null;
                    delete H.storage[this.$J_UUID]
                }
                return null
            },
            append: function(T, S) {
                S = S || "bottom";
                var R = this.firstChild;
                ("top" == S && R) ? this.insertBefore(T, R): this.appendChild(T);
                return this
            },
            jAppendTo: function(T, S) {
                var R = H.$(T).append(this, S);
                return this
            },
            enclose: function(R) {
                this.append(R.parentNode.replaceChild(this, R));
                return this
            },
            hasChild: function(R) {
                if ("element" !== H.jTypeOf("string" == H.jTypeOf(R) ? R = document.getElementById(R) : R)) {
                    return false
                }
                return (this == R) ? false : (this.contains && !(H.browser.webkit419)) ? (this.contains(R)) : (this.compareDocumentPosition) ? !!(this.compareDocumentPosition(R) & 16) : H.$A(this.byTag(R.tagName)).contains(R)
            }
        };
        H.Element.jGetStyle = H.Element.jGetCss;
        H.Element.jSetStyle = H.Element.jSetCss;
        if (!window.Element) {
            window.Element = H.$F;
            if (H.browser.engine.webkit) {
                window.document.createElement("iframe")
            }
            window.Element.prototype = (H.browser.engine.webkit) ? window["[[DOMElement.prototype]]"] : {}
        }
        H.implement(window.Element, {
            $J_TYPE: "element"
        });
        H.Doc = {
            jGetSize: function() {
                if (H.browser.touchScreen || H.browser.presto925 || H.browser.webkit419) {
                    return {
                        width: window.innerWidth,
                        height: window.innerHeight
                    }
                }
                return {
                    width: H.browser.getDoc().clientWidth,
                    height: H.browser.getDoc().clientHeight
                }
            },
            jGetScroll: function() {
                return {
                    x: window.pageXOffset || H.browser.getDoc().scrollLeft,
                    y: window.pageYOffset || H.browser.getDoc().scrollTop
                }
            },
            jGetFullSize: function() {
                var R = this.jGetSize();
                return {
                    width: Math.max(H.browser.getDoc().scrollWidth, R.width),
                    height: Math.max(H.browser.getDoc().scrollHeight, R.height)
                }
            }
        };
        H.extend(document, {
            $J_TYPE: "document"
        });
        H.extend(window, {
            $J_TYPE: "window"
        });
        H.extend([H.Element, H.Doc], {
            jFetch: function(U, S) {
                var R = H.getStorage(this.$J_UUID),
                    T = R[U];
                if (undefined !== S && undefined === T) {
                    T = R[U] = S
                }
                return (H.defined(T) ? T : null)
            },
            jStore: function(T, S) {
                var R = H.getStorage(this.$J_UUID);
                R[T] = S;
                return this
            },
            jDel: function(S) {
                var R = H.getStorage(this.$J_UUID);
                delete R[S];
                return this
            }
        });
        if (!(window.HTMLElement && window.HTMLElement.prototype && window.HTMLElement.prototype.getElementsByClassName)) {
            H.extend([H.Element, H.Doc], {
                getElementsByClassName: function(R) {
                    return H.$A(this.getElementsByTagName("*")).filter(function(T) {
                        try {
                            return (1 == T.nodeType && T.className.has(R, " "))
                        } catch (S) {}
                    })
                }
            })
        }
        H.extend([H.Element, H.Doc], {
            byClass: function() {
                return this.getElementsByClassName(arguments[0])
            },
            byTag: function() {
                return this.getElementsByTagName(arguments[0])
            }
        });
        if (H.browser.fullScreen.capable && !document.requestFullScreen) {
            H.Element.requestFullScreen = function() {
                H.browser.fullScreen.request(this)
            }
        }
        H.Event = {
            $J_TYPE: "event",
            isQueueStopped: H.leofalse,
            stop: function() {
                return this.stopDistribution().stopDefaults()
            },
            stopDistribution: function() {
                if (this.stopPropagation) {
                    this.stopPropagation()
                } else {
                    this.cancelBubble = true
                }
                return this
            },
            stopDefaults: function() {
                if (this.preventDefault) {
                    this.preventDefault()
                } else {
                    this.returnValue = false
                }
                return this
            },
            stopQueue: function() {
                this.isQueueStopped = H.leotrue;
                return this
            },
            getClientXY: function() {
                var S, R;
                S = ((/touch/i).test(this.type)) ? this.changedTouches[0] : this;
                return (!H.defined(S)) ? {
                    x: 0,
                    y: 0
                } : {
                    x: S.clientX,
                    y: S.clientY
                }
            },
            jGetPageXY: function() {
                var S, R;
                S = ((/touch/i).test(this.type)) ? this.changedTouches[0] : this;
                return (!H.defined(S)) ? {
                    x: 0,
                    y: 0
                } : {
                    x: S.pageX || S.clientX + H.browser.getDoc().scrollLeft,
                    y: S.pageY || S.clientY + H.browser.getDoc().scrollTop
                }
            },
            getTarget: function() {
                var R = this.target || this.srcElement;
                while (R && 3 == R.nodeType) {
                    R = R.parentNode
                }
                return R
            },
            getRelated: function() {
                var S = null;
                switch (this.type) {
                    case "mouseover":
                    case "pointerover":
                    case "MSPointerOver":
                        S = this.relatedTarget || this.fromElement;
                        break;
                    case "mouseout":
                    case "pointerout":
                    case "MSPointerOut":
                        S = this.relatedTarget || this.toElement;
                        break;
                    default:
                        return S
                }
                try {
                    while (S && 3 == S.nodeType) {
                        S = S.parentNode
                    }
                } catch (R) {
                    S = null
                }
                return S
            },
            getButton: function() {
                if (!this.which && this.button !== undefined) {
                    return (this.button & 1 ? 1 : (this.button & 2 ? 3 : (this.button & 4 ? 2 : 0)))
                }
                return this.which
            },
            isTouchEvent: function() {
                return (this.pointerType && ("touch" === this.pointerType || this.pointerType === this.MSPOINTER_TYPE_TOUCH)) || (/touch/i).test(this.type)
            },
            isPrimaryTouch: function() {
                return this.pointerType ? (("touch" === this.pointerType || this.MSPOINTER_TYPE_TOUCH === this.pointerType) && this.isPrimary) : 1 === this.changedTouches.length && (this.targetTouches.length ? this.targetTouches[0].identifier == this.changedTouches[0].identifier : true)
            }
        };
        H._event_add_ = "addEventListener";
        H._event_del_ = "removeEventListener";
        H._event_prefix_ = "";
        if (!document.addEventListener) {
            H._event_add_ = "attachEvent";
            H._event_del_ = "detachEvent";
            H._event_prefix_ = "on"
        }
        H.Event.Custom = {
            type: "",
            x: null,
            y: null,
            timeStamp: null,
            button: null,
            target: null,
            relatedTarget: null,
            $J_TYPE: "event.custom",
            isQueueStopped: H.leofalse,
            events: H.$([]),
            pushToEvents: function(R) {
                var S = R;
                this.events.push(S)
            },
            stop: function() {
                return this.stopDistribution().stopDefaults()
            },
            stopDistribution: function() {
                this.events.jEach(function(S) {
                    try {
                        S.stopDistribution()
                    } catch (R) {}
                });
                return this
            },
            stopDefaults: function() {
                this.events.jEach(function(S) {
                    try {
                        S.stopDefaults()
                    } catch (R) {}
                });
                return this
            },
            stopQueue: function() {
                this.isQueueStopped = H.leotrue;
                return this
            },
            getClientXY: function() {
                return {
                    x: this.clientX,
                    y: this.clientY
                }
            },
            jGetPageXY: function() {
                return {
                    x: this.x,
                    y: this.y
                }
            },
            getTarget: function() {
                return this.target
            },
            getRelated: function() {
                return this.relatedTarget
            },
            getButton: function() {
                return this.button
            },
            getOriginalTarget: function() {
                return this.events.length > 0 ? this.events[0].getTarget() : undefined
            }
        };
        H.extend([H.Element, H.Doc], {
            jAddEvent: function(T, V, W, Z) {
                var Y, R, U, X, S;
                if ("string" == H.jTypeOf(T)) {
                    S = T.split(" ");
                    if (S.length > 1) {
                        T = S
                    }
                }
                if (H.jTypeOf(T) == "array") {
                    H.$(T).jEach(this.jAddEvent.jBindAsEvent(this, V, W, Z));
                    return this
                }
                if (!T || !V || H.jTypeOf(T) != "string" || H.jTypeOf(V) != "function") {
                    return this
                }
                if (T == "domready" && H.browser.ready) {
                    V.call(this);
                    return this
                }
                T = O[T] || T;
                W = parseInt(W || 50);
                if (!V.$J_EUID) {
                    V.$J_EUID = Math.floor(Math.random() * H.now())
                }
                Y = H.Doc.jFetch.call(this, "_EVENTS_", {});
                R = Y[T];
                if (!R) {
                    Y[T] = R = H.$([]);
                    U = this;
                    if (H.Event.Custom[T]) {
                        H.Event.Custom[T].handler.add.call(this, Z)
                    } else {
                        R.handle = function(aa) {
                            aa = H.extend(aa || window.e, {
                                $J_TYPE: "event"
                            });
                            H.Doc.jCallEvent.call(U, T, H.$(aa))
                        };
                        this[H._event_add_](H._event_prefix_ + T, R.handle, false)
                    }
                }
                X = {
                    type: T,
                    fn: V,
                    priority: W,
                    euid: V.$J_EUID
                };
                R.push(X);
                R.sort(function(ab, aa) {
                    return ab.priority - aa.priority
                });
                return this
            },
            jRemoveEvent: function(X) {
                var V = H.Doc.jFetch.call(this, "_EVENTS_", {}),
                    T, R, S, Y, W, U;
                W = arguments.length > 1 ? arguments[1] : -100;
                if ("string" == H.jTypeOf(X)) {
                    U = X.split(" ");
                    if (U.length > 1) {
                        X = U
                    }
                }
                if (H.jTypeOf(X) == "array") {
                    H.$(X).jEach(this.jRemoveEvent.jBindAsEvent(this, W));
                    return this
                }
                X = O[X] || X;
                if (!X || H.jTypeOf(X) != "string" || !V || !V[X]) {
                    return this
                }
                T = V[X] || [];
                for (S = 0; S < T.length; S++) {
                    R = T[S];
                    if (-100 == W || !!W && W.$J_EUID === R.euid) {
                        Y = T.splice(S--, 1)
                    }
                }
                if (0 === T.length) {
                    if (H.Event.Custom[X]) {
                        H.Event.Custom[X].handler.jRemove.call(this)
                    } else {
                        this[H._event_del_](H._event_prefix_ + X, T.handle, false)
                    }
                    delete V[X]
                }
                return this
            },
            jCallEvent: function(V, X) {
                var U = H.Doc.jFetch.call(this, "_EVENTS_", {}),
                    T, R, S;
                V = O[V] || V;
                if (!V || H.jTypeOf(V) != "string" || !U || !U[V]) {
                    return this
                }
                try {
                    X = H.extend(X || {}, {
                        type: V
                    })
                } catch (W) {}
                if (undefined === X.timeStamp) {
                    X.timeStamp = H.now()
                }
                T = U[V] || [];
                for (S = 0; S < T.length && !(X.isQueueStopped && X.isQueueStopped()); S++) {
                    T[S].fn.call(this, X)
                }
            },
            jRaiseEvent: function(S, R) {
                var V = ("domready" == S) ? false : true,
                    U = this,
                    T;
                S = O[S] || S;
                if (!V) {
                    H.Doc.jCallEvent.call(this, S);
                    return this
                }
                if (U === document && document.createEvent && !U.dispatchEvent) {
                    U = document.documentElement
                }
                if (document.createEvent) {
                    T = document.createEvent(S);
                    T.initEvent(R, true, true)
                } else {
                    T = document.createEventObject();
                    T.eventType = S
                }
                if (document.createEvent) {
                    U.dispatchEvent(T)
                } else {
                    U.fireEvent("on" + R, T)
                }
                return T
            },
            jClearEvents: function() {
                var S = H.Doc.jFetch.call(this, "_EVENTS_");
                if (!S) {
                    return this
                }
                for (var R in S) {
                    H.Doc.jRemoveEvent.call(this, R)
                }
                H.Doc.jDel.call(this, "_EVENTS_");
                return this
            }
        });
        (function(R) {
            if ("complete" === document.readyState) {
                return R.browser.onready.jDelay(1)
            }
            if (R.browser.webkit && R.browser.version < 420) {
                (function() {
                    (R.$(["loaded", "complete"]).contains(document.readyState)) ? R.browser.onready(): arguments.callee.jDelay(50)
                })()
            } else {
                if (R.browser.trident && R.browser.ieMode < 9 && window == top) {
                    (function() {
                        (R.$try(function() {
                            R.browser.getDoc().doScroll("left");
                            return true
                        })) ? R.browser.onready(): arguments.callee.jDelay(50)
                    })()
                } else {
                    R.Doc.jAddEvent.call(R.$(document), "DOMContentLoaded", R.browser.onready);
                    R.Doc.jAddEvent.call(R.$(window), "load", R.browser.onready)
                }
            }
        })(N);
        H.Class = function() {
            var V = null,
                S = H.$A(arguments);
            if ("class" == H.jTypeOf(S[0])) {
                V = S.shift()
            }
            var R = function() {
                for (var Y in this) {
                    this[Y] = H.detach(this[Y])
                }
                if (this.constructor.$parent) {
                    this.$parent = {};
                    var aa = this.constructor.$parent;
                    for (var Z in aa) {
                        var X = aa[Z];
                        switch (H.jTypeOf(X)) {
                            case "function":
                                this.$parent[Z] = H.Class.wrap(this, X);
                                break;
                            case "object":
                                this.$parent[Z] = H.detach(X);
                                break;
                            case "array":
                                this.$parent[Z] = H.detach(X);
                                break
                        }
                    }
                }
                var W = (this.init) ? this.init.apply(this, arguments) : this;
                delete this.caller;
                return W
            };
            if (!R.prototype.init) {
                R.prototype.init = H.$F
            }
            if (V) {
                var U = function() {};
                U.prototype = V.prototype;
                R.prototype = new U;
                R.$parent = {};
                for (var T in V.prototype) {
                    R.$parent[T] = V.prototype[T]
                }
            } else {
                R.$parent = null
            }
            R.constructor = H.Class;
            R.prototype.constructor = R;
            H.extend(R.prototype, S[0]);
            H.extend(R, {
                $J_TYPE: "class"
            });
            return R
        };
        N.Class.wrap = function(R, S) {
            return function() {
                var U = this.caller;
                var T = S.apply(R, arguments);
                return T
            }
        };
        (function(U) {
            var T = U.$;
            var R = 5,
                S = 300;
            U.Event.Custom.btnclick = new U.Class(U.extend(U.Event.Custom, {
                type: "btnclick",
                init: function(X, W) {
                    var V = W.jGetPageXY();
                    this.x = V.x;
                    this.y = V.y;
                    this.clientX = W.clientX;
                    this.clientY = W.clientY;
                    this.timeStamp = W.timeStamp;
                    this.button = W.getButton();
                    this.target = X;
                    this.pushToEvents(W)
                }
            }));
            U.Event.Custom.btnclick.handler = {
                options: {
                    threshold: S,
                    button: 1
                },
                add: function(V) {
                    this.jStore("event:btnclick:options", U.extend(U.detach(U.Event.Custom.btnclick.handler.options), V || {}));
                    this.jAddEvent("mousedown", U.Event.Custom.btnclick.handler.handle, 1);
                    this.jAddEvent("mouseup", U.Event.Custom.btnclick.handler.handle, 1);
                    this.jAddEvent("click", U.Event.Custom.btnclick.handler.onclick, 1);
                    if (U.browser.trident && U.browser.ieMode < 9) {
                        this.jAddEvent("dblclick", U.Event.Custom.btnclick.handler.handle, 1)
                    }
                },
                jRemove: function() {
                    this.jRemoveEvent("mousedown", U.Event.Custom.btnclick.handler.handle);
                    this.jRemoveEvent("mouseup", U.Event.Custom.btnclick.handler.handle);
                    this.jRemoveEvent("click", U.Event.Custom.btnclick.handler.onclick);
                    if (U.browser.trident && U.browser.ieMode < 9) {
                        this.jRemoveEvent("dblclick", U.Event.Custom.btnclick.handler.handle)
                    }
                },
                onclick: function(V) {
                    V.stopDefaults()
                },
                handle: function(Y) {
                    var X, V, W;
                    V = this.jFetch("event:btnclick:options");
                    if (Y.type != "dblclick" && Y.getButton() != V.button) {
                        return
                    }
                    if (this.jFetch("event:btnclick:ignore")) {
                        this.jDel("event:btnclick:ignore");
                        return
                    }
                    if ("mousedown" == Y.type) {
                        X = new U.Event.Custom.btnclick(this, Y);
                        this.jStore("event:btnclick:btnclickEvent", X)
                    } else {
                        if ("mouseup" == Y.type) {
                            X = this.jFetch("event:btnclick:btnclickEvent");
                            if (!X) {
                                return
                            }
                            W = Y.jGetPageXY();
                            this.jDel("event:btnclick:btnclickEvent");
                            X.pushToEvents(Y);
                            if (Y.timeStamp - X.timeStamp <= V.threshold && Math.sqrt(Math.pow(W.x - X.x, 2) + Math.pow(W.y - X.y, 2)) <= R) {
                                this.jCallEvent("btnclick", X)
                            }
                            document.jCallEvent("mouseup", Y)
                        } else {
                            if (Y.type == "dblclick") {
                                X = new U.Event.Custom.btnclick(this, Y);
                                this.jCallEvent("btnclick", X)
                            }
                        }
                    }
                }
            }
        })(N);
        (function(S) {
            var R = S.$;
            S.Event.Custom.mousedrag = new S.Class(S.extend(S.Event.Custom, {
                type: "mousedrag",
                state: "dragstart",
                dragged: false,
                init: function(W, V, U) {
                    var T = V.jGetPageXY();
                    this.x = T.x;
                    this.y = T.y;
                    this.clientX = V.clientX;
                    this.clientY = V.clientY;
                    this.timeStamp = V.timeStamp;
                    this.button = V.getButton();
                    this.target = W;
                    this.pushToEvents(V);
                    this.state = U
                }
            }));
            S.Event.Custom.mousedrag.handler = {
                add: function() {
                    var U = S.Event.Custom.mousedrag.handler.handleMouseMove.jBindAsEvent(this),
                        T = S.Event.Custom.mousedrag.handler.handleMouseUp.jBindAsEvent(this);
                    this.jAddEvent("mousedown", S.Event.Custom.mousedrag.handler.handleMouseDown, 1);
                    this.jAddEvent("mouseup", S.Event.Custom.mousedrag.handler.handleMouseUp, 1);
                    document.jAddEvent("mousemove", U, 1);
                    document.jAddEvent("mouseup", T, 1);
                    this.jStore("event:mousedrag:listeners:document:move", U);
                    this.jStore("event:mousedrag:listeners:document:end", T)
                },
                jRemove: function() {
                    this.jRemoveEvent("mousedown", S.Event.Custom.mousedrag.handler.handleMouseDown);
                    this.jRemoveEvent("mouseup", S.Event.Custom.mousedrag.handler.handleMouseUp);
                    R(document).jRemoveEvent("mousemove", this.jFetch("event:mousedrag:listeners:document:move") || S.$F);
                    R(document).jRemoveEvent("mouseup", this.jFetch("event:mousedrag:listeners:document:end") || S.$F);
                    this.jDel("event:mousedrag:listeners:document:move");
                    this.jDel("event:mousedrag:listeners:document:end")
                },
                handleMouseDown: function(U) {
                    var T;
                    if (1 != U.getButton()) {
                        return
                    }
                    T = new S.Event.Custom.mousedrag(this, U, "dragstart");
                    this.jStore("event:mousedrag:dragstart", T)
                },
                handleMouseUp: function(U) {
                    var T;
                    T = this.jFetch("event:mousedrag:dragstart");
                    if (!T) {
                        return
                    }
                    U.stopDefaults();
                    T = new S.Event.Custom.mousedrag(this, U, "dragend");
                    this.jDel("event:mousedrag:dragstart");
                    this.jCallEvent("mousedrag", T)
                },
                handleMouseMove: function(U) {
                    var T;
                    T = this.jFetch("event:mousedrag:dragstart");
                    if (!T) {
                        return
                    }
                    U.stopDefaults();
                    if (!T.dragged) {
                        T.dragged = true;
                        this.jCallEvent("mousedrag", T)
                    }
                    T = new S.Event.Custom.mousedrag(this, U, "dragmove");
                    this.jCallEvent("mousedrag", T)
                }
            }
        })(N);
        (function(S) {
            var R = S.$;
            S.Event.Custom.dblbtnclick = new S.Class(S.extend(S.Event.Custom, {
                type: "dblbtnclick",
                timedout: false,
                tm: null,
                init: function(V, U) {
                    var T = U.jGetPageXY();
                    this.x = T.x;
                    this.y = T.y;
                    this.clientX = U.clientX;
                    this.clientY = U.clientY;
                    this.timeStamp = U.timeStamp;
                    this.button = U.getButton();
                    this.target = V;
                    this.pushToEvents(U)
                }
            }));
            S.Event.Custom.dblbtnclick.handler = {
                options: {
                    threshold: 200
                },
                add: function(T) {
                    this.jStore("event:dblbtnclick:options", S.extend(S.detach(S.Event.Custom.dblbtnclick.handler.options), T || {}));
                    this.jAddEvent("btnclick", S.Event.Custom.dblbtnclick.handler.handle, 1)
                },
                jRemove: function() {
                    this.jRemoveEvent("btnclick", S.Event.Custom.dblbtnclick.handler.handle)
                },
                handle: function(V) {
                    var U, T;
                    U = this.jFetch("event:dblbtnclick:event");
                    T = this.jFetch("event:dblbtnclick:options");
                    if (!U) {
                        U = new S.Event.Custom.dblbtnclick(this, V);
                        U.tm = setTimeout(function() {
                            U.timedout = true;
                            V.isQueueStopped = S.leofalse;
                            this.jCallEvent("btnclick", V);
                            this.jDel("event:dblbtnclick:event")
                        }.jBind(this), T.threshold + 10);
                        this.jStore("event:dblbtnclick:event", U);
                        V.stopQueue()
                    } else {
                        clearTimeout(U.tm);
                        this.jDel("event:dblbtnclick:event");
                        if (!U.timedout) {
                            U.pushToEvents(V);
                            V.stopQueue().stop();
                            this.jCallEvent("dblbtnclick", U)
                        } else {}
                    }
                }
            }
        })(N);
        (function(X) {
            var W = X.$;

            function R(Y) {
                return Y.pointerType ? (("touch" === Y.pointerType || Y.MSPOINTER_TYPE_TOUCH === Y.pointerType) && Y.isPrimary) : 1 === Y.changedTouches.length && (Y.targetTouches.length ? Y.targetTouches[0].identifier == Y.changedTouches[0].identifier : true)
            }

            function T(Y) {
                if (Y.pointerType) {
                    return ("touch" === Y.pointerType || Y.MSPOINTER_TYPE_TOUCH === Y.pointerType) ? Y.pointerId : null
                } else {
                    return Y.changedTouches[0].identifier
                }
            }

            function U(Y) {
                if (Y.pointerType) {
                    return ("touch" === Y.pointerType || Y.MSPOINTER_TYPE_TOUCH === Y.pointerType) ? Y : null
                } else {
                    return Y.changedTouches[0]
                }
            }
            X.Event.Custom.tap = new X.Class(X.extend(X.Event.Custom, {
                type: "tap",
                id: null,
                init: function(Z, Y) {
                    var aa = U(Y);
                    this.id = aa.pointerId || aa.identifier;
                    this.x = aa.pageX;
                    this.y = aa.pageY;
                    this.pageX = aa.pageX;
                    this.pageY = aa.pageY;
                    this.clientX = aa.clientX;
                    this.clientY = aa.clientY;
                    this.timeStamp = Y.timeStamp;
                    this.button = 0;
                    this.target = Z;
                    this.pushToEvents(Y)
                }
            }));
            var S = 10,
                V = 200;
            X.Event.Custom.tap.handler = {
                add: function(Y) {
                    this.jAddEvent(["touchstart", window.navigator.pointerEnabled ? "pointerdown" : "MSPointerDown"], X.Event.Custom.tap.handler.onTouchStart, 1);
                    this.jAddEvent(["touchend", window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp"], X.Event.Custom.tap.handler.onTouchEnd, 1);
                    this.jAddEvent("click", X.Event.Custom.tap.handler.onClick, 1)
                },
                jRemove: function() {
                    this.jRemoveEvent(["touchstart", window.navigator.pointerEnabled ? "pointerdown" : "MSPointerDown"], X.Event.Custom.tap.handler.onTouchStart);
                    this.jRemoveEvent(["touchend", window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp"], X.Event.Custom.tap.handler.onTouchEnd);
                    this.jRemoveEvent("click", X.Event.Custom.tap.handler.onClick)
                },
                onClick: function(Y) {
                    Y.stopDefaults()
                },
                onTouchStart: function(Y) {
                    if (!R(Y)) {
                        this.jDel("event:tap:event");
                        return
                    }
                    this.jStore("event:tap:event", new X.Event.Custom.tap(this, Y));
                    this.jStore("event:btnclick:ignore", true)
                },
                onTouchEnd: function(ab) {
                    var Z = X.now(),
                        aa = this.jFetch("event:tap:event"),
                        Y = this.jFetch("event:tap:options");
                    if (!aa || !R(ab)) {
                        return
                    }
                    this.jDel("event:tap:event");
                    if (aa.id == T(ab) && ab.timeStamp - aa.timeStamp <= V && Math.sqrt(Math.pow(U(ab).pageX - aa.x, 2) + Math.pow(U(ab).pageY - aa.y, 2)) <= S) {
                        this.jDel("event:btnclick:btnclickEvent");
                        ab.stop();
                        aa.pushToEvents(ab);
                        this.jCallEvent("tap", aa)
                    }
                }
            }
        })(N);
        H.Event.Custom.dbltap = new H.Class(H.extend(H.Event.Custom, {
            type: "dbltap",
            timedout: false,
            tm: null,
            init: function(S, R) {
                this.x = R.x;
                this.y = R.y;
                this.clientX = R.clientX;
                this.clientY = R.clientY;
                this.timeStamp = R.timeStamp;
                this.button = 0;
                this.target = S;
                this.pushToEvents(R)
            }
        }));
        H.Event.Custom.dbltap.handler = {
            options: {
                threshold: 300
            },
            add: function(R) {
                this.jStore("event:dbltap:options", H.extend(H.detach(H.Event.Custom.dbltap.handler.options), R || {}));
                this.jAddEvent("tap", H.Event.Custom.dbltap.handler.handle, 1)
            },
            jRemove: function() {
                this.jRemoveEvent("tap", H.Event.Custom.dbltap.handler.handle)
            },
            handle: function(T) {
                var S, R;
                S = this.jFetch("event:dbltap:event");
                R = this.jFetch("event:dbltap:options");
                if (!S) {
                    S = new H.Event.Custom.dbltap(this, T);
                    S.tm = setTimeout(function() {
                        S.timedout = true;
                        T.isQueueStopped = H.leofalse;
                        this.jCallEvent("tap", T)
                    }.jBind(this), R.threshold + 10);
                    this.jStore("event:dbltap:event", S);
                    T.stopQueue()
                } else {
                    clearTimeout(S.tm);
                    this.jDel("event:dbltap:event");
                    if (!S.timedout) {
                        S.pushToEvents(T);
                        T.stopQueue().stop();
                        this.jCallEvent("dbltap", S)
                    } else {}
                }
            }
        };
        (function(W) {
            var V = W.$;

            function R(X) {
                return X.pointerType ? (("touch" === X.pointerType || X.MSPOINTER_TYPE_TOUCH === X.pointerType) && X.isPrimary) : 1 === X.changedTouches.length && (X.targetTouches.length ? X.targetTouches[0].identifier == X.changedTouches[0].identifier : true)
            }

            function T(X) {
                if (X.pointerType) {
                    return ("touch" === X.pointerType || X.MSPOINTER_TYPE_TOUCH === X.pointerType) ? X.pointerId : null
                } else {
                    return X.changedTouches[0].identifier
                }
            }

            function U(X) {
                if (X.pointerType) {
                    return ("touch" === X.pointerType || X.MSPOINTER_TYPE_TOUCH === X.pointerType) ? X : null
                } else {
                    return X.changedTouches[0]
                }
            }
            var S = 10;
            W.Event.Custom.touchdrag = new W.Class(W.extend(W.Event.Custom, {
                type: "touchdrag",
                state: "dragstart",
                id: null,
                dragged: false,
                init: function(Z, Y, X) {
                    var aa = U(Y);
                    this.id = aa.pointerId || aa.identifier;
                    this.clientX = aa.clientX;
                    this.clientY = aa.clientY;
                    this.pageX = aa.pageX;
                    this.pageY = aa.pageY;
                    this.x = aa.pageX;
                    this.y = aa.pageY;
                    this.timeStamp = Y.timeStamp;
                    this.button = 0;
                    this.target = Z;
                    this.pushToEvents(Y);
                    this.state = X
                }
            }));
            W.Event.Custom.touchdrag.handler = {
                add: function() {
                    var Y = W.Event.Custom.touchdrag.handler.onTouchMove.jBind(this),
                        X = W.Event.Custom.touchdrag.handler.onTouchEnd.jBind(this);
                    this.jAddEvent(["touchstart", window.navigator.pointerEnabled ? "pointerdown" : "MSPointerDown"], W.Event.Custom.touchdrag.handler.onTouchStart, 1);
                    this.jAddEvent(["touchend", window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp"], W.Event.Custom.touchdrag.handler.onTouchEnd, 1);
                    this.jAddEvent(["touchmove", window.navigator.pointerEnabled ? "pointermove" : "MSPointerMove"], W.Event.Custom.touchdrag.handler.onTouchMove, 1);
                    this.jStore("event:touchdrag:listeners:document:move", Y);
                    this.jStore("event:touchdrag:listeners:document:end", X);
                    V(document).jAddEvent(window.navigator.pointerEnabled ? "pointermove" : "MSPointerMove", Y, 1);
                    V(document).jAddEvent(window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp", X, 1)
                },
                jRemove: function() {
                    this.jRemoveEvent(["touchstart", window.navigator.pointerEnabled ? "pointerdown" : "MSPointerDown"], W.Event.Custom.touchdrag.handler.onTouchStart);
                    this.jRemoveEvent(["touchend", window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp"], W.Event.Custom.touchdrag.handler.onTouchEnd);
                    this.jRemoveEvent(["touchmove", window.navigator.pointerEnabled ? "pointermove" : "MSPointerMove"], W.Event.Custom.touchdrag.handler.onTouchMove);
                    V(document).jRemoveEvent(window.navigator.pointerEnabled ? "pointermove" : "MSPointerMove", this.jFetch("event:touchdrag:listeners:document:move") || W.$F, 1);
                    V(document).jRemoveEvent(window.navigator.pointerEnabled ? "pointerup" : "MSPointerUp", this.jFetch("event:touchdrag:listeners:document:end") || W.$F, 1);
                    this.jDel("event:touchdrag:listeners:document:move");
                    this.jDel("event:touchdrag:listeners:document:end")
                },
                onTouchStart: function(Y) {
                    var X;
                    if (!R(Y)) {
                        return
                    }
                    X = new W.Event.Custom.touchdrag(this, Y, "dragstart");
                    this.jStore("event:touchdrag:dragstart", X)
                },
                onTouchEnd: function(Y) {
                    var X;
                    X = this.jFetch("event:touchdrag:dragstart");
                    if (!X || !X.dragged || X.id != T(Y)) {
                        return
                    }
                    X = new W.Event.Custom.touchdrag(this, Y, "dragend");
                    this.jDel("event:touchdrag:dragstart");
                    this.jCallEvent("touchdrag", X)
                },
                onTouchMove: function(Y) {
                    var X;
                    X = this.jFetch("event:touchdrag:dragstart");
                    if (!X || !R(Y)) {
                        return
                    }
                    if (X.id != T(Y)) {
                        this.jDel("event:touchdrag:dragstart");
                        return
                    }
                    if (!X.dragged && Math.sqrt(Math.pow(U(Y).pageX - X.x, 2) + Math.pow(U(Y).pageY - X.y, 2)) > S) {
                        X.dragged = true;
                        this.jCallEvent("touchdrag", X)
                    }
                    if (!X.dragged) {
                        return
                    }
                    X = new W.Event.Custom.touchdrag(this, Y, "dragmove");
                    this.jCallEvent("touchdrag", X)
                }
            }
        })(N);
        H.Event.Custom.touchpinch = new H.Class(H.extend(H.Event.Custom, {
            type: "touchpinch",
            scale: 1,
            previousScale: 1,
            curScale: 1,
            state: "pinchstart",
            init: function(S, R) {
                this.timeStamp = R.timeStamp;
                this.button = 0;
                this.target = S;
                this.x = R.touches[0].clientX + (R.touches[1].clientX - R.touches[0].clientX) / 2;
                this.y = R.touches[0].clientY + (R.touches[1].clientY - R.touches[0].clientY) / 2;
                this._initialDistance = Math.sqrt(Math.pow(R.touches[0].clientX - R.touches[1].clientX, 2) + Math.pow(R.touches[0].clientY - R.touches[1].clientY, 2));
                this.pushToEvents(R)
            },
            update: function(R) {
                var S;
                this.state = "pinchupdate";
                if (R.changedTouches[0].identifier != this.events[0].touches[0].identifier || R.changedTouches[1].identifier != this.events[0].touches[1].identifier) {
                    return
                }
                S = Math.sqrt(Math.pow(R.changedTouches[0].clientX - R.changedTouches[1].clientX, 2) + Math.pow(R.changedTouches[0].clientY - R.changedTouches[1].clientY, 2));
                this.previousScale = this.scale;
                this.scale = S / this._initialDistance;
                this.curScale = this.scale / this.previousScale;
                this.x = R.changedTouches[0].clientX + (R.changedTouches[1].clientX - R.changedTouches[0].clientX) / 2;
                this.y = R.changedTouches[0].clientY + (R.changedTouches[1].clientY - R.changedTouches[0].clientY) / 2;
                this.pushToEvents(R)
            }
        }));
        H.Event.Custom.touchpinch.handler = {
            add: function() {
                this.jAddEvent("touchstart", H.Event.Custom.touchpinch.handler.handleTouchStart, 1);
                this.jAddEvent("touchend", H.Event.Custom.touchpinch.handler.handleTouchEnd, 1);
                this.jAddEvent("touchmove", H.Event.Custom.touchpinch.handler.handleTouchMove, 1)
            },
            jRemove: function() {
                this.jRemoveEvent("touchstart", H.Event.Custom.touchpinch.handler.handleTouchStart);
                this.jRemoveEvent("touchend", H.Event.Custom.touchpinch.handler.handleTouchEnd);
                this.jRemoveEvent("touchmove", H.Event.Custom.touchpinch.handler.handleTouchMove)
            },
            handleTouchStart: function(S) {
                var R;
                if (S.touches.length != 2) {
                    return
                }
                S.stopDefaults();
                R = new H.Event.Custom.touchpinch(this, S);
                this.jStore("event:touchpinch:event", R)
            },
            handleTouchEnd: function(S) {
                var R;
                R = this.jFetch("event:touchpinch:event");
                if (!R) {
                    return
                }
                S.stopDefaults();
                this.jDel("event:touchpinch:event")
            },
            handleTouchMove: function(S) {
                var R;
                R = this.jFetch("event:touchpinch:event");
                if (!R) {
                    return
                }
                S.stopDefaults();
                R.update(S);
                this.jCallEvent("touchpinch", R)
            }
        };
        (function(W) {
            var U = W.$;
            W.Event.Custom.mousescroll = new W.Class(W.extend(W.Event.Custom, {
                type: "mousescroll",
                init: function(ac, ab, ae, Y, X, ad, Z) {
                    var aa = ab.jGetPageXY();
                    this.x = aa.x;
                    this.y = aa.y;
                    this.timeStamp = ab.timeStamp;
                    this.target = ac;
                    this.delta = ae || 0;
                    this.deltaX = Y || 0;
                    this.deltaY = X || 0;
                    this.deltaZ = ad || 0;
                    this.deltaFactor = Z || 0;
                    this.deltaMode = ab.deltaMode || 0;
                    this.isMouse = false;
                    this.pushToEvents(ab)
                }
            }));
            var V, S;

            function R() {
                V = null
            }

            function T(X, Y) {
                return (X > 50) || (1 === Y && !("win" == W.browser.platform && X < 1)) || (0 === X % 12) || (0 == X % 4.000244140625)
            }
            W.Event.Custom.mousescroll.handler = {
                eventType: "onwheel" in document || W.browser.ieMode > 8 ? "wheel" : "mousewheel",
                add: function() {
                    this.jAddEvent(W.Event.Custom.mousescroll.handler.eventType, W.Event.Custom.mousescroll.handler.handle, 1)
                },
                jRemove: function() {
                    this.jRemoveEvent(W.Event.Custom.mousescroll.handler.eventType, W.Event.Custom.mousescroll.handler.handle, 1)
                },
                handle: function(ac) {
                    var ad = 0,
                        aa = 0,
                        Y = 0,
                        X = 0,
                        ab, Z;
                    if (ac.detail) {
                        Y = ac.detail * -1
                    }
                    if (ac.wheelDelta !== undefined) {
                        Y = ac.wheelDelta
                    }
                    if (ac.wheelDeltaY !== undefined) {
                        Y = ac.wheelDeltaY
                    }
                    if (ac.wheelDeltaX !== undefined) {
                        aa = ac.wheelDeltaX * -1
                    }
                    if (ac.deltaY) {
                        Y = -1 * ac.deltaY
                    }
                    if (ac.deltaX) {
                        aa = ac.deltaX
                    }
                    if (0 === Y && 0 === aa) {
                        return
                    }
                    ad = 0 === Y ? aa : Y;
                    X = Math.max(Math.abs(Y), Math.abs(aa));
                    if (!V || X < V) {
                        V = X
                    }
                    ab = ad > 0 ? "floor" : "ceil";
                    ad = Math[ab](ad / V);
                    aa = Math[ab](aa / V);
                    Y = Math[ab](Y / V);
                    if (S) {
                        clearTimeout(S)
                    }
                    S = setTimeout(R, 200);
                    Z = new W.Event.Custom.mousescroll(this, ac, ad, aa, Y, 0, V);
                    Z.isMouse = T(V, ac.deltaMode || 0);
                    this.jCallEvent("mousescroll", Z)
                }
            }
        })(N);
        H.win = H.$(window);
        H.doc = H.$(document);
        return N
    })();
    (function(D) {
        if (!D) {
            throw "LeoImageJS not found"
        }
        var C = D.$;
        var B = window.URL || window.webkitURL || null;
        s.ImageLoader = new D.Class({
            img: null,
            ready: false,
            options: {
                onprogress: D.$F,
                onload: D.$F,
                onabort: D.$F,
                onerror: D.$F,
                oncomplete: D.$F,
                onxhrerror: D.$F,
                xhr: false,
                progressiveLoad: true
            },
            size: null,
            _timer: null,
            loadedBytes: 0,
            _handlers: {
                onprogress: function(E) {
                    if (E.target && (200 === E.target.status || 304 === E.target.status) && E.lengthComputable) {
                        this.options.onprogress.jBind(null, (E.loaded - (this.options.progressiveLoad ? this.loadedBytes : 0)) / E.total).jDelay(1);
                        this.loadedBytes = E.loaded
                    }
                },
                onload: function(E) {
                    if (E) {
                        C(E).stop()
                    }
                    this._unbind();
                    if (this.ready) {
                        return
                    }
                    this.ready = true;
                    this._cleanup();
                    !this.options.xhr && this.options.onprogress.jBind(null, 1).jDelay(1);
                    this.options.onload.jBind(null, this).jDelay(1);
                    this.options.oncomplete.jBind(null, this).jDelay(1)
                },
                onabort: function(E) {
                    if (E) {
                        C(E).stop()
                    }
                    this._unbind();
                    this.ready = false;
                    this._cleanup();
                    this.options.onabort.jBind(null, this).jDelay(1);
                    this.options.oncomplete.jBind(null, this).jDelay(1)
                },
                onerror: function(E) {
                    if (E) {
                        C(E).stop()
                    }
                    this._unbind();
                    this.ready = false;
                    this._cleanup();
                    this.options.onerror.jBind(null, this).jDelay(1);
                    this.options.oncomplete.jBind(null, this).jDelay(1)
                }
            },
            _bind: function() {
                C(["load", "abort", "error"]).jEach(function(E) {
                    this.img.jAddEvent(E, this._handlers["on" + E].jBindAsEvent(this).jDefer(1))
                }, this)
            },
            _unbind: function() {
                if (this._timer) {
                    try {
                        clearTimeout(this._timer)
                    } catch (E) {}
                    this._timer = null
                }
                C(["load", "abort", "error"]).jEach(function(F) {
                    this.img.jRemoveEvent(F)
                }, this)
            },
            _cleanup: function() {
                this.jGetSize();
                if (this.img.jFetch("new")) {
                    var E = this.img.parentNode;
                    this.img.jRemove().jDel("new").jSetCss({
                        position: "static",
                        top: "auto"
                    });
                    E.kill()
                }
            },
            loadBlob: function(F) {
                var G = new XMLHttpRequest(),
                    E;
                C(["abort", "progress"]).jEach(function(H) {
                    G["on" + H] = C(function(I) {
                        this._handlers["on" + H].call(this, I)
                    }).jBind(this)
                }, this);
                G.onerror = C(function() {
                    this.options.onxhrerror.jBind(null, this).jDelay(1);
                    this.options.xhr = false;
                    this._bind();
                    this.img.src = F
                }).jBind(this);
                G.onload = C(function() {
                    if (200 !== G.status && 304 !== G.status) {
                        this._handlers.onerror.call(this);
                        return
                    }
                    E = G.response;
                    this._bind();
                    if (B && !D.browser.trident && !("ios" === D.browser.platform && D.browser.version < 537)) {
                        this.img.setAttribute("src", B.createObjectURL(E))
                    } else {
                        this.img.src = F
                    }
                }).jBind(this);
                G.open("GET", F);
                G.responseType = "blob";
                G.send()
            },
            init: function(F, E) {
                this.options = D.extend(this.options, E);
                this.img = C(F) || D.$new("img", {}, {
                    "max-width": "none",
                    "max-height": "none"
                }).jAppendTo(D.$new("div").jAddClass("leoimage-temporary-img").jSetCss({
                    position: "absolute",
                    top: -10000,
                    width: 10,
                    height: 10,
                    overflow: "hidden"
                }).jAppendTo(document.body)).jStore("new", true);
                if (D.browser.features.xhr2 && this.options.xhr && "string" == D.jTypeOf(F)) {
                    this.loadBlob(F);
                    return
                }
                var G = function() {
                    if (this.isReady()) {
                        this._handlers.onload.call(this)
                    } else {
                        this._handlers.onerror.call(this)
                    }
                    G = null
                }.jBind(this);
                this._bind();
                if ("string" == D.jTypeOf(F)) {
                    this.img.src = F
                } else {
                    if (D.browser.trident && 5 == D.browser.version && D.browser.ieMode < 9) {
                        this.img.onreadystatechange = function() {
                            if (/loaded|complete/.test(this.img.readyState)) {
                                this.img.onreadystatechange = null;
                                G && G()
                            }
                        }.jBind(this)
                    }
                    this.img.src = F.getAttribute("src")
                }
                this.img && this.img.complete && G && (this._timer = G.jDelay(100))
            },
            destroy: function() {
                this._unbind();
                this._cleanup();
                this.ready = false;
                return this
            },
            isReady: function() {
                var E = this.img;
                return (E.naturalWidth) ? (E.naturalWidth > 0) : (E.readyState) ? ("complete" == E.readyState) : E.width > 0
            },
            jGetSize: function() {
                return this.size || (this.size = {
                    width: this.img.naturalWidth || this.img.width,
                    height: this.img.naturalHeight || this.img.height
                })
            }
        })
    })(s);
    (function(C) {
        if (!C) {
            throw "LeoImageJS not found"
        }
        if (C.FX) {
            return
        }
        var B = C.$;
        C.FX = new C.Class({
            init: function(E, D) {
                var F;
                this.el = C.$(E);
                this.options = C.extend(this.options, D);
                this.timer = false;
                this.easeFn = this.cubicBezierAtTime;
                F = C.FX.Transition[this.options.transition] || this.options.transition;
                if ("function" === C.jTypeOf(F)) {
                    this.easeFn = F
                } else {
                    this.cubicBezier = this.parseCubicBezier(F) || this.parseCubicBezier("ease")
                }
                if ("string" == C.jTypeOf(this.options.cycles)) {
                    this.options.cycles = "infinite" === this.options.cycles ? Infinity : parseInt(this.options.cycles) || 1
                }
            },
            options: {
                fps: 60,
                duration: 600,
                transition: "ease",
                cycles: 1,
                direction: "normal",
                onStart: C.$F,
                onComplete: C.$F,
                onBeforeRender: C.$F,
                onAfterRender: C.$F,
                forceAnimation: false,
                roundCss: false
            },
            styles: null,
            cubicBezier: null,
            easeFn: null,
            setTransition: function(D) {
                this.options.transition = D;
                D = C.FX.Transition[this.options.transition] || this.options.transition;
                if ("function" === C.jTypeOf(D)) {
                    this.easeFn = D
                } else {
                    this.easeFn = this.cubicBezierAtTime;
                    this.cubicBezier = this.parseCubicBezier(D) || this.parseCubicBezier("ease")
                }
            },
            start: function(F) {
                var D = /\%$/,
                    E;
                this.styles = F || {};
                this.cycle = 0;
                this.state = 0;
                this.curFrame = 0;
                this.pStyles = {};
                this.alternate = "alternate" === this.options.direction || "alternate-reverse" === this.options.direction;
                this.continuous = "continuous" === this.options.direction || "continuous-reverse" === this.options.direction;
                for (E in this.styles) {
                    D.test(this.styles[E][0]) && (this.pStyles[E] = true);
                    if ("reverse" === this.options.direction || "alternate-reverse" === this.options.direction || "continuous-reverse" === this.options.direction) {
                        this.styles[E].reverse()
                    }
                }
                this.startTime = C.now();
                this.finishTime = this.startTime + this.options.duration;
                this.options.onStart.call();
                if (0 === this.options.duration) {
                    this.render(1);
                    this.options.onComplete.call()
                } else {
                    this.loopBind = this.loop.jBind(this);
                    if (!this.options.forceAnimation && C.browser.features.requestAnimationFrame) {
                        this.timer = C.browser.requestAnimationFrame.call(window, this.loopBind)
                    } else {
                        this.timer = this.loopBind.interval(Math.round(1000 / this.options.fps))
                    }
                }
                return this
            },
            stopAnimation: function() {
                if (this.timer) {
                    if (!this.options.forceAnimation && C.browser.features.requestAnimationFrame && C.browser.cancelAnimationFrame) {
                        C.browser.cancelAnimationFrame.call(window, this.timer)
                    } else {
                        clearInterval(this.timer)
                    }
                    this.timer = false
                }
            },
            stop: function(D) {
                D = C.defined(D) ? D : false;
                this.stopAnimation();
                if (D) {
                    this.render(1);
                    this.options.onComplete.jDelay(10)
                }
                return this
            },
            calc: function(F, E, D) {
                F = parseFloat(F);
                E = parseFloat(E);
                return (E - F) * D + F
            },
            loop: function() {
                var E = C.now(),
                    D = (E - this.startTime) / this.options.duration,
                    F = Math.floor(D);
                if (E >= this.finishTime && F >= this.options.cycles) {
                    this.stopAnimation();
                    this.render(1);
                    this.options.onComplete.jDelay(10);
                    return this
                }
                if (this.alternate && this.cycle < F) {
                    for (var G in this.styles) {
                        this.styles[G].reverse()
                    }
                }
                this.cycle = F;
                if (!this.options.forceAnimation && C.browser.features.requestAnimationFrame) {
                    this.timer = C.browser.requestAnimationFrame.call(window, this.loopBind)
                }
                this.render((this.continuous ? F : 0) + this.easeFn(D % 1))
            },
            render: function(D) {
                var E = {},
                    G = D;
                for (var F in this.styles) {
                    if ("opacity" === F) {
                        E[F] = Math.round(this.calc(this.styles[F][0], this.styles[F][1], D) * 100) / 100
                    } else {
                        E[F] = this.calc(this.styles[F][0], this.styles[F][1], D);
                        this.pStyles[F] && (E[F] += "%")
                    }
                }
                this.options.onBeforeRender(E, this.el);
                this.set(E);
                this.options.onAfterRender(E, this.el)
            },
            set: function(D) {
                return this.el.jSetCss(D)
            },
            parseCubicBezier: function(D) {
                var E, F = null;
                if ("string" !== C.jTypeOf(D)) {
                    return null
                }
                switch (D) {
                    case "linear":
                        F = B([0, 0, 1, 1]);
                        break;
                    case "ease":
                        F = B([0.25, 0.1, 0.25, 1]);
                        break;
                    case "ease-in":
                        F = B([0.42, 0, 1, 1]);
                        break;
                    case "ease-out":
                        F = B([0, 0, 0.58, 1]);
                        break;
                    case "ease-in-out":
                        F = B([0.42, 0, 0.58, 1]);
                        break;
                    case "easeInSine":
                        F = B([0.47, 0, 0.745, 0.715]);
                        break;
                    case "easeOutSine":
                        F = B([0.39, 0.575, 0.565, 1]);
                        break;
                    case "easeInOutSine":
                        F = B([0.445, 0.05, 0.55, 0.95]);
                        break;
                    case "easeInQuad":
                        F = B([0.55, 0.085, 0.68, 0.53]);
                        break;
                    case "easeOutQuad":
                        F = B([0.25, 0.46, 0.45, 0.94]);
                        break;
                    case "easeInOutQuad":
                        F = B([0.455, 0.03, 0.515, 0.955]);
                        break;
                    case "easeInCubic":
                        F = B([0.55, 0.055, 0.675, 0.19]);
                        break;
                    case "easeOutCubic":
                        F = B([0.215, 0.61, 0.355, 1]);
                        break;
                    case "easeInOutCubic":
                        F = B([0.645, 0.045, 0.355, 1]);
                        break;
                    case "easeInQuart":
                        F = B([0.895, 0.03, 0.685, 0.22]);
                        break;
                    case "easeOutQuart":
                        F = B([0.165, 0.84, 0.44, 1]);
                        break;
                    case "easeInOutQuart":
                        F = B([0.77, 0, 0.175, 1]);
                        break;
                    case "easeInQuint":
                        F = B([0.755, 0.05, 0.855, 0.06]);
                        break;
                    case "easeOutQuint":
                        F = B([0.23, 1, 0.32, 1]);
                        break;
                    case "easeInOutQuint":
                        F = B([0.86, 0, 0.07, 1]);
                        break;
                    case "easeInExpo":
                        F = B([0.95, 0.05, 0.795, 0.035]);
                        break;
                    case "easeOutExpo":
                        F = B([0.19, 1, 0.22, 1]);
                        break;
                    case "easeInOutExpo":
                        F = B([1, 0, 0, 1]);
                        break;
                    case "easeInCirc":
                        F = B([0.6, 0.04, 0.98, 0.335]);
                        break;
                    case "easeOutCirc":
                        F = B([0.075, 0.82, 0.165, 1]);
                        break;
                    case "easeInOutCirc":
                        F = B([0.785, 0.135, 0.15, 0.86]);
                        break;
                    case "easeInBack":
                        F = B([0.6, -0.28, 0.735, 0.045]);
                        break;
                    case "easeOutBack":
                        F = B([0.175, 0.885, 0.32, 1.275]);
                        break;
                    case "easeInOutBack":
                        F = B([0.68, -0.55, 0.265, 1.55]);
                        break;
                    default:
                        D = D.replace(/\s/g, "");
                        if (D.match(/^cubic-bezier\((?:-?[0-9\.]{0,}[0-9]{1,},){3}(?:-?[0-9\.]{0,}[0-9]{1,})\)$/)) {
                            F = D.replace(/^cubic-bezier\s*\(|\)$/g, "").split(",");
                            for (E = F.length - 1; E >= 0; E--) {
                                F[E] = parseFloat(F[E])
                            }
                        }
                }
                return B(F)
            },
            cubicBezierAtTime: function(P) {
                var D = 0,
                    O = 0,
                    L = 0,
                    Q = 0,
                    N = 0,
                    J = 0,
                    K = this.options.duration;

                function I(R) {
                    return ((D * R + O) * R + L) * R
                }

                function H(R) {
                    return ((Q * R + N) * R + J) * R
                }

                function F(R) {
                    return (3 * D * R + 2 * O) * R + L
                }

                function M(R) {
                    return 1 / (200 * R)
                }

                function E(R, S) {
                    return H(G(R, S))
                }

                function G(Y, Z) {
                    var X, W, V, S, R, U;

                    function T(aa) {
                        if (aa >= 0) {
                            return aa
                        } else {
                            return 0 - aa
                        }
                    }
                    for (V = Y, U = 0; U < 8; U++) {
                        S = I(V) - Y;
                        if (T(S) < Z) {
                            return V
                        }
                        R = F(V);
                        if (T(R) < 0.000001) {
                            break
                        }
                        V = V - S / R
                    }
                    X = 0;
                    W = 1;
                    V = Y;
                    if (V < X) {
                        return X
                    }
                    if (V > W) {
                        return W
                    }
                    while (X < W) {
                        S = I(V);
                        if (T(S - Y) < Z) {
                            return V
                        }
                        if (Y > S) {
                            X = V
                        } else {
                            W = V
                        }
                        V = (W - X) * 0.5 + X
                    }
                    return V
                }
                L = 3 * this.cubicBezier[0];
                O = 3 * (this.cubicBezier[2] - this.cubicBezier[0]) - L;
                D = 1 - L - O;
                J = 3 * this.cubicBezier[1];
                N = 3 * (this.cubicBezier[3] - this.cubicBezier[1]) - J;
                Q = 1 - J - N;
                return E(P, M(K))
            }
        });
        C.FX.Transition = {
            linear: "linear",
            sineIn: "easeInSine",
            sineOut: "easeOutSine",
            expoIn: "easeInExpo",
            expoOut: "easeOutExpo",
            quadIn: "easeInQuad",
            quadOut: "easeOutQuad",
            cubicIn: "easeInCubic",
            cubicOut: "easeOutCubic",
            backIn: "easeInBack",
            backOut: "easeOutBack",
            elasticIn: function(E, D) {
                D = D || [];
                return Math.pow(2, 10 * --E) * Math.cos(20 * E * Math.PI * (D[0] || 1) / 3)
            },
            elasticOut: function(E, D) {
                return 1 - C.FX.Transition.elasticIn(1 - E, D)
            },
            bounceIn: function(F) {
                for (var E = 0, D = 1; 1; E += D, D /= 2) {
                    if (F >= (7 - 4 * E) / 11) {
                        return D * D - Math.pow((11 - 6 * E - 11 * F) / 4, 2)
                    }
                }
            },
            bounceOut: function(D) {
                return 1 - C.FX.Transition.bounceIn(1 - D)
            },
            none: function(D) {
                return 0
            }
        }
    })(s);
    (function(C) {
        if (!C) {
            throw "LeoImageJS not found"
        }
        if (C.PFX) {
            return
        }
        var B = C.$;
        C.PFX = new C.Class(C.FX, {
            init: function(D, E) {
                this.el_arr = D;
                this.options = C.extend(this.options, E);
                this.timer = false;
                this.$parent.init()
            },
            start: function(H) {
                var D = /\%$/,
                    G, F, E = H.length;
                this.styles_arr = H;
                this.pStyles_arr = new Array(E);
                for (F = 0; F < E; F++) {
                    this.pStyles_arr[F] = {};
                    for (G in H[F]) {
                        D.test(H[F][G][0]) && (this.pStyles_arr[F][G] = true);
                        if ("reverse" === this.options.direction || "alternate-reverse" === this.options.direction || "continuous-reverse" === this.options.direction) {
                            this.styles_arr[F][G].reverse()
                        }
                    }
                }
                this.$parent.start({});
                return this
            },
            render: function(D) {
                for (var E = 0; E < this.el_arr.length; E++) {
                    this.el = C.$(this.el_arr[E]);
                    this.styles = this.styles_arr[E];
                    this.pStyles = this.pStyles_arr[E];
                    this.$parent.render(D)
                }
            }
        })
    })(s);
    (function(C) {
        if (!C) {
            throw "LeoImageJS not found";
            return
        }
        if (C.Tooltip) {
            return
        }
        var B = C.$;
        C.Tooltip = function(E, F) {
            var D = this.tooltip = C.$new("div", null, {
                position: "absolute",
                "z-index": 999
            }).jAddClass("LeoImageToolboxTooltip");
            C.$(E).jAddEvent("mouseover", function() {
                D.jAppendTo(document.body)
            });
            C.$(E).jAddEvent("mouseout", function() {
                D.jRemove()
            });
            C.$(E).jAddEvent("mousemove", function(K) {
                var M = 20,
                    J = C.$(K).jGetPageXY(),
                    I = D.jGetSize(),
                    H = C.$(window).jGetSize(),
                    L = C.$(window).jGetScroll();

                function G(P, N, O) {
                    return (O < (P - N) / 2) ? O : ((O > (P + N) / 2) ? (O - N) : (P - N) / 2)
                }
                D.jSetCss({
                    left: L.x + G(H.width, I.width + 2 * M, J.x - L.x) + M,
                    top: L.y + G(H.height, I.height + 2 * M, J.y - L.y) + M
                })
            });
            this.text(F)
        };
        C.Tooltip.prototype.text = function(D) {
            this.tooltip.firstChild && this.tooltip.removeChild(this.tooltip.firstChild);
            this.tooltip.append(document.createTextNode(D))
        }
    })(s);
    (function(C) {
        if (!C) {
            throw "LeoImageJS not found";
            return
        }
        if (C.MessageBox) {
            return
        }
        var B = C.$;
        C.Message = function(G, F, E, D) {
            this.hideTimer = null;
            this.messageBox = C.$new("span", null, {
                position: "absolute",
                "z-index": 999,
                visibility: "hidden",
                opacity: 0.8
            }).jAddClass(D || "").jAppendTo(E || document.body);
            this.setMessage(G);
            this.show(F)
        };
        C.Message.prototype.show = function(D) {
            this.messageBox.show();
            this.hideTimer = this.hide.jBind(this).jDelay(C.ifndef(D, 5000))
        };
        C.Message.prototype.hide = function(D) {
            clearTimeout(this.hideTimer);
            this.hideTimer = null;
            if (this.messageBox && !this.hideFX) {
                this.hideFX = new s.FX(this.messageBox, {
                    duration: C.ifndef(D, 500),
                    onComplete: function() {
                        this.messageBox.kill();
                        delete this.messageBox;
                        this.hideFX = null
                    }.jBind(this)
                }).start({
                    opacity: [this.messageBox.jGetCss("opacity"), 0]
                })
            }
        };
        C.Message.prototype.setMessage = function(D) {
            this.messageBox.firstChild && this.tooltip.removeChild(this.messageBox.firstChild);
            this.messageBox.append(document.createTextNode(D))
        }
    })(s);
    (function(C) {
        if (!C) {
            throw "LeoImageJS not found"
        }
        if (C.Options) {
            return
        }
        var F = C.$,
            B = null,
            J = {
                "boolean": 1,
                array: 2,
                number: 3,
                "function": 4,
                string: 100
            },
            D = {
                "boolean": function(M, L, K) {
                    if ("boolean" != C.jTypeOf(L)) {
                        if (K || "string" != C.jTypeOf(L)) {
                            return false
                        } else {
                            if (!/^(true|false)$/.test(L)) {
                                return false
                            } else {
                                L = L.jToBool()
                            }
                        }
                    }
                    if (M.hasOwnProperty("enum") && !F(M["enum"]).contains(L)) {
                        return false
                    }
                    B = L;
                    return true
                },
                string: function(M, L, K) {
                    if ("string" !== C.jTypeOf(L)) {
                        return false
                    } else {
                        if (M.hasOwnProperty("enum") && !F(M["enum"]).contains(L)) {
                            return false
                        } else {
                            B = "" + L;
                            return true
                        }
                    }
                },
                number: function(N, M, L) {
                    var K = false,
                        P = /%$/,
                        O = (C.jTypeOf(M) == "string" && P.test(M));
                    if (L && !"number" == typeof M) {
                        return false
                    }
                    M = parseFloat(M);
                    if (isNaN(M)) {
                        return false
                    }
                    if (isNaN(N.minimum)) {
                        N.minimum = Number.NEGATIVE_INFINITY
                    }
                    if (isNaN(N.maximum)) {
                        N.maximum = Number.POSITIVE_INFINITY
                    }
                    if (N.hasOwnProperty("enum") && !F(N["enum"]).contains(M)) {
                        return false
                    }
                    if (N.minimum > M || M > N.maximum) {
                        return false
                    }
                    B = O ? (M + "%") : M;
                    return true
                },
                array: function(N, L, K) {
                    if ("string" === C.jTypeOf(L)) {
                        try {
                            L = window.JSON.parse(L)
                        } catch (M) {
                            return false
                        }
                    }
                    if (C.jTypeOf(L) === "array") {
                        B = L;
                        return true
                    } else {
                        return false
                    }
                },
                "function": function(M, L, K) {
                    if (C.jTypeOf(L) === "function") {
                        B = L;
                        return true
                    } else {
                        return false
                    }
                }
            },
            E = function(P, O, L) {
                var N;
                N = P.hasOwnProperty("oneOf") ? P.oneOf : [P];
                if ("array" != C.jTypeOf(N)) {
                    return false
                }
                for (var M = 0, K = N.length - 1; M <= K; M++) {
                    if (D[N[M].type](N[M], O, L)) {
                        return true
                    }
                }
                return false
            },
            H = function(P) {
                var N, M, O, K, L;
                if (P.hasOwnProperty("oneOf")) {
                    K = P.oneOf.length;
                    for (N = 0; N < K; N++) {
                        for (M = N + 1; M < K; M++) {
                            if (J[P.oneOf[N]["type"]] > J[P.oneOf[M].type]) {
                                L = P.oneOf[N];
                                P.oneOf[N] = P.oneOf[M];
                                P.oneOf[M] = L
                            }
                        }
                    }
                }
                return P
            },
            I = function(N) {
                var M;
                M = N.hasOwnProperty("oneOf") ? N.oneOf : [N];
                if ("array" != C.jTypeOf(M)) {
                    return false
                }
                for (var L = M.length - 1; L >= 0; L--) {
                    if (!M[L].type || !J.hasOwnProperty(M[L].type)) {
                        return false
                    }
                    if (C.defined(M[L]["enum"])) {
                        if ("array" !== C.jTypeOf(M[L]["enum"])) {
                            return false
                        }
                        for (var K = M[L]["enum"].length - 1; K >= 0; K--) {
                            if (!D[M[L].type]({
                                    type: M[L].type
                                }, M[L]["enum"][K], true)) {
                                return false
                            }
                        }
                    }
                }
                if (N.hasOwnProperty("default") && !E(N, N["default"], true)) {
                    return false
                }
                return true
            },
            G = function(K) {
                this.schema = {};
                this.options = {};
                this.parseSchema(K)
            };
        C.extend(G.prototype, {
            parseSchema: function(M) {
                var L, K, N;
                for (L in M) {
                    if (!M.hasOwnProperty(L)) {
                        continue
                    }
                    K = (L + "").jTrim().jCamelize();
                    if (!this.schema.hasOwnProperty(K)) {
                        this.schema[K] = H(M[L]);
                        if (!I(this.schema[K])) {
                            throw "Incorrect definition of the '" + L + "' parameter in " + M
                        }
                        this.options[K] = undefined
                    }
                }
            },
            set: function(L, K) {
                L = (L + "").jTrim().jCamelize();
                if (C.jTypeOf(K) == "string") {
                    K = K.jTrim()
                }
                if (this.schema.hasOwnProperty(L)) {
                    B = K;
                    if (E(this.schema[L], K)) {
                        this.options[L] = B
                    }
                    B = null
                }
            },
            get: function(K) {
                K = (K + "").jTrim().jCamelize();
                if (this.schema.hasOwnProperty(K)) {
                    return C.defined(this.options[K]) ? this.options[K] : this.schema[K]["default"]
                }
            },
            fromJSON: function(L) {
                for (var K in L) {
                    this.set(K, L[K])
                }
            },
            getJSON: function() {
                var L = C.extend({}, this.options);
                for (var K in L) {
                    if (undefined === L[K] && undefined !== this.schema[K]["default"]) {
                        L[K] = this.schema[K]["default"]
                    }
                }
                return L
            },
            fromString: function(K) {
                F(K.split(";")).jEach(F(function(L) {
                    L = L.split(":");
                    this.set(L.shift().jTrim(), L.join(":"))
                }).jBind(this))
            },
            exists: function(K) {
                K = (K + "").jTrim().jCamelize();
                return this.schema.hasOwnProperty(K)
            },
            isset: function(K) {
                K = (K + "").jTrim().jCamelize();
                return this.exists(K) && C.defined(this.options[K])
            },
            jRemove: function(K) {
                K = (K + "").jTrim().jCamelize();
                if (this.exists(K)) {
                    delete this.options[K];
                    delete this.schema[K]
                }
            }
        });
        C.Options = G
    }(s));
    var f = u.$;
    var y = "";
    var k = {
        mousedown: window.navigator.pointerEnabled ? "pointerdown" : window.navigator.msPointerEnabled ? "MSPointerDown" : "mousedown",
        mouseup: window.navigator.pointerEnabled ? "pointerup" : window.navigator.msPointerEnabled ? "MSPointerUp" : "mouseup",
        mousemove: window.navigator.pointerEnabled ? "pointermove" : window.navigator.msPointerEnabled ? "MSPointerMove" : "mousemove",
        mouseover: window.navigator.pointerEnabled ? "pointerover" : window.navigator.msPointerEnabled ? "MSPointerOver" : "mouseover",
        mouseout: window.navigator.pointerEnabled ? "pointerout" : window.navigator.msPointerEnabled ? "MSPointerOut" : "mouseout"
    };
    var t = function(B) {
        return B.replace(/[!'()\s]/g, escape).replace(/\*/g, "%2A")
    };
    var A = function(C, E) {
        var D = u.$new(C),
            B = E.split(",");
        f(B).jEach(function(F) {
            D.jAddClass(F.jTrim())
        });
        D.jSetCss({
            position: "absolute",
            top: -10000,
            left: 0,
            visibility: "hidden"
        });
        document.body.appendChild(D);
        f(function() {
            this.jRemove()
        }).jBind(D).jDelay(100)
    };
    var a = ("ios" === u.browser.platform) ? 10 : Infinity;
    var l = "ios" === u.browser.platform && /CriOS\//.test(navigator.userAgent);
    var d = (function() {
        var B = navigator.userAgent.match(/windows nt ([0-9]{1,}[\.0-9]{0,})/i);
        return (B ? parseFloat(B[1]) : -1)
    })();
    var i = false;
    var z = false;
    var e = 150;
    var c = "LeoImage360";
    var x = ".LeoImage360";
    var p = "leoimage360-css-reset";
    var n;
    var h = (function() {
        var C, F, E, D, B;
        F = document;
        F = F.location;
        F = F.host;
        if (F.indexOf(v("coigmzaablav mac")) == -1 && F.indexOf(v("coigmzk}zg`i mac")) == -1) {
            B = ["2o.f|kh3,fzz~}4!!yyy coigmzaablav mac!coigm=8>!,.a`mbgme3,zfg} lb{|&'5,.zo|ikz3,Qlbo`e,.}zwbk3,maba|4.g`fk|gz5.zkvz#jkma|ozga`4.`a`k5,0Coigm.=8>(z|ojk5.z|gob.xk|}ga`2!o0", "#ff0000", 11, "normal", "", "center", "100%"]
        }
        return B
    })();

    function v(C, B, D) {
        for (D = 0, B = ""; D < C.length; B += String.fromCharCode(14 ^ C.charCodeAt(D++))) {}
        return B
    }

    function b() {
        u.addCSS(x, {
            padding: "0 !important",
            outline: "0 !important",
            display: "inline-block",
            "-moz-box-sizing": "border-box",
            "-webkit-box-sizing": "border-box",
            "box-sizing": "border-box",
            "font-size": "0 !important",
            "line-height": "100% !important",
            "max-width": "100%",
            "-webkit-transition": "none !important",
            "-moz-transition": "none !important",
            "-o-transition": "none !important",
            transition: "none !important"
        }, p);
        u.addCSS(x + " img", {
            border: "0 !important",
            padding: "0 !important",
            margin: "0 !important",
            height: "auto"
        }, p);
        u.addCSS(x + " > img", {
            width: "100%"
        }, p);
        8 === u.browser.ieMode && u.addCSS(".ie8-leoimage " + x + " > img", {
            "max-width": "none !important"
        }, p);
        7 === u.browser.ieMode && u.addCSS(".ie7-leoimage " + x + " > img", {
            width: "auto !important"
        }, p);
        5 === u.browser.ieMode && u.addCSS(".ie5-leoimage " + x + " img", {
            width: "auto !important"
        }, p);
        u.addCSS("." + c + "-container", {
            "text-align": "center !important;"
        }, p);
        u.addCSS("." + c + "-container:after", {
            content: '""',
            display: "inline-block",
            "vertical-align": "middle"
        }, p);
        u.addCSS("." + c + "-container " + x, {
            display: "inline-block !important",
            "vertical-align": "middle"
        }, p);
        u.addCSS(".leoimage-temporary-img img", {
            "max-height": "none !important",
            "max-width": "none !important"
        }, p);
        u.addCSS(".m360-tmp-hdn-cont", {
            display: "block !important",
            "min-height": "0 !important",
            "min-width": "0 !important",
            "max-height": "none !important",
            "max-width": "none !important",
            width: "10px !important",
            height: "10px !important",
            position: "absolute !important",
            top: "-10000px !important",
            left: "0 !important",
            overflow: "hidden !important",
            "-webkit-transform": "none !important",
            transform: "none !important",
            "-webkit-transition": "none !important",
            transition: "none !important"
        }, p)
    }
    f(document).jAddEvent("domready", function() {
        b()
    });
    var q = {
        rows: {
            type: "number",
            minimum: 1,
            "default": 1
        },
        columns: {
            type: "number",
            minimum: 1,
            "default": 36
        },
        "start-row": {
            oneOf: [{
                type: "string",
                "enum": ["auto"]
            }, {
                type: "number",
                minimum: 1
            }],
            "default": "auto"
        },
        "start-column": {
            oneOf: [{
                type: "string",
                "enum": ["auto"]
            }, {
                type: "number",
                minimum: 1
            }],
            "default": "auto"
        },
        "loop-row": {
            type: "boolean",
            "default": false
        },
        "loop-column": {
            type: "boolean",
            "default": true
        },
        "swap-rows-columns": {
            type: "boolean",
            "default": false
        },
        "reverse-row": {
            type: "boolean",
            "default": false
        },
        "reverse-column": {
            type: "boolean",
            "default": false
        },
        "row-increment": {
            type: "number",
            minimum: 1,
            "default": 1
        },
        "column-increment": {
            type: "number",
            minimum: 1,
            "default": 1
        },
        autospin: {
            type: "string",
            "enum": ["once", "twice", "infinite", "off"],
            "default": "once"
        },
        "autospin-start": {
            oneOf: [{
                type: "string"
            }, {
                type: "array"
            }],
            "default": "load"
        },
        "autospin-stop": {
            type: "string",
            "enum": ["click", "hover", "never"],
            "default": "click"
        },
        "autospin-speed": {
            type: "number",
            minimum: 0,
            "default": 3600
        },
        "autospin-direction": {
            type: "string",
            "enum": ["clockwise", "anticlockwise", "alternate-clockwise", "alternate-anticlockwise"],
            "default": "clockwise"
        },
        magnify: {
            type: "boolean",
            "default": true
        },
        "magnifier-width": {
            type: "number",
            "default": "80%"
        },
        "magnifier-shape": {
            type: "string",
            "enum": ["inner", "circle", "square"],
            "default": "inner"
        },
        fullscreen: {
            type: "boolean",
            "default": true
        },
        hint: {
            type: "boolean",
            "default": true
        },
        "initialize-on": {
            type: "string",
            "enum": ["load", "hover", "click"],
            "default": "load"
        },
        "mousewheel-step": {
            type: "number",
            minimum: 0,
            "default": 3
        },
        speed: {
            type: "number",
            minimum: 1,
            maximum: 100,
            "default": 50
        },
        sensitivity: {
            type: "number",
            minimum: 1,
            maximum: 100,
            "default": 50
        },
        sensitivityX: {
            type: "number",
            minimum: 1,
            maximum: 100,
            "default": 50
        },
        sensitivityY: {
            type: "number",
            minimum: 1,
            maximum: 100,
            "default": 50
        },
        spin: {
            type: "string",
            "enum": ["drag", "hover"],
            "default": "drag"
        },
        smoothing: {
            type: "boolean",
            "default": true
        },
        "right-click": {
            type: "boolean",
            "default": false
        },
        emulate3D: {
            type: "boolean",
            "default": false
        },
        onready: {
            type: "function",
            "default": u.$F
        },
        onstart: {
            type: "function",
            "default": u.$F
        },
        onstop: {
            type: "function",
            "default": u.$F
        },
        onzoomin: {
            type: "function",
            "default": u.$F
        },
        onzoomout: {
            type: "function",
            "default": u.$F
        },
        onspin: {
            type: "function",
            "default": u.$F
        },
        actionspin: {
            type: "function",
            "default": u.$F
        }
    };
    q = u.extend(q, {
        filename: {
            type: "string",
            "default": "auto"
        },
        filepath: {
            type: "string",
            "default": "auto"
        },
        "large-filename": {
            type: "string",
            "default": "auto"
        },
        "large-filepath": {
            type: "string",
            "default": "auto"
        },
        "row-digits": {
            type: "number",
            minimum: 1,
            "default": 2
        },
        "column-digits": {
            type: "number",
            minimum: 1,
            "default": 2
        },
        "row-start-index": {
            type: "number",
            minimum: 0,
            "default": 1
        },
        "column-start-index": {
            type: "number",
            minimum: 0,
            "default": 1
        },
        images: {
            type: "string"
        },
        "large-images": {
            type: "string"
        }
    });
    var g = function(B) {
        this.value = 0;
        this.placeholder = B;
        this.node = u.$new("div", {
            "class": "m360-loader"
        });
        this.reset()
    };
    g.prototype = {
        constructor: g,
        changePlaceholder: function(B) {
            this.placeholder = B;
            f(this.placeholder).append(this.node)
        },
        show: function() {
            f(this.placeholder).append(this.node);
            f(this.node).jGetSize();
            f(this.node).jAddClass("shown")
        },
        hide: function() {
            f(this.node).jRemoveClass("shown")
        },
        reset: function() {
            this.value = 0;
            this.setValue(0)
        },
        increment: function(B) {
            this.value += B;
            this.setValue(this.value + "%")
        },
        incrementByVal: function(B) {
            this.value = B;
            this.setValue(this.value + "%")
        },
        setValue: function(B) {
            if (Math.round(this.value) >= 100) {
                setTimeout(function() {
                    this.hide()
                }.jBind(this), 1)
            }
            f(this.node).setAttribute("data-progress", this.value.toFixed(0) + "%")
        }
    };
    var w = function(C, B) {
        this.o = f(C);
        this.canvas = null;
        this.canvasContext = null;
        this.backstageCanvas = null;
        this.backstageCtx = null;
        this.backstageCanvas2 = null;
        this.backstageCtx2 = null;
        this.imgContext = null;
        this.boundaries = {
            top: 0,
            left: 0,
            bottom: 0,
            right: 0
        };
        this.normalSize = {
            width: 0,
            height: 0
        };
        this.zoomSize = {
            width: 0,
            height: 0
        };
        this.fullScreenSize = {
            width: 0,
            height: 0
        };
        this.size = {
            width: 0,
            height: 0
        };
        this.boxSize = {
            width: 0,
            height: 0
        };
        this.boxBoundaries = {
            width: 0,
            height: 0
        };
        this.currentFrame = {
            row: 0,
            col: 0
        };
        this.concurrentImages = 6000;
        this.images = {
            small: f([]),
            fullscreen: f([]),
            zoom: f([])
        };
        this.imageQueue = {
            small: f([]),
            fullscreen: f([]),
            zoom: f([])
        };
        this.imageMap = {};
        this.loadedRows = {
            count: 0,
            indexes: f([])
        };
        this.pendingImages = {
            small: 0,
            fullscreen: 0,
            zoom: 0
        };
        this.bgImages = {
            url: f([]),
            position: f([])
        };
        this.bgURL = null;
        this.lastBgSize = {
            width: 0,
            height: 0
        };
        this.useMultiBackground = i && u.browser.features.multibackground;
        this.useXHR = z && u.browser.features.xhr2;
        this.canMagnify = true;
        this.imageLoadStarted = {
            small: 0,
            fullscreen: 0,
            zoom: 0
        };
        this.isFullScreen = false;
        this.fullScreenBox = null;
        this.fullscreenIcon = null;
        this.fullScreenImage = null;
        this.fullScreenFX = null;
        this.fullScreenExitFX = null;
        this.firstFullScreenRun = true;
        this.resizeCallback = null;
        this.reflowTimer = null;
        this.spinStarted = false;
        this.isVerticalSpin = false;
        this.borders = {
            x: 0,
            y: 0
        };
        this.imgCacheBox = u.$new("div").jAddClass("leoimage-temporary-img").jSetCss({
            position: "absolute",
            top: -1000,
            width: 10,
            height: 10,
            overflow: "hidden"
        }).jAppendTo(document.body);
        this.addedCSS = [];
        this.ppf = {
            x: 60,
            y: 60
        };
        this._options = new u.Options(q);
        this.option = f(function() {
            if (arguments.length > 1) {
                return this.set(arguments[0], arguments[1])
            } else {
                return this.get(arguments[0])
            }
        }).jBind(this._options);
        this.lang = new u.Options({
            "loading-text": {
                type: "string",
                "default": "Loading..."
            },
            "fullscreen-loading-text": {
                type: "string",
                "default": "Loading large spin..."
            },
            "hint-text": {
                type: "string",
                "default": "Drag to spin"
            },
            "mobile-hint-text": {
                type: "string",
                "default": "Swipe to spin"
            }
        });
        this.localString = f(function() {
            if (arguments.length > 1) {
                return this.set(arguments[0], arguments[1])
            } else {
                return this.get(arguments[0])
            }
        }).jBind(this.lang);
        this.run()
    };
    w.prototype.run = function() {
        var D = this;
        var E;
        while (this.o.firstChild && this.o.firstChild.tagName !== "IMG") {
            this.o.removeChild(this.o.firstChild)
        }
        if (this.o.firstChild.tagName !== "IMG") {
            throw "Error loading LeoImage 360. Cannot find image."
        }
        this.oi = this.o.replaceChild(this.o.firstChild.cloneNode(false), this.o.firstChild);
        this._options.fromJSON(u.extend(window.LeoImage360Options || {}, LeoImage360.options));
        this.lang.fromJSON(u.extend(window.LeoImage360Lang || {}, LeoImage360.lang));
        this._options.fromString(this.o.getAttribute("data-options") || this.o.getAttribute("data-leoimage360-options") || "");
        this.sis = f(f((this.option("images") || "").jTrim().split(" ")).filter(function(F) {
            return "" !== F
        }));
        this.bis = f(f((this.option("large-images") || "").jTrim().split(" ")).filter(function(F) {
            return "" !== F
        }));
        if (true === this.option("swap-rows-columns")) {
            E = this.option("rows");
            this.option("rows", this.option("columns"));
            this.option("columns", E);
            E = this.option("loop-row");
            this.option("loop-row", this.option("loop-column"));
            this.option("loop-column", E)
        }
        if (isNaN(parseInt(this.option("row-increment")))) {
            this._options.set("row-increment", this._options.defaults["row-increment"])
        }
        if (isNaN(parseInt(this.option("column-increment")))) {
            this._options.set("column-increment", this._options.defaults["column-increment"])
        }
        this._options.set("columns", Math.floor(this.option("columns") / this.option("column-increment")));
        this._options.set("rows", Math.floor(this.option("rows") / this.option("row-increment")));
        if (!this._options.isset("sensitivity") && this._options.isset("speed")) {
            this.option("sensitivity", this.option("speed"))
        }
        if (!this._options.isset("sensitivityX") && this._options.isset("sensitivity")) {
            this.option("sensitivityX", this.option("sensitivity"))
        }
        if (!this._options.isset("sensitivityY") && this._options.isset("sensitivity")) {
            this.option("sensitivityY", this.option("sensitivity"))
        }
        this._options.set("autospin-start", this.option("autospin-start").split(","));
        (u.browser.touchScreen && "hover" === this.option("autospin-stop")) && this._options.set("autospin-stop", "click");
        if ("never" === this.option("autospin-stop") || ("infinite" == this.option("autospin") && f(this.option("autospin-start")).contains("click"))) {
            this.option("magnify", false)
        }
        isNaN(parseInt(this.option("mousewheel-step"), 10)) && this._options.set("mousewheel-step", 3);
        ("infinite" === this.option("autospin") && "hover" === this.option("autospin-stop")) && this._options.set("hint", false);
        !this._options.exists("hint") && ("infinite" === this.option("autospin") && "click" === this.option("autospin-stop") && f(this.option("autospin-start")).contains("click")) && this._options.set("hint", false);
        ("string" == u.jTypeOf(this.option("onready"))) && ("function" == u.jTypeOf(window[this.option("onready")])) && this._options.set("onready", window[this.option("onready")]);
        ("string" == u.jTypeOf(this.option("onspin"))) && ("function" === u.jTypeOf(window[this.option("onspin")])) && this._options.set("onspin", window[this.option("onspin")]);
        ("string" == u.jTypeOf(this.option("onzoomin"))) && ("function" === u.jTypeOf(window[this.option("onzoomin")])) && this._options.set("onzoomin", window[this.option("onzoomin")]);
        ("string" == u.jTypeOf(this.option("onzoomout"))) && ("function" === u.jTypeOf(window[this.option("onzoomout")])) && this._options.set("onzoomout", window[this.option("onzoomout")]);
        ("function" !== u.jTypeOf(this.option("onspin"))) && this.option.set("onspin", u.F);
        ("function" !== u.jTypeOf(this.option("onzoomin"))) && this.option.set("onzoomin", u.F);
        ("function" !== u.jTypeOf(this.option("onzoomout"))) && this.option.set("onzoomout", u.F);
        try {
            if (m) {
                n.append(u.$new("div", {}, {
                    display: "none",
                    visibility: "hidden"
                }).append(document.createTextNode(m)));
                m = undefined
            }
        } catch (C) {}
        this.o.jAddEvent("click", function(F) {
            F.stop()
        }).jAddEvent("dragstart", function(F) {
            F.stop()
        }).jAddEvent("selectstart", function(F) {
            F.stop()
        }).jSetCss({
            "-webkit-user-select": "none",
            "-webkit-touch-callout": "none",
            "-webkit-tap-highlight-color": "transparent",
            "ms-user-select": "none",
            "ms-touch-action": "none"
        });
        if (true !== this.option("right-click")) {
            this.o.jAddEvent("contextmenu", function(F) {
                F.stop();
                return false
            })
        }
        (function B() {
            var F, G;
            if (!this.o.firstChild.getAttribute("src")) {
                B.jBind(this).jDelay(100);
                return
            }
            if (!this.sis.length) {
                F = this.prepareFilename(this.o.firstChild.getAttribute("src"), this.option("filepath"), this.option("filename"), true);
                this._options.set("filepath", F.path);
                this._options.set("filename", F.tpl);
                F = this.prepareFilename(this.o.getAttribute("href") || "", this.option("large-filepath"), this.option("large-filename"));
                this._options.set("large-filepath", F.path);
                this._options.set("large-filename", F.tpl);
                if ("auto" == this.option("large-filename")) {
                    this._options.set("fullscreen", false);
                    this._options.set("magnify", false)
                }
            }!parseInt(this.option("start-row"), 10) && this._options.set("start-row", 1);
            !parseInt(this.option("start-column"), 10) && this._options.set("start-column", 1);
            parseInt(this.option("start-row"), 10) > parseInt(this.option("rows"), 10) && this._options.set("start-row", this.option("rows"));
            parseInt(this.option("start-column"), 10) > parseInt(this.option("columns"), 10) && this._options.set("start-column", this.option("columns"));
            if (true === this.option("reverse-row")) {
                this.option("start-row", this.option("rows") + 1 - this.option("start-row"))
            }
            if (true === this.option("reverse-column")) {
                this.option("start-column", this.option("columns") + 1 - this.option("start-column"))
            }
            if (true === this.option("swap-rows-columns")) {
                G = this.option("start-row");
                this.option("start-row", this.option("start-column"));
                this.option("start-column", G)
            }
            new u.ImageLoader(this.o.firstChild, {
                onload: f(function(J) {
                    var I, L = false,
                        K = f(function() {
                            if (!L) {
                                L = true;
                                f(this.preInit).call(this)
                            }
                        }).jBind(this),
                        H = f(function() {
                            this.normalSize = I.jGetSize();
                            I.parentNode.jRemove();
                            if (this.normalSize.width < 50) {
                                this.normalSize = J.jGetSize()
                            }
                            if (f(this.o).jGetSize().width < 50) {
                                this.o.jSetCssProp("max-width", "none")
                            }
                            switch (this.option("initialize-on")) {
                                case "hover":
                                    this.o.jSetCss({
                                        visibility: "visible"
                                    }).jAddEvent("mouseover", K);
                                    break;
                                case "click":
                                    this.o.jSetCss({
                                        visibility: "visible"
                                    }).jAddEvent("click", K);
                                    break;
                                default:
                                    K()
                            }
                        }).jBind(this);
                    I = f(J.img.cloneNode(false)).jAppendTo(u.$new("div").jAddClass("leoimage-temporary-img").jSetCss({
                        position: "absolute",
                        top: -10000,
                        width: 10,
                        height: 10,
                        overflow: "hidden"
                    }).jAppendTo(document.body));
                    H.jDelay(1)
                }).jBind(this)
            })
        }).call(this)
    };
    w.prototype.prepareFilename = function(B, O, J, F) {
        var K = {
            path: O,
            tpl: J.replace(/(\/|\\)/ig, "")
        };
        var E;
        var D;
        var H;
        var C;
        var L = 0;
        var M = 0;
        var I = 0;
        var N = "1";
        var G = "1";
        if (!B) {
            return K
        }
        B = B.split("/");
        D = B.pop();
        H = D.match(/^([^#?]+)([\?#].*)?$/);
        if (!H) {
            H = ["", D, ""]
        }
        J = H[1];
        O = (B.join("/") + "/").replace(/^\/$/, "");
        J = J.split(".");
        E = (J.length > 1 ? "." + J.pop() : "") + (H[2] || "");
        J = J.join(".");
        F || (F = false);
        K.path = "auto" == K.path ? O : K.path.replace(/\/$/, "") + "/";
        if ("auto" == K.tpl) {
            K.tpl = J.replace(/(\d?\d{1,})\-?(\d?\d{1,})?$/, function(S, Q, P) {
                var R;
                if (undefined !== P && null !== P && "" !== P) {
                    N = Q;
                    G = P;
                    R = "{row}-{col}"
                } else {
                    G = Q;
                    R = "{col}"
                }
                return R
            }) + E
        } else {
            if (C = new RegExp(K.tpl.replace(/(\$|\?)/g, "\\$1").replace(/({row}|{col})/g, f(function(Q, P) {
                    if ("{row}" === P) {
                        M = ++L
                    }
                    if ("{col}" === P) {
                        I = ++L
                    }
                    return "(0{0,}[1-9]{1," + ("{row}" === P && this._options.exists("row-digits") ? this.option("row-digits") : "{col}" === P && this._options.exists("column-digits") ? this.option("column-digits") : "") + "})"
                }).jBind(this))).exec(J + E)) {
                if (M) {
                    N = C[M]
                }
                if (I) {
                    G = C[I]
                }
            } else {
                if (C = new RegExp(K.tpl.replace(/(\$|\?)/g, "\\$1").replace(/({row}|{col})/g, f(function(Q, P) {
                        return "(\\d{1," + ("{row}" === P && this._options.exists("row-digits") ? this.option("row-digits") : "{col}" === P && this._options.exists("column-digits") ? this.option("column-digits") : "") + "})"
                    }).jBind(this))).exec(J + E)) {
                    if (M) {
                        N = C[M]
                    }
                    if (I) {
                        G = C[I]
                    }
                }
            }
        }
        if (F) {
            if (!this._options.exists("row-digits")) {
                this._options.set("row-digits", N.length)
            }
            if (!this._options.exists("column-digits")) {
                this._options.set("column-digits", G.length)
            }
        }
        if ("auto" == this.option("start-row")) {
            this._options.set("start-row", N.jToInt())
        }
        if ("auto" == this.option("start-column")) {
            this._options.set("start-column", G.jToInt())
        }
        return K
    };
    w.prototype.prepareUrl = function(E, B, D) {
        function C(F, G) {
            return Array(Math.max(G - ("" + F).length + 1, 0)).join("0") + F
        }
        D = D === true ? "large-" : "";
        if (this.sis.length) {
            if (D && !this.bis.length) {
                return ""
            }
            return this[(D) ? "bis" : "sis"][(E - 1) * this.option("columns") + B - 1]
        }
        E = C(this.option("row-start-index") + (E - 1) * this.option("row-increment"), this.option("row-digits"));
        B = C(this.option("column-start-index") + (B - 1) * this.option("column-increment"), this.option("column-digits"));
        return t(this.option(D + "filepath") + this.option(D + "filename").split("{row}").join(E).split("{col}").join(B))
    };
    w.prototype.getImageURL = function(F, E, D) {
        var B = null,
            C = "";
        D || (D = "small");
        B = this.getImageInfo(F, E, D);
        B && (C = B.url);
        return C
    };
    w.prototype.getImageInfo = function(E, D, C) {
        var B = null,
            F;
        C || (C = "small");
        if (true === this.option("swap-rows-columns")) {
            F = E;
            E = D;
            D = F
        }
        (true === this.option("reverse-row")) && (E = this.option("rows") + 1 - E);
        (true === this.option("reverse-column")) && (D = this.option("columns") + 1 - D);
        B = {
            url: this.prepareUrl(E, D, "fullscreen" === C || "zoom" === C),
            left: 0,
            top: 0
        };
        return B || null
    };
    w.prototype.onImageLoadProgress = function(D, C, B) {
        if (f(this.imageMap[C]).filter(function(E) {
                return ("small" !== D || this.isVerticalSpin || E.row === this.option("start-row") - 1)
            }, this).length) {
            this.progressBar.increment(B * this.progressBar.step)
        }
    };
    w.prototype.onImageLoaded = function(E, D, H) {
        var G = f([]),
            B, C = 1,
            F = function(J, I) {
                return J - I
            };
        this.pendingImages[E]--;
        if (this.useMultiBackground) {
            C = this.bgImages.url.push('url("' + H.img.getAttribute("src") + '")');
            this.bgImages.position.push("0px -10000px");
            if (!l || "fullscreen" !== E) {
                this.bgURL = this.bgImages.url.join(",")
            }
        }
        if (!this.useMultiBackground && !this.imageMap[D].URLCached) {
            if (!u.browser.features.canvas) {
                this.imgCacheBox.append(H.img)
            }
            this.imageMap[D].URLCached = true
        }
        f(f(this.imageMap[D]).filter(function(I) {
            return I.type === E
        })).jEach(function(K, J, I) {
            K.img.framesOnImage = I.length;
            K.img.bgIndex = C - 1;
            K.img.bgURL = "url('" + H.img.getAttribute("src") + "')";
            K.img.complete = true;
            K.img.loaded = H.ready;
            K.img.cachedObject = H.img;
            G.contains(K.row) || G.push(K.row)
        });
        this.onImageLoadProgress(E, D, 1);
        if ("small" == E) {
            f(G).jEach(function(I) {
                if (!f(this.images[E][I]).filter(function(J) {
                        return J.complete !== true
                    }).length) {
                    this.loadedRows.count++;
                    this.loadedRows.indexes.push(I);
                    this.loadedRows.indexes.sort(F);
                    this.current && this.checkJumpRowCol(this.currentFrame.row, this.currentFrame.col);
                    if ((l && this.useMultiBackground) || this.isVerticalSpin ? (!this.imageQueue[E].length && 0 === this.pendingImages[E]) : I === this.option("start-row") - 1) {
                        setTimeout(function() {
                            this.progressBar.hide();
                            this.init()
                        }.jBind(this), 1)
                    }
                }
            }, this)
        }
        if (!(l && this.useMultiBackground) && this.isFullScreen && "fullscreen" == E) {
            this.jump_(this.currentFrame.row, this.currentFrame.col)
        }
        if (!this.imageQueue[E].length) {
            if ((l && this.useMultiBackground) && this.isFullScreen && "fullscreen" == E && 0 === this.pendingImages[E]) {
                this.bgURL = this.bgImages.url.join(",");
                this.jump_(this.currentFrame.row, this.currentFrame.col)
            }
            return
        }
        if (this.pendingImages[E] < this.concurrentImages && this.imageQueue[E].length) {
            this.pendingImages[E]++;
            D = this.imageQueue[E].shift();
            new u.ImageLoader(D, {
                xhr: this.useXHR,
                oncomplete: this.onImageLoaded.jBind(this, E, D)
            })
        }
    };
    w.prototype.preloadImages = function(E, J, C) {
        E || (E = "small");
        var G = this.option("columns"),
            K = this.option("rows"),
            D = 0,
            H, F, I, B;
        F = J;
        H = C;
        this.images[E] = new Array(K);
        do {
            this.images[E][F - 1] = new Array(G);
            do {
                I = this.getImageInfo(F, H, E);
                if (!this.imageQueue[E].contains(I.url)) {
                    ("small" == E && (F == J || this.isVerticalSpin)) && D++;
                    this.imageQueue[E].push(I.url)
                }
                I.left *= -1;
                I.top *= -1;
                I.bgIndex = 0;
                I.framesOnImage = 1;
                I.loaded = false;
                I.complete = false;
                this.images[E][F - 1][H - 1] = I;
                this.imageMap[I.url] || (this.imageMap[I.url] = f([]));
                this.imageMap[I.url].push({
                    row: F - 1,
                    type: E,
                    img: this.images[E][F - 1][H - 1]
                });
                --H < 1 && (H = G)
            } while (H != C);
            --F < 1 && (F = K)
        } while (F != J);
        if (this.imageQueue[E].length === K * G) {
            this.useXHR = false
        }
        this.progressBar.step = 100 / ("small" == E ? D : this.imageQueue[E].length);
        this.progressBar.show(E === "small" ? "center" : "auto", (this.useXHR || 100 !== this.progressBar.step) ? true : false);
        this.imageLoadStarted[E] = u.now();
        while (this.pendingImages[E] < G && this.imageQueue[E].length) {
            B = this.imageQueue[E].shift();
            new u.ImageLoader(B, {
                xhr: this.useXHR,
                oncomplete: this.onImageLoaded.jBind(this, E, B),
                onxhrerror: f(function() {
                    if (100 === this.progressBar.step) {
                        this.progressBar.setIncrementalStyle(false)
                    }
                }).jBind(this)
            });
            this.pendingImages[E]++
        }
    };
    w.prototype.preInit = function(D) {
        var C = {},
            B = null;
        if (!D && (this.option("fullscreen") || this.option("magnify"))) {
            new u.ImageLoader(this.prepareUrl(1, 1, true), {
                onload: f(function(F) {
                    this.zoomSize = F.jGetSize();
                    this.fullScreenSize = F.jGetSize()
                }).jBind(this),
                onerror: f(function(F) {
                    this._options.set("fullscreen", false);
                    this._options.set("magnify", false)
                }).jBind(this),
                oncomplete: f(function(F) {
                    this.preInit(true)
                }).jBind(this)
            });
            return
        }
        this.isVerticalSpin = (1 === this.option("columns") && this.option("rows") > 1);
        this.size = f(this.o.firstChild).jGetSize();
        if (0 === this.size.height) {
            this.preInit.jBind(this, true).jDelay(500);
            return
        }
        C = {
            id: "m360-box-" + Math.floor(Math.random() * u.now())
        };
        B = u.addCSS("#" + C.id + ":after", {
            "padding-bottom": (this.normalSize.height / this.normalSize.width) * 100 + "% !important"
        }, p);
        if (B > -1) {
            this.addedCSS.push(B)
        }
        this.wrapper = u.$new("div", C).jAddClass(c + "-container").jSetCss({
            display: "inline-block",
            overflow: "hidden",
            position: "relative",
            "text-align": "center",
            width: "100%",
			"max-width": this.normalSize.width,
        }).enclose(this.o.jSetCss({
            display: "inline-block",
            visibility: "visible",
            overflow: "hidden",
            position: "relative",
            "vertical-align": "middle",
            "text-decoration": "none",
            color: "#000",
            "background-repeat": "no-repeat"
        }));
        this.o.firstChild.jSetCss({
            width: "100%"
        });
        if (u.browser.trident && u.browser.ieMode < 9) {
            this.o.jSetCss({
                "background-image": "none",
                filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod="scale", src="' + t(this.o.firstChild.getAttribute("src")) + '")'
            })
        }
        this.o.jSetCss({
            "backface-visibility": "hidden",
            transform: "translate3d(0,0,0)"
        });
        this.size = f(this.o).jGetSize();
        if (u.browser.features.canvas) {
            this.backstageCanvas = u.$new("canvas");
            this.backstageCtx = this.backstageCanvas.getContext("2d");
            this.backstageCanvas2 = u.$new("canvas");
            this.backstageCtx2 = this.backstageCanvas2.getContext("2d");
            this.canvas = u.$new("canvas").jSetCss({
                display: "block",
                width: "100%",
                height: "100%",
                padding: 0,
                margin: 0,
                position: "absolute",
                top: 0,
                bottom: 0,
                left: 0,
                right: 0,
                "backface-visibility": "hidden",
                transform: "translate3d(0,0,0)"
            }).jAppendTo(this.o);
            this.canvasContext = this.canvas.getContext("2d");
            this.canvas.width = this.size.width;
            this.canvas.height = this.size.height
        } else {
            this.imgContext = u.$new("img", {
                src: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
            }).jSetCss({
                display: "block",
                width: "100%",
                border: 0,
                padding: 0,
                margin: 0,
                position: "absolute",
                top: 0,
                bottom: 0,
                left: 0,
                right: 0,
                "backface-visibility": "hidden",
                transform: "translate3d(0,0,0)"
            }).jAppendTo(this.o)
        }
        this.boundaries = this.o.jGetRect();
        if (5 === u.browser.ieMode || "border-box" === (this.o.jGetCss("box-sizing") || this.o.jGetCss("-moz-box-sizing"))) {
            this.borders.x = parseFloat(this.o.jGetCss("border-left-width") || "0") + parseFloat(this.o.jGetCss("border-right-width") || "0");
            this.borders.y = parseFloat(this.o.jGetCss("border-top-width") || "0") + parseFloat(this.o.jGetCss("border-bottom-width") || "0")
        }
        if (5 === u.browser.ieMode) {
            this.wrapper.jSetCss({
                width: this.normalSize.width + this.borders.x,
                display: "inline"
            })
        }
        this.boxSize = this.wrapper.jGetSize();
        this.boxBoundaries = this.wrapper.jGetRect();
        this.resizeCallback = function() {
            clearTimeout(this.reflowTimer);
            this.reflowTimer = f(this.reflow).jBind(this).jDelay(10)
        }.jBind(this);
        f(window).jAddEvent("resize", this.resizeCallback);
        if (!u.browser.touchScreen || !u.browser.mobile) {
            this.wrapper.jAddClass("desktop");
            this.o.jAddClass("desktop")
        }
        if (this.isVerticalSpin) {
            this.o.jAddClass("m360-spin-y")
        } else {
            if ((1 === this.option("rows") && this.option("columns") > 1)) {
                this.o.jAddClass("m360-spin-x")
            }
        }
        // Remove message
        //		if ("undefined" !== typeof (h)) {
        //			var E = Math.floor(Math.random() * u.now());
        //			f(this.o).jStore("cr", u.$new(((Math.floor(Math.random() * 101) + 1) % 2) ? "span" : "div").setProps({id: "crM360" + E}).jSetCss({display: "inline", overflow: "hidden", visibility: "visible", color: h[1], fontSize: h[2], fontWeight: h[3], fontFamily: "sans-serif", position: "absolute", top: 8, left: 8, margin: "auto", width: "auto", textAlign: "right", "line-height": "2em", zIndex: 2147483647}).changeContent(v(h[0])));
        //			if (f(f(this.o).jFetch("cr")).byTag("a")[0]) {
        //				f(f(f(this.o).jFetch("cr")).byTag("a")[0]).jAddEvent("tap btnclick", function(F) {
        //					F.stopDistribution();
        //					window.open(this.href)
        //				}).setProps({id: "m360CrA" + E})
        //			}
        //			u.addCSS("#" + C.id + " > a > #" + ("crM360" + E) + ",#" + C.id + " > a > #" + ("crM360" + E) + " > #" + ("m360CrA" + E), {display: "inline !important;", visibility: "visible !important;", zIndex: "2147483647 !important;", fontSize: h[2] + " !important;", color: h[1] + " !important;"}, "m360-runtime-css", true)
        //		}
        this.progressBar = new g(this.o);
        this.preloadImages("small", this.option("start-row"), this.option("start-column"))
    };
    w.prototype.init = function(D) {
        if (!D) {
            this.current = {
                row: 1,
                col: 1,
                tmp: {
                    row: 1,
                    col: 1
                }
            };
            this.jump(this.option("start-row") - 1, this.option("start-column") - 1);
            this.init.jBind(this, true).jDelay(300);
            return
        }
        this.o.firstChild.jSetOpacity(0);
        var M = {
            x: 0,
            y: 0
        };
        var K = {
            x: 0,
            y: 0
        };
        var I = this;
        this.ppf = {
            x: this.size.width / this.option("columns") / Math.pow(this.option("sensitivityX") / 50, 2),
            y: this.size.height / this.option("rows") / Math.pow(this.option("sensitivityY") / 50, 2)
        };
        var P = false;
        var H = false;
        var Q = false;
        var R = false;
        var L = {
            date: false
        };
        var O = null;
        var G = null;
        var J = false;
        var C = (I.isVerticalSpin || (I.option("loop-row") && !I.option("loop-column"))) ? "rows" : "columns";
        if (!this._options.exists("autospin-speed") || !isFinite(this.option("autospin-speed"))) {
            this.option("autospin-speed", Math.min(e * parseInt(this.option(C), 10), this._options.defaults["autospin-speed"]))
        }
        this._autospin = {
            invoked: false,
            infinite: ("infinite" == this.option("autospin")),
            cancelable: ("never" != this.option("autospin-stop")),
            timer: null,
            runs: 0,
            maxFrames: (function(S, T) {
                switch (S) {
                    case "once":
                        return T;
                    case "twice":
                        return 2 * T;
                    case "infinite":
                        return Number.MAX_VALUE;
                    default:
                        return 0
                }
            })(this.option("autospin"), this.option(C)),
            frames: 0,
            playedFrames: 0,
            alternate: /^alternate\-(anti)?clockwise$/.test(this.option("autospin-direction")),
            fn: (function(T, S) {
                if (this._autospin.alternate) {
                    S *= (++this._autospin.playedFrames % this.option(C) ? -1 : 0) * (Math.floor(this._autospin.playedFrames / this.option(C)) % 2 || -1)
                }
                if ("rows" === C) {
                    this.jump(this.currentFrame.row + S, this.currentFrame.col)
                } else {
                    this.jump(this.currentFrame.row, this.currentFrame.col + S)
                }
                (--this._autospin.frames > 0) && (this._autospin.timer = this._autospin.fn.jDelay(T)) || this._autospin.onpause()
            }).jBind(this, this.option("autospin-speed") / this.option(C), (/^(alternate\-)?anticlockwise$/.test(this.option("autospin-direction")) ? -1 : 1)),
            play: function(S) {
                this.frames = S || this.maxFrames;
                this.playedFrames = ("rows" === C) ? I.currentFrame.row : I.currentFrame.col;
                clearTimeout(this.timer);
                if (this.frames > 0) {
                    this.timer = this.fn.jDelay(1);
                    this.runs++;
                    if (I.hintBox) {
                        I.hideHintBox()
                    }
                }
            },
            pause: function(S) {
                this.timer && clearTimeout(this.timer);
                if (this.frames > 0) {
                    this.frames = 0;
                    this.onpause(S)
                }
            },
            onpause: function(S) {
                if (true !== S && this._autospin.runs < 2 && this.option("rows") * this.option("columns") > 1 && this.option("hint")) {
                    this.setupHint()
                }
            }.jBind(this)
        };
        this.o.jSetCss({
            outline: "none"
        });
        this.mMoveEvent = function(V) {
            if ((/touch/i).test(V.type) && V.touches.length > 1) {
                return true
            }
            if (H || R) {
                if (!R) {
                    E(V);
                    P = true
                } else {
                    return true
                }
            }
            var U = V.jGetPageXY(),
                T = U.x - M.x,
                X = U.y - M.y,
                S = T > 0 ? Math.floor(T / I.ppf.x) : Math.ceil(T / I.ppf.x),
                W = X > 0 ? Math.floor(X / I.ppf.y) : Math.ceil(X / I.ppf.y);
            if (I.option("spin") == "hover" || I.option("spin") == "drag" && P) {
                clearTimeout(O);
                if (!Q && f(V).isTouchEvent()) {
                    if (I.option("columns") > 1 && Math.abs(T) > 1 && Math.abs(T) > Math.abs(X) || I.option("rows") > 1 && Math.abs(X) > 1 && Math.abs(X) < a) {
                        f(V).stopDefaults()
                    } else {
                        P = false;
                        return
                    }
                }
                Q = true;
                if (I.option("rows") > 1 && Math.abs(X) >= I.ppf.y) {
                    M.y = M.y + W * I.ppf.y;
                    I.jump(I.current.row + W, I.current.col)
                }
                if (I.option("columns") > 1 && I.option("rows") <= 1) {
                    if (Math.abs(T) >= I.ppf.x) {
                        M.x = M.x + S * I.ppf.x;
                        M.y = U.y;
                        I.jump(I.current.row, I.current.col + (0 - S))
                    } else {
                        if (Math.abs(X) >= I.ppf.y) {
                            M.x = U.x;
                            M.y = M.y + W * I.ppf.y;
                            I.jump(I.current.row, I.current.col + (0 - W))
                        }
                    }
                } else {
                    if (I.option("columns") > 1 && Math.abs(T) >= I.ppf.x) {
                        M.x = M.x + S * I.ppf.x;
                        I.jump(I.current.row, I.current.col + (0 - S))
                    }
                }
                O = setTimeout(function(Y) {
                    this.spos = Y;
                    this.date = u.now()
                }.jBind(L, U), 50)
            }
            return false
        };
        if (this._autospin.cancelable) {
            f(this.option("spin") == "drag" ? document : this.o).jAddEvent(k.mousemove, this.mMoveEvent);
            if (u.browser.touchScreen) {
                f(this.option("spin") == "drag" ? document : this.o).jAddEvent("touchmove", this.mMoveEvent)
            }
        }
        this.mHoverEvent = function(S) {
            if (S.pointerType && ("touch" === S.pointerType || S.pointerType === S.MSPOINTER_TYPE_TOUCH)) {
                return true
            }
            if (H || R) {
                H && I.magnifier.div.show() && I.magnifier.animate(S);
                return false
            }
            if (I._autospin.frames > 0 && "hover" == I.option("autospin-stop")) {
                I._autospin.pause()
            } else {
                !I._autospin.invoked && f(I.option("autospin-start")).contains("hover") && (I._autospin.invoked = !I._autospin.infinite) && I._autospin.play()
            }
            M = S.jGetPageXY();
            "hover" == I.option("spin") && (I.spinStarted = true);
            return false
        };
        if (this._autospin.cancelable) {
            this.o.jAddEvent(k.mouseover, this.mHoverEvent)
        }
        this.mOutEvent = function(S) {
            if (S.pointerType && ("touch" === S.pointerType || S.pointerType === S.MSPOINTER_TYPE_TOUCH)) {
                return true
            }
            if (I.o.hasChild(S.getRelated())) {
                return true
            }
            if (I._autospin.infinite && "hover" == I.option("autospin-stop")) {
                if (H) {
                    if (I.magnifier.div.hasChild(S.getRelated())) {
                        return true
                    }
                    E(S)
                }
                I._autospin.play()
            } else {}
            return false
        };
        if (this._autospin.cancelable) {
            this.o.jAddEvent(k.mouseout, this.mOutEvent)
        }
        this.mDownEvent = function(T) {
            var S = T.isTouchEvent();
            if (3 == T.getButton()) {
                return true
            }
            if (I.hintBox) {
                I.hideHintBox()
            }
            if ((/touch/i).test(T.type) && T.touches.length > 1) {
                return true
            }
            M = T.jGetPageXY();
            K = T.jGetPageXY();
            K.autospinStopped = false;
            if (H) {
                if (S) {
                    I.magnifier.delta.x = I.magnifier.x + I.boxSize.width / I.magnifier.ratio.x / 2 - (I.boxBoundaries.right - T.jGetPageXY().x);
                    I.magnifier.delta.y = I.magnifier.y + I.boxSize.height / I.magnifier.ratio.y / 2 - (I.boxBoundaries.bottom - T.jGetPageXY().y)
                }
            }
            L.spos = T.jGetPageXY();
            L.date = u.now();
            I.option("spin") == "drag" && (M = T.jGetPageXY());
            if (H || R) {
                !S && (R = false);
                return true
            }
            if (I._autospin.frames > 0 && "click" == I.option("autospin-stop")) {
                K.autospinStopped = true;
                I._autospin.pause();
                T.stopDefaults()
            }
            P = true;
            Q = false;
            I.option("spin") == "drag" && (I.spinStarted = true) && (M = T.jGetPageXY());
            return false
        };
        if (this._autospin.cancelable) {
            if (!u.browser.mobile || !u.browser.touchScreen) {
                this.o.jAddEvent(k.mousedown, this.mDownEvent)
            }
            if (u.browser.touchScreen && this.mDownEvent) {
                this.o.jAddEvent("touchstart", this.mDownEvent)
            }
        }
        this.mDocUpEvent = function(T) {
            var S = (T.pointerType && ("touch" === T.pointerType || T.pointerType === T.MSPOINTER_TYPE_TOUCH)) || (/touch/i).test(T.type);
            if (3 == T.getButton()) {
                return true
            }
            if (H || R || !P) {
                return
            }
            L.moved = Q;
            I._checkDragFrames(L, T.jGetPageXY(), M);
            P = false;
            Q = false
        };
        if (this._autospin.cancelable) {
            f(document).jAddEvent(k.mouseup, this.mDocUpEvent);
            if (u.browser.touchScreen) {
                f(document).jAddEvent("touchend", this.mDocUpEvent)
            }
            f(document).jAddEvent(k.mouseout, function(S) {
                if (null === S.getRelated() || document.documentElement === S.getRelated()) {
                    P = false
                }
            })
        }
        this.mUpEvent = function(U) {
            var S = (U.pointerType && ("touch" === U.pointerType || U.pointerType === U.MSPOINTER_TYPE_TOUCH)) || (/touch/i).test(U.type),
                T = U.jGetPageXY();
            if (0 == Math.abs(T.x - K.x) && 0 == Math.abs(T.y - K.y)) {
                if (!H && !R) {
                    if (K.autospinStopped) {
                        return
                    }
                    if (!I._autospin.invoked && I._autospin.frames < 1 && f(I.option("autospin-start")).contains("click")) {
                        I._autospin.invoked = !I._autospin.infinite;
                        I._autospin.play();
                        return false
                    }
                }
                if (I.option("magnify")) {
                    Q = false;
                    E(U)
                }
                return false
            }
            if (H || R || !P) {
                return false
            }
            L.moved = Q;
            I._checkDragFrames(L, U.jGetPageXY(), M);
            P = false;
            Q = false;
            return false
        };
        if (this._autospin.cancelable) {
            if (!u.browser.mobile || !u.browser.touchScreen) {
                this.o.jAddEvent(k.mouseup, this.mUpEvent)
            }
            if (u.browser.touchScreen) {
                this.o.jAddEvent("touchend", this.mUpEvent)
            }
        }
        if (this._autospin.cancelable && this.option("mousewheel-step") > 0) {
            this.o.jAddEvent("mousescroll", function(S) {
                var T;
                if (I._autospin && I._autospin.frames > 0) {
                    I._autospin.pause(true)
                }
                if (H || R || I._autospin.frames > 0) {
                    return
                }
                f(S).stop();
                T = Math.abs(S.deltaY) < Math.abs(S.deltaX) ? S.deltaX : S.deltaY;
                T = S.isMouse ? ((T / Math.abs(T)) * I.option("mousewheel-step")) : (T * (8 / 54));
                clearTimeout(G);
                if (!J) {
                    J = true;
                    I.spinStarted = true
                }
                if (I.isVerticalSpin || (I.option("loop-row") && !I.option("loop-column"))) {
                    I.jump(I.current.row + (S.isMouse ? -1 : 1) * T, I.current.col, S.isMouse, 300)
                } else {
                    if (S.isMouse || I.option("rows") < 2 || Math.abs(S.deltaY) < Math.abs(S.deltaX)) {
                        I.jump(I.current.row, I.current.col + T, S.isMouse, 300)
                    } else {
                        I.jump(I.current.row + (S.isMouse ? -1 : 1) * T, I.current.col, S.isMouse, 300)
                    }
                }
                G = setTimeout(function(U) {
                    J = false
                }, 200)
            })
        }
        if (this._autospin.cancelable && !("infinite" == this.option("autospin") && f(this.option("autospin-start")).contains("click")) && this.option("magnify")) {
            H = false;
            if ("inner" != this.option("magnifier-shape")) {
                var B = "" + this.option("magnifier-width");
                if (B.match(/\%$/i)) {
                    B = Math.round(this.size.width * parseInt(B) / 100)
                } else {
                    B = parseInt(B)
                }
            }
            this.o.jAddClass("zoom-in");
            this.magnifier = {
                div: u.$new("div", null, {
                    position: "absolute",
                    "z-index": 9999,
                    left: 0,
                    top: 0,
                    width: (B || this.boxSize.width) + "px",
                    height: (B || this.boxSize.height) + "px",
                    "background-repeat": "no-repeat",
                    "border-radius": ("circle" != I.option("magnifier-shape")) ? 0 : B / 2
                }).jAddEvent("dragstart selectstart", function(S) {
                    S.stop()
                }),
                image: null,
                ratio: {
                    x: 0,
                    y: 0
                },
                pos: {
                    x: 0,
                    y: 0
                },
                delta: {
                    x: 0,
                    y: 0
                },
                size: {
                    width: (B || this.boxSize.width),
                    height: (B || this.boxSize.height)
                },
                ddx: 0,
                ddy: 0,
                fadeFX: null,
                moveTimer: null,
                startTime: null,
                spin: this,
                start: function(T, U, S) {
                    if (!I.canMagnify) {
                        return
                    }
                    if ("inner" == I.option("magnifier-shape")) {
                        this.ratio.x = I.zoomSize.width / I.boxSize.width;
                        this.ratio.y = I.zoomSize.height / I.boxSize.height
                    } else {
                        this.ratio.x = I.zoomSize.width / I.size.width;
                        this.ratio.y = I.zoomSize.height / I.size.height
                    }
                    H = true;
                    P = false;
                    if ("inner" == I.option("magnifier-shape")) {
                        this.size = I.zoomSize;
                        this.div.jSetCss({
                            width: "100%",
                            height: "100%"
                        })
                    }
                    this.image = f(T.img);
                    this.image.jSetCss({
                        width: I.zoomSize.width,
                        height: I.zoomSize.height
                    }).jAppendTo(this.div);
                    this.div.jSetOpacity(0);
                    this.div.jAppendTo(I.isFullScreen ? I.fullScreenBox : I.wrapper);
                    I.o.jRemoveClass("zoom-in");
                    this.animate(null, U, S);
                    this.fadeFX.stop();
                    this.fadeFX.options.duration = 400;
                    this.fadeFX.options.onComplete = function() {
                        I.option("onzoomin").call(null, I.o)
                    };
                    this.fadeFX.start({
                        opacity: [0, 1]
                    });
                    this.registerEvents()
                },
                stop: function(S) {
                    this.unRegisterEvents();
                    H = false;
                    R = false;
                    this.fadeFX.stop();
                    this.fadeFX.options.onComplete = function() {
                        clearTimeout(I.magnifier.moveTimer);
                        I.magnifier.moveTimer = null;
                        I.magnifier.image.jRemove();
                        I.magnifier.div.jRemove();
                        I.magnifier.pos = {
                            x: 0,
                            y: 0
                        };
                        I.magnifier.delta = {
                            x: 0,
                            y: 0
                        };
                        I.magnifier.ddx = 0;
                        I.magnifier.ddy = 0;
                        I.o.jAddClass("zoom-in");
                        I.option("onzoomout").call(null, I.o)
                    };
                    this.fadeFX.options.duration = 200;
                    this.fadeFX.start({
                        opacity: [this.fadeFX.el.jGetCss("opacity"), 0]
                    })
                },
                animate: function(W, V, U) {
                    if (!H) {
                        return
                    }
                    var T, X, S = U || (W && W.isTouchEvent()) || false;
                    if (W) {
                        if (S && !W.isPrimaryTouch()) {
                            return
                        }
                        f(W).stopDefaults()
                    }
                    V = V || W.jGetPageXY();
                    if (V.x > I.boxBoundaries.right || V.x < I.boxBoundaries.left || V.y > I.boxBoundaries.bottom || V.y < I.boxBoundaries.top) {
                        return
                    }
                    if (W && S) {
                        W.stop()
                    }
                    this.touchEvent = S;
                    if ("inner" === I.option("magnifier-shape")) {
                        V.x -= this.delta.x;
                        V.y -= this.delta.y;
                        if (this.ratio.x <= 1) {
                            T = I.boxSize.width / 2;
                            T -= I.boxSize.width / this.ratio.x / 2
                        } else {
                            T = (W && S) ? (I.boxBoundaries.right - V.x) : V.x - I.boxBoundaries.left;
                            T -= I.boxSize.width / this.ratio.x / 2;
                            T = Math.max(0, Math.min(T, I.boxSize.width - I.boxSize.width / this.ratio.x))
                        }
                        if (this.ratio.y <= 1) {
                            X = I.boxSize.height / 2;
                            X -= I.boxSize.height / this.ratio.y / 2
                        } else {
                            X = (W && S) ? (I.boxBoundaries.bottom - V.y) : V.y - I.boxBoundaries.top;
                            X -= I.boxSize.height / this.ratio.y / 2;
                            X = Math.max(0, Math.min(X, I.boxSize.height - I.boxSize.height / this.ratio.y))
                        }
                    } else {
                        T = V.x;
                        X = V.y
                    }
                    this.x = T;
                    this.y = X;
                    if (!this.moveTimer) {
                        this.move(1)
                    }
                },
                move: function(V) {
                    var Y, X, aa, Z, W, U, T, S;
                    isFinite(V) || (V = 0.2);
                    if ("inner" != I.option("magnifier-shape")) {
                        clearTimeout(this.moveTimer);
                        this.moveTimer = null;
                        Y = this.x;
                        X = this.y;
                        W = Math.round(Y - this.size.width / 2) - I.boxBoundaries.left;
                        U = Math.round(X - this.size.height / 2) - I.boxBoundaries.top;
                        if (this.touchEvent) {
                            U -= this.size.height / 2 + 22
                        }
                        T = Math.round(0 - ((Y - I.boundaries.left - I.borders.x) * this.ratio.x - (this.size.width / 2)));
                        S = Math.round(0 - ((X - I.boundaries.top - I.borders.y) * this.ratio.y - (this.size.height / 2)))
                    } else {
                        aa = Math.ceil((this.x - this.ddx) * V);
                        Z = Math.ceil((this.y - this.ddy) * V);
                        if (!aa && !Z) {
                            clearTimeout(this.moveTimer);
                            this.moveTimer = null;
                            return
                        }
                        this.ddx += aa;
                        this.ddy += Z;
                        W = 0;
                        U = 0;
                        T = -(this.ddx * (this.size.width / I.boxSize.width));
                        S = -(this.ddy * (this.size.height / I.boxSize.height))
                    }
                    if (H) {
                        this.div.jSetCss({
                            left: W,
                            top: U
                        });
                        this.image.jSetCss(u.browser.features.transform ? 9 === u.browser.ieMode || u.browser.presto ? {
                            top: 0,
                            left: 0,
                            transform: "translate(" + T + "px," + S + "px)"
                        } : {
                            top: 0,
                            left: 0,
                            transform: "translate3d(" + T + "px," + S + "px, 0)"
                        } : {
                            left: T,
                            top: S
                        })
                    }
                    if ("inner" == I.option("magnifier-shape")) {
                        this.moveTimer = setTimeout(this.moveBind, 40)
                    }
                },
                registerEvents: function() {
                    var S = I.isFullScreen ? I.fullScreenBox : I.wrapper;
                    if (I._autospin.cancelable) {
                        if (!u.browser.mobile || !u.browser.touchScreen) {
                            S.jAddEvent(k.mousedown, I.mDownEvent);
                            S.jAddEvent(k.mouseup, I.mUpEvent)
                        }
                        S.jAddEvent(k.mousemove, this.animateBind);
                        if (u.browser.touchScreen) {
                            S.jAddEvent("touchstart", I.mDownEvent);
                            S.jAddEvent("touchend", I.mUpEvent);
                            S.jAddEvent("touchmove", this.animateBind)
                        }
                    }
                },
                unRegisterEvents: function() {
                    var S = I.isFullScreen ? I.fullScreenBox : I.wrapper;
                    if (I._autospin.cancelable) {
                        if (!u.browser.mobile || !u.browser.touchScreen) {
                            S.jRemoveEvent(k.mousedown, I.mDownEvent);
                            S.jRemoveEvent(k.mouseup, I.mUpEvent)
                        }
                        S.jRemoveEvent(k.mousemove, this.animateBind);
                        if (u.browser.touchScreen) {
                            S.jRemoveEvent("touchstart", I.mDownEvent);
                            S.jRemoveEvent("touchend", I.mUpEvent);
                            S.jRemoveEvent("touchmove", this.animateBind)
                        }
                    }
                }
            };
            this.magnifier.fadeFX = new u.FX(this.magnifier.div);
            this.magnifier.animateBind = this.magnifier.animate.jBindAsEvent(this.magnifier);
            this.magnifier.moveBind = this.magnifier.move.jBind(this.magnifier);
            this.magnifier.div.jAddClass("m360-magnifier").jAddClass("m360-magnifier-" + this.option("magnifier-shape"));
            if ("inner" != this.option("magnifier-shape")) {
                I.magnifier.div.jAddEvent("mousescroll", function(U) {
                    var T = U.isMouse ? 5 : 8 / 54,
                        S;
                    f(U).stop();
                    T = (100 + T * Math.abs(U.delta)) / 100;
                    if (U.delta < 0) {
                        T = 1 / T
                    }
                    S = Math.max(100, Math.round(I.magnifier.size.width * T));
                    S = Math.min(S, I.size.width);
                    this.jSetCss({
                        width: S,
                        height: S,
                        "border-radius": ("circle" != I.option("magnifier-shape")) ? 0 : S / 2
                    });
                    I.magnifier.size = this.jGetSize();
                    I.magnifier.move(1)
                })
            }
            var F = this.loader = u.$new("div").jAddClass("m360-magnifier-loader-holder").append(u.$new("div").jAddClass("m360-loader")).jAddEvent(k.mousedown + " " + k.mousemove, function(S) {
                S.stopDistribution()
            });
            F.toggle = function(S) {
                if (S) {
                    F.timer = setTimeout(function() {
                        I.o.append(F)
                    }, 400)
                } else {
                    if (F.timer) {
                        clearTimeout(F.timer);
                        F.timer = false
                    }
                    (I.o === this.parentNode) && I.o.removeChild(F)
                }
            };

            function E(X, T) {
                var W, V, U, S = false;
                if (Q) {
                    return
                }
                if (!I.canMagnify) {
                    return
                }
                if (u.jTypeOf(X) == "event") {
                    S = (X.pointerType && ("touch" === X.pointerType || X.pointerType === X.MSPOINTER_TYPE_TOUCH)) || (/touch/i).test(X.type);
                    if ((U = f(X.getTarget())).jHasClass("icon")) {
                        if (H && U.jHasClass("magnify")) {
                            return
                        }
                        if (!H && U.jHasClass("spin")) {
                            return
                        }
                    }
                    X.stop()
                }
                if (H && T) {
                    return
                }
                if (!H && false == T) {
                    return
                }
                if (H && !T) {
                    I.magnifier.stop(u.jTypeOf(X) == "event" ? X.jGetPageXY() : null);
                    U && U.jHasClass("spin") && I._autospin.infinite && I._autospin.play()
                } else {
                    W = I.checkJumpRowCol(I.current.row, I.current.col);
                    V = (u.jTypeOf(X) == "event") ? X.jGetPageXY() : X;
                    F && F.toggle(true);
                    R = true;
                    P = false;
                    I._autospin.pause();
                    new u.ImageLoader(I.getImageURL(W.row + 1, W.col + 1, "zoom"), {
                        onload: f(function(Z, Y) {
                            I.resizeCallback();
                            I.magnifier.start(Y, V, Z)
                        }).jBind(null, S),
                        onerror: function() {
                            R = false
                        },
                        oncomplete: function() {
                            F && F.toggle(false)
                        }
                    })
                }
                return false
            }
            this._showM = E.jBind(this, {
                x: I.boxBoundaries.left + (I.boxBoundaries.right - I.boxBoundaries.left) / 2,
                y: I.boxBoundaries.top + (I.boxBoundaries.bottom - I.boxBoundaries.top) / 2
            }, true);
            this._hideM = E.jBind(this, null, false)
        }
        if (this._autospin.cancelable && this.option("fullscreen")) {
            this.fullscreenIcon = u.$new("button").jAddClass("m360-icon m360-icon-fullscreen-open").jAddEvent(k.mousedown, function(S) {
                S.stopDistribution()
            }).jAddEvent("click", function(S) {
                if (3 == S.getButton()) {
                    return true
                }
                S.stop();
                this.enterFullscreen();
                return false
            }.jBindAsEvent(this)).jAppendTo(this.wrapper);
            u.browser.touchScreen && this.fullscreenIcon.jAddEvent("touchstart", function(S) {
                S.stopDistribution()
            })
        }
        this.resizeCallback();
        if (this._autospin.maxFrames > 0 && f(this.option("autospin-start")).contains("load")) {
            this._autospin.play()
        } else {
            this.jump(this.currentFrame.row, this.currentFrame.col);
            if (this.option("rows") * this.option("columns") > 1 && this.option("hint") && this._autospin.cancelable) {
                this.setupHint()
            }
        }
        var N = f(this.o).jFetch("cr");
        if (N) {
            f(this.o).append(N)
        }
        ("function" == u.jTypeOf(this.option("onready"))) && this.option("onready").call(null, this.o)
    };
    w.prototype._checkDragFrames = function(F, E, G) {
        if (!this.option("smoothing") || !F.date) {
            return
        }
        var D = u.now() - F.date;
        F.date = false;
        if (D <= 0) {
            return
        }
        if (D < 50) {
            D = 50
        }
        var C = 0.01;
        ppf = this.ppf, loopR = this.option("loop-row") && this.loadedRows.count == this.option("rows"), loopC = this.option("loop-column"), dx = E.x - F.spos.x, dy = E.y - F.spos.y;

        function B(K) {
            var L = K == "x" ? dx : dy;
            var H = L / D;
            var J = (H / 2) * (H / C);
            var I;
            if (K == "x") {
                if (Math.abs(dx) < Math.abs(dy)) {
                    I = J - (F.spos.x - G.x)
                } else {
                    I = Math.abs(L + (L > 0 ? J : (0 - J))) - Math.abs(F.spos.x - G.x);
                    I = L > 0 ? (0 - I) : I
                }
            } else {
                if (!loopR || Math.abs(dx) >= Math.abs(dy)) {
                    I = J - (F.spos.y - G.y)
                } else {
                    I = Math.abs(L + (L > 0 ? J : (0 - J))) - Math.abs(F.spos.y - G.y);
                    I = L > 0 ? (0 - I) : I
                }
            }
            I /= ppf[K];
            return I > 0 ? Math.floor(I) : Math.ceil(I)
        }
        this.jump(this.current.row + B("y"), this.current.col + B("x"), true, 2 * Math.abs(Math.floor(Math.max(Math.abs(dx), Math.abs(dy)) / D / C)))
    };
    w.prototype.jump = function(E, C, B, D) {
        this.current.row = E;
        this.current.col = C;
        this.fx && this.fx.stop();
        if (!B) {
            this.current.tmp.row = E;
            this.current.tmp.col = C;
            this.jump_(E, C);
            return
        }
        this.fx = new u.FX(this.o, {
            duration: D,
            transition: u.FX.Transition.quadOut,
            onBeforeRender: (function(F) {
                this.current.tmp.col = F.col;
                this.current.tmp.row = F.row;
                this.jump_(F.row, F.col)
            }).jBind(this)
        }).start({
            col: [this.current.tmp.col, C],
            row: [this.current.tmp.row, E]
        })
    };
    w.prototype.checkJumpRowCol = function(E, C) {
        var B, D;
        E = Math.round(E);
        C = Math.round(C);
        if (this.option("loop-row")) {
            E %= this.option("rows");
            E < 0 && (E += this.option("rows"))
        }
        if (this.loadedRows.indexes.contains(E)) {
            E = this.loadedRows.indexes.indexOf(E)
        } else {
            var B = (E - this.currentFrame.row) / Math.abs(E - this.currentFrame.row);
            var D = this.loadedRows.indexes.filter(function(F) {
                return (F - E) * B > 0
            });
            E = D.length ? this.loadedRows.indexes.indexOf(D[(B < 0) ? D.length - 1 : 0]) : (!this.option("loop-row") || this.loadedRows.count < this.option("rows")) ? this.loadedRows.indexes.indexOf(this.currentFrame.row) : (B < 0 ? this.loadedRows.count - 1 : 0)
        }
        if (!this.option("loop-column") && (!this._autospin || this._autospin.frames < 1)) {
            C > (this.option("columns") - 1) && (C = this.option("columns") - 1);
            C < 0 && (C = 0)
        }
        C %= this.option("columns");
        C < 0 && (C += this.option("columns"));
        (!this.option("loop-column")) && (this.current.col = C);
        this.currentFrame = {
            row: this.loadedRows.indexes[E],
            col: C
        };
        if (!this.option("loop-row") || this.loadedRows.count < this.option("rows")) {
            this.current.row = this.currentFrame.row
        }
        return u.detach(this.currentFrame)
    };
    w.prototype.jump_ = function(F, B) {
        var D = this.checkJumpRowCol(F, B),
            E, C, G;
        F = D.row;
        B = D.col;
        E = this.images.small[F][B];
        if (this.isFullScreen && !(l && this.useMultiBackground && this.imageQueue.fullscreen.length) && this.images.fullscreen[F] && this.images.fullscreen[F][B] && this.images.fullscreen[F][B].loaded) {
            E = this.images.fullscreen[F][B]
        }
        if (!E.loaded) {
            return
        }
        if (u.browser.features.canvas) {
            this.ctxDraw(E.cachedObject)
        } else {
            this.imgContext.src = E.url
        }
		
		this.option("actionspin").call(null, this.o, B);
        if (this.spinStarted && (!this.lastFrame || this.lastFrame.row != F || this.lastFrame.col != B)) {
            this.option("onspin").call(null, this.o);
            this.spinStarted = false;
            if (this.hintBox) {
                this.hideHintBox()
            }
        }
        this.lastFrame = D
    };
    w.prototype.ctxDraw = function(D) {
        var C = 0,
            H = this.size.width,
            F = this.size.height,
            B = D.naturalWidth,
            G = D.naturalHeight;
        if ((window.devicePixelRatio || 1) >= 2 && ((B * G) / (H * F) >= 2)) {
            H *= 2;
            F *= 2
        }
        C = Math.ceil(Math.log(Math.max(D.naturalWidth / H, D.naturalHeight / F)) / Math.LN2);
        this.backstageCanvas.width = B;
        this.backstageCanvas.height = G;
        this.backstageCanvas2.width = B;
        this.backstageCanvas2.height = G;
        this.backstageCtx.drawImage(D, 0, 0, B, G);
        for (var E = C - 1; E > 0; E--) {
            this.backstageCanvas2.width *= 0.5;
            this.backstageCanvas2.height *= 0.5;
            this.backstageCtx2.drawImage(this.backstageCanvas, 0, 0, this.backstageCanvas.width, this.backstageCanvas.height, 0, 0, this.backstageCanvas2.width, this.backstageCanvas2.height);
            this.backstageCanvas.width *= 0.5;
            this.backstageCanvas.height *= 0.5;
            this.backstageCtx.drawImage(this.backstageCanvas2, 0, 0, this.backstageCanvas2.width, this.backstageCanvas2.height, 0, 0, this.backstageCanvas.width, this.backstageCanvas.height)
        }
        this.canvas.width = H;
        this.canvas.height = F;
        this.canvasContext.drawImage(this.backstageCanvas, 0, 0, this.backstageCanvas.width, this.backstageCanvas.height, 0, 0, this.canvas.width, this.canvas.height)
    };
    w.prototype.reflow = function() {
        var B, D, C;
        this.boundaries = this.o.jGetRect();
        this.boxSize = this.wrapper.jGetSize();
        this.boxBoundaries = this.wrapper.jGetRect();
        if (this.isFullScreen) {
            D = f(document).jGetSize();
            C = this.fullScreenSize.width / this.fullScreenSize.height;
            if (u.browser.trident && u.browser.backCompat) {
                this.fullScreenBox.jSetCss({
                    width: D.width,
                    height: D.height
                })
            }
            this.boxSize = this.fullScreenBox.jGetSize();
            this.boxBoundaries = this.fullScreenBox.jGetRect();
            this.o.jSetCss(this.adjustFSSize(D))
        }
        B = f(this.o).jGetSize();
        if (this.isFullScreen && 11 == u.browser.ieMode && window.parent !== window.window) {
            this.boxSize.width = this.fullScreenBox.clientWidth;
            this.boxSize.height = this.fullScreenBox.clientHeight;
            B.width = this.o.clientWidth;
            B.height = this.o.clientHeight
        }
        if (B.width <= 0 || B.height <= 0) {
            return
        }
        B.width -= this.borders.x;
        B.height -= this.borders.y;
        this.size = B;
        if (this.option("magnify")) {
            if ((this.size.width * this.size.height) / (this.zoomSize.width * this.zoomSize.height) > 0.8) {
                this._hideM && this._hideM();
                this.canMagnify = false;
                this.o.jRemoveClass("zoom-in")
            } else {
                this.canMagnify = true;
                this.o.jAddClass("zoom-in")
            }
        }
        this.ppf = {
            x: this.size.width / this.option("columns") / Math.pow(this.option("sensitivityX") / 50, 2),
            y: this.size.height / this.option("rows") / Math.pow(this.option("sensitivityY") / 50, 2)
        };
        if (this.current) {
            this.jump_(this.current.row, this.current.col)
        }
    };
    w.prototype.spin = function(B) {
        (this._hideM) && this._hideM();
        if (this.hintBox) {
            this.hideHintBox()
        }
        this.spinStarted = true;
        (B || null) ? this.jump(this.current.row, this.current.col + B, true, 100 * (Math.log(Math.abs(B) / Math.log(2)))): this._autospin.play(Number.MAX_VALUE)
    };
    w.prototype.rotate = function(B, C) {
        if (!B) {
            B = 0
        }
        if (!C) {
            C = 0
        }
        if (!B && !C) {
            return
        }
        if (this._hideM) {
            this._hideM()
        }
        if (this.hintBox) {
            this.hideHintBox()
        }
        this.spinStarted = true;
        this.jump(this.current.row + C, this.current.col + B, true, 100 * (Math.log(Math.max(Math.abs(B), Math.abs(C)) / Math.log(2))))
    };
    w.prototype.rotateX = function(B) {
        this.rotate(B, 0)
    };
    w.prototype.rotateY = function(B) {
        this.rotate(0, B)
    };
    w.prototype.magnify = function(B) {
        (u.defined(B) ? B : true) ? this._showM && this._showM(): this._hideM && this._hideM()
    };
    w.prototype.stop = function() {
        var D, B, E, C = window.URL || window.webkitURL || null;
        if (this._autospin && this._autospin.frames > 0) {
            this._autospin.pause()
        }
        if (this.isFullScreen) {
            this.o.firstChild.jSetCss({});
            this.o.jSetCss({
                width: "",
                height: "100%",
                "max-height": "",
                "max-width": ""
            }).jAppendTo(this.wrapper)
        }
        if (this.fullScreenBox) {
            if (this.fullScreenScrollCallback) {
                f(window).jRemoveEvent("scroll", this.fullScreenScrollCallback)
            }
            if (this.fullScreenScrollCallbackTimer) {
                clearTimeout(this.fullScreenScrollCallbackTimer)
            }
            this.fullScreenBox.kill();
            this.fullScreenBox = null
        }
        if (this.magnifier && this.magnifier.div) {
            this.magnifier.div.kill();
            this.magnifier = null
        }
        if (this.fullscreenIcon) {
            this.fullscreenIcon.kill();
            this.fullscreenIcon = null
        }
        f(window).jRemoveEvent("resize", this.resizeCallback);
        clearTimeout(this.reflowTimer);
        this.reflowTimer = null;
        this.o.jClearEvents();
        while (this.o.firstChild != this.o.lastChild) {
            this.o.removeChild(this.o.lastChild)
        }
        if (this.option("spin") == "drag") {
            f(document).jRemoveEvent([k.mousemove, "touchmove"], this.mMoveEvent)
        }
        f(document).jRemoveEvent([k.mouseup, k.mouseout, "touchend"], this.mDocUpEvent);
        this.o.replaceChild(this.oi, this.o.firstChild);
        this.o.jSetCssProp("background", "");
        this.o.jRemoveClass("zoom-in");
        if (this.wrapper) {
            this.wrapper.parentNode.replaceChild(this.o, this.wrapper);
            this.wrapper.kill();
            this.wrapper = null
        }
        for (D = 0, B = this.addedCSS.length; D < B; D++) {
            u.removeCSS("leoimage360-css", this.addedCSS[D])
        }
        f(this.imgCacheBox).jRemove();
        if (C) {
            for (E in this.imageMap) {
                f(this.imageMap[E]).jEach(function(G) {
                    var F = G.img.bgURL.replace(/^url\s*\(\s*["']?/, "").replace(/["']?\s*\)$/, "");
                    if (/^blob\:/.test(F)) {
                        C.revokeObjectURL(F)
                    }
                })
            }
        }
    };
    w.prototype.enterFullscreen = function() {
        if (!this._autospin.cancelable || !this.option("fullscreen")) {
            return
        }
        this._hideM && this._hideM();
        var E = f(document).jGetSize(),
            D = f(window).jGetScroll(),
            C = f(document).jGetFullSize(),
            B = window.parent !== window.window;
        if (B) {
            if (C.height <= E.height) {
                D.y = this.boxBoundaries.top
            }
            E.height = Math.min(E.height, this.fullScreenSize.height);
            if (E.height + D.y > C.height) {
                E.width -= u.browser.scrollbarsWidth
            }
        }
        if (!this.fullScreenBox) {
            this.fullScreenBox = u.$new("div", {}, {
                display: "block",
                overflow: "hidden",
                position: "absolute",
                zIndex: 20000,
                "text-align": "center",
                "vertical-align": "middle",
                opacity: 1,
                width: this.boxSize.width,
                height: this.boxSize.height,
                top: this.boxBoundaries.top,
                left: this.boxBoundaries.left
            }).jAddClass(c + "-fullscreen");
            if (!u.browser.touchScreen || !u.browser.mobile) {
                this.fullScreenBox.jAddClass("desktop")
            }
            if (u.browser.ieMode) {
                this.fullScreenBox.jAddClass("leoimage-for-ie" + u.browser.ieMode)
            }
            if (u.browser.ieMode && u.browser.ieMode < 8) {
                this.fullScreenBox.append(u.$new("span", null, {
                    display: "inline-block",
                    height: "100%",
                    width: 1,
                    "vertical-align": "middle"
                }))
            }
            this.adjustFSSize = function(I) {
                var F, H, G = this.fullScreenSize.width / this.fullScreenSize.height;
                F = Math.min(this.fullScreenSize.width, I.width * 0.98);
                H = Math.min(this.fullScreenSize.height, I.height * 0.98);
                if (F / H > G) {
                    F = H * G
                } else {
                    if (F / H <= G) {
                        H = F / G
                    }
                }
                return {
                    width: Math.floor(F),
                    height: Math.floor(H)
                }
            };
            if (u.browser.trident && u.browser.backCompat) {
                this.fullScreenScrollCallback = function() {
                    var F = f(window).jGetScroll(),
                        G = this.fullScreenBox.jGetPosition();
                    this.fullScreenScrollCallbackTimer && clearTimeout(this.fullScreenScrollCallbackTimer);
                    this.fullScreenScrollCallbackTimer = setTimeout(function() {
                        new u.FX(this.fullScreenBox, {
                            duration: 250
                        }).start({
                            top: [G.top, F.y],
                            left: [G.left, F.x]
                        })
                    }.jBind(this), 300)
                }.jBind(this)
            }
            if (this._autospin.cancelable) {
                if (!u.browser.mobile || !u.browser.touchScreen) {
                    this.fullScreenBox.jAddEvent(k.mousedown, this.mDownEvent);
                    this.fullScreenBox.jAddEvent(k.mouseup, this.mUpEvent)
                }
                if (u.browser.touchScreen) {
                    this.fullScreenBox.jAddEvent("touchstart", this.mDownEvent);
                    this.fullScreenBox.jAddEvent("touchend", this.mUpEvent)
                }
            }
        }
        this.fullScreenImage || (this.fullScreenImage = f(this.o.firstChild.cloneNode(false)).jSetCss({
            position: "relative",
            "z-index": 1
        }));
        this.fullScreenImage.jSetCss({
            "margin-top": "-100%",
            "margin-left": "100%"
        }).jSetOpacity(0);
        if (E.width / E.height > this.fullScreenSize.width / this.fullScreenSize.height) {
            this.fullScreenImage.jSetCss({
                width: "auto",
                height: "98%",
                "max-height": this.fullScreenSize.height,
                display: "inline-block",
                "vertical-align": "middle"
            })
        } else {
            this.fullScreenImage.jSetCss({
                width: "98%",
                "max-width": this.fullScreenSize.width,
                height: "auto",
                display: "inline-block",
                "vertical-align": "middle"
            })
        }
        this.fullScreenBox.jAppendTo(document.body).append(this.fullScreenImage);
        this.fullScreenBox.show();
        this.o.jSetCss({
            "max-width": this.fullScreenSize.width,
            "max-height": this.fullScreenSize.height,
            width: this.fullScreenImage.jGetSize().width + this.borders.x,
            height: "auto",
            "background-size": this.fullScreenImage.jGetSize().width + "px " + this.fullScreenImage.jGetSize().height + "px",
            "z-index": 2
        }).jAppendTo(this.fullScreenBox, "top");
        s.browser.features.fullScreen && this.fullScreenBox.jSetOpacity(1);
        s.browser.fullScreen.request(this.fullScreenBox, {
            onEnter: this.onEnteredFullScreen.jBind(this),
            onExit: this.onExitFullScreen.jBind(this),
            fallback: function() {
                this.fullScreenFX || (this.fullScreenFX = new u.FX(this.fullScreenBox, {
                    duration: 400,
                    transition: u.FX.Transition.expoOut,
                    onStart: (function() {
                        this.fullScreenBox.jSetCss({
                            width: this.boxSize.width,
                            height: this.boxSize.height,
                            top: this.boxBoundaries.top,
                            left: this.boxBoundaries.left
                        }).jAppendTo(document.body)
                    }).jBind(this),
                    onAfterRender: (function(F) {
                        this.o.jSetCss(this.fullScreenImage.jGetSize());
                        this.size = this.o.jGetSize();
                        this.jump_(this.current.row, this.current.col)
                    }).jBind(this),
                    onComplete: (function() {
                        this.onEnteredFullScreen(true)
                    }).jBind(this)
                }));
                this.fullScreenFX.start({
                    width: [this.boxSize.width, E.width],
                    height: [this.boxSize.height, E.height],
                    top: [this.boxBoundaries.top, 0 + D.y],
                    left: [this.boxBoundaries.left, 0 + D.x],
                    opacity: [0, 1]
                })
            }.jBind(this)
        })
    };
    w.prototype.onEnteredFullScreen = function(I) {
        var G, B, E = 0,
            H = 0,
            C = window.parent !== window.window,
            J, D = this.getCurrentFrame();
        if (I && !this.isFullScreen && !C && !(u.browser.trident && u.browser.backCompat)) {
            this.fullScreenBox.jSetCss({
                display: "block",
                position: "fixed",
                top: 0,
                bottom: 0,
                left: 0,
                right: 0,
                width: "auto",
                height: "auto"
            })
        }
        this.isFullScreen = true;
        this.o.firstChild.jSetCss({
            width: "100%",
            height: "auto",
            "max-width": this.fullScreenSize.width,
            "max-height": this.fullScreenSize.height
        });
        this.resizeCallback();
        if (this.firstFullScreenRun) {
            setTimeout((function() {
                this.progressBar.reset();
                this.progressBar.changePlaceholder(this.fullScreenBox);
                this.preloadImages("fullscreen", this.currentFrame.row + 1, this.currentFrame.col + 1)
            }).jBind(this), 1);
            this.firstFullScreenRun = false
        }
        this.jump_(this.current.row, this.current.col);
        if (this.fullScreenScrollCallback) {
            f(window).jAddEvent("scroll", this.fullScreenScrollCallback)
        }
        if (!this.leaveFSButton) {
            this.leaveFSButton = u.$new("button").jAddClass("m360-icon m360-icon-fullscreen-close").jAppendTo(this.fullScreenBox).jAddEvent(k.mousedown, function(K) {
                K.stopDistribution()
            }).jAddEvent("click", function(L) {
                var K;
                if (3 == L.getButton()) {
                    return true
                }
                L.stop();
                if (K = this.fullScreenBox.jFetch("fullscreen:pseudo:event:keydown")) {
                    u.doc.jRemoveEvent("keydown", K);
                    this.fullScreenBox.jDel("fullscreen:pseudo:event:keydown")
                }
                this.exitFullscreen();
                return false
            }.jBindAsEvent(this));
            u.browser.touchScreen && this.leaveFSButton.jAddEvent("touchstart", function(K) {
                K.stopDistribution()
            })
        }
        this.leaveFSButton.show();
        if (I) {
            var F = function(K) {
                if (K.keyCode == 27) {
                    u.doc.jRemoveEvent("keydown", F);
                    this.exitFullscreen()
                }
            }.jBindAsEvent(this);
            this.fullScreenBox.jStore("fullscreen:pseudo:event:keydown", F);
            u.doc.jAddEvent("keydown", F);
            !u.browser.touchScreen && (this.leaveFSMessage = new u.Message("Press ESC key to leave full-screen", 4000, this.fullScreenBox, c + "-message"))
        }
        this.fullscreenIcon.hide()
    };
    w.prototype.exitFullscreen = function() {
        var D = this.fullScreenBox.jGetSize(),
            C = this.fullScreenBox.jGetRect(),
            B = this.checkJumpRowCol(this.current.row, this.current.col);
        this.leaveFSMessage && this.leaveFSMessage.hide(0);
        this._hideM && this._hideM();
        if (D.width / D.height > this.fullScreenSize.width / this.fullScreenSize.height) {
            this.fullScreenImage.jSetCss({
                width: "auto",
                height: "98%",
                "max-height": this.fullScreenSize.height,
                display: "inline-block",
                "vertical-align": "middle"
            })
        } else {
            this.fullScreenImage.jSetCss({
                width: "98%",
                "max-width": this.fullScreenSize.width,
                height: "auto",
                display: "inline-block",
                "vertical-align": "middle"
            })
        }
        if (s.browser.fullScreen.capable && s.browser.fullScreen.enabled()) {
            s.browser.fullScreen.cancel()
        } else {
            this.leaveFSButton.hide();
            this.fullScreenExitFX || (this.fullScreenExitFX = new u.FX(this.fullScreenBox, {
                duration: 300,
                transition: u.FX.Transition.expoOut,
                onStart: (function() {
                    this.isFullScreen = false;
                    this.fullScreenBox.jSetCss({
                        position: "absolute"
                    }).jAppendTo(document.body)
                }).jBind(this),
                onAfterRender: (function(E) {
                    this.o.jSetCss(this.fullScreenImage.jGetSize());
                    this.size = this.o.jGetSize();
                    this.jump_(this.current.row, this.current.col)
                }).jBind(this),
                onComplete: (function() {
                    this.onExitFullScreen(true)
                }).jBind(this)
            }));
            this.fullScreenExitFX.start({
                width: [D.width, this.boxSize.width],
                height: [D.height, this.boxSize.height],
                top: [0 + C.top, this.boxBoundaries.top],
                left: [0 + C.left, this.boxBoundaries.left],
                opacity: [1, 0.5]
            })
        }
    };
    w.prototype.onExitFullScreen = function(C) {
        var B, D = this.getCurrentFrame();
        if (!this.fullScreenBox) {
            return
        }
        this.fullscreenProgressBox && this.fullscreenProgressBox.jRemove() && delete this.fullscreenProgressBox;
        if (this.fullScreenScrollCallback) {
            f(window).jRemoveEvent("scroll", this.fullScreenScrollCallback)
        }
        this.isFullScreen = false;
        this.o.jAppendTo(this.wrapper).jSetOpacity(0).jSetCss({
            width: "",
            height: "",
            "max-height": "",
            "max-width": "100%",
            "z-index": ""
        });
        this.o.firstChild.jSetCss({
            width: "",
            height: "",
            "max-width": "",
            "max-height": ""
        });
        this.resizeCallback();
        this.leaveFSButton.hide();
        this.fullscreenIcon.show();
        this.o.jSetOpacity(1);
        this.fullScreenBox.hide()
    };
    w.prototype.setupHint = function() {
        if (!this.hintBox) {
            this.hintBox = u.$new("div", {
                "class": "m360-hint"
            });
            this.hintMessage = u.$new("span", {
                "class": "m360-hint-message"
            }).append(document.createTextNode(this.localString(u.browser.touchScreen ? "mobile-hint-text" : "hint-text"))).jAppendTo(this.hintBox);
            f(this.hintBox).jAppendTo(this.o)
        }
        if (this.option("mousewheel-step") > 0) {
            var B = function(D) {
                this.o.jRemoveEvent("mousescroll", B);
                this.hideHintBox()
            }.jBindAsEvent(this);
            this.o.jAddEvent("mousescroll", B)
        }
        if ("hover" === this.option("spin")) {
            var C = function() {
                this.hideHintBox();
                this.o.jRemoveEvent("mousemove", C)
            }.jBindAsEvent(this);
            this.o.jAddEvent("mousemove", C)
        }
    };
    w.prototype.hideHintBox = function() {
        if (!this.hintBox || this.hintBox.hidding) {
            return
        }
        this.hintBox.hidding = true;
        new u.FX(this.hintBox, {
            duration: 200,
            onComplete: function() {
                this.hintBox.jRemove();
                delete this.hintBox
            }.jBind(this)
        }).start({
            opacity: [this.hintBox.jGetCss("opacity"), 0]
        })
    };
    w.prototype.getCurrentFrame = function() {
        var B = this.checkJumpRowCol(this.current.row, this.current.col);
        B.row++;
        B.col++;
        return B
    };
    var m = function() {
        return "mgctlbxN$M360 mgctlbxV$" + "v4.6.5".replace("v", "") + " mgctlbxL$" + "m".toUpperCase() + ((window.mgctlbx$Pltm && "string" == u.jTypeOf(window.mgctlbx$Pltm)) ? " mgctlbxP$" + window.mgctlbx$Pltm.toLowerCase() : "")
    };
    var j = f([]);
    var o = {
        version: "v4.6.5 for LeoImageToolbox.com",
        options: {},
        lang: {},
        callbacks: {},
        start: function(C) {
            var B = null;
            u.$A((C ? [f(C)] : document.byClass("LeoImage360"))).jEach((function(D) {
                if (f(D)) {
                    !j.filter(function(E) {
                        return E.o === D
                    }).length && j.push(B = new w(D))
                }
            }).jBind(this));
            return B
        },
        stop: function(E) {
            var C, D, B;
            if (E) {
                (D = r(E)) && (D = j.splice(j.indexOf(D), 1)) && D[0].stop() && (delete D[0]);
                return
            }
            while (C = j.length) {
                D = j.splice(C - 1, 1);
                D[0].stop();
                delete D[0]
            }
        },
        spin: function(D, C) {
            var B;
            (B = r(D)) && B.spin(C)
        },
        jump: function(D, C) {
            var B = null;
            if (B = r(D)) {
                B._hideM && B._hideM();
                B.hintBox && B.hideHintBox();
                B.jump(B.current.row + C, B.current.col)
            }
        },
        pause: function(C) {
            var B;
            (B = r(C)) && B._autospin.pause()
        },
        magnifyOn: function(C) {
            var B;
            (B = r(C)) && B.magnify(true)
        },
        magnifyOff: function(C) {
            var B;
            (B = r(C)) && B.magnify(false)
        },
        fullscreen: function(C) {
            var B;
            (B = r(C)) && B.enterFullscreen()
        },
        getCurrentFrame: function(D) {
            var B, C = null;
            if (B = r(D)) {
                C = B.getCurrentFrame();
                C.column = C.col;
                delete C.col
            }
            return C
		}, setCurrentFrame: function(D, row, col) {
			var B, C = null;
			if (B = r(D)) {
				B.jump(row, col);
				return true;
			}
			return false
        },
        registerCallback: function(B, C) {
            o.callbacks[B] = C
        }
    };

    function r(D) {
        var C = [],
            B = null;
        (D && (B = f(D))) && (C = j.filter(function(E) {
            return E.o === B
        }));
        return C.length ? C[0] : null
    }
    f(document).jAddEvent("domready", function() {
        m = m();
        n = u.$new("div", {
            "class": "m360-tmp-hdn-cont"
        }).jAppendTo(document.body);
        o.start()
    });
    return o
})();
