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