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