sp-magic.de/bower_components/foundation-sites/js/foundation.util.timerAndImageLoader.js
2016-10-28 19:56:41 +02:00

87 lines
2 KiB
JavaScript

'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);