'use strict'; var helper = helper || {}; helper.interval = (function () { var privateScope = {}, publicScope = {}; privateScope.intervals = []; /** * * @param {String} name * @param {Function} code function reference (code to be executed) * @param {int} interval time interval in milliseconds * @param {boolean=} first true/false if code should be ran initially before next timer interval hits * @returns {{name: *, timer: null, code: *, interval: *, fired: number, paused: boolean}} */ publicScope.add = function (name, code, interval, first) { /* * Kill existing interval with this name if exists */ publicScope.remove(name); var data = { 'name': name, 'timer': null, 'code': code, 'interval': interval, 'fired': 0, 'paused': false }; if (first == true) { code(); // execute code data.fired++; // increment counter } data.timer = setInterval(function() { code(); data.fired++; }, interval); privateScope.intervals.push(data); return data; }; /** * Method removes and stop execution of interval callback * @param {string} name * @returns {boolean} */ publicScope.remove = function (name) { for (var i = 0; i < privateScope.intervals.length; i++) { if (privateScope.intervals[i].name == name) { clearInterval(privateScope.intervals[i].timer); // stop timer privateScope.intervals.splice(i, 1); return true; } } return false; }; /** * * @param {string} name * @returns {boolean} */ publicScope.pause = function (name) { for (var i = 0; i < privateScope.intervals.length; i++) { if (privateScope.intervals[i].name == name) { clearInterval(privateScope.intervals[i].timer); privateScope.intervals[i].paused = true; return true; } } return false; }; /** * * @param {string} name * @returns {boolean} */ publicScope.resume = function (name) { for (var i = 0; i < privateScope.intervals.length; i++) { if (privateScope.intervals[i].name == name && privateScope.intervals[i].paused) { var obj = privateScope.intervals[i]; obj.timer = setInterval(function() { obj.code(); // execute code obj.fired++; // increment counter }, obj.interval); obj.paused = false; return true; } } return false; }; /** * * @param {=} keep_array * @returns {number} */ publicScope.killAll = function (keep_array) { var timers_killed = 0; for (var i = (privateScope.intervals.length - 1); i >= 0; i--) { // reverse iteration var keep = false; if (keep_array) { // only run through the array if it exists keep_array.forEach(function (name) { if (privateScope.intervals[i].name == name) { keep = true; } }); } if (!keep) { clearInterval(privateScope.intervals[i].timer); // stop timer privateScope.intervals.splice(i, 1); // remove element/object from array timers_killed++; } } return timers_killed; }; return publicScope; })();