View file xmyx.ru/files/js/func.Tick.js

File size: 4.89Kb
/**
 * by koder_alex
 * @type {{setTick, clearTick, setTime, stopTick}}
 */
var Tick = function () {
    var IDTimers = [];
    var IDCallFuncTick = [];
    var IDCallFuncTime = [];
    var Time = 5e3;

    var t = function iv() {
        var t = {
            i: -1,
            change: function (e) {
                if (!t.isSupported()) return !1;
                t.i += 1;
                var n = t.i;
                return t._callbacks[n] = e, t._listen(), n
            }, hidden: function () {
                return !(!t._doc.hidden && !t._doc.webkitHidden)
            }, state: function () {
                return t._doc.visibilityState || t._doc.webkitVisibilityState || "visible"
            }, isSupported: function () {
                return !(!t._doc.visibilityState && !t._doc.webkitVisibilityState)
            }, _doc: document || {},
            _callbacks: {}, _change: function (e) {
                var i = t.state();
                for (var n in t._callbacks) t._callbacks[n].call(t._doc, e, i)
            }, _listen: function () {
                if (!t._init) {
                    var e = "visibilitychange";
                    t._doc.webkitVisibilityState && (e = "webkit" + e);
                    var i = function () {
                        t._change.apply(t, arguments)
                    };
                    t._doc.addEventListener ? t._doc.addEventListener(e, i) : t._doc.attachEvent(e, i), t._init = !0
                }
            }, _timers: {}, _time: function () {
                t._timed || (t._timed = !0, t._wasHidden = t.hidden(), t.change(function () {
                    t._stopRun(), t._wasHidden = t.hidden()
                }))
            }, _run: function (i, n) {
                var r, d = t._timers[i];
                if (t.hidden()) {
                    if (null === d.hidden) return;
                    r = d.hidden
                } else r = d.visible;
                var a = function () {
                    d.last = new Date, d.callback.apply(null, d.args)
                };
                if (n) {
                    var o = new Date, c = o - d.last;
                    r > c ? d.delay = setTimeout(function () {
                        d.id = setInterval(a, r), a()
                    }, r - c) : (d.id = setInterval(a, r), a())
                } else d.id = setInterval(a, r)
            }, _stop: function (e) {
                var i = t._timers[e];
                clearInterval(i.id), clearTimeout(i.delay), delete i.id, delete i.delay
            }, _stopRun: function (e) {
                var i = t.hidden(), n = t._wasHidden;
                if (i && !n || !i && n) for (var r in t._timers) t._stop(r), t._run(r, !i)
            }
        };
        return {
            every: function ev(e, n, r, args) {
                t._time(), r || (r = n, n = null), t.i += 1;
                var d = t.i;
                return t._timers[d] = {
                    visible: e,
                    hidden: n,
                    callback: r,
                    args: args
                }, t._run(d, !1), t.isSupported() && t._listen(), d
            }, stop: function st(e) {
                return !!t._timers[e] && (t._stop(e), delete t._timers[e], !0)
            }
        }
    }();

    return {
        setTick: function (func) {
            var r = Array.prototype.slice.call(arguments);
            r.shift();
            if ((typeof func).toLowerCase() != 'function') {
                return false;
            }
            var key = func.name;

            if (key == undefined || key == '') {
                return false;
            }

            if (IDCallFuncTick[key] == undefined) {
                IDCallFuncTime[key] = Time;
                Time = 5e3;
                var idT = t.every( IDCallFuncTime[key], null, func, r);
                if (typeof idT != 'undefined') {
                    IDTimers.push(idT);
                    IDCallFuncTick[key] = idT;
                    return true;
                }
            }

            return false;
        },clearTick: function () {
            for (var i = 0; i < IDTimers.length; i++) {
                t.stop(IDTimers[i]);
            }
            IDTimers = [];
            IDCallFuncTick = [];
            IDCallFuncTime = [];
        }, setTime: function (t) {
            Time = t;
            return true;
        }, getTime: function (e) {
            if (IDCallFuncTime[e] === undefined)
                return Time;
            return IDCallFuncTime[e];
        }, stopTick: function (e) {
            if (IDCallFuncTick[e] === undefined)
                return false;
            t.stop(IDCallFuncTick[e]);
            IDTimers.splice(IDTimers.indexOf(IDCallFuncTick[e]), 1);
            delete IDCallFuncTick[e];
            delete IDCallFuncTime[e];
            return true;
        }
    }
}();