PageRenderTime 51ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax/libs/ifvisible/1.0.5/ifvisible.js

https://gitlab.com/Mirros/cdnjs
JavaScript | 314 lines | 311 code | 2 blank | 1 comment | 62 complexity | 03c097812af05c9ded0e577fcc4f51a1 MD5 | raw file
  1. (function() {
  2. (function(root, factory) {
  3. if (typeof define === 'function' && define.amd) {
  4. return define(function() {
  5. return factory();
  6. });
  7. } else if (typeof exports === 'object') {
  8. return module.exports = factory();
  9. } else {
  10. return root.ifvisible = factory();
  11. }
  12. })(this, function() {
  13. var addEvent, customEvent, doc, fireEvent, hidden, idleStartedTime, idleTime, ie, ifvisible, init, initialized, status, trackIdleStatus, visibilityChange;
  14. ifvisible = {};
  15. doc = document;
  16. initialized = false;
  17. status = "active";
  18. idleTime = 60000;
  19. idleStartedTime = false;
  20. customEvent = (function() {
  21. var S4, addCustomEvent, cgid, fireCustomEvent, guid, listeners, removeCustomEvent;
  22. S4 = function() {
  23. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  24. };
  25. guid = function() {
  26. return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
  27. };
  28. listeners = {};
  29. cgid = '__ceGUID';
  30. addCustomEvent = function(obj, event, callback) {
  31. obj[cgid] = undefined;
  32. if (!obj[cgid]) {
  33. obj[cgid] = "ifvisible.object.event.identifier";
  34. }
  35. if (!listeners[obj[cgid]]) {
  36. listeners[obj[cgid]] = {};
  37. }
  38. if (!listeners[obj[cgid]][event]) {
  39. listeners[obj[cgid]][event] = [];
  40. }
  41. return listeners[obj[cgid]][event].push(callback);
  42. };
  43. fireCustomEvent = function(obj, event, memo) {
  44. var ev, j, len, ref, results;
  45. if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
  46. ref = listeners[obj[cgid]][event];
  47. results = [];
  48. for (j = 0, len = ref.length; j < len; j++) {
  49. ev = ref[j];
  50. results.push(ev(memo || {}));
  51. }
  52. return results;
  53. }
  54. };
  55. removeCustomEvent = function(obj, event, callback) {
  56. var cl, i, j, len, ref;
  57. if (callback) {
  58. if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
  59. ref = listeners[obj[cgid]][event];
  60. for (i = j = 0, len = ref.length; j < len; i = ++j) {
  61. cl = ref[i];
  62. if (cl === callback) {
  63. listeners[obj[cgid]][event].splice(i, 1);
  64. return cl;
  65. }
  66. }
  67. }
  68. } else {
  69. if (obj[cgid] && listeners[obj[cgid]] && listeners[obj[cgid]][event]) {
  70. return delete listeners[obj[cgid]][event];
  71. }
  72. }
  73. };
  74. return {
  75. add: addCustomEvent,
  76. remove: removeCustomEvent,
  77. fire: fireCustomEvent
  78. };
  79. })();
  80. addEvent = (function() {
  81. var setListener;
  82. setListener = false;
  83. return function(el, ev, fn) {
  84. if (!setListener) {
  85. if (el.addEventListener) {
  86. setListener = function(el, ev, fn) {
  87. return el.addEventListener(ev, fn, false);
  88. };
  89. } else if (el.attachEvent) {
  90. setListener = function(el, ev, fn) {
  91. return el.attachEvent('on' + ev, fn, false);
  92. };
  93. } else {
  94. setListener = function(el, ev, fn) {
  95. return el['on' + ev] = fn;
  96. };
  97. }
  98. }
  99. return setListener(el, ev, fn);
  100. };
  101. })();
  102. fireEvent = function(element, event) {
  103. var evt;
  104. if (doc.createEventObject) {
  105. return element.fireEvent('on' + event, evt);
  106. } else {
  107. evt = doc.createEvent('HTMLEvents');
  108. evt.initEvent(event, true, true);
  109. return !element.dispatchEvent(evt);
  110. }
  111. };
  112. ie = (function() {
  113. var all, check, div, undef, v;
  114. undef = void 0;
  115. v = 3;
  116. div = doc.createElement("div");
  117. all = div.getElementsByTagName("i");
  118. check = function() {
  119. return (div.innerHTML = "<!--[if gt IE " + (++v) + "]><i></i><![endif]-->", all[0]);
  120. };
  121. while (check()) {
  122. continue;
  123. }
  124. if (v > 4) {
  125. return v;
  126. } else {
  127. return undef;
  128. }
  129. })();
  130. hidden = false;
  131. visibilityChange = void 0;
  132. if (typeof doc.hidden !== "undefined") {
  133. hidden = "hidden";
  134. visibilityChange = "visibilitychange";
  135. } else if (typeof doc.mozHidden !== "undefined") {
  136. hidden = "mozHidden";
  137. visibilityChange = "mozvisibilitychange";
  138. } else if (typeof doc.msHidden !== "undefined") {
  139. hidden = "msHidden";
  140. visibilityChange = "msvisibilitychange";
  141. } else if (typeof doc.webkitHidden !== "undefined") {
  142. hidden = "webkitHidden";
  143. visibilityChange = "webkitvisibilitychange";
  144. }
  145. trackIdleStatus = function() {
  146. var timer, wakeUp;
  147. timer = false;
  148. wakeUp = function() {
  149. clearTimeout(timer);
  150. if (status !== "active") {
  151. ifvisible.wakeup();
  152. }
  153. idleStartedTime = +(new Date());
  154. return timer = setTimeout(function() {
  155. if (status === "active") {
  156. return ifvisible.idle();
  157. }
  158. }, idleTime);
  159. };
  160. wakeUp();
  161. addEvent(doc, "mousemove", wakeUp);
  162. addEvent(doc, "keyup", wakeUp);
  163. addEvent(window, "scroll", wakeUp);
  164. ifvisible.focus(wakeUp);
  165. return ifvisible.wakeup(wakeUp);
  166. };
  167. init = function() {
  168. var blur;
  169. if (initialized) {
  170. return true;
  171. }
  172. if (hidden === false) {
  173. blur = "blur";
  174. if (ie < 9) {
  175. blur = "focusout";
  176. }
  177. addEvent(window, blur, function() {
  178. return ifvisible.blur();
  179. });
  180. addEvent(window, "focus", function() {
  181. return ifvisible.focus();
  182. });
  183. } else {
  184. addEvent(doc, visibilityChange, function() {
  185. if (doc[hidden]) {
  186. return ifvisible.blur();
  187. } else {
  188. return ifvisible.focus();
  189. }
  190. }, false);
  191. }
  192. initialized = true;
  193. return trackIdleStatus();
  194. };
  195. ifvisible = {
  196. setIdleDuration: function(seconds) {
  197. return idleTime = seconds * 1000;
  198. },
  199. getIdleDuration: function() {
  200. return idleTime;
  201. },
  202. getIdleInfo: function() {
  203. var now, res;
  204. now = +(new Date());
  205. res = {};
  206. if (status === "idle") {
  207. res.isIdle = true;
  208. res.idleFor = now - idleStartedTime;
  209. res.timeLeft = 0;
  210. res.timeLeftPer = 100;
  211. } else {
  212. res.isIdle = false;
  213. res.idleFor = now - idleStartedTime;
  214. res.timeLeft = (idleStartedTime + idleTime) - now;
  215. res.timeLeftPer = (100 - (res.timeLeft * 100 / idleTime)).toFixed(2);
  216. }
  217. return res;
  218. },
  219. focus: function(callback) {
  220. if (typeof callback === "function") {
  221. this.on("focus", callback);
  222. } else {
  223. status = "active";
  224. customEvent.fire(this, "focus");
  225. customEvent.fire(this, "wakeup");
  226. customEvent.fire(this, "statusChanged", {
  227. status: status
  228. });
  229. }
  230. return this;
  231. },
  232. blur: function(callback) {
  233. if (typeof callback === "function") {
  234. this.on("blur", callback);
  235. } else {
  236. status = "hidden";
  237. customEvent.fire(this, "blur");
  238. customEvent.fire(this, "idle");
  239. customEvent.fire(this, "statusChanged", {
  240. status: status
  241. });
  242. }
  243. return this;
  244. },
  245. idle: function(callback) {
  246. if (typeof callback === "function") {
  247. this.on("idle", callback);
  248. } else {
  249. status = "idle";
  250. customEvent.fire(this, "idle");
  251. customEvent.fire(this, "statusChanged", {
  252. status: status
  253. });
  254. }
  255. return this;
  256. },
  257. wakeup: function(callback) {
  258. if (typeof callback === "function") {
  259. this.on("wakeup", callback);
  260. } else {
  261. status = "active";
  262. customEvent.fire(this, "wakeup");
  263. customEvent.fire(this, "statusChanged", {
  264. status: status
  265. });
  266. }
  267. return this;
  268. },
  269. on: function(name, callback) {
  270. init();
  271. customEvent.add(this, name, callback);
  272. return this;
  273. },
  274. off: function(name, callback) {
  275. init();
  276. customEvent.remove(this, name, callback);
  277. return this;
  278. },
  279. onEvery: function(seconds, callback) {
  280. var paused, t;
  281. init();
  282. paused = false;
  283. if (callback) {
  284. t = setInterval(function() {
  285. if (status === "active" && paused === false) {
  286. return callback();
  287. }
  288. }, seconds * 1000);
  289. }
  290. return {
  291. stop: function() {
  292. return clearInterval(t);
  293. },
  294. pause: function() {
  295. return paused = true;
  296. },
  297. resume: function() {
  298. return paused = false;
  299. },
  300. code: t,
  301. callback: callback
  302. };
  303. },
  304. now: function(check) {
  305. init();
  306. return status === (check || "active");
  307. }
  308. };
  309. return ifvisible;
  310. });
  311. }).call(this);
  312. //# sourceMappingURL=ifvisible.js.map