diff options
Diffstat (limited to 'public/js/icinga.js')
-rw-r--r-- | public/js/icinga.js | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/public/js/icinga.js b/public/js/icinga.js new file mode 100644 index 0000000..e8b8bcc --- /dev/null +++ b/public/js/icinga.js @@ -0,0 +1,279 @@ +/*! Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */ + +/** + * Icinga starts here. + * + * Usage example: + * + * <code> + * var icinga = new Icinga({ + * baseUrl: '/icinga', + * }); + * </code> + */ +(function(window, $) { + + 'use strict'; + + var Icinga = function (config) { + + this.initialized = false; + + /** + * Our config object + */ + this.config = config; + + /** + * Icinga.Logger + */ + this.logger = null; + + /** + * Icinga.UI + */ + this.ui = null; + + /** + * Icinga.Loader + */ + this.loader = null; + + /** + * Icinga.Events + */ + this.events = null; + + /** + * Icinga.Timer + */ + this.timer = null; + + /** + * Icinga.History + */ + this.history = null; + + /** + * Icinga.Utils + */ + this.utils = null; + + /** + * Additional site behavior + */ + this.behaviors = {}; + + /** + * Loaded modules + */ + this.modules = {}; + + var _this = this; + $(document).ready(function () { + _this.initialize(); + _this = null; + }); + }; + + Icinga.prototype = { + + /** + * Icinga startup, will be triggerd once the document is ready + */ + initialize: function () { + if (this.initialized) { + return false; + } + + this.timezone = new Icinga.Timezone(); + this.utils = new Icinga.Utils(this); + this.logger = new Icinga.Logger(this); + this.timer = new Icinga.Timer(this); + this.ui = new Icinga.UI(this); + this.loader = new Icinga.Loader(this); + this.events = new Icinga.Events(this); + this.history = new Icinga.History(this); + var _this = this; + $.each(Icinga.Behaviors, function(name, Behavior) { + _this.behaviors[name.toLowerCase()] = new Behavior(_this); + }); + + this.timezone.initialize(); + this.timer.initialize(); + this.events.initialize(); + this.history.initialize(); + this.ui.initialize(); + this.loader.initialize(); + + this.logger.info('Icinga is ready, running on jQuery ', $().jquery); + this.initialized = true; + + // Trigger our own post-init event, `onLoad` is not reliable enough + $(document).trigger('icinga-init'); + }, + + /** + * Load a given module by name + * + * @param {string} name + * + * @return {boolean} + */ + loadModule: function (name) { + + if (this.isLoadedModule(name)) { + this.logger.error('Cannot load module ' + name + ' twice'); + return false; + } + + if (! this.hasModule(name)) { + this.logger.error('Cannot find module ' + name); + return false; + } + + this.modules[name] = new Icinga.Module( + this, + name, + Icinga.availableModules[name] + ); + return true; + }, + + /** + * Whether a module matching the given name exists or is loaded + * + * @param {string} name + * + * @return {boolean} + */ + hasModule: function (name) { + return this.isLoadedModule(name) || + 'undefined' !== typeof Icinga.availableModules[name]; + }, + + /** + * Return whether the given module is loaded + * + * @param {string} name The name of the module + * + * @returns {Boolean} + */ + isLoadedModule: function (name) { + return 'undefined' !== typeof this.modules[name]; + }, + + /** + * Ensure we have loaded the javascript code for a module + * + * @param {string} moduleName + */ + ensureModule: function(moduleName) { + if (this.hasModule(moduleName) && ! this.isLoadedModule(moduleName)) { + this.loadModule(moduleName); + } + }, + + /** + * If a container contains sub-containers for other modules, + * make sure the javascript code for each module is loaded. + * + * Containers are identified by "data-icinga-module" which + * holds the module name. + * + * @param container + */ + ensureSubModules: function (container) { + var icinga = this; + + $(container).find('[data-icinga-module]').each(function () { + var moduleName = $(this).data('icingaModule'); + if (moduleName) { + icinga.ensureModule(moduleName); + } + }); + }, + + /** + * Get a module by name + * + * @param {string} name + * + * @return {object} + */ + module: function (name) { + + if (this.hasModule(name) && !this.isLoadedModule(name)) { + this.modules[name] = new Icinga.Module( + this, + name, + Icinga.availableModules[name] + ); + } + + return this.modules[name]; + }, + + /** + * Clean up and unload all Icinga components + */ + destroy: function () { + + $.each(this.modules, function (name, module) { + module.destroy(); + }); + + this.timezone.destroy(); + this.timer.destroy(); + this.events.destroy(); + this.loader.destroy(); + this.ui.destroy(); + this.logger.debug('Icinga has been destroyed'); + this.logger.destroy(); + this.utils.destroy(); + + this.modules = []; + this.timer = this.events = this.loader = this.ui = this.logger = + this.utils = null; + this.initialized = false; + }, + + reload: function () { + setTimeout(function () { + var oldjQuery = window.jQuery; + var oldConfig = window.icinga.config; + var oldIcinga = window.Icinga; + window.icinga.destroy(); + window.Icinga = undefined; + window.$ = undefined; + window.jQuery = undefined; + jQuery = undefined; + $ = undefined; + + oldjQuery.getScript( + oldConfig.baseUrl.replace(/\/$/, '') + '/js/icinga.min.js' + ).done(function () { + var jQuery = window.jQuery; + window.icinga = new window.Icinga(oldConfig); + window.icinga.initialize(); + window.icinga.ui.reloadCss(); + oldjQuery = undefined; + oldConfig = undefined; + oldIcinga = undefined; + }).fail(function () { + window.jQuery = oldjQuery; + window.$ = window.jQuery; + window.Icinga = oldIcinga; + window.icinga = new Icinga(oldConfig); + window.icinga.ui.reloadCss(); + }); + }, 0); + } + + }; + + window.Icinga = Icinga; + + Icinga.availableModules = {}; + +})(window, jQuery); |