(function (window, undefined) {
    var S = {
        version: "3.0.1"
    };
    var ua = navigator.userAgent.toLowerCase();
    if (ua.indexOf("windows") > -1 || ua.indexOf("win32") > -1) {
        S.isWindows = true;
    } else {
        if (ua.indexOf("macintosh") > -1 || ua.indexOf("mac os x") > -1) {
            S.isMac = true;
        } else {
            if (ua.indexOf("linux") > -1) {
                S.isLinux = true;
            }
        }
    }
    S.isIE = ua.indexOf("msie") > -1;
    S.isIE6 = ua.indexOf("msie 6") > -1;
    S.isIE7 = ua.indexOf("msie 7") > -1;
    S.isGecko = ua.indexOf("gecko") > -1 && ua.indexOf("safari") == -1;
    S.isWebKit = ua.indexOf("applewebkit/") > -1;
    var inlineId = /#(.+)$/,
        galleryName = /^(light|shadow)box\[(.*?)\]/i,
        inlineParam = /\s*([a-z_]*?)\s*=\s*(.+)\s*/,
        fileExtension = /[0-9a-z]+$/i,
        scriptPath = /(.+\/)shadowbox\.js/i;
    var open = false,
        initialized = false,
        lastOptions = {},
        slideDelay = 0,
        slideStart, slideTimer;
    S.current = -1;
    S.dimensions = null;
    S.ease = function (state) {
            return 1 + Math.pow(state - 1, 3);
        };
    S.errorInfo = {
            fla: {
                name: "Flash",
                url: "http://www.adobe.com/products/flashplayer/"
            },
            qt: {
                name: "QuickTime",
                url: "http://www.apple.com/quicktime/download/"
            },
            wmp: {
                name: "Windows Media Player",
                url: "http://www.microsoft.com/windows/windowsmedia/"
            },
            f4m: {
                name: "Flip4Mac",
                url: "http://www.flip4mac.com/wmv_download.htm"
            }
        };
    S.gallery = [];
    S.onReady = noop;
    S.path = null;
    S.player = null;
    S.playerId = "sb-player";
    S.options = {
            animate: true,
            animateFade: true,
            autoplayMovies: true,
            continuous: false,
            enableKeys: true,
            flashParams: {
                bgcolor: "#000000",
                allowfullscreen: true
            },
            flashVars: {},
            flashVersion: "9.0.115",
            handleOversize: "resize",
            handleUnsupported: "link",
            onChange: noop,
            onClose: noop,
            onFinish: noop,
            onOpen: noop,
            showMovieControls: true,
            skipSetup: false,
            slideshowDelay: 0,
            viewportPadding: 20
        };
    S.getCurrent = function () {
            return S.current > -1 ? S.gallery[S.current] : null;
        };
    S.hasNext = function () {
            return S.gallery.length > 1 && (S.current != S.gallery.length - 1 || S.options.continuous);
        };
    S.isOpen = function () {
            return open;
        };
    S.isPaused = function () {
            return slideTimer == "pause";
        };
    S.applyOptions = function (options) {
            lastOptions = apply({}, S.options);
            apply(S.options, options);
        };
    S.revertOptions = function () {
            apply(S.options, lastOptions);
        };
    S.init = function (options, callback) {
            if (initialized) {
                return;
            }
            initialized = true;
            if (S.skin.options) {
                apply(S.options, S.skin.options);
            }
            if (options) {
                apply(S.options, options);
            }
            if (!S.path) {
                var path, scripts = document.getElementsByTagName("script");
                for (var i = 0, len = scripts.length; i < len; ++i) {
                    path = scriptPath.exec(scripts[i].src);
                    if (path) {
                        S.path = path[1];
                        break;
                    }
                }
            }
            if (callback) {
                S.onReady = callback;
            }
            bindLoad();
        };
    S.open = function (obj) {
            if (open) {
                return;
            }
            var gc = S.makeGallery(obj);
            S.gallery = gc[0];
            S.current = gc[1];
            obj = S.getCurrent();
            if (obj == null) {
                return;
            }
            S.applyOptions(obj.options || {});
            filterGallery();
            if (S.gallery.length) {
                obj = S.getCurrent();
                if (S.options.onOpen(obj) === false) {
                    return;
                }
                open = true;
                S.skin.onOpen(obj, load);
            }
        };
    S.close = function () {
            if (!open) {
                return;
            }
            open = false;
            if (S.player) {
                S.player.remove();
                S.player = null;
            }
            if (typeof slideTimer == "number") {
                clearTimeout(slideTimer);
                slideTimer = null;
            }
            slideDelay = 0;
            listenKeys(false);
            S.options.onClose(S.getCurrent());
            S.skin.onClose();
            S.revertOptions();
        };
    S.play = function () {
            if (!S.hasNext()) {
                return;
            }
            if (!slideDelay) {
                slideDelay = S.options.slideshowDelay * 1000;
            }
            if (slideDelay) {
                slideStart = now();
                slideTimer = setTimeout(function () {
                    slideDelay = slideStart = 0;
                    S.next();
                }, slideDelay);
                if (S.skin.onPlay) {
                    S.skin.onPlay();
                }
            }
        };
    S.pause = function () {
            if (typeof slideTimer != "number") {
                return;
            }
            slideDelay = Math.max(0, slideDelay - (now() - slideStart));
            if (slideDelay) {
                clearTimeout(slideTimer);
                slideTimer = "pause";
                if (S.skin.onPause) {
                    S.skin.onPause();
                }
            }
        };
    S.change = function (index) {
            if (!(index in S.gallery)) {
                if (S.options.continuous) {
                    index = (index < 0 ? S.gallery.length + index : 0);
                    if (!(index in S.gallery)) {
                        return;
                    }
                } else {
                    return;
                }
            }
            S.current = index;
            if (typeof slideTimer == "number") {
                clearTimeout(slideTimer);
                slideTimer = null;
                slideDelay = slideStart = 0;
            }
            S.options.onChange(S.getCurrent());
            load(true);
        };
    S.next = function () {
            S.change(S.current + 1);
        };
    S.previous = function () {
            S.change(S.current - 1);
        };
    S.setDimensions = function (height, width, maxHeight, maxWidth, topBottom, leftRight, padding) {
            var originalHeight = height,
                originalWidth = width;
            var extraHeight = 2 * padding + topBottom;
            if (height + extraHeight > maxHeight) {
                    height = maxHeight - extraHeight;
                }
            var extraWidth = 2 * padding + leftRight;
            if (width + extraWidth > maxWidth) {
                    width = maxWidth - extraWidth;
                }
            var changeHeight = (originalHeight - height) / originalHeight,
                changeWidth = (originalWidth - width) / originalWidth,
                oversized = (changeHeight > 0 || changeWidth > 0);
            if (oversized) {
                    if (changeHeight > changeWidth) {
                        width = Math.round((originalWidth / originalHeight) * height);
                    } else {
                        if (changeWidth > changeHeight) {
                            height = Math.round((originalHeight / originalWidth) * width);
                        }
                    }
                }
            S.dimensions = {
                    height: height + topBottom,
                    width: width + leftRight,
                    innerHeight: height,
                    innerWidth: width,
                    top: Math.floor((maxHeight - (height + extraHeight)) / 2 + padding),
                    left: Math.floor((maxWidth - (width + extraWidth)) / 2 + padding),
                    oversized: oversized
                };
            return S.dimensions;
        };
    S.makeGallery = function (obj) {
            var gallery = [],
                current = -1;
            if (typeof obj == "string") {
                    obj = [obj];
                }
            if (typeof obj.length == "number") {
                    each(obj, function (i, o) {
                        if (o.content) {
                            gallery[i] = o;
                        } else {
                            gallery[i] = {
                                content: o
                            };
                        }
                    });
                    current = 0;
                } else {
                    if (obj.tagName) {
                        var cacheObj = S.getCache(obj);
                        obj = cacheObj ? cacheObj : S.makeObject(obj);
                    }
                    if (obj.gallery) {
                        gallery = [];
                        var o;
                        for (var key in S.cache) {
                            o = S.cache[key];
                            if (o.gallery && o.gallery == obj.gallery) {
                                if (current == -1 && o.content == obj.content) {
                                    current = gallery.length;
                                }
                                gallery.push(o);
                            }
                        }
                        if (current == -1) {
                            gallery.unshift(obj);
                            current = 0;
                        }
                    } else {
                        gallery = [obj];
                        current = 0;
                    }
                }
            each(gallery, function (i, o) {
                    gallery[i] = apply({}, o);
                });
            return [gallery, current];
        };
    S.makeObject = function (link, options) {
            var obj = {
                content: link.href,
                title: link.getAttribute("title") || "",
                link: link
            };
            if (options) {
                options = apply({}, options);
                each(["player", "title", "height", "width", "gallery"], function (i, o) {
                    if (typeof options[o] != "undefined") {
                        obj[o] = options[o];
                        delete options[o];
                    }
                });
                obj.options = options;
            } else {
                obj.options = {};
            }
            if (!obj.player) {
                obj.player = S.getPlayer(obj.content);
            }
            var rel = link.getAttribute("rel");
            if (rel) {
                var match = rel.match(galleryName);
                if (match) {
                    obj.gallery = escape(match[2]);
                }
                each(rel.split(";"), function (i, p) {
                    match = p.match(inlineParam);
                    if (match) {
                        obj[match[1]] = match[2];
                    }
                });
            }
            return obj;
        };
    S.getPlayer = function (content) {
            if (content.indexOf("#") > -1 && content.indexOf(document.location.href) == 0) {
                return "inline";
            }
            var q = content.indexOf("?");
            if (q > -1) {
                content = content.substring(0, q);
            }
            var ext, m = content.match(fileExtension);
            if (m) {
                ext = m[0];
            }
            if (ext) {
                if (S.img && S.img.ext.indexOf(ext) > -1) {
                    return "img";
                }
                if (S.swf && S.swf.ext.indexOf(ext) > -1) {
                    return "swf";
                }
                if (S.flv && S.flv.ext.indexOf(ext) > -1) {
                    return "flv";
                }
                if (S.qt && S.qt.ext.indexOf(ext) > -1) {
                    if (S.wmp && S.wmp.ext.indexOf(ext) > -1) {
                        return "qtwmp";
                    } else {
                        return "qt";
                    }
                }
                if (S.wmp && S.wmp.ext.indexOf(ext) > -1) {
                    return "wmp";
                }
            }
            return "iframe";
        };

    function filterGallery() {
            var err = S.errorInfo,
                plugins = S.plugins,
                obj, remove, needed, m, format, replace, inlineEl, flashVersion;
            for (var i = 0; i < S.gallery.length; ++i) {
                    obj = S.gallery[i];
                    remove = false;
                    needed = null;
                    switch (obj.player) {
                    case "flv":
                    case "swf":
                        if (!plugins.fla) {
                            needed = "fla";
                        }
                        break;
                    case "qt":
                        if (!plugins.qt) {
                            needed = "qt";
                        }
                        break;
                    case "wmp":
                        if (S.isMac) {
                            if (plugins.qt && plugins.f4m) {
                                obj.player = "qt";
                            } else {
                                needed = "qtf4m";
                            }
                        } else {
                            if (!plugins.wmp) {
                                needed = "wmp";
                            }
                        }
                        break;
                    case "qtwmp":
                        if (plugins.qt) {
                            obj.player = "qt";
                        } else {
                            if (plugins.wmp) {
                                obj.player = "wmp";
                            } else {
                                needed = "qtwmp";
                            }
                        }
                        break;
                    }
                    if (needed) {
                        if (S.options.handleUnsupported == "link") {
                            switch (needed) {
                            case "qtf4m":
                                format = "shared";
                                replace = [err.qt.url, err.qt.name, err.f4m.url, err.f4m.name];
                                break;
                            case "qtwmp":
                                format = "either";
                                replace = [err.qt.url, err.qt.name, err.wmp.url, err.wmp.name];
                                break;
                            default:
                                format = "single";
                                replace = [err[needed].url, err[needed].name];
                            }
                            obj.player = "html";
                            obj.content = '<div class="sb-message">' + sprintf(S.lang.errors[format], replace) + "</div>";
                        } else {
                            remove = true;
                        }
                    } else {
                        if (obj.player == "inline") {
                            m = inlineId.exec(obj.content);
                            if (m) {
                                inlineEl = get(m[1]);
                                if (inlineEl) {
                                    obj.content = inlineEl.innerHTML;
                                } else {
                                    remove = true;
                                }
                            } else {
                                remove = true;
                            }
                        } else {
                            if (obj.player == "swf" || obj.player == "flv") {
                                flashVersion = (obj.options && obj.options.flashVersion) || S.options.flashVersion;
                                if (S.flash && !S.flash.hasFlashPlayerVersion(flashVersion)) {
                                    obj.width = 310;
                                    obj.height = 177;
                                }
                            }
                        }
                    }
                    if (remove) {
                        S.gallery.splice(i, 1);
                        if (i < S.current) {
                            --S.current;
                        } else {
                            if (i == S.current) {
                                S.current = i > 0 ? i - 1 : i;
                            }
                        }--i;
                    }
                }
        }
    function listenKeys(on) {
            if (!S.options.enableKeys) {
                return;
            }(on ? addEvent : removeEvent)(document, "keydown", handleKey);
        }
    function handleKey(e) {
            if (e.metaKey || e.shiftKey || e.altKey || e.ctrlKey) {
                return;
            }
            var code = keyCode(e),
                handler;
            switch (code) {
                case 81:
                case 88:
                case 27:
                    handler = S.close;
                    break;
                case 37:
                    handler = S.previous;
                    break;
                case 39:
                    handler = S.next;
                    break;
                case 32:
                    handler = typeof slideTimer == "number" ? S.pause : S.play;
                    break;
                }
            if (handler) {
                    preventDefault(e);
                    handler();
                }
        }
    function load(changing) {
            listenKeys(false);
            var obj = S.getCurrent();
            var player = (obj.player == "inline" ? "html" : obj.player);
            if (typeof S[player] != "function") {
                throw "unknown player " + player;
            }
            if (changing) {
                S.player.remove();
                S.revertOptions();
                S.applyOptions(obj.options || {});
            }
            S.player = new S[player](obj, S.playerId);
            if (S.gallery.length > 1) {
                var next = S.gallery[S.current + 1] || S.gallery[0];
                if (next.player == "img") {
                    var a = new Image();
                    a.src = next.content;
                }
                var prev = S.gallery[S.current - 1] || S.gallery[S.gallery.length - 1];
                if (prev.player == "img") {
                    var b = new Image();
                    b.src = prev.content;
                }
            }
            S.skin.onLoad(changing, waitReady);
        }
    function waitReady() {
            if (!open) {
                return;
            }
            if (typeof S.player.ready != "undefined") {
                var timer = setInterval(function () {
                    if (open) {
                        if (S.player.ready) {
                            clearInterval(timer);
                            timer = null;
                            S.skin.onReady(show);
                        }
                    } else {
                        clearInterval(timer);
                        timer = null;
                    }
                }, 10);
            } else {
                S.skin.onReady(show);
            }
        }
    function show() {
            if (!open) {
                return;
            }
            S.player.append(S.skin.body, S.dimensions);
            S.skin.onShow(finish);
        }
    function finish() {
            if (!open) {
                return;
            }
            if (S.player.onLoad) {
                S.player.onLoad();
            }
            S.options.onFinish(S.getCurrent());
            if (!S.isPaused()) {
                S.play();
            }
            listenKeys(true);
        }
    if (!Array.prototype.indexOf) {
            Array.prototype.indexOf = function (obj, from) {
                var len = this.length >>> 0;
                from = from || 0;
                if (from < 0) {
                    from += len;
                }
                for (; from < len; ++from) {
                    if (from in this && this[from] === obj) {
                        return from;
                    }
                }
                return -1;
            };
        }
    function now() {
            return (new Date).getTime();
        }
    function apply(original, extension) {
            for (var property in extension) {
                original[property] = extension[property];
            }
            return original;
        }
    function each(obj, callback) {
            var i = 0,
                len = obj.length;
            for (var value = obj[0]; i < len && callback.call(value, i, value) !== false; value = obj[++i]) {}
        }
    function sprintf(str, replace) {
            return str.replace(/\{(\w+?)\}/g, function (match, i) {
                return replace[i];
            });
        }
    function noop() {}
    function get(id) {
            return document.getElementById(id);
        }
    function remove(el) {
            el.parentNode.removeChild(el);
        }
    var supportsOpacity = true,
        supportsFixed = true;

    function checkSupport() {
            var body = document.body,
                div = document.createElement("div");
            supportsOpacity = typeof div.style.opacity === "string";
            div.style.position = "fixed";
            div.style.margin = 0;
            div.style.top = "20px";
            body.appendChild(div, body.firstChild);
            supportsFixed = div.offsetTop == 20;
            body.removeChild(div);
        }
    S.getStyle = (function () {
            var opacity = /opacity=([^)]*)/,
                getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
            return function (el, style) {
                    var ret;
                    if (!supportsOpacity && style == "opacity" && el.currentStyle) {
                        ret = opacity.test(el.currentStyle.filter || "") ? (parseFloat(RegExp.$1) / 100) + "" : "";
                        return ret === "" ? "1" : ret;
                    }
                    if (getComputedStyle) {
                        var computedStyle = getComputedStyle(el, null);
                        if (computedStyle) {
                            ret = computedStyle[style];
                        }
                        if (style == "opacity" && ret == "") {
                            ret = "1";
                        }
                    } else {
                        ret = el.currentStyle[style];
                    }
                    return ret;
                };
        })();
    S.appendHTML = function (el, html) {
            if (el.insertAdjacentHTML) {
                el.insertAdjacentHTML("BeforeEnd", html);
            } else {
                if (el.lastChild) {
                    var range = el.ownerDocument.createRange();
                    range.setStartAfter(el.lastChild);
                    var frag = range.createContextualFragment(html);
                    el.appendChild(frag);
                } else {
                    el.innerHTML = html;
                }
            }
        };
    S.getWindowSize = function (dimension) {
            if (document.compatMode === "CSS1Compat") {
                return document.documentElement["client" + dimension];
            }
            return document.body["client" + dimension];
        };
    S.setOpacity = function (el, opacity) {
            var style = el.style;
            if (supportsOpacity) {
                style.opacity = (opacity == 1 ? "" : opacity);
            } else {
                style.zoom = 1;
                if (opacity == 1) {
                    if (typeof style.filter == "string" && (/alpha/i).test(style.filter)) {
                        style.filter = style.filter.replace(/\s*[\w\.]*alpha\([^\)]*\);?/gi, "");
                    }
                } else {
                    style.filter = (style.filter || "").replace(/\s*[\w\.]*alpha\([^\)]*\)/gi, "") + " alpha(opacity=" + (opacity * 100) + ")";
                }
            }
        };
    S.clearOpacity = function (el) {
            S.setOpacity(el, 1);
        };

    function getTarget(e) {
            return e.target;
        }
    function getPageXY(e) {
            return [e.pageX, e.pageY];
        }
    function preventDefault(e) {
            e.preventDefault();
        }
    function keyCode(e) {
            return e.keyCode;
        }
    function addEvent(el, type, handler) {
            jQuery(el).bind(type, handler);
        }
    function removeEvent(el, type, handler) {
            jQuery(el).unbind(type, handler);
        }
    jQuery.fn.shadowbox = function (options) {
            return this.each(function () {
                var el = jQuery(this);
                var opts = jQuery.extend({}, options || {}, jQuery.metadata ? el.metadata() : jQuery.meta ? el.data() : {});
                var cls = this.className || "";
                opts.width = parseInt((cls.match(/w:(\d+)/) || [])[1]) || opts.width;
                opts.height = parseInt((cls.match(/h:(\d+)/) || [])[1]) || opts.height;
                Shadowbox.setup(el, opts);
            });
        };
    var loaded = false,
        DOMContentLoaded;
    if (document.addEventListener) {
            DOMContentLoaded = function () {
                document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
                S.load();
            };
        } else {
            if (document.attachEvent) {
                DOMContentLoaded = function () {
                    if (document.readyState === "complete") {
                        document.detachEvent("onreadystatechange", DOMContentLoaded);
                        S.load();
                    }
                };
            }
        }
    function doScrollCheck() {
            if (loaded) {
                return;
            }
            try {
                document.documentElement.doScroll("left");
            } catch (e) {
                setTimeout(doScrollCheck, 1);
                return;
            }
            S.load();
        }
    function bindLoad() {
            if (document.readyState === "complete") {
                return S.load();
            }
            if (document.addEventListener) {
                document.addEventListener("DOMContentLoaded", DOMContentLoaded, false);
                window.addEventListener("load", S.load, false);
            } else {
                if (document.attachEvent) {
                    document.attachEvent("onreadystatechange", DOMContentLoaded);
                    window.attachEvent("onload", S.load);
                    var topLevel = false;
                    try {
                        topLevel = window.frameElement === null;
                    } catch (e) {}
                    if (document.documentElement.doScroll && topLevel) {
                        doScrollCheck();
                    }
                }
            }
        }
    S.load = function () {
            if (loaded) {
                return;
            }
            if (!document.body) {
                return setTimeout(S.load, 13);
            }
            loaded = true;
            checkSupport();
            S.onReady();
            if (!S.options.skipSetup) {
                S.setup();
            }
            S.skin.init();
        };
    S.plugins = {};
    if (navigator.plugins && navigator.plugins.length) {
            var names = [];
            each(navigator.plugins, function (i, p) {
                names.push(p.name);
            });
            names = names.join(",");
            var f4m = names.indexOf("Flip4Mac") > -1;
            S.plugins = {
                fla: names.indexOf("Shockwave Flash") > -1,
                qt: names.indexOf("QuickTime") > -1,
                wmp: !f4m && names.indexOf("Windows Media") > -1,
                f4m: f4m
            };
        } else {
            var detectPlugin = function (name) {
                var axo;
                try {
                    axo = new ActiveXObject(name);
                } catch (e) {}
                return !!axo;
            };
            S.plugins = {
                fla: detectPlugin("ShockwaveFlash.ShockwaveFlash"),
                qt: detectPlugin("QuickTime.QuickTime"),
                wmp: detectPlugin("wmplayer.ocx"),
                f4m: false
            };
        }
    var relAttr = /^(light|shadow)box/i,
        expando = "shadowboxCacheKey",
        cacheKey = 1;
    S.cache = {};
    S.select = function (selector) {
            var links = [];
            if (!selector) {
                var rel;
                each(document.getElementsByTagName("a"), function (i, el) {
                    rel = el.getAttribute("rel");
                    if (rel && relAttr.test(rel)) {
                        links.push(el);
                    }
                });
            } else {
                var length = selector.length;
                if (length) {
                    if (typeof selector == "string") {
                        if (S.find) {
                            links = S.find(selector);
                        }
                    } else {
                        if (length == 2 && typeof selector[0] == "string" && selector[1].nodeType) {
                            if (S.find) {
                                links = S.find(selector[0], selector[1]);
                            }
                        } else {
                            for (var i = 0; i < length; ++i) {
                                links[i] = selector[i];
                            }
                        }
                    }
                } else {
                    links.push(selector);
                }
            }
            return links;
        };
    S.setup = function (selector, options) {
            each(S.select(selector), function (i, link) {
                S.addCache(link, options);
            });
        };
    S.teardown = function (selector) {
            each(S.select(selector), function (i, link) {
                S.removeCache(link);
            });
        };
    S.addCache = function (link, options) {
            var key = link[expando];
            if (key == undefined) {
                key = cacheKey++;
                link[expando] = key;
                addEvent(link, "click", handleClick);
            }
            S.cache[key] = S.makeObject(link, options);
        };
    S.removeCache = function (link) {
            removeEvent(link, "click", handleClick);
            delete S.cache[link[expando]];
            link[expando] = null;
        };
    S.getCache = function (link) {
            var key = link[expando];
            return (key in S.cache && S.cache[key]);
        };
    S.clearCache = function () {
            for (var key in S.cache) {
                S.removeCache(S.cache[key].link);
            }
            S.cache = {};
        };

    function handleClick(e) {
            S.open(this);
            if (S.gallery.length) {
                preventDefault(e);
            }
        }
    S.flash = (function () {
            var swfobject = function () {
                var UNDEF = "undefined",
                    OBJECT = "object",
                    SHOCKWAVE_FLASH = "Shockwave Flash",
                    SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
                    FLASH_MIME_TYPE = "application/x-shockwave-flash",
                    EXPRESS_INSTALL_ID = "SWFObjectExprInst",
                    win = window,
                    doc = document,
                    nav = navigator,
                    domLoadFnArr = [],
                    regObjArr = [],
                    objIdArr = [],
                    listenersArr = [],
                    script, timer = null,
                    storedAltContent = null,
                    storedAltContentId = null,
                    isDomLoaded = false,
                    isExpressInstallActive = false;
                var ua = function () {
                        var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
                            playerVersion = [0, 0, 0],
                            d = null;
                        if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
                                d = nav.plugins[SHOCKWAVE_FLASH].description;
                                if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) {
                                    d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
                                    playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
                                    playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
                                    playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
                                }
                            } else {
                                if (typeof win.ActiveXObject != UNDEF) {
                                    var a = null,
                                        fp6Crash = false;
                                    try {
                                            a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
                                        } catch (e) {
                                            try {
                                                a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
                                                playerVersion = [6, 0, 21];
                                                a.AllowScriptAccess = "always";
                                            } catch (e) {
                                                if (playerVersion[0] == 6) {
                                                    fp6Crash = true;
                                                }
                                            }
                                            if (!fp6Crash) {
                                                try {
                                                    a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
                                                } catch (e) {}
                                            }
                                        }
                                    if (!fp6Crash && a) {
                                            try {
                                                d = a.GetVariable("$version");
                                                if (d) {
                                                    d = d.split(" ")[1].split(",");
                                                    playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
                                                }
                                            } catch (e) {}
                                        }
                                }
                            }
                        var u = nav.userAgent.toLowerCase(),
                            p = nav.platform.toLowerCase(),
                            webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false,
                            ie = false,
                            windows = p ? /win/.test(p) : /win/.test(u),
                            mac = p ? /mac/.test(p) : /mac/.test(u);
                        /*@cc_on
                         ie = true;
                         @if (@_win32)
                         windows = true;
                         @elif (@_mac)
                         mac = true;
                         @end
                         @*/
                        return {
                                w3cdom: w3cdom,
                                pv: playerVersion,
                                webkit: webkit,
                                ie: ie,
                                win: windows,
                                mac: mac
                            };
                    }();
                var onDomLoad = function () {
                        if (!ua.w3cdom) {
                            return;
                        }
                        addDomLoadEvent(main);
                        if (ua.ie && ua.win) {
                            try {
                                doc.write("<script id=__ie_ondomload defer=true src=//:><\/script>");
                                script = getElementById("__ie_ondomload");
                                if (script) {
                                    addListener(script, "onreadystatechange", checkReadyState);
                                }
                            } catch (e) {}
                        }
                        if (ua.webkit && typeof doc.readyState != UNDEF) {
                            timer = setInterval(function () {
                                if (/loaded|complete/.test(doc.readyState)) {
                                    callDomLoadFunctions();
                                }
                            }, 10);
                        }
                        if (typeof doc.addEventListener != UNDEF) {
                            doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
                        }
                        addLoadEvent(callDomLoadFunctions);
                    }();

                function checkReadyState() {
                        if (script.readyState == "complete") {
                            script.parentNode.removeChild(script);
                            callDomLoadFunctions();
                        }
                    }
                function callDomLoadFunctions() {
                        if (isDomLoaded) {
                            return;
                        }
                        if (ua.ie && ua.win) {
                            var s = createElement("span");
                            try {
                                var t = doc.getElementsByTagName("body")[0].appendChild(s);
                                t.parentNode.removeChild(t);
                            } catch (e) {
                                return;
                            }
                        }
                        isDomLoaded = true;
                        if (timer) {
                            clearInterval(timer);
                            timer = null;
                        }
                        var dl = domLoadFnArr.length;
                        for (var i = 0; i < dl; i++) {
                            domLoadFnArr[i]();
                        }
                    }
                function addDomLoadEvent(fn) {
                        if (isDomLoaded) {
                            fn();
                        } else {
                            domLoadFnArr[domLoadFnArr.length] = fn;
                        }
                    }
                function addLoadEvent(fn) {
                        if (typeof win.addEventListener != UNDEF) {
                            win.addEventListener("load", fn, false);
                        } else {
                            if (typeof doc.addEventListener != UNDEF) {
                                doc.addEventListener("load", fn, false);
                            } else {
                                if (typeof win.attachEvent != UNDEF) {
                                    addListener(win, "onload", fn);
                                } else {
                                    if (typeof win.onload == "function") {
                                        var fnOld = win.onload;
                                        win.onload = function () {
                                            fnOld();
                                            fn();
                                        };
                                    } else {
                                        win.onload = fn;
                                    }
                                }
                            }
                        }
                    }
                function main() {
                        var rl = regObjArr.length;
                        for (var i = 0; i < rl; i++) {
                            var id = regObjArr[i].id;
                            if (ua.pv[0] > 0) {
                                var obj = getElementById(id);
                                if (obj) {
                                    regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
                                    regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
                                    if (hasPlayerVersion(regObjArr[i].swfVersion)) {
                                        if (ua.webkit && ua.webkit < 312) {
                                            fixParams(obj);
                                        }
                                        setVisibility(id, true);
                                    } else {
                                        if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
                                            showExpressInstall(regObjArr[i]);
                                        } else {
                                            displayAltContent(obj);
                                        }
                                    }
                                }
                            } else {
                                setVisibility(id, true);
                            }
                        }
                    }
                function fixParams(obj) {
                        var nestedObj = obj.getElementsByTagName(OBJECT)[0];
                        if (nestedObj) {
                            var e = createElement("embed"),
                                a = nestedObj.attributes;
                            if (a) {
                                    var al = a.length;
                                    for (var i = 0; i < al; i++) {
                                        if (a[i].nodeName == "DATA") {
                                            e.setAttribute("src", a[i].nodeValue);
                                        } else {
                                            e.setAttribute(a[i].nodeName, a[i].nodeValue);
                                        }
                                    }
                                }
                            var c = nestedObj.childNodes;
                            if (c) {
                                    var cl = c.length;
                                    for (var j = 0; j < cl; j++) {
                                        if (c[j].nodeType == 1 && c[j].nodeName == "PARAM") {
                                            e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
                                        }
                                    }
                                }
                            obj.parentNode.replaceChild(e, obj);
                        }
                    }
                function showExpressInstall(regObj) {
                        isExpressInstallActive = true;
                        var obj = getElementById(regObj.id);
                        if (obj) {
                            if (regObj.altContentId) {
                                var ac = getElementById(regObj.altContentId);
                                if (ac) {
                                    storedAltContent = ac;
                                    storedAltContentId = regObj.altContentId;
                                }
                            } else {
                                storedAltContent = abstractAltContent(obj);
                            }
                            if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
                                regObj.width = "310";
                            }
                            if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
                                regObj.height = "137";
                            }
                            doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
                            var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
                                dt = doc.title,
                                fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
                                replaceId = regObj.id;
                            if (ua.ie && ua.win && obj.readyState != 4) {
                                    var newObj = createElement("div");
                                    replaceId += "SWFObjectNew";
                                    newObj.setAttribute("id", replaceId);
                                    obj.parentNode.insertBefore(newObj, obj);
                                    obj.style.display = "none";
                                    var fn = function () {
                                        obj.parentNode.removeChild(obj);
                                    };
                                    addListener(win, "onload", fn);
                                }
                            createSWF({
                                    data: regObj.expressInstall,
                                    id: EXPRESS_INSTALL_ID,
                                    width: regObj.width,
                                    height: regObj.height
                                }, {
                                    flashvars: fv
                                }, replaceId);
                        }
                    }
                function displayAltContent(obj) {
                        if (ua.ie && ua.win && obj.readyState != 4) {
                            var el = createElement("div");
                            obj.parentNode.insertBefore(el, obj);
                            el.parentNode.replaceChild(abstractAltContent(obj), el);
                            obj.style.display = "none";
                            var fn = function () {
                                obj.parentNode.removeChild(obj);
                            };
                            addListener(win, "onload", fn);
                        } else {
                            obj.parentNode.replaceChild(abstractAltContent(obj), obj);
                        }
                    }
                function abstractAltContent(obj) {
                        var ac = createElement("div");
                        if (ua.win && ua.ie) {
                            ac.innerHTML = obj.innerHTML;
                        } else {
                            var nestedObj = obj.getElementsByTagName(OBJECT)[0];
                            if (nestedObj) {
                                var c = nestedObj.childNodes;
                                if (c) {
                                    var cl = c.length;
                                    for (var i = 0; i < cl; i++) {
                                        if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
                                            ac.appendChild(c[i].cloneNode(true));
                                        }
                                    }
                                }
                            }
                        }
                        return ac;
                    }
                function createSWF(attObj, parObj, id) {
                        var r, el = getElementById(id);
                        if (el) {
                            if (typeof attObj.id == UNDEF) {
                                attObj.id = id;
                            }
                            if (ua.ie && ua.win) {
                                var att = "";
                                for (var i in attObj) {
                                    if (attObj[i] != Object.prototype[i]) {
                                        if (i.toLowerCase() == "data") {
                                            parObj.movie = attObj[i];
                                        } else {
                                            if (i.toLowerCase() == "styleclass") {
                                                att += ' class="' + attObj[i] + '"';
                                            } else {
                                                if (i.toLowerCase() != "classid") {
                                                    att += " " + i + '="' + attObj[i] + '"';
                                                }
                                            }
                                        }
                                    }
                                }
                                var par = "";
                                for (var j in parObj) {
                                    if (parObj[j] != Object.prototype[j]) {
                                        par += '<param name="' + j + '" value="' + parObj[j] + '" />';
                                    }
                                }
                                el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + ">" + par + "</object>";
                                objIdArr[objIdArr.length] = attObj.id;
                                r = getElementById(attObj.id);
                            } else {
                                if (ua.webkit && ua.webkit < 312) {
                                    var e = createElement("embed");
                                    e.setAttribute("type", FLASH_MIME_TYPE);
                                    for (var k in attObj) {
                                        if (attObj[k] != Object.prototype[k]) {
                                            if (k.toLowerCase() == "data") {
                                                e.setAttribute("src", attObj[k]);
                                            } else {
                                                if (k.toLowerCase() == "styleclass") {
                                                    e.setAttribute("class", attObj[k]);
                                                } else {
                                                    if (k.toLowerCase() != "classid") {
                                                        e.setAttribute(k, attObj[k]);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    for (var l in parObj) {
                                        if (parObj[l] != Object.prototype[l]) {
                                            if (l.toLowerCase() != "movie") {
                                                e.setAttribute(l, parObj[l]);
                                            }
                                        }
                                    }
                                    el.parentNode.replaceChild(e, el);
                                    r = e;
                                } else {
                                    var o = createElement(OBJECT);
                                    o.setAttribute("type", FLASH_MIME_TYPE);
                                    for (var m in attObj) {
                                        if (attObj[m] != Object.prototype[m]) {
                                            if (m.toLowerCase() == "styleclass") {
                                                o.setAttribute("class", attObj[m]);
                                            } else {
                                                if (m.toLowerCase() != "classid") {
                                                    o.setAttribute(m, attObj[m]);
                                                }
                                            }
                                        }
                                    }
                                    for (var n in parObj) {
                                        if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") {
                                            createObjParam(o, n, parObj[n]);
                                        }
                                    }
                                    el.parentNode.replaceChild(o, el);
                                    r = o;
                                }
                            }
                        }
                        return r;
                    }
                function createObjParam(el, pName, pValue) {
                        var p = createElement("param");
                        p.setAttribute("name", pName);
                        p.setAttribute("value", pValue);
                        el.appendChild(p);
                    }
                function removeSWF(id) {
                        var obj = getElementById(id);
                        if (obj && (obj.nodeName == "OBJECT" || obj.nodeName == "EMBED")) {
                            if (ua.ie && ua.win) {
                                if (obj.readyState == 4) {
                                    removeObjectInIE(id);
                                } else {
                                    win.attachEvent("onload", function () {
                                        removeObjectInIE(id);
                                    });
                                }
                            } else {
                                obj.parentNode.removeChild(obj);
                            }
                        }
                    }
                function removeObjectInIE(id) {
                        var obj = getElementById(id);
                        if (obj) {
                            for (var i in obj) {
                                if (typeof obj[i] == "function") {
                                    obj[i] = null;
                                }
                            }
                            obj.parentNode.removeChild(obj);
                        }
                    }
                function getElementById(id) {
                        var el = null;
                        try {
                            el = doc.getElementById(id);
                        } catch (e) {}
                        return el;
                    }
                function createElement(el) {
                        return doc.createElement(el);
                    }
                function addListener(target, eventType, fn) {
                        target.attachEvent(eventType, fn);
                        listenersArr[listenersArr.length] = [target, eventType, fn];
                    }
                function hasPlayerVersion(rv) {
                        var pv = ua.pv,
                            v = rv.split(".");
                        v[0] = parseInt(v[0], 10);
                        v[1] = parseInt(v[1], 10) || 0;
                        v[2] = parseInt(v[2], 10) || 0;
                        return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
                    }
                function createCSS(sel, decl) {
                        if (ua.ie && ua.mac) {
                            return;
                        }
                        var h = doc.getElementsByTagName("head")[0],
                            s = createElement("style");
                        s.setAttribute("type", "text/css");
                        s.setAttribute("media", "screen");
                        if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
                                s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
                            }
                        h.appendChild(s);
                        if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
                                var ls = doc.styleSheets[doc.styleSheets.length - 1];
                                if (typeof ls.addRule == OBJECT) {
                                    ls.addRule(sel, decl);
                                }
                            }
                    }
                function setVisibility(id, isVisible) {
                        var v = isVisible ? "visible" : "hidden";
                        if (isDomLoaded && getElementById(id)) {
                            getElementById(id).style.visibility = v;
                        } else {
                            createCSS("#" + id, "visibility:" + v);
                        }
                    }
                function urlEncodeIfNecessary(s) {
                        var regex = /[\\\"<>\.;]/;
                        var hasBadChars = regex.exec(s) != null;
                        return hasBadChars ? encodeURIComponent(s) : s;
                    }
                var cleanup = function () {
                        if (ua.ie && ua.win) {
                            window.attachEvent("onunload", function () {
                                var ll = listenersArr.length;
                                for (var i = 0; i < ll; i++) {
                                    listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
                                }
                                var il = objIdArr.length;
                                for (var j = 0; j < il; j++) {
                                    removeSWF(objIdArr[j]);
                                }
                                for (var k in ua) {
                                    ua[k] = null;
                                }
                                ua = null;
                                for (var l in swfobject) {
                                    swfobject[l] = null;
                                }
                                swfobject = null;
                            });
                        }
                    }();
                return {
                        registerObject: function (objectIdStr, swfVersionStr, xiSwfUrlStr) {
                            if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
                                return;
                            }
                            var regObj = {};
                            regObj.id = objectIdStr;
                            regObj.swfVersion = swfVersionStr;
                            regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
                            regObjArr[regObjArr.length] = regObj;
                            setVisibility(objectIdStr, false);
                        },
                        getObjectById: function (objectIdStr) {
                            var r = null;
                            if (ua.w3cdom) {
                                var o = getElementById(objectIdStr);
                                if (o) {
                                    var n = o.getElementsByTagName(OBJECT)[0];
                                    if (!n || (n && typeof o.SetVariable != UNDEF)) {
                                        r = o;
                                    } else {
                                        if (typeof n.SetVariable != UNDEF) {
                                            r = n;
                                        }
                                    }
                                }
                            }
                            return r;
                        },
                        embedSWF: function (swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
                            if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
                                return;
                            }
                            widthStr += "";
                            heightStr += "";
                            if (hasPlayerVersion(swfVersionStr)) {
                                setVisibility(replaceElemIdStr, false);
                                var att = {};
                                if (attObj && typeof attObj === OBJECT) {
                                    for (var i in attObj) {
                                        if (attObj[i] != Object.prototype[i]) {
                                            att[i] = attObj[i];
                                        }
                                    }
                                }
                                att.data = swfUrlStr;
                                att.width = widthStr;
                                att.height = heightStr;
                                var par = {};
                                if (parObj && typeof parObj === OBJECT) {
                                    for (var j in parObj) {
                                        if (parObj[j] != Object.prototype[j]) {
                                            par[j] = parObj[j];
                                        }
                                    }
                                }
                                if (flashvarsObj && typeof flashvarsObj === OBJECT) {
                                    for (var k in flashvarsObj) {
                                        if (flashvarsObj[k] != Object.prototype[k]) {
                                            if (typeof par.flashvars != UNDEF) {
                                                par.flashvars += "&" + k + "=" + flashvarsObj[k];
                                            } else {
                                                par.flashvars = k + "=" + flashvarsObj[k];
                                            }
                                        }
                                    }
                                }
                                addDomLoadEvent(function () {
                                    createSWF(att, par, replaceElemIdStr);
                                    if (att.id == replaceElemIdStr) {
                                        setVisibility(replaceElemIdStr, true);
                                    }
                                });
                            } else {
                                if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
                                    isExpressInstallActive = true;
                                    setVisibility(replaceElemIdStr, false);
                                    addDomLoadEvent(function () {
                                        var regObj = {};
                                        regObj.id = regObj.altContentId = replaceElemIdStr;
                                        regObj.width = widthStr;
                                        regObj.height = heightStr;
                                        regObj.expressInstall = xiSwfUrlStr;
                                        showExpressInstall(regObj);
                                    });
                                }
                            }
                        },
                        getFlashPlayerVersion: function () {
                            return {
                                major: ua.pv[0],
                                minor: ua.pv[1],
                                release: ua.pv[2]
                            };
                        },
                        hasFlashPlayerVersion: hasPlayerVersion,
                        createSWF: function (attObj, parObj, replaceElemIdStr) {
                            if (ua.w3cdom) {
                                return createSWF(attObj, parObj, replaceElemIdStr);
                            } else {
                                return undefined;
                            }
                        },
                        removeSWF: function (objElemIdStr) {
                            if (ua.w3cdom) {
                                removeSWF(objElemIdStr);
                            }
                        },
                        createCSS: function (sel, decl) {
                            if (ua.w3cdom) {
                                createCSS(sel, decl);
                            }
                        },
                        addDomLoadEvent: addDomLoadEvent,
                        addLoadEvent: addLoadEvent,
                        getQueryParamValue: function (param) {
                            var q = doc.location.search || doc.location.hash;
                            if (param == null) {
                                return urlEncodeIfNecessary(q);
                            }
                            if (q) {
                                var pairs = q.substring(1).split("&");
                                for (var i = 0; i < pairs.length; i++) {
                                    if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
                                        return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
                                    }
                                }
                            }
                            return "";
                        },
                        expressInstallCallback: function () {
                            if (isExpressInstallActive && storedAltContent) {
                                var obj = getElementById(EXPRESS_INSTALL_ID);
                                if (obj) {
                                    obj.parentNode.replaceChild(storedAltContent, obj);
                                    if (storedAltContentId) {
                                        setVisibility(storedAltContentId, true);
                                        if (ua.ie && ua.win) {
                                            storedAltContent.style.display = "block";
                                        }
                                    }
                                    storedAltContent = null;
                                    storedAltContentId = null;
                                    isExpressInstallActive = false;
                                }
                            }
                        }
                    };
            }();
            return swfobject;
        })();
    S.lang = {
            code: "en",
            of: "of",
            loading: "loading",
            cancel: "Cancel",
            next: "Next",
            previous: "Previous",
            play: "Play",
            pause: "Pause",
            close: "Close",
            errors: {
                single: 'You must install the <a href="{0}">{1}</a> browser plugin to view this content.',
                shared: 'You must install both the <a href="{0}">{1}</a> and <a href="{2}">{3}</a> browser plugins to view this content.',
                either: 'You must install either the <a href="{0}">{1}</a> or the <a href="{2}">{3}</a> browser plugin to view this content.'
            }
        };
    var pre, proxyId = "sb-drag-proxy",
        dragData, dragProxy, dragTarget;

    function resetDrag() {
            dragData = {
                x: 0,
                y: 0,
                startX: null,
                startY: null
            };
        }
    function updateProxy() {
            var dims = S.dimensions;
            apply(dragProxy.style, {
                height: dims.innerHeight + "px",
                width: dims.innerWidth + "px"
            });
        }
    function enableDrag() {
            resetDrag();
            var style = ["position:absolute", "cursor:" + (S.isGecko ? "-moz-grab" : "move"), "background-color:" + (S.isIE ? "#fff;filter:alpha(opacity=0)" : "transparent")].join(";");
            S.appendHTML(S.skin.body, '<div id="' + proxyId + '" style="' + style + '"></div>');
            dragProxy = get(proxyId);
            updateProxy();
            addEvent(dragProxy, "mousedown", startDrag);
        }
    function disableDrag() {
            if (dragProxy) {
                removeEvent(dragProxy, "mousedown", startDrag);
                remove(dragProxy);
                dragProxy = null;
            }
            dragTarget = null;
        }
    function startDrag(e) {
            preventDefault(e);
            var xy = getPageXY(e);
            dragData.startX = xy[0];
            dragData.startY = xy[1];
            dragTarget = get(S.player.id);
            addEvent(document, "mousemove", positionDrag);
            addEvent(document, "mouseup", endDrag);
            if (S.isGecko) {
                dragProxy.style.cursor = "-moz-grabbing";
            }
        }
    function positionDrag(e) {
            var player = S.player,
                dims = S.dimensions,
                xy = getPageXY(e);
            var moveX = xy[0] - dragData.startX;
            dragData.startX += moveX;
            dragData.x = Math.max(Math.min(0, dragData.x + moveX), dims.innerWidth - player.width);
            var moveY = xy[1] - dragData.startY;
            dragData.startY += moveY;
            dragData.y = Math.max(Math.min(0, dragData.y + moveY), dims.innerHeight - player.height);
            apply(dragTarget.style, {
                    left: dragData.x + "px",
                    top: dragData.y + "px"
                });
        }
    function endDrag() {
            removeEvent(document, "mousemove", positionDrag);
            removeEvent(document, "mouseup", endDrag);
            if (S.isGecko) {
                dragProxy.style.cursor = "-moz-grab";
            }
        }
    S.img = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.ready = false;
            var self = this;
            pre = new Image();
            pre.onload = function () {
                self.height = obj.height ? parseInt(obj.height, 10) : pre.height;
                self.width = obj.width ? parseInt(obj.width, 10) : pre.width;
                self.ready = true;
                pre.onload = null;
                pre = null;
            };
            pre.src = obj.content;
        };
    S.img.ext = ["bmp", "gif", "jpg", "jpeg", "png"];
    S.img.prototype = {
            append: function (body, dims) {
                var img = document.createElement("img");
                img.id = this.id;
                img.src = this.obj.content;
                img.style.position = "absolute";
                var height, width;
                if (dims.oversized && S.options.handleOversize == "resize") {
                    height = dims.innerHeight;
                    width = dims.innerWidth;
                } else {
                    height = this.height;
                    width = this.width;
                }
                img.setAttribute("height", height);
                img.setAttribute("width", width);
                img.setAttribute("onClick", "Shadowbox.next()");
                body.appendChild(img);
            },
            remove: function () {
                var el = get(this.id);
                if (el) {
                    remove(el);
                }
                disableDrag();
                if (pre) {
                    pre.onload = null;
                    pre = null;
                }
            },
            onLoad: function () {
                var dims = S.dimensions;
                if (dims.oversized && S.options.handleOversize == "drag") {
                    enableDrag();
                }
            },
            onWindowResize: function () {
                var dims = S.dimensions;
                switch (S.options.handleOversize) {
                case "resize":
                    var el = get(this.id);
                    el.height = dims.innerHeight;
                    el.width = dims.innerWidth;
                    break;
                case "drag":
                    if (dragTarget) {
                        var top = parseInt(S.getStyle(dragTarget, "top")),
                            left = parseInt(S.getStyle(dragTarget, "left"));
                        if (top + this.height < dims.innerHeight) {
                                dragTarget.style.top = dims.innerHeight - this.height + "px";
                            }
                        if (left + this.width < dims.innerWidth) {
                                dragTarget.style.left = dims.innerWidth - this.width + "px";
                            }
                        updateProxy();
                    }
                    break;
                }
            }
        };
    S.iframe = function (obj, id) {
            this.obj = obj;
            this.id = id;
            var overlay = get("sb-overlay");
            this.height = obj.height ? parseInt(obj.height, 10) : overlay.offsetHeight;
            this.width = obj.width ? parseInt(obj.width, 10) : overlay.offsetWidth;
        };
    S.iframe.prototype = {
            append: function (body, dims) {
                var html = '<iframe id="' + this.id + '" name="' + this.id + '" height="100%" width="100%" frameborder="0" marginwidth="0" marginheight="0" style="visibility:hidden" onload="this.style.visibility=\'visible\'" scrolling="auto"';
                if (S.isIE) {
                    html += ' allowtransparency="true"';
                    if (S.isIE6) {
                        html += " src=\"javascript:false;document.write('');\"";
                    }
                }
                html += "></iframe>";
                body.innerHTML = html;
            },
            remove: function () {
                var el = get(this.id);
                if (el) {
                    remove(el);
                    if (S.isGecko) {
                        delete window.frames[this.id];
                    }
                }
            },
            onLoad: function () {
                var win = S.isIE ? get(this.id).contentWindow : window.frames[this.id];
                win.location.href = this.obj.content;
            }
        };
    S.html = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.height = obj.height ? parseInt(obj.height, 10) : 300;
            this.width = obj.width ? parseInt(obj.width, 10) : 500;
        };
    S.html.prototype = {
            append: function (body, dims) {
                var div = document.createElement("div");
                div.id = this.id;
                div.className = "html";
                div.innerHTML = this.obj.content;
                body.appendChild(div);
            },
            remove: function () {
                var el = get(this.id);
                if (el) {
                    remove(el);
                }
            }
        };
    S.swf = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.height = obj.height ? parseInt(obj.height, 10) : 300;
            this.width = obj.width ? parseInt(obj.width, 10) : 300;
        };
    S.swf.ext = ["swf"];
    S.swf.prototype = {
            append: function (body, dims) {
                var tmp = document.createElement("div");
                tmp.id = this.id;
                body.appendChild(tmp);
                var height = dims.innerHeight,
                    width = dims.innerWidth,
                    swf = this.obj.content,
                    version = S.options.flashVersion,
                    express = S.path + "expressInstall.swf",
                    flashvars = S.options.flashVars,
                    params = S.options.flashParams;
                S.flash.embedSWF(swf, this.id, width, height, version, express, flashvars, params);
            },
            remove: function () {
                S.flash.expressInstallCallback();
                S.flash.removeSWF(this.id);
            },
            onWindowResize: function () {
                var dims = S.dimensions,
                    el = get(this.id);
                el.height = dims.innerHeight;
                el.width = dims.innerWidth;
            }
        };
    var jwControllerHeight = 20;
    S.flv = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.height = obj.height ? parseInt(obj.height, 10) : 300;
            if (S.options.showMovieControls) {
                this.height += jwControllerHeight;
            }
            this.width = obj.width ? parseInt(obj.width, 10) : 300;
        };
    S.flv.ext = ["flv", "m4v"];
    S.flv.prototype = {
            append: function (body, dims) {
                var tmp = document.createElement("div");
                tmp.id = this.id;
                body.appendChild(tmp);
                var height = dims.innerHeight,
                    width = dims.innerWidth,
                    swf = S.path + "player.swf",
                    version = S.options.flashVersion,
                    express = S.path + "expressInstall.swf",
                    flashvars = apply({
                        file: this.obj.content,
                        height: height,
                        width: width,
                        autostart: (S.options.autoplayMovies ? "true" : "false"),
                        controlbar: (S.options.showMovieControls ? "bottom" : "none"),
                        backcolor: "0x000000",
                        frontcolor: "0xCCCCCC",
                        lightcolor: "0x557722"
                    }, S.options.flashVars),
                    params = S.options.flashParams;
                S.flash.embedSWF(swf, this.id, width, height, version, express, flashvars, params);
            },
            remove: function () {
                S.flash.expressInstallCallback();
                S.flash.removeSWF(this.id);
            },
            onWindowResize: function () {
                var dims = S.dimensions,
                    el = get(this.id);
                el.height = dims.innerHeight;
                el.width = dims.innerWidth;
            }
        };
    var qtControllerHeight = 16;
    S.qt = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.height = obj.height ? parseInt(obj.height, 10) : 300;
            if (S.options.showMovieControls) {
                this.height += qtControllerHeight;
            }
            this.width = obj.width ? parseInt(obj.width, 10) : 300;
        };
    S.qt.ext = ["dv", "mov", "moov", "movie", "mp4", "avi", "mpg", "mpeg"];
    S.qt.prototype = {
            append: function (body, dims) {
                var opt = S.options,
                    autoplay = String(opt.autoplayMovies),
                    controls = String(opt.showMovieControls);
                var html = "<object",
                    movie = {
                        id: this.id,
                        name: this.id,
                        height: this.height,
                        width: this.width,
                        kioskmode: "true"
                    };
                if (S.isIE) {
                        movie.classid = "clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B";
                        movie.codebase = "http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";
                    } else {
                        movie.type = "video/quicktime";
                        movie.data = this.obj.content;
                    }
                for (var m in movie) {
                        html += " " + m + '="' + movie[m] + '"';
                    }
                html += ">";
                var params = {
                        src: this.obj.content,
                        scale: "aspect",
                        controller: controls,
                        autoplay: autoplay
                    };
                for (var p in params) {
                        html += '<param name="' + p + '" value="' + params[p] + '">';
                    }
                html += "</object>";
                body.innerHTML = html;
            },
            remove: function () {
                try {
                    document[this.id].Stop();
                } catch (e) {}
                var el = get(this.id);
                if (el) {
                    remove(el);
                }
            }
        };
    var wmpControllerHeight = (S.isIE ? 70 : 45);
    S.wmp = function (obj, id) {
            this.obj = obj;
            this.id = id;
            this.height = obj.height ? parseInt(obj.height, 10) : 300;
            if (S.options.showMovieControls) {
                this.height += wmpControllerHeight;
            }
            this.width = obj.width ? parseInt(obj.width, 10) : 300;
        };
    S.wmp.ext = ["asf", "avi", "mpg", "mpeg", "wm", "wmv"];
    S.wmp.prototype = {
            append: function (body, dims) {
                var opt = S.options,
                    autoplay = opt.autoplayMovies ? 1 : 0;
                var movie = '<object id="' + this.id + '" name="' + this.id + '" height="' + this.height + '" width="' + this.width + '"',
                    params = {
                        autostart: opt.autoplayMovies ? 1 : 0
                    };
                if (S.isIE) {
                        movie += ' classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6"';
                        params.url = this.obj.content;
                        params.uimode = opt.showMovieControls ? "full" : "none";
                    } else {
                        movie += ' type="video/x-ms-wmv"';
                        movie += ' data="' + this.obj.content + '"';
                        params.showcontrols = opt.showMovieControls ? 1 : 0;
                    }
                movie += ">";
                for (var p in params) {
                        movie += '<param name="' + p + '" value="' + params[p] + '">';
                    }
                movie += "</object>";
                body.innerHTML = movie;
            },
            remove: function () {
                if (S.isIE) {
                    try {
                        window[this.id].controls.stop();
                        window[this.id].URL = "movie" + now() + ".wmv";
                        window[this.id] = function () {};
                    } catch (e) {}
                }
                var el = get(this.id);
                if (el) {
                    setTimeout(function () {
                        remove(el);
                    }, 10);
                }
            }
        };
    var overlayOn = false,
        visibilityCache = [],
        pngIds = ["sb-nav-close", "sb-nav-next", "sb-nav-play", "sb-nav-pause", "sb-nav-previous", "sb-nav-next-main", "sb-nav-previous-main"],
        container, overlay, wrapper, doWindowResize = true;

    function animate(el, property, to, duration, callback) {
            var isOpacity = (property == "opacity"),
                anim = isOpacity ? S.setOpacity : function (el, value) {
                    el.style[property] = "" + value + "px";
                };
            if (duration == 0 || (!isOpacity && !S.options.animate) || (isOpacity && !S.options.animateFade)) {
                    anim(el, to);
                    if (callback) {
                        callback();
                    }
                    return;
                }
            var from = parseFloat(S.getStyle(el, property)) || 0;
            var delta = to - from;
            if (delta == 0) {
                    if (callback) {
                        callback();
                    }
                    return;
                }
            duration *= 1000;
            var begin = now(),
                ease = S.ease,
                end = begin + duration,
                time;
            var interval = setInterval(function () {
                    time = now();
                    if (time >= end) {
                        clearInterval(interval);
                        interval = null;
                        anim(el, to);
                        if (callback) {
                            callback();
                        }
                    } else {
                        anim(el, from + ease((time - begin) / duration) * delta);
                    }
                }, 10);
        }
    function setSize() {
            container.style.height = S.getWindowSize("Height") + "px";
            container.style.width = S.getWindowSize("Width") + "px";
        }
    function setPosition() {
            container.style.top = document.documentElement.scrollTop + "px";
            container.style.left = document.documentElement.scrollLeft + "px";
        }
    function toggleTroubleElements(on) {
            if (on) {
                each(visibilityCache, function (i, el) {
                    el[0].style.visibility = el[1] || "";
                });
            } else {
                visibilityCache = [];
                each(S.options.troubleElements, function (i, tag) {
                    each(document.getElementsByTagName(tag), function (i, el) {
                        visibilityCache.push([el, el.style.visibility]);
                        el.style.visibility = "hidden";
                    });
                });
            }
        }
    function toggleNav(id, on) {
            var el = get("sb-nav-" + id);
            if (el) {
                el.style.display = on ? "" : "none";
            }
        }
    function toggleLoading(on, callback) {
            var loading = get("sb-loading"),
                playerName = S.getCurrent().player,
                anim = (playerName == "img" || playerName == "html");
            if (on) {
                    S.setOpacity(loading, 0);
                    loading.style.display = "block";
                    var wrapped = function () {
                        S.clearOpacity(loading);
                        if (callback) {
                            callback();
                        }
                    };
                    if (anim) {
                        animate(loading, "opacity", 1, S.options.fadeDuration, wrapped);
                    } else {
                        wrapped();
                    }
                } else {
                    var wrapped = function () {
                        loading.style.display = "none";
                        S.clearOpacity(loading);
                        if (callback) {
                            callback();
                        }
                    };
                    if (anim) {
                        animate(loading, "opacity", 0, S.options.fadeDuration, wrapped);
                    } else {
                        wrapped();
                    }
                }
        }
    function buildBars(callback) {
            var obj = S.getCurrent();
            get("sb-title-inner").innerHTML = obj.title || "";
            var close, next, play, pause, previous;
            if (S.options.displayNav) {
                close = true;
                var len = S.gallery.length;
                if (len > 1) {
                    if (S.options.continuous) {
                        next = previous = true;
                    } else {
                        next = (len - 1) > S.current;
                        previous = S.current > 0;
                    }
                }
                if (S.options.slideshowDelay > 0 && S.hasNext()) {
                    pause = !S.isPaused();
                    play = !pause;
                }
            } else {
                close = next = play = pause = previous = false;
            }
            toggleNav("close", close);
            toggleNav("next", next);
            toggleNav("play", play);
            toggleNav("pause", pause);
            toggleNav("previous", previous);
            var counter = "";
            if (S.options.displayCounter && S.gallery.length > 1) {
                var len = S.gallery.length;
                if (S.options.counterType == "skip") {
                    var i = 0,
                        end = len,
                        limit = parseInt(S.options.counterLimit) || 0;
                    if (limit < len && limit > 2) {
                            var h = Math.floor(limit / 2);
                            i = S.current - h;
                            if (i < 0) {
                                i += len;
                            }
                            end = S.current + (limit - h);
                            if (end > len) {
                                end -= len;
                            }
                        }
                    while (i != end) {
                            if (i == len) {
                                i = 0;
                            }
                            counter += '<a onclick="Shadowbox.change(' + i + ');"';
                            if (i == S.current) {
                                counter += ' class="sb-counter-current"';
                            }
                            counter += ">" + (i++) + "</a>";
                        }
                } else {
                    counter = [S.current + 1, S.lang.of, len].join(" ");
                }
            }
            get("sb-counter").innerHTML = counter;
            callback();
        }
    function showBars(callback) {
            var titleInner = get("sb-title-inner"),
                infoInner = get("sb-info-inner"),
                duration = 0.35;
            titleInner.style.visibility = infoInner.style.visibility = "";
            if (titleInner.innerHTML != "") {
                    animate(titleInner, "marginTop", 0, duration);
                }
            animate(infoInner, "marginTop", 0, duration, callback);
        }
    function hideBars(anim, callback) {
            var title = get("sb-title"),
                info = get("sb-info"),
                titleHeight = title.offsetHeight,
                infoHeight = info.offsetHeight,
                titleInner = get("sb-title-inner"),
                infoInner = get("sb-info-inner"),
                duration = (anim ? 0.35 : 0);
            animate(titleInner, "marginTop", titleHeight, duration);
            animate(infoInner, "marginTop", infoHeight * -1, duration, function () {
                    titleInner.style.visibility = infoInner.style.visibility = "hidden";
                    callback();
                });
        }
    function adjustHeight(height, top, anim, callback) {
            var wrapperInner = get("sb-wrapper-inner"),
                duration = (anim ? S.options.resizeDuration : 0);
            animate(wrapper, "top", top, duration);
            animate(wrapperInner, "height", height, duration, callback);
        }
    function adjustWidth(width, left, anim, callback) {
            var duration = (anim ? S.options.resizeDuration : 0);
            animate(wrapper, "left", left, duration);
            animate(wrapper, "width", width, duration, callback);
        }
    function setDimensions(height, width) {
            var bodyInner = get("sb-body-inner"),
                height = parseInt(height),
                width = parseInt(width),
                topBottom = wrapper.offsetHeight - bodyInner.offsetHeight,
                leftRight = wrapper.offsetWidth - bodyInner.offsetWidth,
                padding = parseInt(S.options.viewportPadding) || 20,
                maxHeight = overlay.offsetHeight,
                maxWidth = overlay.offsetWidth;
            return S.setDimensions(height, width, maxHeight, maxWidth, topBottom, leftRight, padding);
        }
    var K = {};
    K.markup = '<div id="sb-container"><div id="sb-overlay"></div><div id="sb-wrapper"><div id="sb-title"><div id="sb-title-inner"></div></div><div id="sb-wrapper-inner"><div id="sb-nav-previous-main" onClick="Shadowbox.previous();"><a></a></div><div id="sb-nav-next-main" onClick="Shadowbox.next();"><a></a></div><div id="sb-body"><div id="sb-body-inner"></div><div id="sb-loading"><div id="sb-loading-inner"><span>{loading}</span></div></div></div></div><div id="sb-info"><div id="sb-info-inner"><div id="sb-counter"></div><div id="sb-nav"><a id="sb-nav-close" title="{close}" onclick="Shadowbox.close()"></a><a id="sb-nav-next" title="{next}" onclick="Shadowbox.next()"></a><a id="sb-nav-play" title="{play}" onclick="Shadowbox.play()"></a><a id="sb-nav-pause" title="{pause}" onclick="Shadowbox.pause()"></a><a id="sb-nav-previous" title="{previous}" onclick="Shadowbox.previous()"></a></div></div></div></div></div>';
    K.markup1 = '<div id="sb-container"><div id="sb-overlay"></div><div id="sb-wrapper"><div id="sb-title"><div id="sb-title-inner"></div></div><div id="sb-wrapper-inner"><div id="sb-body"><div id="sb-body-inner"></div><div id="sb-loading"><div id="sb-loading-inner"><span>{loading}</span></div></div></div></div><div id="sb-info"><div id="sb-info-inner"><div id="sb-counter"></div><div id="sb-nav"><a id="sb-nav-close" title="{close}" onclick="Shadowbox.close()"></a><a id="sb-nav-next" title="{next}" onclick="Shadowbox.next()"></a><a id="sb-nav-play" title="{play}" onclick="Shadowbox.play()"></a><a id="sb-nav-pause" title="{pause}" onclick="Shadowbox.pause()"></a><a id="sb-nav-previous" title="{previous}" onclick="Shadowbox.previous()"></a></div></div></div></div></div>';
    K.options = {
            animSequence: "sync",
            counterLimit: 10,
            counterType: "default",
            displayCounter: true,
            displayNav: true,
            fadeDuration: 0.35,
            initialHeight: 160,
            initialWidth: 320,
            modal: false,
            overlayColor: "#000",
            overlayOpacity: 0.5,
            resizeDuration: 0.35,
            showOverlay: true,
            troubleElements: ["select", "object", "embed", "canvas"]
        };
    K.init = function () {
            if (S.options.contentType=="img") {
                S.appendHTML(document.body, sprintf(K.markup, S.lang));
            } else {
                S.appendHTML(document.body, sprintf(K.markup1, S.lang));
            }
            K.body = get("sb-body-inner");
            container = get("sb-container");
            overlay = get("sb-overlay");
            wrapper = get("sb-wrapper");
            if (!supportsFixed) {
                container.style.position = "absolute";
            }
            if (!supportsOpacity) {
                var el, m, re = /url\("(.*\.png)"\)/;
                each(pngIds, function (i, id) {
                    el = get(id);
                    if (el) {
                        m = S.getStyle(el, "backgroundImage").match(re);
                        if (m) {
                            el.style.backgroundImage = "none";
                            el.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,src=" + m[1] + ",sizingMethod=scale);";
                        }
                    }
                });
            }
            var timer;
            addEvent(window, "resize", function () {
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
                if (open) {
                    timer = setTimeout(K.onWindowResize, 10);
                }
            });
        };
    K.onOpen = function (obj, callback) {
            doWindowResize = false;
            container.style.display = "block";
            setSize();
            var dims = setDimensions(S.options.initialHeight, S.options.initialWidth);
            adjustHeight(dims.innerHeight, dims.top);
            adjustWidth(dims.width, dims.left);
            if (S.options.showOverlay) {
                overlay.style.backgroundColor = S.options.overlayColor;
                S.setOpacity(overlay, 0);
                if (!S.options.modal) {
                    addEvent(overlay, "click", S.close);
                }
                overlayOn = true;
            }
            if (!supportsFixed) {
                setPosition();
                addEvent(window, "scroll", setPosition);
            }
            toggleTroubleElements();
            container.style.visibility = "visible";
            if (overlayOn) {
                animate(overlay, "opacity", S.options.overlayOpacity, S.options.fadeDuration, callback);
            } else {
                callback();
            }
        };
    K.onLoad = function (changing, callback) {
            toggleLoading(true);
            while (K.body.firstChild) {
                remove(K.body.firstChild);
            }
            hideBars(changing, function () {
                if (!open) {
                    return;
                }
                if (!changing) {
                    wrapper.style.visibility = "visible";
                }
                buildBars(callback);
            });
        };
    K.onReady = function (callback) {
            if (!open) {
                return;
            }
            var player = S.player,
                dims = setDimensions(player.height, player.width);
            var wrapped = function () {
                    showBars(callback);
                };
            switch (S.options.animSequence) {
                case "hw":
                    adjustHeight(dims.innerHeight, dims.top, true, function () {
                        adjustWidth(dims.width, dims.left, true, wrapped);
                    });
                    break;
                case "wh":
                    adjustWidth(dims.width, dims.left, true, function () {
                        adjustHeight(dims.innerHeight, dims.top, true, wrapped);
                    });
                    break;
                default:
                    adjustWidth(dims.width, dims.left, true);
                    adjustHeight(dims.innerHeight, dims.top, true, wrapped);
                }
        };
    K.onShow = function (callback) {
            toggleLoading(false, callback);
            doWindowResize = true;
        };
    K.onClose = function () {
            if (!supportsFixed) {
                removeEvent(window, "scroll", setPosition);
            }
            removeEvent(overlay, "click", S.close);
            wrapper.style.visibility = "hidden";
            var callback = function () {
                container.style.visibility = "hidden";
                container.style.display = "none";
                toggleTroubleElements(true);
            };
            if (overlayOn) {
                animate(overlay, "opacity", 0, S.options.fadeDuration, callback);
            } else {
                callback();
            }
        };
    K.onPlay = function () {
            toggleNav("play", false);
            toggleNav("pause", true);
        };
    K.onPause = function () {
            toggleNav("pause", false);
            toggleNav("play", true);
        };
    K.onWindowResize = function () {
            if (!doWindowResize) {
                return;
            }
            setSize();
            var player = S.player,
                dims = setDimensions(player.height, player.width);
            adjustWidth(dims.width, dims.left);
            adjustHeight(dims.innerHeight, dims.top);
            if (player.onWindowResize) {
                    player.onWindowResize();
                }
        };
    S.skin = K;
    window.Shadowbox = S;
})(window);