fuelux
Version:
Base Fuel UX styles and controls
173 lines (137 loc) • 4 kB
JavaScript
/*
* Fuel UX Loader
* https://github.com/ExactTarget/fuelux
*
* Copyright (c) 2014 ExactTarget
* Licensed under the BSD New license.
*/
// -- BEGIN UMD WRAPPER PREFACE --
// For more information on UMD visit:
// https://github.com/umdjs/umd/blob/master/jqueryPlugin.js
(function (factory) {
if (typeof define === 'function' && define.amd) {
// if AMD loader is available, register as an anonymous module.
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// Node/CommonJS
module.exports = factory(require('jquery'));
} else {
// OR use browser globals if AMD is not present
factory(jQuery);
}
}(function ($) {
// -- END UMD WRAPPER PREFACE --
// -- BEGIN MODULE CODE HERE --
var old = $.fn.loader;
// LOADER CONSTRUCTOR AND PROTOTYPE
var Loader = function (element, options) {
this.$element = $(element);
this.options = $.extend({}, $.fn.loader.defaults, options);
this.begin = (this.$element.is('[data-begin]')) ? parseInt(this.$element.attr('data-begin'), 10) : 1;
this.delay = (this.$element.is('[data-delay]')) ? parseFloat(this.$element.attr('data-delay')) : 150;
this.end = (this.$element.is('[data-end]')) ? parseInt(this.$element.attr('data-end'), 10) : 8;
this.frame = (this.$element.is('[data-frame]')) ? parseInt(this.$element.attr('data-frame'), 10) : this.begin;
this.isIElt9 = false;
this.timeout = {};
var ieVer = this.msieVersion();
if (ieVer !== false && ieVer < 9) {
this.$element.addClass('iefix');
this.isIElt9 = true;
}
this.$element.attr('data-frame', this.frame + '');
this.play();
};
Loader.prototype = {
constructor: Loader,
destroy: function () {
this.pause();
this.$element.remove();
// any external bindings
// [none]
// empty elements to return to original markup
// [none]
// returns string of markup
return this.$element[0].outerHTML;
},
ieRepaint: function () {
if (this.isIElt9) {
this.$element.addClass('iefix_repaint').removeClass('iefix_repaint');
}
},
msieVersion: function () {
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE ');
if (msie > 0) {
return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10);
} else {
return false;
}
},
next: function () {
this.frame++;
if (this.frame > this.end) {
this.frame = this.begin;
}
this.$element.attr('data-frame', this.frame + '');
this.ieRepaint();
},
pause: function () {
clearTimeout(this.timeout);
},
play: function () {
var self = this;
clearTimeout(this.timeout);
this.timeout = setTimeout(function () {
self.next();
self.play();
}, this.delay);
},
previous: function () {
this.frame--;
if (this.frame < this.begin) {
this.frame = this.end;
}
this.$element.attr('data-frame', this.frame + '');
this.ieRepaint();
},
reset: function () {
this.frame = this.begin;
this.$element.attr('data-frame', this.frame + '');
this.ieRepaint();
}
};
// LOADER PLUGIN DEFINITION
$.fn.loader = function (option) {
var args = Array.prototype.slice.call(arguments, 1);
var methodReturn;
var $set = this.each(function () {
var $this = $(this);
var data = $this.data('fu.loader');
var options = typeof option === 'object' && option;
if (!data) {
$this.data('fu.loader', (data = new Loader(this, options)));
}
if (typeof option === 'string') {
methodReturn = data[option].apply(data, args);
}
});
return (methodReturn === undefined) ? $set : methodReturn;
};
$.fn.loader.defaults = {};
$.fn.loader.Constructor = Loader;
$.fn.loader.noConflict = function () {
$.fn.loader = old;
return this;
};
// INIT LOADER ON DOMCONTENTLOADED
$(function () {
$('[data-initialize=loader]').each(function () {
var $this = $(this);
if (!$this.data('fu.loader')) {
$this.loader($this.data());
}
});
});
// -- BEGIN UMD WRAPPER AFTERWORD --
}));
// -- END UMD WRAPPER AFTERWORD --