diff --git a/public/js/icinga/icinga.js b/public/js/icinga/icinga.js
index d26c6f0cd..a9791d9d0 100755
--- a/public/js/icinga/icinga.js
+++ b/public/js/icinga/icinga.js
@@ -72,368 +72,3 @@ define([
});
-
- /**
- *
- */
- /* prepareContainers: function ()
- {
- $('#icinga-main').attr(
- 'icingaurl',
- window.location.pathname + window.location.search
- );
- return Icinga;
- },
-
- initializeTimer: function (interval)
- {
- // This currently messes up the frontend
- //Icinga.refresher = setInterval(Icinga.timer, interval);
- return Icinga;
- },
-
- module: function (name)
- {
- return Icinga.modules[name];
- },
-
- timer: function ()
- {
- $('.icinga-container[icingaurl]').each(function (idx, el)
- {
- el = $(el);
- // TODO: Find a better solution for this problem
- if (el.find('.icinga-container').length) {
- return;
- }
- Icinga.loadUrl(el.attr('icingaurl'), el, el.data('icingaparams'));
- });
- },*/
-
-
- /**
- * Clicks on action table rows shall trigger the first link action found
- * in that row
- */
- /* prepareActionRow: function (idx, el)
- {
- var a = $(el).find('a.row-action'),
- tr;
- if (a.length < 1) {
- a = $(el).find('a');
- }
- if (a.length < 1) { return; }
- tr = a.closest('tr');
- tr.attr('href', a.first().attr('href'));
- // $(a).first().replaceWith($(a).html());
- // tr.addClass('hasHref');
- },*/
-
- /**
- * Apply event handlers within a given parent node
- */
- /* applyEventHandlers: function (parent)
- {
- // Icinga.debug('Applying event handlers');
- $('.dashboard.icinga-container', parent).each(function(idx, el) {
- Icinga.loadUrl($(el).attr('icingaurl'), $(el));
- });
- $('div[icingamodule]', parent).each(function (idx, el) {
- Icinga.loadModule($(el).attr('icingamodule'), el);
- });
- $('table.action tbody tr', parent).each(Icinga.prepareActionRow);
-<<<<<<< HEAD:public/js/icinga/icinga.js
- $('a[title], span[title], td[title], img[title]', parent).qtip()
- .each(Icinga.fixQtippedElement);*/
-/* $('.inlinepie', parent).sparkline('html', {
-=======
- $('*[title]').tooltip({placement:"bottom",container: "body"});
- $('.inlinepie', parent).sparkline('html', {
->>>>>>> 3845f64dd2380974633fad30c3160944e9bff1d2:public/js/icinga.js
- type: 'pie',
- sliceColors: ['#0c0', '#f80', '#c00', '#dcd'],
- width: '16px',
- height: '16px'
- });*//*
- $('.inlinebullet', parent).sparkline('html', {
- type: 'bullet',
- targetColor: '#000',
- rangeColors: ['#0c0', '#f80', '#c00'],
- width: '16px',
- height: '16px'
- });
- // Icinga.debug('Applying event handlers done');
- return Icinga;
- },
-*/
- /**
- * Apply some global event handlers
- */
- /* applyGlobalEventHandlers: function ()
- {
- // TODO: replace document with deeper parent elements once they are
- // defined
- $(document).on('click', 'a', Icinga.linkClicked);
- $(document).on('click', 'tr[href]', Icinga.linkClicked);
- $(document).on('keyup', 'form.auto input', Icinga.formChangeDelayed);
- $(document).on('change', 'form.auto input', Icinga.formChanged);
- $(document).on('change', 'form.auto select', Icinga.formChanged);
- $(document).on('submit', 'form', Icinga.submitForm);
- return Icinga;
- },
- applyModuleEventHandlers: function (name, el)
- {
- Icinga.debug('Applying handlers for ' + name);
- $.each(Icinga.moduleHandlers[name], function (idx, event) {
- if (event[1] === 'each') {
- $(event[0], $(el)).each(event[2]);
- } else {
- $(event[0], $(el)).on(event[1], event[2]);
- }
- });
- },
- loadModule: function (name, el)
- {
- if (typeof Icinga.modules[name] !== 'undefined')
- {
- Icinga.applyModuleEventHandlers(name, $(el));
- return;
- }
- try {
- require([name], function (module) {
- Icinga.modules[name] = module;
- Icinga.moduleHandlers[name] = [];
- if (typeof module.eventHandlers !== 'undefined') {
- $.each(module.eventHandlers, function (filter, events) {
- $.each(events, function (event, handle) {
- var eventHandle = Icinga.modules[name][handle];
- Icinga.moduleHandlers[name].push([
- filter,
- event,
- eventHandle
- ]);
- });
- });
- }
- Icinga.applyModuleEventHandlers(name, $(el));
- Icinga.debug('Module "' + name + '" has been loaded');
- });
- } catch (e) {
- Icinga.debug(
- 'Loading module "' + name + '" failed: ' +
- e.name + "\n" + e.message
- );
- return;
- }
- },
-*/
- /**
- * Load CSS file if not already done so.
- *
- * This is an unfinished prototype, we have to make sure to not load
- * the same file multiple times
- *
- * TODO: Finish it, remember/discover what has been loaded, to it the
- * jQuery way
- */
- /* requireCss: function (url)
- {
- Icinga.debug('Should load CSS file: ' + url);
- // var link = document.createElement("link");
- // link.type = "text/css";
- // link.rel = "stylesheet";
- // link.href = url;
- // document.getElementsByTagName("head")[0].appendChild(link);
- },
-*/
- /**
- * Load the given URL to the given target
- *
- * @param {string} url URL to be loaded
- * @param {object} target Target element
- */
- /* loadUrl: function (url, target, data)
- {
- var req = $.ajax({
- type : 'POST',
- url : url,
- data : data,
- headers: { 'X-Icinga-Accept': 'text/html' }
- });
- req.done(Icinga.handleResponse);
- req.IcingaTarget = target;
- req.fail(Icinga.handleFailure);
- return req;
- },
-*/
- /**
- * Create an URL relative to the Icinga base Url, still unused
- *
- * @param {string} url Relative url
- */
- /* url: function (url)
- {
- return base_url + url;
- },
-*/
- /**
- * Smoothly render given HTML to given container
- */
- /* renderContentToContainer: function (content, container)
- {
- Icinga.disableQtips();
- Icinga.debug('fire');
- container.html(content);
- if (container.attr('id') === 'icinga-detail') {
- container.closest('.layout-main-detail').removeClass('collapsed');
- }
- Icinga.applyEventHandlers(container);
-
- },
-*/
- /**
- * Handle successful XHR response
- */
- /* handleResponse: function (data, textStatus, jqXHR)
- {
- Icinga.debug('Got response: ' + this.url);
- jqXHR.IcingaTarget.attr('icingaurl', this.url);
- Icinga.renderContentToContainer(jqXHR.responseText, jqXHR.IcingaTarget);
- },
-*/
- /**
- * Handle failed XHR response
- */
- /* handleFailure: function (jqXHR, textStatus, errorThrown)
- {
- if (jqXHR.status > 0) {
- Icinga.debug(jqXHR.responseText.slice(0, 100));
- Icinga.renderContentToContainer(
- '
' + jqXHR.status + ' ' + errorThrown + '
' +
- jqXHR.responseText,
- jqXHR.IcingaTarget
- );
-
- // Header example:
- // Icinga.debug(jqXHR.getResponseHeader('X-Icinga-Redirect'));
- } else {
- if (errorThrown === 'abort') {
- Icinga.debug('Request to ' + this.url + ' has been aborted');
- } else {
- Icinga.debug('Failed to contact web server');
- }
- }
- },
-*/
- /**
- * A link has been clicked. Try to find out it's target and fire the XHR
- * request
- */
- /* linkClicked: function (event)
- {
- event.stopPropagation();
- var target = event.currentTarget,
- href = $(target).attr('href'),
- destination;
-
- if ($(target).closest('.pagination').length) {
- Icinga.debug('Pagination link clicked');
- destination = $(target).closest('.icinga-container');
- } else if ($(target).closest('.nav-tabs').length) {
- Icinga.debug('Nav tab link clicked');
- destination = $(target).closest('.icinga-container');
- } else if ($(target).closest('table.action').length ||
- // TODO: define just one class name instead of this list
- $(target).closest('table.pivot').length ||
- $(target).closest('.bpapp').length ||
- $(target).closest('.dashboard.icinga-container').length)
- {
- destination = $('#icinga-detail');
- Icinga.debug('Clicked an action table / pivot / bpapp / dashboard link');
- } else {
- Icinga.debug('Something else clicked');
- // target = $(target).closest('.icinga-container');
- destination = $(target).closest('.icinga-container');
- if (!destination.length) {
- destination = $('#icinga-main');
- }
- }
-
- Icinga.loadUrl(href, destination);
- return false;
- },
-*/
- /* BEGIN form handling, still unfinished */
- /* formChanged: function (event)
- {
- // TODO: event.preventDefault();
- // TODO: event.stopPropatagion();
- if (Icinga.load_form !== false) {
- // Already loading. TODO: make it multi-form-aware
- // TODO: shorter timeout, but clear not before ajax call finished
- return;
- }
- var target = event.currentTarget,
- form = $(target).closest('form');
- Icinga.load_form = form;
- Icinga.fireFormLoader();
- },
-
- formChangeDelayed: function (event)
- {
- if (Icinga.load_form !== false) {
- // Already loading. TODO: make it multi-form-aware
- // TODO: shorter timeout, but clear not before ajax call finished
- return;
- }
- var target = event.currentTarget,
- form = $(target).closest('form');
- Icinga.load_form = form;
- setTimeout(Icinga.fireFormLoader, 200);
- },
-
- fireFormLoader: function ()
- {
- if (Icinga.load_form === false) {
- return;
- }
- // Temporarily hardcoded for top search:
- // Icinga.loadUrl(Icinga.load_form.attr('action') + '?' + Icinga.load_form.serialize(), $('#icinga-main'));
- Icinga.debug(Icinga.load_form);
- if ($('#icinga-main').find('.dashboard.icinga-container').length) {
- $('#icinga-main .dashboard.icinga-container').each(function (idx, el) {
- Icinga.loadSearch($(el));
- });
- } else {
- $('#icinga-main').each(function (idx, el) {
- Icinga.loadSearch($(el));
- });
- }
- Icinga.load_form = false;
-
- },
- loadSearch: function(target)
- {
- var url = target.attr('icingaurl');
- var params = url.split('?')[1] || '';
- url = url.split('?')[0];
- var param_list = params.split('&');
- params = {};
- var i, pairs;
- for (i = 0; i < param_list.length; i++) {
- pairs = param_list[i].split('=');
- params[pairs[0]] = pairs[1];
- }
- var searchstring = $('input[name=search]', Icinga.load_form).val();
- params['search'] = searchstring || '';
- params = '?' + $.param(params);
- Icinga.loadUrl(url + params, target);
- },
- submitForm: function (event)
- {
- event.stopPropagation();
- var form = $(event.currentTarget);
- Icinga.loadUrl(form.attr('action'), $('#icinga-main'), form.serializeArray());
- return false;
- },*/
- /* END of form handling */
diff --git a/public/js/icinga/module.js b/public/js/icinga/module.js
new file mode 100644
index 000000000..6d0ac6080
--- /dev/null
+++ b/public/js/icinga/module.js
@@ -0,0 +1,100 @@
+/*global Icinga:false, $: false, document: false, define:false requirejs:false base_url:false console:false */
+
+/**
+ This prototype encapsulates the modules registered in the module folder
+ **/
+(function() {
+ "use strict";
+
+ var loaded = {};
+
+ define(['logging'],function(log) {
+
+ var registerModuleFunctions = function(module) {
+ var enableFn = module.enable, disableFn = module.disable;
+
+ module.enable = (function(root) {
+ root = root || $('body');
+ for (var jqMatcher in this.eventHandler) {
+ for (var ev in this.eventHandler[jqMatcher]) {
+ log.debug("Registered module: ", "'"+ev+"'", jqMatcher);
+ $(root).on(ev,jqMatcher,this.eventHandler[jqMatcher][ev]);
+ }
+ }
+ if(enableFn) {
+ enableFn.apply(this,arguments);
+ }
+ }).bind(module);
+
+ module.disable = (function(root) {
+ root = root || $('body');
+ for (var jqMatcher in this.eventHandler) {
+ for (var ev in this.eventHandler[jqMatcher]) {
+ log.debug("Unregistered module: ", "'"+ev+"'", jqMatcher);
+ $(root).off(ev,jqMatcher,this.eventHandler[jqMatcher][ev]);
+ }
+ }
+ if (disableFn) {
+ disableFn.apply(this,arguments);
+ }
+ }).bind(module);
+
+
+ };
+
+ var CallInterface = function() {
+
+ /**
+ * Loads a module and calls successCallback with the module as the parameter on success, otherwise
+ * the errorCallback with the errorstring as the first parameter
+ *
+ * @param name
+ * @param errorCallback
+ * @param successCallback
+ */
+ this.enableModule = function(name,errorCallback,successCallback) {
+ requirejs([name],function(module) {
+ if (typeof module === "undefined") {
+ return errorCallback(new Error("Unknown module: "+name));
+ }
+
+ if (typeof module.eventHandler === "object") {
+ registerModuleFunctions(module);
+ }
+ if (typeof module.enable === "function") {
+ module.enable();
+ }
+ loaded[name] = {
+ module: module,
+ active: true
+ };
+ if (typeof successCallback === "function") {
+ successCallback(module);
+ }
+ },function(err) {
+ errorCallback("Could not load module "+name+" "+err,err);
+ });
+ };
+
+ this.disableModule = function(name) {
+ if(loaded[name] && loaded[name].active) {
+ loaded[name].module.disable();
+ }
+ };
+
+ /**
+ * This should *ONLY* be called in testcases
+ **/
+ this.resetHard = function() {
+ if (typeof describe !== "function") {
+ return;
+ }
+ loaded = {};
+ };
+ };
+
+
+ return new CallInterface();
+ });
+
+})();
diff --git a/public/js/vendor/namespaced_requirejs.min.js b/public/js/vendor/namespaced_requirejs.min.js
new file mode 100644
index 000000000..dcc93072f
--- /dev/null
+++ b/public/js/vendor/namespaced_requirejs.min.js
@@ -0,0 +1,47 @@
+var requirejs = (function () {
+ //Define a require object here that has any
+ //default configuration you want for RequireJS. If
+ //you do not have any config options you want to set,
+ //just use an simple object literal, {}. You may need
+ //to at least set baseUrl.
+ var require = {
+ baseUrl: '..'
+ };
+ /*
+ RequireJS 2.1.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+ */
+ var requirejs,require,define;
+ (function(ba){function J(b){return"[object Function]"===N.call(b)}function K(b){return"[object Array]"===N.call(b)}function z(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(J(n)){if(this.events.error&&this.map.isDefine||h.onError!==ca)try{e=k.execCb(c,n,b,e)}catch(d){a=d}else e=k.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==
+ this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else e=n;this.exports=e;if(this.map.isDefine&&!this.ignore&&(r[c]=e,h.onResourceLoad))h.onResourceLoad(k,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=
+ !0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=l(a.prefix);this.depMaps.push(d);u(d,"defined",v(this,function(e){var n,d;d=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,C=k.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,g,!0)})||""),e=l(a.prefix+"!"+d,this.map.parentMap),u(e,"defined",v(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),
+ d=m(q,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",v(this,function(a){this.emit("error",a)}));d.enable()}}else n=v(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=v(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];H(q,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),n.fromText=v(this,function(e,c){var d=a.name,g=l(d),i=Q;c&&(e=c);i&&(Q=!1);s(g);t(j.config,b)&&(j.config[d]=j.config[b]);try{h.exec(e)}catch(D){return w(B("fromtexteval",
+ "fromText eval for "+b+" failed: "+D,D,[b]))}i&&(Q=!0);this.depMaps.push(g);k.completeLoad(d);C([d],n)}),e.load(a.name,C,n,j)}));k.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){W[this.map.id]=this;this.enabling=this.enabled=!0;z(this.depMaps,v(this,function(a,b){var c,e;if("string"===typeof a){a=l(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(P,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;u(a,"defined",v(this,function(a){this.defineDep(b,
+ a);this.check()}));this.errback&&u(a,"error",v(this,this.errback))}c=a.id;e=q[c];!t(P,c)&&(e&&!e.enabled)&&k.enable(a,this)}));H(this.pluginMaps,v(this,function(a){var b=m(q,a.id);b&&!b.enabled&&k.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){z(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};k={config:j,contextName:b,registry:q,defined:r,urlFetched:V,defQueue:I,Module:$,makeModuleMap:l,
+ nextTick:h.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.pkgs,c=j.shim,e={paths:!0,config:!0,map:!0};H(a,function(a,b){e[b]?"map"===b?(j.map||(j.map={}),S(j[b],a,!0,!0)):S(j[b],a,!0):j[b]=a});a.shim&&(H(a.shim,function(a,b){K(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=k.makeShimExports(a);c[b]=a}),j.shim=c);a.packages&&(z(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,
+ location:a.location||a.name,main:(a.main||"main").replace(ka,"").replace(fa,"")}}),j.pkgs=b);H(q,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=l(b))});if(a.deps||a.callback)k.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,f){function d(e,c,g){var i,j;f.enableBuildCallback&&(c&&J(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(J(c))return w(B("requireargs",
+ "Invalid require call"),g);if(a&&t(P,e))return P[e](q[a.id]);if(h.get)return h.get(k,e,a,d);i=l(e,a,!1,!0);i=i.id;return!t(r,i)?w(B("notloaded",'Module name "'+i+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[i]}M();k.nextTick(function(){M();j=s(l(null,a));j.skipMap=f.skipMap;j.init(e,c,g,{enabled:!0});E()});return d}f=f||{};S(d,{isBrowser:A,toUrl:function(b){var d,f=b.lastIndexOf("."),g=b.split("/")[0];if(-1!==f&&(!("."===g||".."===g)||1g.attachEvent.toString().indexOf("[native code"))&&!Z?(Q=!0,g.attachEvent("onreadystatechange",b.onScriptLoad)):(g.addEventListener("load",b.onScriptLoad,!1),g.addEventListener("error",b.onScriptError,!1)),g.src=d,M=g,E?y.insertBefore(g,E):y.appendChild(g),
+ M=null,g;if(ea)try{importScripts(d),b.completeLoad(c)}catch(l){b.onError(B("importscripts","importScripts failed for "+c+" at "+d,l,[c]))}};A&&O(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(L=b.getAttribute("data-main"))return s=L,u.baseUrl||(F=s.split("/"),s=F.pop(),ga=F.length?F.join("/")+"/":"./",u.baseUrl=ga),s=s.replace(fa,""),h.jsExtRegExp.test(s)&&(s=L),u.deps=u.deps?u.deps.concat(s):[s],!0});define=function(b,c,d){var h,g;"string"!==typeof b&&(d=c,c=b,b=null);
+ K(c)||(d=c,c=null);!c&&J(d)&&(c=[],d.length&&(d.toString().replace(ma,"").replace(na,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(Q){if(!(h=M))R&&"interactive"===R.readyState||O(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return R=b}),h=R;h&&(b||(b=h.getAttribute("data-requiremodule")),g=G[h.getAttribute("data-requirecontext")])}(g?g.defQueue:U).push([b,c,d])};define.amd={jQuery:!0};h.exec=function(b){return eval(b)};
+ h(u)}})(this);
+ return require;
+})();