if (window.Worker)
{
    var _TimerWorkCallBacks = [];
    var _TimerIds = 0;

    var _TimerWorker = new window.Worker("Scripts/TimerWorker.js");
    _TimerWorker.onmessage = function (e)
    {
        var Message = e.data;

        switch (Message.Action)
        {
            case "ELASPED":
                var TimerWorkCallBack = _TimerWorkCallBacks[Message.Id];

                if (!TimerWorkCallBack)
                {
                    return;
                }

                var Window = TimerWorkCallBack.Window;
                var CallBack = TimerWorkCallBack.CallBack;
                var Arguments = TimerWorkCallBack.Arguments;

                if (typeof (CallBack) === 'string')
                {
                    CallBack = new Function(CallBack);
                }
                if (typeof (CallBack) === 'function')
                {
                    CallBack.apply(Window, Arguments);
                }

                if (Message.RunOnce == true)
                {
                    _clearIntervalWorker(Message.Id);
                }
                break;
        }
    };

    window.setIntervalWorker = function (CallBack, TimeOut, Arguments)
    {
        Arguments = Array.prototype.slice.call(arguments).slice(2);
        return _setIntervalWorker(false, CallBack, TimeOut, Arguments, window);
    };
    window.setTimeoutWorker = function (CallBack, TimeOut, Arguments)
    {
        Arguments = Array.prototype.slice.call(arguments).slice(2);
        return _setIntervalWorker(true, CallBack, TimeOut, Arguments, window);
    };
    var _setIntervalWorker = function (RunOnce, CallBack, TimeOut, Arguments, Window)
    {
        var Id = ++_TimerIds;

        _TimerWorkCallBacks[Id] = {
            CallBack: CallBack,
            Arguments: Arguments,
            Window: Window,
        };

        _TimerWorker.postMessage({
            Action: "START",
            RunOnce: RunOnce,
            Id: Id,
            TimeOut: TimeOut,
        });

        return Id;
    };

    window.clearIntervalWorker = function (Id)
    {
        _clearIntervalWorker(Id);
    };
    window.clearTimeoutWorker = function (Id)
    {
        _clearIntervalWorker(Id);
    };
    var _clearIntervalWorker = function (Id)
    {
        if (!Id)
        {
            return;
        }

        _TimerWorker.postMessage({
            Action: "STOP",
            Id: Id,
        });

        delete _TimerWorkCallBacks[Id];
    };
}
