'use strict'; !function ($) { function Timer(elem, options, cb) { var _this = this, duration = options.duration, //options is an object for easily adding features later. nameSpace = Object.keys(elem.data())[0] || 'timer', remain = -1, start, timer; this.isPaused = false; this.restart = function () { remain = -1; clearTimeout(timer); this.start(); }; this.start = function () { this.isPaused = false; // if(!elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. clearTimeout(timer); remain = remain <= 0 ? duration : remain; elem.data('paused', false); start = Date.now(); timer = setTimeout(function () { if (options.infinite) { _this.restart(); //rerun the timer. } cb(); }, remain); elem.trigger('timerstart.zf.' + nameSpace); }; this.pause = function () { this.isPaused = true; //if(elem.data('paused')){ return false; }//maybe implement this sanity check if used for other things. clearTimeout(timer); elem.data('paused', true); var end = Date.now(); remain = remain - (end - start); elem.trigger('timerpaused.zf.' + nameSpace); }; } /** * Runs a callback function when images are fully loaded. * @param {Object} images - Image(s) to check if loaded. * @param {Func} callback - Function to execute when image is fully loaded. */ function onImagesLoaded(images, callback) { var self = this, unloaded = images.length; if (unloaded === 0) { callback(); } images.each(function () { if (this.complete) { singleImageLoaded(); } else if (typeof this.naturalWidth !== 'undefined' && this.naturalWidth > 0) { singleImageLoaded(); } else { $(this).one('load', function () { singleImageLoaded(); }); } }); function singleImageLoaded() { unloaded--; if (unloaded === 0) { callback(); } } } Foundation.Timer = Timer; Foundation.onImagesLoaded = onImagesLoaded; }(jQuery);