(function ($, window, document, undefined) {
'use strict';
var pluginName = 'loadingModal',
defaults = {
position: 'auto',
text: '',
color: '#fff',
opacity: '0.7',
backgroundColor: 'rgb(0,0,0)',
animation: 'doubleBounce'
};
// The actual plugin constructor
function Plugin(element, options) {
var $that = this;
this.element = element;
this.animations = {
doubleBounce: {html: '
'},
rotatingPlane: {html: '', setBackground: function(color) {
$that.animationBox.find('*').each(function (k, e) {
if ($(e).css('background-color') && $(e).css('background-color') != 'rgba(0, 0, 0, 0)') {
$(e).css('background-color', color);
}
});
}},
wave: {html: ''},
wanderingCubes: {html: ''},
spinner: {html: ''},
chasingDots: {html: ''},
threeBounce: {html: ''},
circle: {html: '', setBackground: function(color) {
$that.animationBox.children().find('*').each(function (k, e) {
if(window.getComputedStyle(e, ':before').getPropertyValue('background-color') !== 'rgba(0, 0, 0, 0)') {
$('body').append($(''));
}
});
}},
cubeGrid: {html: ''},
fadingCircle: {html: '', setBackground: function(color) {
$that.animationBox.children().find('*').each(function (k, e) {
if(window.getComputedStyle(e, ':before').getPropertyValue('background-color') !== 'rgba(0, 0, 0, 0)') {
$('body').append($(''));
}
});
}},
foldingCube: {html: '', setBackground: function(color) {
$that.animationBox.find('*').each(function (k, e) {
if(window.getComputedStyle(e, ':before').getPropertyValue('background-color') !== 'rgba(0, 0, 0, 0)') {
$('body').append($(''));
}
});
}}
};
// jQuery has an extend method which merges the contents of two or
// more objects, storing the result in the first object. The first object
// is generally empty as we don't want to alter the default options for
// future instances of the plugin
this.settings = $.extend({}, defaults, options);
this.modal = null;
this.modalText = null;
this.animationBox = null;
this.modalBg = null;
this.currenAnimation = null;
this.init();
return this;
}
// Avoid Plugin.prototype conflicts
$.extend(Plugin.prototype, {
init: function () {
// Create all elements
var $modal = $('');
var $modalBg = $('');
var $animationBox = $('');
var $infoBox = $('');
var $text = $('');
// Hide text element if no text available
if (this.settings.text !== '') {
$text.html(this.settings.text);
} else {
$text.hide();
}
// Add selected animation loader element
this.currenAnimation = this.animations[this.settings.animation];
$animationBox.append(this.currenAnimation.html);
$infoBox.append($animationBox).append($text);
$modal.append($modalBg);
$modal.append($infoBox);
if(this.settings.position === 'auto' && this.element.tagName.toLowerCase() !== 'body') {
$modal.css('position', 'absolute');
$(this.element).css('position', 'relative');
} else if(this.settings.position !== 'auto') {
$(this.element).css('position', this.settings.position);
}
$(this.element).append($modal);
this.modalBg = $modalBg;
this.modal = $modal;
this.modalText = $text;
this.animationBox = $animationBox;
this.color(this.settings.color);
this.backgroundColor(this.settings.backgroundColor);
this.opacity(this.settings.opacity);
},
hide: function () {
var modal = this.modal;
modal.removeClass('jquery-loading-modal--visible').addClass('jquery-loading-modal--hidden');
setTimeout(function(){
modal.hide();
}, 1000);
},
backgroundColor: function (color) {
this.modalBg.css({'background-color': color});
},
color: function (color) {
$('[data-custom-style]').remove();
this.modalText.css('color', color);
if(this.currenAnimation.setBackground) {
this.currenAnimation.setBackground(color);
} else {
this.animationBox.children().find('*').each(function (k, e) {
if ($(e).css('background-color') && $(e).css('background-color') != 'rgba(0, 0, 0, 0)') {
$(e).css('background-color', color);
}
if(window.getComputedStyle(e, ':before').getPropertyValue('background-color') !== 'rgba(0, 0, 0, 0)') {
$('body').append($(''));
}
});
}
},
opacity: function (opacity) {
this.modalBg.css({'opacity': opacity});
},
show: function () {
this.modal.show().removeClass('jquery-loading-modal--hidden').addClass('jquery-loading-modal--visible');
},
animation: function (animation) {
this.animationBox.html('');
this.currenAnimation = this.animations[animation];
this.animationBox.append(this.currenAnimation.html);
},
destroy: function () {
$('[data-custom-style]').remove();
this.modal.remove();
},
text: function (text) {
this.modalText.html(text);
}
});
// You don't need to change something below:
// A really lightweight plugin wrapper around the constructor,
// preventing against multiple instantiations and allowing any
// public function (ie. a function whose name doesn't start
// with an underscore) to be called via the jQuery plugin,
// e.g. $(element).defaultPluginName('functionName', arg1, arg2)
$.fn[pluginName] = function (options) {
var args = arguments;
// Is the first parameter an object (options), or was omitted,
// instantiate a new instance of the plugin.
if (options === undefined || typeof options === 'object') {
return this.each(function () {
// Only allow the plugin to be instantiated once,
// so we check that the element has no plugin instantiation yet
if (!$.data(this, 'plugin_' + pluginName)) {
// if it has no instance, create a new one,
// pass options to our plugin constructor,
// and store the plugin instance
// in the elements jQuery data object.
$.data(this, 'plugin_' + pluginName, new Plugin(this, options));
}
});
// If the first parameter is a string and it doesn't start
// with an underscore or "contains" the `init`-function,
// treat this as a call to a public method.
} else if (typeof options === 'string' && options[0] !== '_' && options !== 'init') {
// Cache the method call
// to make it possible
// to return a value
var returns;
this.each(function () {
var instance = $.data(this, 'plugin_' + pluginName);
// Tests that there's already a plugin-instance
// and checks that the requested public method exists
if (instance instanceof Plugin && typeof instance[options] === 'function') {
// Call the method of our plugin instance,
// and pass it the supplied arguments.
returns = instance[options].apply(instance, Array.prototype.slice.call(args, 1));
}
// Allow instances to be destroyed via the 'destroy' method
if (options === 'destroy') {
$.data(this, 'plugin_' + pluginName, null);
}
});
// If the earlier cached method
// gives a value back return the value,
// otherwise return this to preserve chainability.
return returns !== undefined ? returns : this;
}
};
})(jQuery, window, document);