text: '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.
          }
          if (cb && typeof cb === 'function') {
            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 () {
        // Check if image is loaded
        if (this.complete || this.readyState === 4 || this.readyState === 'complete') {
          singleImageLoaded();
        }
        // Force load the image
        else {
            // fix for IE. See https://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/
            var src = $(this).attr('src');
            $(this).attr('src', src + (src.indexOf('?') >= 0 ? '&' : '?') + new Date().getTime());
            $(this).one('load', function () {
              singleImageLoaded();
            });
          }
      });
  
      function singleImageLoaded() {
        unloaded--;
        if (unloaded === 0) {
          callback();
        }
      }
    }
  
    Foundation.Timer = Timer;
    Foundation.onImagesLoaded = onImagesLoaded;
  }(jQuery);