Zen for www.memozor.com games

Userscript that allows clean fullscreen game play at memozor.com

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name            Zen for www.memozor.com games
// @namespace       https://github.com/Amourspirit/memozor-zen
// @version         1.1.3
// @description     Userscript that allows clean fullscreen game play at memozor.com
// @author          Paul Moss
// @run-at          document-end
// @include         /^https?:\/\/www\.memozor\.com\/.*$/
// @include         /^https?:\/\/memozor\.com\/.*$/
// @noframes
// @license         MIT
// @homepageURL     https://github.com/Amourspirit/memozor-zen/
// @update          https://github.com/Amourspirit/memozor-zen/raw/master/dist/zen-www-memozor-com.user.js
// @contributionURL https://bit.ly/1QIN2Cs
// @require         https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @grant           none
// ==/UserScript==
(function ($) {
    'use strict';

    $ = $ && $.hasOwnProperty('default') ? $['default'] : $;

    var PriorityLevel;
    (function (PriorityLevel) {
        PriorityLevel[PriorityLevel["none"] = 0] = "none";
        PriorityLevel[PriorityLevel["now"] = 1] = "now";
        PriorityLevel[PriorityLevel["med"] = 2] = "med";
        PriorityLevel[PriorityLevel["high"] = 3] = "high";
    })(PriorityLevel || (PriorityLevel = {}));
    var DebugLevel;
    (function (DebugLevel) {
        DebugLevel[DebugLevel["debug"] = 0] = "debug";
        DebugLevel[DebugLevel["error"] = 1] = "error";
        DebugLevel[DebugLevel["warn"] = 2] = "warn";
        DebugLevel[DebugLevel["info"] = 3] = "info";
        DebugLevel[DebugLevel["none"] = 4] = "none";
    })(DebugLevel || (DebugLevel = {}));
    var ElementLocation;
    (function (ElementLocation) {
        ElementLocation[ElementLocation["head"] = 0] = "head";
        ElementLocation[ElementLocation["body"] = 1] = "body";
        ElementLocation[ElementLocation["other"] = 2] = "other";
    })(ElementLocation || (ElementLocation = {}));

    var appSettings = {
        debugLevel: DebugLevel.none,
        buttonId: 'fsmc-btn',
        shortName: 'fsmc',
        preKey: 'fsmc_',
        gameBoardSelector: 'div#game',
        buttonPlacementSelector: 'body',
        controlSelector: 'div#control'
    };

    var Log =  (function () {
        function Log() {
        }
        Log.message = function (msg, optionalParams) {
            if (appSettings.debugLevel > DebugLevel.info) {
                return;
            }
            var params = [];
            if (optionalParams) {
                for (var i = 0; i < optionalParams.length; i++) {
                    params[i] = optionalParams[i];
                }
            }
            console.log.apply(console, [msg].concat(params));
        };
        Log.warn = function (msg, optionalParams) {
            if (appSettings.debugLevel > DebugLevel.warn) {
                return;
            }
            var params = [];
            if (optionalParams) {
                for (var i = 0; i < optionalParams.length; i++) {
                    params[i] = optionalParams[i];
                }
            }
            console.warn.apply(console, [msg].concat(params));
        };
        Log.error = function (msg, optionalParams) {
            if (appSettings.debugLevel > DebugLevel.error) {
                return;
            }
            var params = [];
            if (optionalParams) {
                for (var i = 0; i < optionalParams.length; i++) {
                    params[i] = optionalParams[i];
                }
            }
            console.error.apply(console, [msg].concat(params));
        };
        Log.debug = function (msg, optionalParams) {
            if (appSettings.debugLevel > DebugLevel.debug) {
                return;
            }
            var params = [];
            if (optionalParams) {
                for (var i = 0; i < optionalParams.length; i++) {
                    params[i] = optionalParams[i];
                }
            }
            console.log.apply(console, [appSettings.shortName + ": Debug: " + msg].concat(params));
        };
        Log.debugWarn = function (msg, optionalParams) {
            if (appSettings.debugLevel > DebugLevel.debug) {
                return;
            }
            var params = [];
            if (optionalParams) {
                for (var i = 0; i < optionalParams.length; i++) {
                    params[i] = optionalParams[i];
                }
            }
            console.warn.apply(console, [appSettings.shortName + ": Debug: " + msg].concat(params));
        };
        return Log;
    }());


    var extendStatics = function(d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };

    function __extends(d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }

    var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};

    function unwrapExports (x) {
    	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x;
    }

    function createCommonjsModule(fn, module) {
    	return module = { exports: {} }, fn(module, module.exports), module.exports;
    }

    var management = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });
    var EventManagement =  (function () {
        function EventManagement(unsub) {
            this.unsub = unsub;
            this.propagationStopped = false;
        }
        EventManagement.prototype.stopPropagation = function () {
            this.propagationStopped = true;
        };
        return EventManagement;
    }());
    exports.EventManagement = EventManagement;
    });

    unwrapExports(management);
    var management_1 = management.EventManagement;

    var subscription = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });
    var Subscription =  (function () {
        function Subscription(handler, isOnce) {
            this.handler = handler;
            this.isOnce = isOnce;
            this.isExecuted = false;
        }
        Subscription.prototype.execute = function (executeAsync, scope, args) {
            if (!this.isOnce || !this.isExecuted) {
                this.isExecuted = true;
                var fn = this.handler;
                if (executeAsync) {
                    setTimeout(function () {
                        fn.apply(scope, args);
                    }, 1);
                }
                else {
                    fn.apply(scope, args);
                }
            }
        };
        return Subscription;
    }());
    exports.Subscription = Subscription;
    });

    unwrapExports(subscription);
    var subscription_1 = subscription.Subscription;

    var dispatching = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });
    var DispatcherBase =  (function () {
        function DispatcherBase() {
            this._wrap = new DispatcherWrapper(this);
            this._subscriptions = new Array();
        }
        DispatcherBase.prototype.subscribe = function (fn) {
            var _this = this;
            if (fn) {
                this._subscriptions.push(new subscription.Subscription(fn, false));
            }
            return function () {
                _this.unsubscribe(fn);
            };
        };
        DispatcherBase.prototype.sub = function (fn) {
            return this.subscribe(fn);
        };
        DispatcherBase.prototype.one = function (fn) {
            var _this = this;
            if (fn) {
                this._subscriptions.push(new subscription.Subscription(fn, true));
            }
            return function () {
                _this.unsubscribe(fn);
            };
        };
        DispatcherBase.prototype.has = function (fn) {
            if (!fn)
                return false;
            return this._subscriptions.some(function (sub) { return sub.handler == fn; });
        };
        DispatcherBase.prototype.unsubscribe = function (fn) {
            if (!fn)
                return;
            for (var i = 0; i < this._subscriptions.length; i++) {
                if (this._subscriptions[i].handler == fn) {
                    this._subscriptions.splice(i, 1);
                    break;
                }
            }
        };
        DispatcherBase.prototype.unsub = function (fn) {
            this.unsubscribe(fn);
        };
        DispatcherBase.prototype._dispatch = function (executeAsync, scope, args) {
            var _this = this;
            var _loop_1 = function (sub) {
                var ev = new management.EventManagement(function () { return _this.unsub(sub.handler); });
                var nargs = Array.prototype.slice.call(args);
                nargs.push(ev);
                sub.execute(executeAsync, scope, nargs);
                this_1.cleanup(sub);
                if (!executeAsync && ev.propagationStopped) {
                    return "break";
                }
            };
            var this_1 = this;
            for (var _i = 0, _a = this._subscriptions.slice(); _i < _a.length; _i++) {
                var sub = _a[_i];
                var state_1 = _loop_1(sub);
                if (state_1 === "break")
                    break;
            }
        };
        DispatcherBase.prototype.cleanup = function (sub) {
            if (sub.isOnce && sub.isExecuted) {
                var i = this._subscriptions.indexOf(sub);
                if (i > -1) {
                    this._subscriptions.splice(i, 1);
                }
            }
        };
        DispatcherBase.prototype.asEvent = function () {
            return this._wrap;
        };
        DispatcherBase.prototype.clear = function () {
            this._subscriptions.splice(0, this._subscriptions.length);
        };
        return DispatcherBase;
    }());
    exports.DispatcherBase = DispatcherBase;
    var EventListBase =  (function () {
        function EventListBase() {
            this._events = {};
        }
        EventListBase.prototype.get = function (name) {
            var event = this._events[name];
            if (event) {
                return event;
            }
            event = this.createDispatcher();
            this._events[name] = event;
            return event;
        };
        EventListBase.prototype.remove = function (name) {
            delete this._events[name];
        };
        return EventListBase;
    }());
    exports.EventListBase = EventListBase;
    var DispatcherWrapper =  (function () {
        function DispatcherWrapper(dispatcher) {
            this._subscribe = function (fn) { return dispatcher.subscribe(fn); };
            this._unsubscribe = function (fn) { return dispatcher.unsubscribe(fn); };
            this._one = function (fn) { return dispatcher.one(fn); };
            this._has = function (fn) { return dispatcher.has(fn); };
            this._clear = function () { return dispatcher.clear(); };
        }
        DispatcherWrapper.prototype.subscribe = function (fn) {
            return this._subscribe(fn);
        };
        DispatcherWrapper.prototype.sub = function (fn) {
            return this.subscribe(fn);
        };
        DispatcherWrapper.prototype.unsubscribe = function (fn) {
            this._unsubscribe(fn);
        };
        DispatcherWrapper.prototype.unsub = function (fn) {
            this.unsubscribe(fn);
        };
        DispatcherWrapper.prototype.one = function (fn) {
            return this._one(fn);
        };
        DispatcherWrapper.prototype.has = function (fn) {
            return this._has(fn);
        };
        DispatcherWrapper.prototype.clear = function () {
            this._clear();
        };
        return DispatcherWrapper;
    }());
    exports.DispatcherWrapper = DispatcherWrapper;
    });

    unwrapExports(dispatching);
    var dispatching_1 = dispatching.DispatcherBase;
    var dispatching_2 = dispatching.EventListBase;
    var dispatching_3 = dispatching.DispatcherWrapper;

    var dist = createCommonjsModule(function (module, exports) {

    Object.defineProperty(exports, "__esModule", { value: true });

    exports.DispatcherBase = dispatching.DispatcherBase;
    exports.DispatcherWrapper = dispatching.DispatcherWrapper;
    exports.EventListBase = dispatching.EventListBase;

    exports.Subscription = subscription.Subscription;
    });

    unwrapExports(dist);
    var dist_1 = dist.DispatcherBase;
    var dist_2 = dist.DispatcherWrapper;
    var dist_3 = dist.EventListBase;
    var dist_4 = dist.Subscription;

    var events = createCommonjsModule(function (module, exports) {
    var __extends = (commonjsGlobal && commonjsGlobal.__extends) || (function () {
        var extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return function (d, b) {
            extendStatics(d, b);
            function __() { this.constructor = d; }
            d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
    })();
    Object.defineProperty(exports, "__esModule", { value: true });
    var EventDispatcher =  (function (_super) {
        __extends(EventDispatcher, _super);
        function EventDispatcher() {
            return _super.call(this) || this;
        }
        EventDispatcher.prototype.dispatch = function (sender, args) {
            this._dispatch(false, this, arguments);
        };
        EventDispatcher.prototype.dispatchAsync = function (sender, args) {
            this._dispatch(true, this, arguments);
        };
        EventDispatcher.prototype.asEvent = function () {
            return _super.prototype.asEvent.call(this);
        };
        return EventDispatcher;
    }(dist.DispatcherBase));
    exports.EventDispatcher = EventDispatcher;
    var EventList =  (function (_super) {
        __extends(EventList, _super);
        function EventList() {
            return _super.call(this) || this;
        }
        EventList.prototype.createDispatcher = function () {
            return new EventDispatcher();
        };
        return EventList;
    }(dist.EventListBase));
    exports.EventList = EventList;
    var EventHandlingBase =  (function () {
        function EventHandlingBase() {
            this._events = new EventList();
        }
        Object.defineProperty(EventHandlingBase.prototype, "events", {
            get: function () {
                return this._events;
            },
            enumerable: true,
            configurable: true
        });
        EventHandlingBase.prototype.subscribe = function (name, fn) {
            this._events.get(name).subscribe(fn);
        };
        EventHandlingBase.prototype.sub = function (name, fn) {
            this.subscribe(name, fn);
        };
        EventHandlingBase.prototype.unsubscribe = function (name, fn) {
            this._events.get(name).unsubscribe(fn);
        };
        EventHandlingBase.prototype.unsub = function (name, fn) {
            this.unsubscribe(name, fn);
        };
        EventHandlingBase.prototype.one = function (name, fn) {
            this._events.get(name).one(fn);
        };
        EventHandlingBase.prototype.has = function (name, fn) {
            return this._events.get(name).has(fn);
        };
        return EventHandlingBase;
    }());
    exports.EventHandlingBase = EventHandlingBase;
    });

    unwrapExports(events);
    var events_1 = events.EventDispatcher;
    var events_2 = events.EventList;
    var events_3 = events.EventHandlingBase;

    var dist$1 = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });

    exports.EventDispatcher = events.EventDispatcher;
    exports.EventHandlingBase = events.EventHandlingBase;
    exports.EventList = events.EventList;
    });

    unwrapExports(dist$1);
    var dist_1$1 = dist$1.EventDispatcher;
    var dist_2$1 = dist$1.EventHandlingBase;
    var dist_3$1 = dist$1.EventList;

    var simpleEvents = createCommonjsModule(function (module, exports) {
    var __extends = (commonjsGlobal && commonjsGlobal.__extends) || (function () {
        var extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return function (d, b) {
            extendStatics(d, b);
            function __() { this.constructor = d; }
            d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
    })();
    Object.defineProperty(exports, "__esModule", { value: true });
    var SimpleEventDispatcher =  (function (_super) {
        __extends(SimpleEventDispatcher, _super);
        function SimpleEventDispatcher() {
            return _super.call(this) || this;
        }
        SimpleEventDispatcher.prototype.dispatch = function (args) {
            this._dispatch(false, this, arguments);
        };
        SimpleEventDispatcher.prototype.dispatchAsync = function (args) {
            this._dispatch(true, this, arguments);
        };
        SimpleEventDispatcher.prototype.asEvent = function () {
            return _super.prototype.asEvent.call(this);
        };
        return SimpleEventDispatcher;
    }(dist.DispatcherBase));
    exports.SimpleEventDispatcher = SimpleEventDispatcher;
    var SimpleEventList =  (function (_super) {
        __extends(SimpleEventList, _super);
        function SimpleEventList() {
            return _super.call(this) || this;
        }
        SimpleEventList.prototype.createDispatcher = function () {
            return new SimpleEventDispatcher();
        };
        return SimpleEventList;
    }(dist.EventListBase));
    exports.SimpleEventList = SimpleEventList;
    var SimpleEventHandlingBase =  (function () {
        function SimpleEventHandlingBase() {
            this._events = new SimpleEventList();
        }
        Object.defineProperty(SimpleEventHandlingBase.prototype, "events", {
            get: function () {
                return this._events;
            },
            enumerable: true,
            configurable: true
        });
        SimpleEventHandlingBase.prototype.subscribe = function (name, fn) {
            this._events.get(name).subscribe(fn);
        };
        SimpleEventHandlingBase.prototype.sub = function (name, fn) {
            this.subscribe(name, fn);
        };
        SimpleEventHandlingBase.prototype.one = function (name, fn) {
            this._events.get(name).one(fn);
        };
        SimpleEventHandlingBase.prototype.has = function (name, fn) {
            return this._events.get(name).has(fn);
        };
        SimpleEventHandlingBase.prototype.unsubscribe = function (name, fn) {
            this._events.get(name).unsubscribe(fn);
        };
        SimpleEventHandlingBase.prototype.unsub = function (name, fn) {
            this.unsubscribe(name, fn);
        };
        return SimpleEventHandlingBase;
    }());
    exports.SimpleEventHandlingBase = SimpleEventHandlingBase;
    });

    unwrapExports(simpleEvents);
    var simpleEvents_1 = simpleEvents.SimpleEventDispatcher;
    var simpleEvents_2 = simpleEvents.SimpleEventList;
    var simpleEvents_3 = simpleEvents.SimpleEventHandlingBase;

    var dist$2 = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });

    exports.SimpleEventDispatcher = simpleEvents.SimpleEventDispatcher;
    exports.SimpleEventHandlingBase = simpleEvents.SimpleEventHandlingBase;
    exports.SimpleEventList = simpleEvents.SimpleEventList;
    });

    unwrapExports(dist$2);
    var dist_1$2 = dist$2.SimpleEventDispatcher;
    var dist_2$2 = dist$2.SimpleEventHandlingBase;
    var dist_3$2 = dist$2.SimpleEventList;

    var signals = createCommonjsModule(function (module, exports) {
    var __extends = (commonjsGlobal && commonjsGlobal.__extends) || (function () {
        var extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return function (d, b) {
            extendStatics(d, b);
            function __() { this.constructor = d; }
            d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
        };
    })();
    Object.defineProperty(exports, "__esModule", { value: true });
    var SignalDispatcher =  (function (_super) {
        __extends(SignalDispatcher, _super);
        function SignalDispatcher() {
            return _super.call(this) || this;
        }
        SignalDispatcher.prototype.dispatch = function () {
            this._dispatch(false, this, arguments);
        };
        SignalDispatcher.prototype.dispatchAsync = function () {
            this._dispatch(true, this, arguments);
        };
        SignalDispatcher.prototype.asEvent = function () {
            return _super.prototype.asEvent.call(this);
        };
        return SignalDispatcher;
    }(dist.DispatcherBase));
    exports.SignalDispatcher = SignalDispatcher;
    var SignalList =  (function (_super) {
        __extends(SignalList, _super);
        function SignalList() {
            return _super.call(this) || this;
        }
        SignalList.prototype.createDispatcher = function () {
            return new SignalDispatcher();
        };
        return SignalList;
    }(dist.EventListBase));
    exports.SignalList = SignalList;
    var SignalHandlingBase =  (function () {
        function SignalHandlingBase() {
            this._events = new SignalList();
        }
        Object.defineProperty(SignalHandlingBase.prototype, "events", {
            get: function () {
                return this._events;
            },
            enumerable: true,
            configurable: true
        });
        SignalHandlingBase.prototype.one = function (name, fn) {
            this._events.get(name).one(fn);
        };
        SignalHandlingBase.prototype.has = function (name, fn) {
            return this._events.get(name).has(fn);
        };
        SignalHandlingBase.prototype.subscribe = function (name, fn) {
            this._events.get(name).subscribe(fn);
        };
        SignalHandlingBase.prototype.sub = function (name, fn) {
            this.subscribe(name, fn);
        };
        SignalHandlingBase.prototype.unsubscribe = function (name, fn) {
            this._events.get(name).unsubscribe(fn);
        };
        SignalHandlingBase.prototype.unsub = function (name, fn) {
            this.unsubscribe(name, fn);
        };
        return SignalHandlingBase;
    }());
    exports.SignalHandlingBase = SignalHandlingBase;
    });

    unwrapExports(signals);
    var signals_1 = signals.SignalDispatcher;
    var signals_2 = signals.SignalList;
    var signals_3 = signals.SignalHandlingBase;

    var dist$3 = createCommonjsModule(function (module, exports) {
    Object.defineProperty(exports, "__esModule", { value: true });

    exports.SignalDispatcher = signals.SignalDispatcher;
    exports.SignalHandlingBase = signals.SignalHandlingBase;
    exports.SignalList = signals.SignalList;
    });

    unwrapExports(dist$3);
    var dist_1$3 = dist$3.SignalDispatcher;
    var dist_2$3 = dist$3.SignalHandlingBase;
    var dist_3$3 = dist$3.SignalList;

    var dist$4 = createCommonjsModule(function (module, exports) {

    Object.defineProperty(exports, "__esModule", { value: true });

    exports.DispatcherBase = dist.DispatcherBase;
    exports.DispatcherWrapper = dist.DispatcherWrapper;
    exports.EventListBase = dist.EventListBase;
    exports.Subscription = dist.Subscription;

    exports.EventDispatcher = dist$1.EventDispatcher;
    exports.EventHandlingBase = dist$1.EventHandlingBase;
    exports.EventList = dist$1.EventList;

    exports.SimpleEventDispatcher = dist$2.SimpleEventDispatcher;
    exports.SimpleEventHandlingBase = dist$2.SimpleEventHandlingBase;
    exports.SimpleEventList = dist$2.SimpleEventList;

    exports.SignalDispatcher = dist$3.SignalDispatcher;
    exports.SignalHandlingBase = dist$3.SignalHandlingBase;
    exports.SignalList = dist$3.SignalList;
    });

    unwrapExports(dist$4);
    var dist_1$4 = dist$4.DispatcherBase;
    var dist_2$4 = dist$4.DispatcherWrapper;
    var dist_3$4 = dist$4.EventListBase;
    var dist_4$1 = dist$4.Subscription;
    var dist_5 = dist$4.EventDispatcher;
    var dist_6 = dist$4.EventHandlingBase;
    var dist_7 = dist$4.EventList;
    var dist_8 = dist$4.SimpleEventDispatcher;
    var dist_9 = dist$4.SimpleEventHandlingBase;
    var dist_10 = dist$4.SimpleEventList;
    var dist_11 = dist$4.SignalDispatcher;
    var dist_12 = dist$4.SignalHandlingBase;
    var dist_13 = dist$4.SignalList;
    var EventArgs =  (function () {
        function EventArgs() {
            this.cancel = false;
        }
        return EventArgs;
    }());

    var ElementLoaderEventArgs =  (function (_super) {
        __extends(ElementLoaderEventArgs, _super);
        function ElementLoaderEventArgs(key, elmArgs) {
            var _this = _super.call(this) || this;
            _this.loadFailed = false;
            _this.lInterval = 0;
            _this.lCount = 0;
            _this.lkey = key;
            _this.elementArgs = elmArgs;
            _this.lCount = elmArgs.count;
            _this.lInterval = elmArgs.interval;
            return _this;
        }
        Object.defineProperty(ElementLoaderEventArgs.prototype, "count", {
            get: function () {
                return this.lCount;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(ElementLoaderEventArgs.prototype, "key", {
            get: function () {
                return this.lkey;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(ElementLoaderEventArgs.prototype, "interval", {
            get: function () {
                return this.lInterval;
            },
            enumerable: true,
            configurable: true
        });
        return ElementLoaderEventArgs;
    }(EventArgs));
    var ElementsLoadedArgs =  (function (_super) {
        __extends(ElementsLoadedArgs, _super);
        function ElementsLoadedArgs(numOfScripts) {
            var _this = _super.call(this) || this;
            _this.lTotalScripts = 0;
            _this.lTotalScripts = numOfScripts;
            return _this;
        }
        Object.defineProperty(ElementsLoadedArgs.prototype, "totalNumberOfScripts", {
            get: function () {
                return this.lTotalScripts;
            },
            enumerable: true,
            configurable: true
        });
        return ElementsLoadedArgs;
    }(EventArgs));
    var ElementsLoadFailArgs =  (function (_super) {
        __extends(ElementsLoadFailArgs, _super);
        function ElementsLoadFailArgs(numOfScripts, remainingScripts) {
            var _this = _super.call(this, numOfScripts) || this;
            _this.lRemainingEvents = remainingScripts;
            return _this;
        }
        Object.defineProperty(ElementsLoadFailArgs.prototype, "remainingEvents", {
            get: function () {
                return this.lRemainingEvents;
            },
            enumerable: true,
            configurable: true
        });
        return ElementsLoadFailArgs;
    }(ElementsLoadedArgs));

    var ElementLoader =  (function () {
        function ElementLoader() {
            this.lTotalScripts = 0; 
            this.lEventsFailed = [];
            this.lOnElementLoaded = new dist_5();
            this.lOnAllElementLoaded = new dist_5();
            this.lOnElementLoadFail = new dist_5();
            this.lOnTick = new dist_5();
            this.lOnTickExpired = new dist_5();
            this.lEvents = {};
        }
        ElementLoader.prototype.addElement = function (key, e) {
            if (key.length === 0) {
                Log.error(appSettings.shortName + ": addElement: key argument can not be an empty string");
                return;
            }
            if (this.lEvents.hasOwnProperty(key)) {
                Log.error(appSettings.shortName + ": addElement: key " + key + " is already in the list of elemets and can not be added again");
                return;
            }
            this.lEvents[key] = e;
            this.lTotalScripts++;
        };
        ElementLoader.prototype.hasElement = function (key) {
            if (key.length === 0) {
                Log.debugWarn(appSettings.shortName + ": addElement: key is empty");
                return false;
            }
            var reslut = this.lEvents.hasOwnProperty(key);
            return reslut;
        };
        ElementLoader.prototype.onAllElementsLoaded = function () {
            return this.lOnAllElementLoaded.asEvent();
        };
        ElementLoader.prototype.onElementsLoadFail = function () {
            return this.lOnElementLoadFail.asEvent();
        };
        ElementLoader.prototype.onElementLoaded = function () {
            return this.lOnElementLoaded.asEvent();
        };
        ElementLoader.prototype.onTick = function () {
            return this.lOnTick.asEvent();
        };
        ElementLoader.prototype.onTickExpired = function () {
            return this.lOnTickExpired.asEvent();
        };
        ElementLoader.prototype.start = function () {
            var _this = this;
            var onBeforeStartEventArgs = new EventArgs();
            this.onBeforeStart(onBeforeStartEventArgs);
            if (onBeforeStartEventArgs.cancel === true) {
                return;
            }
            var _loop_1 = function (key) {
                if (this_1.lEvents.hasOwnProperty(key)) {
                    var element = this_1.lEvents[key];
                    element.onTick().subscribe(function (sender, args) {
                        var eArgs = new ElementLoaderEventArgs(key, args);
                        _this.tick(eArgs);
                        if (eArgs.cancel === true) {
                            return;
                        }
                        _this.lOnTick.dispatch(_this, eArgs);
                    });
                    element.onExpired().subscribe(function (sender, args) {
                        var eArgs = new ElementLoaderEventArgs(key, args);
                        sender.dispose();
                        _this.tickExpired(eArgs);
                        if (eArgs.cancel === true) {
                            return;
                        }
                        _this.lOnTickExpired.dispatch(_this, eArgs);
                    });
                    element.onElementLoaded().subscribe(function (sender, args) {
                        var eArgs = new ElementLoaderEventArgs(key, args);
                        sender.dispose();
                        _this.elementLoaded(eArgs);
                        if (eArgs.cancel === true) {
                            return;
                        }
                        _this.lOnElementLoaded.dispatch(_this, eArgs);
                    });
                    element.start();
                }
            };
            var this_1 = this;
            for (var key in this.lEvents) {
                _loop_1(key);
            }
            this.onAfterStart(new EventArgs());
        };
        ElementLoader.prototype.dispose = function () {
            for (var key in this.lEvents) {
                if (this.lEvents.hasOwnProperty(key)) {
                    var el = this.lEvents[key];
                    if (el.isDisposed === false) {
                        el.dispose();
                    }
                }
            }
            this.lEvents = {};
        };
        ElementLoader.prototype.onBeforeStart = function (args) {
            return;
        };
        ElementLoader.prototype.onAfterStart = function (args) {
            return;
        };
        ElementLoader.prototype.elementLoaded = function (args) {
            if (this.lEvents.hasOwnProperty(args.key) === false) {
                Log.error(appSettings.shortName + ": elementLoaded: key " + args.key + " was not found to delete. This may be a serious error");
                return;
            }
            else {
                delete this.lEvents[args.key];
            }
            this.goForFinish();
        };
        ElementLoader.prototype.tick = function (args) {
            return;
        };
        ElementLoader.prototype.tickExpired = function (args) {
            args.loadFailed = true;
            this.lEventsFailed.push(args.key);
            if (this.lEvents.hasOwnProperty(args.key) === false) {
                Log.error(appSettings.shortName + ": tickExpired: key " + args.key + " was not found to delete. This may be a serious error");
                return;
            }
            else {
                delete this.lEvents[args.key];
            }
            this.goForFinish();
            return;
        };
        ElementLoader.prototype.allElementsLoaded = function (args) {
            if (this.lEventsFailed.length > 0) {
                args.cancel = true;
                var eArgs = new ElementsLoadFailArgs(this.lTotalScripts, this.lEventsFailed);
                this.lOnElementLoadFail.dispatch(this, eArgs);
            }
            return;
        };
        ElementLoader.prototype.goForFinish = function () {
            var done = this.isElementsLoaded();
            if (done) {
                var eArgs = new ElementsLoadedArgs(this.lTotalScripts);
                this.allElementsLoaded(eArgs);
                if (eArgs.cancel === false) {
                    this.lOnAllElementLoaded.dispatch(this, eArgs);
                }
            }
            else {
            }
        };
        ElementLoader.prototype.isElementsLoaded = function () {
            for (var key in this.lEvents) {
                if (this.lEvents[key]) {
                    return false;
                }
            }
            return true;
        };
        return ElementLoader;
    }());

    var IntervalEventArgs =  (function (_super) {
        __extends(IntervalEventArgs, _super);
        function IntervalEventArgs(ticks, interval) {
            if (interval === void 0) { interval = 0; }
            var _this = _super.call(this) || this;
            _this.lCount = ticks;
            _this.lInterval = interval;
            return _this;
        }
        Object.defineProperty(IntervalEventArgs.prototype, "count", {
            get: function () {
                return this.lCount;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(IntervalEventArgs.prototype, "interval", {
            get: function () {
                return this.lInterval;
            },
            enumerable: true,
            configurable: true
        });
        return IntervalEventArgs;
    }(EventArgs));
    var exceptionMessages = {
        argLessThenZero: 'Argument "{0}" must to be zero or greater',
        argLessThenOne: 'Argument "{0}" must be one or greater',
        argEmptyString: 'Argument "{0}" is not allowed to be an empty string',
        argKeyExist: 'Argument "{0}" invalid key. Key "{1}" already exist.'
    };

    Number.prototype.thousandsSeperator = function () {
        return Number(this).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    };
    String.Format = function (str) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        return str.replace(/{(\d+)}/g, function (match, index) { return args[index] || ''; });
    };
    var Interval =  (function () {
        function Interval(interval, maxCount) {
            var _this = this;
            this.edOnTick = new dist_5();
            this.edOnTickExpired = new dist_5();
            this.lTick = 0;
            this.lIsDisposed = false;
            this.isAtInterval = function () {
                return _this.lTick > _this.lMaxTick;
            };
            this.lMaxTick = maxCount;
            this.lIntervalTime = interval;
            if (this.lIntervalTime < 0) {
                throw new RangeError(String.Format(exceptionMessages.argLessThenZero, 'interval'));
            }
            if (this.lMaxTick < 1) {
                return;
            }
            this.startInterval();
        }
        Interval.prototype.onTick = function () {
            return this.edOnTick.asEvent();
        };
        Interval.prototype.onExpired = function () {
            return this.edOnTickExpired.asEvent();
        };
        Interval.prototype.dispose = function () {
            if (this.lIsDisposed === true) {
                return;
            }
            try {
                if (this.lInterval) {
                    clearInterval(this.lInterval);
                }
            }
            finally {
                this.lMaxTick = 0;
                this.lIntervalTime = 0;
                this.lMaxTick = 0;
                this.lIsDisposed = true;
            }
        };
        Object.defineProperty(Interval.prototype, "isDisposed", {
            get: function () {
                return this.lIsDisposed;
            },
            enumerable: true,
            configurable: true
        });
        Object.defineProperty(Interval.prototype, "count", {
            get: function () {
                return this.lTick;
            },
            enumerable: true,
            configurable: true
        });
        Interval.prototype.startInterval = function () {
            var _this = this;
            this.lInterval = setInterval(function () {
                _this.tick();
            }, this.lIntervalTime);
        };
        Interval.prototype.onTickTock = function (eventArgs) {
            if (eventArgs.cancel === true) {
                return;
            }
            return;
        };
        Interval.prototype.onTicks = function (eventArgs) {
            if (eventArgs.cancel === true) {
                return;
            }
            return;
        };
        Interval.prototype.onTickExpired = function (eventArgs) {
            if (eventArgs.cancel === true) {
                return;
            }
            return;
        };
        Interval.prototype.tick = function () {
            this.lTick += 1;
            var eventArgs = new IntervalEventArgs(this.lTick, this.lIntervalTime);
            this.onTicks(eventArgs);
            if (this.isAtInterval()) {
                if (this.lInterval) {
                    clearInterval(this.lInterval);
                }
                this.onTickExpired(eventArgs);
                if (eventArgs.cancel === true) {
                    return;
                }
                this.edOnTickExpired.dispatch(this, eventArgs);
            }
            else {
                this.onTickTock(eventArgs);
                if (eventArgs.cancel === true) {
                    return;
                }
                this.edOnTick.dispatch(this, eventArgs);
            }
        };
        return Interval;
    }());
    var IntervalManual =  (function (_super) {
        __extends(IntervalManual, _super);
        function IntervalManual(interval, maxCount) {
            var _this = _super.call(this, interval, maxCount) || this;
            _this.lIsStarted = false;
            return _this;
        }
        IntervalManual.prototype.start = function () {
            if (this.isStarted === true) {
                return;
            }
            this.lIsStarted = true;
            _super.prototype.startInterval.call(this);
        };
        IntervalManual.prototype.dispose = function () {
            this.lIsStarted = false;
            _super.prototype.dispose.call(this);
        };
        Object.defineProperty(IntervalManual.prototype, "isStarted", {
            get: function () {
                return this.lIsStarted;
            },
            enumerable: true,
            configurable: true
        });
        IntervalManual.prototype.startInterval = function () {
        };
        return IntervalManual;
    }(Interval));
    var utilFnAsStringExist = function (fnstring) {
        var fn = window[fnstring];
        if (typeof fn === 'function') {
            return true;
        }
        else {
            return false;
        }
    };
    var utilFnArrayExist = function (fnArray) {
        if (fnArray.length === 0) {
            return true;
        }
        var result = true;
        for (var fn in fnArray) {
            if (fnArray.hasOwnProperty(fn)) {
                var testFn = fnArray[fn];
                result = result && utilFnAsStringExist(testFn);
            }
        }
        return result;
    };
    var utilCreateElement = function (tag) {
        var D = document;
        var node = D.createElement(tag);
        return node;
    };
    var BaseElementLoad =  (function (_super) {
        __extends(BaseElementLoad, _super);
        function BaseElementLoad(interval, maxCount) {
            if (interval === void 0) { interval = 500; }
            if (maxCount === void 0) { maxCount = 30; }
            var _this = _super.call(this, interval, maxCount) || this;
            _this.ptIsLoaded = false;
            _this.elementLoaded = new dist_1$1();
            return _this;
        }
        BaseElementLoad.prototype.onElementLoaded = function () {
            return this.elementLoaded.asEvent();
        };
        BaseElementLoad.prototype.fnAsStringExist = function (fnstring) {
            return utilFnAsStringExist(fnstring);
        };
        BaseElementLoad.prototype.fnArrayExist = function (fnArray) {
            return utilFnArrayExist(fnArray);
        };
        return BaseElementLoad;
    }(IntervalManual));

    var elementAddToDoc = function (e, nodeLocation) {
        var D = document;
        var targ;
        switch (nodeLocation) {
            case ElementLocation.body:
                targ = D.getElementsByTagName('body')[0] || D.body;
                break;
            case ElementLocation.head:
                targ = D.getElementsByTagName('head')[0] || D.head;
                break;
            default:
                targ = D.getElementsByTagName('body')[0] || D.body || D.documentElement;
                break;
        }
        targ.appendChild(e);
    };
    var elementCreate = function (args) {
        var htmlNode = utilCreateElement(args.elementTag); 
        if (args.elementAttributes) {
            for (var key in args.elementAttributes) {
                if (args.elementAttributes.hasOwnProperty(key)) {
                    var value = args.elementAttributes[key];
                    htmlNode.setAttribute(key, value);
                }
            }
        }
        if (args.elementHtml && args.elementHtml.length > 0) {
            htmlNode.innerHTML = args.elementHtml;
        }
        if (args.elementText && args.elementText.length > 0) {
            htmlNode.textContent = args.elementText;
        }
        return htmlNode;
    };
    var elementsCreate = function (args) {
        var parentEl = elementCreate(args);
        if (args.childElements) {
            addElementRecursive(parentEl, args.childElements);
        }
        return parentEl;
    };
    var addElementRecursive = function (parentElement, args) {
        if (args && args.length > 0) {
            for (var i = 0; i < args.length; i++) {
                var el = args[i];
                var childEl = elementCreate(el);
                parentElement.appendChild(childEl);
                if (el.childElements) {
                    addElementRecursive(childEl, args[i].childElements);
                }
            }
        }
    };
    var ElementLoad =  (function (_super) {
        __extends(ElementLoad, _super);
        function ElementLoad(args) {
            var _this = _super.call(this, 0, 1) || this;
            _this.lArgs = args;
            return _this;
        }
        ElementLoad.prototype.onTickTock = function (eventArgs) {
            if (eventArgs.count > 1) {
                eventArgs.cancel = true;
                return;
            }
            if (this.lArgs.elementCreate.childElements) {
                var multiHtml = elementsCreate(this.lArgs.elementCreate);
                elementAddToDoc(multiHtml, this.lArgs.scriptLocation);
            }
            else {
                var eHtml = elementCreate(this.lArgs.elementCreate);
                elementAddToDoc(eHtml, this.lArgs.scriptLocation);
            }
            this.elementLoaded.dispatch(this, eventArgs);
            this.dispose();
        };
        ElementLoad.prototype.onTickExpired = function (eventArgs) {
            return;
        };
        return ElementLoad;
    }(BaseElementLoad));

    var MainElementLoader =  (function (_super) {
        __extends(MainElementLoader, _super);
        function MainElementLoader() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        MainElementLoader.prototype.onBeforeStart = function (args) {
            if (args.cancel === true) {
                return;
            }
            this.addStyleCss();
        };
        MainElementLoader.prototype.addStyleCss = function () {
            this.addStyle('styleCss', this.getStyleCss(), ElementLocation.head);
        };
        MainElementLoader.prototype.getStyleCss = function () {
            var css = '.mem-fs-button::after{content:"";background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACk0lEQVR42mNgGAWjYBSMUFAlx8RQI69IJJanyK5qOS4S7BIjzfAaeVmGFbr/icYLtH4zNClmkOyJXpXjDEt1iLdnktp92noEhGdqfCTJjnoFV5LtoItHpqu/JcmOOnnzgfXIciBerP0PBc/QeA8MYTeSk1aH8mKGeVo/UcxaovOPfh5pVeqhSSEDyvhT1B7TL2nRwjMQTzyhbdICOXyZDu08g8sT6CUaxR4BpdtWpS6aeAaXJ+Zq/mBoV5pLfY+AALU9g88TtfJaDC2KDbTxCH7P9FHVEyBABY9IoxiwGMkj+DzTrFhOtB2T1O7h9QRVPAICoGYHzIAZGh8w5LF5ZqbGJ7JrdXRPYFPXrbKHdI80KiSBPTBd/Q3YQGygVakbxTNT1V8SZXatvCE4BvF5AgbalRYyzNb8yjBR9SZDtbwI7VrKTYrF4HbWVPUXwGaHPdH62pQmMczS+AxMLneBntAY7XKMglEwCkbBKBgFgwY0KIQCa3UbElu/LOBmEK6mCZUdGAJsZznjbYpPVnsAb/22K80j0hNs4AELWC8Q1GbDrZYH6OEU8j3cp3oW3qjrVN5AVH9ituY3IhuksUR1zqrl+BhmaX6B94lAMUhyp2c52kgiMZ2iycAREOJavzoY/XFsnmlSLERRM0H1OvV6iPh7dsS3YonpNtOsq0tM95QUQMgzNPEItT1BjGdo4hFaeIKQZyaq3ab9IDa1PIHPMzQfMqW2J4j1DFU9ArKoQ3kleBwLgnuAlaYHmQN0fMAitgDJrD6wYwd0fqRDeRmJnmADDx8NuokeYmt1RPMnfHDOWE1Uu0myHfgmdajiEdBAGKi5QRx+BBwB3EXW4BkoVvpVLxNtV6fy2tGuxigYBaNg+AAAZ7k6IXnaMaQAAAAASUVORK5CYII=);background-size:cover;opacity:.4;top:0;left:0;bottom:0;right:0;position:absolute;z-index:100;-webkit-filter:grayscale(1);filter:grayscale(1)}.mem-fs-button-parent{width:50px;height:50px;position:fixed;top:10px;right:10px;z-index:101}.mem-fs-button{position:absolute;top:0;left:0;right:0;bottom:0}.mem-fs-button:hover{cursor:pointer;opacity:1;filter:grayscale(0);-webkit-filter:grayscale(0);-webkit-filter:drop-shadow(4px 4px 4px #d107c0);filter:drop-shadow(4px 4px 4px #d107c0)}.mem-fs-button:hover::after{content:"";cursor:pointer;opacity:1;filter:grayscale(0);-webkit-filter:grayscale(0)}.mem-fs-button-parent .mem-fs-btntooltip{visibility:hidden;width:120px;background-color:#272822;color:#fff;text-align:center;border-radius:6px;padding:5px 0;position:absolute;z-index:1;top:2px;right:105%;opacity:0;transition:opacity 1s}.mem-fs-button-parent:hover .mem-fs-btntooltip{visibility:visible;opacity:1}.mem-fs-button-parent .mem-fs-btntooltip::after{content:"";position:absolute;top:50%;left:100%;margin-top:-5px;border-width:5px;border-style:solid;border-color:transparent transparent transparent #272822}.mem-fs-game{background-color:#8d6b15}.mem-fs-game-gobs{background-color:#e0d7e3}.mem-fs-game-sg{background-color:#000}.mem-fs-game-swg{background-color:#ede8ee}.mem-fs-no-sel{-webkit-user-select:none;user-select:none;-o-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none}.mem-fs-wrap-ctl{background-color:brown}div.mem-fs-ctl{display:block;width:100%;text-align:center}div#mem-ctl-wrap div.mem-fs-ctl{display:inline-block;margin:0 0 10px 0}div.mem-fs-toggle-ctl{display:inline-block;width:100%;text-align:center}div.mem-fs-div-tog{display:inline-block}div.mem-fs-div-tog:hover{cursor:pointer}i.mem-fs-tog{border:solid #000;border-width:0 3px 3px 0;display:inline-block;padding:3px}i.mem-fs-tog.right{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}i.mem-fs-tog.left{transform:rotate(135deg);-webkit-transform:rotate(135deg)}i.mem-fs-tog.up{transform:rotate(-135deg);-webkit-transform:rotate(-135deg)}i.mem-fs-tog.down{transform:rotate(45deg);-webkit-transform:rotate(45deg)}';
            return css;
        };
        MainElementLoader.prototype.addStyle = function (key, styelcontent, elementLocation) {
            if (elementLocation === void 0) { elementLocation = ElementLocation.head; }
            var elCss = new ElementLoad({
                scriptLocation: elementLocation,
                elementCreate: {
                    elementTag: 'style',
                    elementText: styelcontent,
                    elementAttributes: {
                        type: 'text/css'
                    }
                }
            });
            this.addElement(key, elCss);
        };
        return MainElementLoader;
    }(ElementLoader));
    var Fullscreen =  (function () {
        function Fullscreen() {
            var _this = this;
            this.inFullScreen = false;
            this.lWrapDivId = 'mem-fs-game-wrap';
            this.fullScreenChange = function () {
                if (document.fullscreenEnabled ||
                    document.webkitIsFullScreen ||
                    document.mozFullScreen ||
                    document.msFullscreenElement) {
                    _this.inFullScreen = !_this.inFullScreen;
                    _this.toggleClass();
                    _this.toggleDisplay();
                }
                else {
                }
            };
        }
        Fullscreen.prototype.init = function () {
            this.addDoucmentEvent();
            this.injectButton();
            this.addBtnClick();
        };
        Fullscreen.prototype.toggleDisplay = function () {
            var jqGameBoard = $(appSettings.gameBoardSelector);
            if (jqGameBoard.length !== 1) {
                return;
            }
        };
        Fullscreen.prototype.injectButton = function () {
            var divBtnHolder = $(appSettings.buttonPlacementSelector);
            if (!divBtnHolder.length) {
                Log.error(appSettings.shortName + " could not find where to place button: selector: " + appSettings.buttonPlacementSelector);
                return;
            }
            var btnHtml = this.getButton();
            divBtnHolder.append(btnHtml);
        };
        Fullscreen.prototype.getButton = function () {
            var htmlArgs = {
                elementTag: 'div',
                elementAttributes: {
                    class: 'mem-fs-button-parent'
                },
                childElements: [{
                        elementTag: 'div',
                        elementAttributes: {
                            id: appSettings.buttonId,
                            class: 'mem-fs-button'
                        }
                    },
                    {
                        elementTag: 'span',
                        elementAttributes: {
                            class: 'mem-fs-btntooltip'
                        },
                        elementText: 'Click to open game in full screen view'
                    }]
            };
            var btnDiv = elementsCreate(htmlArgs);
            return btnDiv;
        };
        Fullscreen.prototype.addBtnClick = function () {
            var _this = this;
            var intTick = new IntervalManual(500, 30);
            intTick.onTick().subscribe(function () {
                var divBtn = $("#" + appSettings.buttonId);
                if (!divBtn.length) {
                    Log.message("try no: " + intTick.count + " looking for button: " + appSettings.buttonId);
                    return;
                }
                Log.message("Found button " + appSettings.buttonId + " on try " + intTick.count);
                intTick.dispose();
                divBtn.on('click', function () {
                    var jqGameBoard = $(appSettings.gameBoardSelector);
                    if (jqGameBoard.length !== 1) {
                        return;
                    }
                    jqGameBoard.wrap(_this.getGameWrapper());
                    var gmBoard = $("#" + _this.lWrapDivId)[0];
                    if (gmBoard) {
                        if (gmBoard.requestFullscreen) {
                            gmBoard.requestFullscreen();
                        }
                        else if (gmBoard.webkitRequestFullscreen) {
                            gmBoard.webkitRequestFullscreen();
                        }
                        else if (gmBoard.mozRequestFullScreen) {
                            gmBoard.mozRequestFullScreen();
                        }
                        else if (gmBoard.msRequestFullscreen) {
                            gmBoard.msRequestFullscreen();
                        }
                    }
                });
            });
            intTick.onExpired().subscribe(function () {
                Log.warn("Unable to find button " + appSettings.buttonId);
            });
            intTick.start();
        };
        Fullscreen.prototype.addDoucmentEvent = function () {
            if (document.fullscreenEnabled) {
                document.addEventListener('fullscreenchange', this.fullScreenChange);
            }
            else if (document.webkitExitFullscreen) {
                document.addEventListener('webkitfullscreenchange', this.fullScreenChange);
            }
            else if (document.mozRequestFullScreen) {
                document.addEventListener('mozfullscreenchange', this.fullScreenChange);
            }
            else if (document.msRequestFullscreen) {
                document.addEventListener('MSFullscreenChange', this.fullScreenChange);
            }
        };
        Fullscreen.prototype.getGameWrapper = function () {
            var htmlArgs = {
                elementTag: 'div',
                elementAttributes: {
                    id: this.lWrapDivId,
                    class: "mem-fs-no-sel " + this.getWrapperBgClass()
                }
            };
            return elementsCreate(htmlArgs);
        };
        Fullscreen.prototype.getWrapperBgClass = function () {
            var loc = window.location.href;
            var result;
            if (loc.includes('grids-of-black-squares')
                || loc.includes('abacus-games')
                || loc.includes('grids-of-pictures')) {
                result = 'mem-fs-game-gobs';
            }
            else if (loc.includes('simon-games')) {
                result = 'mem-fs-game-sg';
            }
            else if (loc.includes('sight-word-games')) {
                result = 'mem-fs-game-swg';
            }
            else {
                result = 'mem-fs-game';
            }
            return result;
        };
        Fullscreen.prototype.toggleClass = function () {
            var elBoard = $(appSettings.gameBoardSelector);
            if (elBoard.length !== 1) {
                return;
            }
            if (this.inFullScreen === false) {
                elBoard.unwrap();
            }
        };
        return Fullscreen;
    }());

    var ControlToggle =  (function () {
        function ControlToggle() {
            this.lDivWrapId = 'mem-ctl-wrap';
            this.lDivtoggleId = 'mem-div-tog';
            this.lVisible = true;
        }
        ControlToggle.prototype.init = function () {
            if (this.controlExist() === true) {
                this.wrapControl();
                this.addControlClass();
                this.insertToggle();
                this.addOnClick();
            }
            else {
                Log.message("Selector " + appSettings.controlSelector + " is not found on this page");
            }
        };
        ControlToggle.prototype.addControlClass = function () {
            $(appSettings.controlSelector).addClass('mem-fs-ctl');
        };
        ControlToggle.prototype.addOnClick = function () {
            var _this = this;
            $("#" + this.lDivtoggleId).on('click', function () {
                _this.toggle();
            });
        };
        ControlToggle.prototype.controlExist = function () {
            return $(appSettings.controlSelector).length === 1;
        };
        ControlToggle.prototype.insertToggle = function () {
            var html = {
                elementTag: 'div',
                elementAttributes: {
                    id: this.lDivtoggleId,
                    class: 'mem-fs-div-tog'
                },
                childElements: [{
                        elementTag: 'i',
                        elementAttributes: {
                            class: 'mem-fs-tog up'
                        }
                    }]
            };
            var arrow = elementsCreate(html);
            $("#" + this.lDivWrapId).prepend(arrow);
        };
        ControlToggle.prototype.wrapControl = function () {
            var htmlWrap = {
                elementTag: 'div',
                elementAttributes: {
                    id: this.lDivWrapId,
                    class: 'mem-fs-toggle-ctl'
                }
            };
            var wrapDiv = elementsCreate(htmlWrap);
            $(appSettings.controlSelector).wrap(wrapDiv);
        };
        ControlToggle.prototype.toggle = function () {
            var el = $('i.mem-fs-tog');
            if (this.lVisible) {
                $(appSettings.controlSelector).slideUp('slow', function () {
                    el.removeClass('up');
                    el.addClass('down');
                });
            }
            else {
                $(appSettings.controlSelector).slideDown('slow', function () {
                    el.removeClass('down');
                    el.addClass('up');
                });
            }
            this.lVisible = !this.lVisible;
        };
        return ControlToggle;
    }());

    var validateIfTop = function () {
        return window.top === window.self;
    };
    var main = function () {
        Log.message(appSettings.shortName + ": Start main...");
        var ctlTog = new ControlToggle();
        ctlTog.init();
        var fs = new Fullscreen();
        fs.init();
        Log.message(appSettings.shortName + ": End main...");
    };
    if (validateIfTop()) {
        Log.message(appSettings.shortName + ': Entry Script: Start loading...');
        var iv_1 = new IntervalManual(500, 30);
        iv_1.onTick().subscribe(function (s, a) {
            if ($(appSettings.gameBoardSelector).length === 1) {
                iv_1.dispose();
                var loader_1 = new MainElementLoader();
                loader_1.onAllElementsLoaded().subscribe(function (sender, args) {
                    loader_1.dispose();
                    Log.message(appSettings.shortName + ": Entry Script: All Scripts loaded. Total count: " + args.totalNumberOfScripts);
                    main();
                });
                loader_1.onElementsLoadFail().subscribe(function (sender, args) {
                    loader_1.dispose();
                    Log.error(appSettings.shortName + ": Entry Script: The neceassary elements were note loaded. Failed:", args.remainingEvents);
                });
                loader_1.onElementLoaded().subscribe(function (sender, args) {
                    Log.message(appSettings.shortName + ": Entry Script: Element with Key value of '" + args.key + "' has loaded");
                });
                loader_1.onTickExpired().subscribe(function (sender, args) {
                    Log.warn(appSettings.shortName + ": Entry Script: Element with Key value of '" + args.key + "' has failed to load");
                });
                loader_1.start();
            }
        });
        iv_1.onExpired().subscribe(function (sender, args) {
            Log.message(appSettings.shortName + ": No game board found on this page");
        });
        iv_1.start();
        Log.message(appSettings.shortName + ': Entry Script: End loading...');
    }

}($));