(function(global) {
    "use strict";
    var ext = global.external;

    function blankFunc(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) {
        console.log("blankFunc called with arguments: " + arg1 + ", " + arg2 + ", " + arg3 + ", " + arg4 + ", " + arg5 + ", " + arg6 + ", " + arg7 + ", " + arg8 + ", " + arg9 + ", " + arg10);
    }

    global.Bridge = {
        External: ext,
        Frame: {
            isIe10: function() { return ext.IEFrame.Version === 10; },
            isIe11: function() { return ext.IEFrame.Version === 11; },
            callEvent: function(funcName, e) {
                ext.Window.CallEvent(funcName, e);
            }
        },
        UI: {
            Splash: {
                show: function() { ext.System.UI.ShowSplash(); },
                fadeAway: function() { ext.System.UI.FadeAwaySplash(); },
                fadeOut: function() { ext.System.UI.FadeOutSplash(); }
            }
        },
        String: ext.String,
        /*         {
                    trim: function(str) { return ext.String.Trim(str); },
                    tolower: function(str) { return ext.String.ToLower(str); },
                    toupper: function(str) { return ext.String.ToUpper(str); },
                }, */
        NString: {
            equals: function(str1, str2) { return ext.String.NString.NEquals(str1, str2); },
            compare: function(str1, str2) { return ext.String.NString.Compare(str1, str2); },
            empty: function(str) { return ext.String.NString.Empty(str); },
            length: function(str) { return ext.String.NString.Length(str); },
        },
        Resources: {
            byname: function(resname) { return ext.System.Resources.GetByName(resname); },
            byid: function(resid) { return ext.System.Resources.GetById(resid); },
            nameToId: function(resname) { return ext.System.Resources.ToId(resname); },
            idToName: function(resid) { return ext.System.Resources.ToName(resid); },
            fromOthers: function(filepath, resid) { return ext.System.Resources.GetFromOthers(filepath, resid); },
            fromFile: function(filepath, resid) { return ext.System.Resources.GetFromOthers(filepath, resid); },
            fromfile: function(filepath, resid) { return ext.System.Resources.GetFromOthers(filepath, resid); },
        },
        Package: {
            filepaths: function() {
                return JSON.parse(ext.Package.GetPackagesToJson() || "[]");
            },
            pkginfo: function(filepath) {
                return JSON.parse(ext.Package.GetPackageInfoToJson(filepath) || "{}");
            },
            capabilityDisplayName: function(capability) {
                return ext.Package.GetCapabilityDisplayName(capability);
            },
            installResult: function(filepath) {
                return ext.Package.GetPackageInstallResult(filepath);
            },
        },
        Locale: {
            toLcid: function(localeName) { return ext.System.Locale.ToLcid(localeName); },
            toLocaleName: function(lcid) { return ext.System.Locale.ToLocaleName(lcid); },
            localeInfo: function(lcid, lcType) { return ext.System.Locale.LocaleInfo(lcid, lcType); },
            localeInfoEx: function(localeName, lcType) { return ext.System.Locale.LocaleInfoEx(localeName, lcType); }
        }
    };
    Object.defineProperty(global.Bridge.Frame, "scale", {
        get: function() { return ext.IEFrame.Scale; },
        set: function(value) { ext.IEFrame.Scale = value; return ext.IEFrame.Scale; }
    });
    Object.defineProperty(global.Bridge.Frame, "version", {
        get: function() { return ext.IEFrame.Version; },
    });
    Object.defineProperty(global.Bridge.Frame, "WindowSize", {
        get: function() { return ext.System.UI.WndSize; },
    });
    Object.defineProperty(global.Bridge.Frame, "ClientSize", {
        get: function() { return ext.System.UI.ClientSize; },
    });
    Object.defineProperty(global.Bridge.UI, "dpiPercent", {
        get: function() { return ext.System.UI.DPIPercent; }
    });
    Object.defineProperty(global.Bridge.UI, "dpi", {
        get: function() { return ext.System.UI.DPI; }
    });
    Object.defineProperty(global.Bridge.UI, "themeColor", {
        get: function() { return ext.System.UI.ThemeColor; }
    });
    Object.defineProperty(global.Bridge.UI, "contrast", {
        get: function() { return ext.System.UI.HighContrast; }
    });
    Object.defineProperty(global.Bridge.UI, "darkmode", {
        get: function() { return ext.System.UI.DarkMode; }
    });
    try {
        Object.defineProperty(global.Bridge.UI.Splash, "backcolor", {
            get: function() { return ext.System.UI.SplashBackgroundColor; },
        });
    } catch (e) {}
    try {
        Object.defineProperty(global.Bridge.UI.Splash, "imageurl", {
            get: function() { return ext.System.UI.SplashImage; },
        });
    } catch (e) {}
    // 下面是有关 String 方法的补充
    if (typeof String.prototype.trim !== "function") {
        String.prototype.trim = function() {
            return Bridge.String.trim(this);
        };
    }
    if (typeof String.prototype.toLowerCase !== "function") {
        String.prototype.toLowerCase = function() {
            return Bridge.String.tolower(this);
        };
    }
    if (typeof String.prototype.toUpperCase !== "function") {
        String.prototype.toUpperCase = function() {
            return Bridge.String.toupper(this);
        };
    }
    if (typeof String.prototype.format !== "function") {
        String.prototype.format = function() {
            var args = arguments;
            return this.replace(/{(\d+)}/g, function(match, number) {
                return typeof args[number] !== "undefined" ? args[number] : match;
            });
        };
    }
})(this);