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