b7b0f65df8966b6c5ea35a214de98e8ee364fb8e
[fnpeditor.git] / runner.js
1 var Runner = function($, _, app) {\r
2 \r
3     function getModuleInstance(moduleName) {\r
4         var module = moduleInstances[moduleName] = (moduleInstances[moduleName] || app.modules[moduleName](new Sandbox(moduleName)));\r
5         return module;\r
6     }\r
7 \r
8     var bootstrappedData = {},\r
9         options = {},\r
10         moduleInstances = {},\r
11         eventListeners = [];\r
12         \r
13     _.each(_.keys(app.modules || {}), function(moduleName) {\r
14         if(_.contains(app.permissions[moduleName] || [], 'handleEvents')) {\r
15             eventListeners.push(moduleName)\r
16         }\r
17     });\r
18 \r
19     \r
20         \r
21     var Sandbox = function(moduleName) {\r
22         this.$ = $;\r
23         this._ = _;\r
24         \r
25         this.getBootstrappedData = function() {\r
26             return bootstrappedData[moduleName];\r
27         }\r
28         \r
29         this.getTemplate = function(templateName) {\r
30             return _.template($('[data-template-name="' + moduleName + '.' + templateName + '"]').html().trim());\r
31         }\r
32         \r
33         this.publish = function(eventName) {\r
34             console.log(moduleName + ': ' + eventName);\r
35             var eventArgs = Array.prototype.slice.call(arguments, 1)\r
36             _.each(eventListeners, function(listenerModuleName) {\r
37                 var listener = moduleInstances[listenerModuleName];\r
38                 if(listener) {\r
39                     listener.handleEvent(moduleName, eventName, eventArgs);\r
40                 }\r
41             });\r
42         }\r
43         \r
44         var permissions = app.permissions[moduleName];\r
45         \r
46         this.getModule = _.contains(permissions, 'getModule') ? function(requestedModuleName) {\r
47             return getModuleInstance(requestedModuleName);\r
48         } : undefined;\r
49         \r
50         this.getDOM = _.contains(permissions, 'getDOM') ? function() {\r
51             return $(options.rootSelector);\r
52         } : undefined;\r
53         \r
54     };\r
55     \r
56     \r
57     this.setBootstrappedData = function(moduleName, data) {\r
58         bootstrappedData[moduleName] = data;\r
59     };\r
60     \r
61     this.start = function(_options) {\r
62         options = _.extend({\r
63             rootSelector: 'body'\r
64         }, _options);\r
65         app.initModules.forEach(function(moduleName) {\r
66             getModuleInstance(moduleName).start();\r
67         });\r
68     }\r
69 };