redmine_extensions 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eee22e1f0eeb964e748a80f0610126541f431768
4
- data.tar.gz: 6d824882250e9379351fae51a6fb68ea4d62924c
3
+ metadata.gz: 002eb7a53213f9d31059a1c7bcc099463893c3b4
4
+ data.tar.gz: 3e26d2836b750e51d43361822f6c2f9da2453e5a
5
5
  SHA512:
6
- metadata.gz: fc4adc022915545c8432e4867827169ba72e0d0af19eac89c2e0961fdd7843b461c241b6139791a91c3bb24e8280a9cb2109fee45219b794509f490b677b9db4
7
- data.tar.gz: 938ab6557a3b51aee80e345aaad6c37237bb1cae9b725280763e4f2ca38e6fc72ab85e1db651a40ee1e2bd7fb79ec70fc91fae49cd5132af54d49c73a35db9c9
6
+ metadata.gz: c04c0b3b80337845436b639be277afba66b7322613f57973cccfe58fd640de034c3cad54120de67237967f1455873990667a7604ec894a901f951dda4a94a6eb
7
+ data.tar.gz: 642bf45996d775e20dad82f5c56fbb4d1e6f5252ec371a8a6104e8e3138a7ebd03948c8ccc0df21f5eec52527326b1993e4b742a81b343d1a25777b3fbce94cf
@@ -12,4 +12,6 @@
12
12
  //
13
13
  //= require ./easy_togglers
14
14
  //= require ./jquery.entityarray
15
+ //= require ./render_polyfill
16
+ //= require ./dynamic_loading
15
17
  //= require ./redmine_extensions
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * code, that cannot be delayed after window.onload or deferred
3
3
  */
4
- //= require ./blocking_polyfill
4
+ //= require ./blocking_namespace
5
+ // require ./event_bus
5
6
  //= require ./blocking_schedule
6
- //= require ./blocking_module
7
+ // require ./blocking_module
8
+ //= require ./blocking_polyfill
9
+ //= require ./blocking_render
10
+ //= require ./blocking_utils
@@ -1,58 +1,163 @@
1
1
  (function () {
2
2
  "use strict";
3
+ return;
4
+
5
+ var modules = {};
6
+ var waiters = {};
7
+ var modulesOrdered = {};
8
+
9
+ window.EASY = window.EASY || {};
10
+ EASY.modules = {};
11
+
12
+ var getMissingModule = function (dependencyNames) {
13
+ for (var i = 0; i < dependencyNames.length; i++) {
14
+ var dependencyName = dependencyNames[i];
15
+ var dependency = modules[dependencyName];
16
+ if (!dependency || !dependency.instance) return dependencyName;
17
+ }
18
+ return null;
19
+ };
20
+
21
+ EASY.eventBus.on("moduleReady", function (moduleName) {
22
+ if (waiters[moduleName]) {
23
+ var subWaiters = waiters[moduleName];
24
+ delete waiters[moduleName];
25
+ delete modulesOrdered[moduleName];
26
+ subWaiters.forEach(function (pack) {
27
+ requireTry(pack);
28
+ })
29
+ }
30
+ });
31
+
32
+
3
33
  /**
4
- * @type {Object.<String,Array.<Function>>}
34
+ * @property {Function} factory
35
+ * @property {String} name
36
+ * @property {Array.<Module>} dependencies
37
+ * @constructor
5
38
  */
6
- var waitingModules = {};
39
+ function Module(moduleName, dependencies, factory) {
40
+ this.name = moduleName;
41
+ this.dependencies = dependencies;
42
+ this.factory = factory;
43
+ if (modulesOrdered[moduleName]) {
44
+ this.construct();
45
+ }
46
+ }
47
+
48
+ Module.prototype.instance = null;
49
+ Module.prototype.factory = function () {
50
+ return {};
51
+ };
52
+ Module.prototype.name = "unnamed";
53
+ Module.prototype.dependencies = [];
54
+ Module.prototype.construct = function (visited) {
55
+ var dependencyInstances;
56
+ visited = visited || [];
57
+ if(visited.indexOf(this.name)>-1){
58
+ throw "Cyclic dependency: " + this.name + " -> " + visited[visited.length - 1] + " -> " + this.name;
59
+ }
60
+
61
+ if (this.dependencies) {
62
+ dependencyInstances = [];
63
+ /** @type {Module} */
64
+ var dependency;
65
+ for (var i = 0; i < this.dependencies.length; i++) {
66
+ dependency = this.dependencies[i];
67
+ if (dependency.instance) {
68
+ dependencyInstances.push(dependency.instance);
69
+ } else {
70
+ return dependency.construct(visited.concat([this.name]));
71
+ }
72
+ }
73
+ }
74
+ this.instance = this.factory(dependencyInstances);
75
+ if (this.instance) {
76
+ EASY.eventBus.fire("moduleReady", this.name);
77
+ } else {
78
+ var self = this;
79
+ setTimeout(function () {
80
+ self.construct();
81
+ }, 10);
82
+ }
83
+ };
84
+
85
+ var getDependencies = function (dependencyNames) {
86
+ var dependencyInstances = [];
87
+ for (var i = 0; i < dependencyNames.length; i++) {
88
+ var dependencyName = dependencyNames[i];
89
+ var dependency = modules[dependencyName];
90
+ if (!dependency) return null;
91
+ if (!dependency.instance) {
92
+ dependency.construct();
93
+ }
94
+ if (!dependency.instance) {
95
+ return null;
96
+ }
97
+ dependencyInstances.push(dependency.instance);
98
+ }
99
+ return dependencyInstances;
100
+ };
7
101
  /**
8
- * @type {Object<String,boolean>}
102
+ * @param {{dependencies:Array.<String>,body:Function,context:Object}} pack
9
103
  */
10
- var registeredModules = {};
104
+ var requireTry = function (pack) {
105
+ var dependencyInstances = getDependencies(pack.dependencies);
106
+ if (dependencyInstances !== null) {
107
+ return pack.body.apply([pack.context || window].concat(dependencyInstances));
108
+ }
109
+ var missingModule = getMissingModule(pack.dependencies);
110
+ if (missingModule === null) return;
111
+ if (!modules[missingModule]) {
112
+ modulesOrdered[missingModule] = true;
113
+ }
114
+
115
+ if (!waiters[missingModule]) {
116
+ waiters[missingModule] = [];
117
+ }
118
+ waiters[missingModule].push(pack);
119
+ };
11
120
 
12
121
 
13
- window.EASY = window.EASY || {};
122
+ //####################################################################################################################
123
+
14
124
  /**
15
- * Module constructor. Execute [func] only if [moduleName] is registered
125
+ * Module constructor. Execute [factory] only if [moduleName] is registered
16
126
  * Works also, if EASY.registerModule is called after module definition
17
127
  * @param {String} moduleName
18
- * @param {Function} func
19
- * @param {...*} rest - parameters for [func]
128
+ * @param {Array.<String>} dependencies
129
+ * @param {Function} factory
20
130
  */
21
- EASY.module = function easyModule(moduleName, func, rest) {
22
- if (registeredModules[moduleName]) {
23
- if (rest !== undefined) {
24
- func.apply(window, Array.prototype.slice.call(arguments, 2));
25
- } else {
26
- func();
27
- }
28
- return;
29
- }
30
- var modules = waitingModules[moduleName];
31
- if (!modules) {
32
- waitingModules[moduleName] = modules = [];
33
- }
34
- if (rest) {
35
- var args = Array.prototype.slice.call(arguments, 2);
36
- modules.push(function () {
37
- func.apply(window, args);
38
- })
39
- } else {
40
- modules.push(func);
41
- }
131
+ EASY.modules.module = function easyModule(moduleName, dependencies, factory) {
132
+ modules[moduleName] = new Module(moduleName, dependencies, factory);
42
133
  };
43
134
  /**
44
- * Enables modules with [moduleName] name
45
- * If any modules are in waitingModules, they are executed immediately.
46
135
  * @param {String} moduleName
136
+ * @param {Function} getter
47
137
  */
48
- EASY.registerModule = function registerModule(moduleName) {
49
- registeredModules[moduleName] = true;
50
- if (waitingModules[moduleName]) {
51
- var modules = waitingModules[moduleName];
52
- for (var i = 0; i < modules.length; i++) {
53
- modules[i]();
54
- }
55
- delete waitingModules[moduleName];
56
- }
138
+ EASY.modules.toModule = function (moduleName, getter) {
139
+ modules[moduleName] = new Module(moduleName, null, getter);
57
140
  };
141
+ /**
142
+ * @param {Array.<String>} dependencies
143
+ * @param {Function} body
144
+ * @param {Object} [context]
145
+ */
146
+ EASY.modules.require = function (dependencies, body, context) {
147
+ if (!dependencies || dependencies.length === 0) body.call(context || window);
148
+ requireTry({dependencies: dependencies, body: body, context: context});
149
+ };
150
+ //####################################################################################################################
151
+
152
+ EASY.modules.toModule("jQuery", function () {
153
+ return window.jQuery;
154
+ });
155
+ EASY.modules.toModule("$", function () {
156
+ return window.jQuery;
157
+ });
158
+ EASY.modules.toModule("jQueryUI", function () {
159
+ if (window.jQuery && window.jQuery.widget) {
160
+ return window.jQuery;
161
+ }
162
+ });
58
163
  })();
@@ -0,0 +1,3 @@
1
+ window.EASY = window.EASY || {};
2
+ window.EasyGem = window.EasyGem || {};
3
+ window.EasyGem.test = window.EasyGem.test || {};
@@ -1,5 +1,4 @@
1
-
2
- (function($, window, undefined) {
1
+ (function (window, undefined) {
3
2
  // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
4
3
  // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
5
4
 
@@ -7,28 +6,21 @@
7
6
  // fixes from Paul Irish and Tino Zijdel
8
7
 
9
8
  var lastTime = 0,
10
- running,
11
- animate = function (elem) {
12
- if (running) {
13
- window.requestAnimationFrame(animate, elem);
14
- jQuery.fx.tick();
15
- }
16
- },
17
9
  vendors = ['ms', 'moz', 'webkit', 'o'];
18
10
 
19
- for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
20
- window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
21
- window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
22
- || window[vendors[x]+'CancelRequestAnimationFrame'];
11
+ for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
12
+ window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
13
+ window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame']
14
+ || window[vendors[x] + 'CancelRequestAnimationFrame'];
23
15
  }
24
16
 
25
17
  if (!window.requestAnimationFrame)
26
- window.requestAnimationFrame = function(fn, element) {
18
+ window.requestAnimationFrame = function (fn, element) {
27
19
  var currTime = new Date().getTime(),
28
20
  delta = currTime - lastTime,
29
21
  timeToCall = Math.max(0, 16 - delta);
30
22
 
31
- var id = window.setTimeout(function() {
23
+ var id = window.setTimeout(function () {
32
24
  fn(currTime + timeToCall);
33
25
  },
34
26
  timeToCall
@@ -40,20 +32,8 @@
40
32
  };
41
33
 
42
34
  if (!window.cancelAnimationFrame) {
43
- window.cancelAnimationFrame = function(id) {
35
+ window.cancelAnimationFrame = function (id) {
44
36
  clearTimeout(id);
45
37
  };
46
38
  }
47
-
48
- jQuery.fx.timer = function (timer) {
49
- if (timer() && jQuery.timers.push(timer) && !running) {
50
- running = true;
51
- animate(timer.elem);
52
- }
53
- };
54
-
55
- jQuery.fx.stop = function() {
56
- running = false;
57
- };
58
-
59
- }(jQuery, this));
39
+ }(this));
@@ -0,0 +1,112 @@
1
+ (function () {
2
+ /**
3
+ * @callback RenderFunction
4
+ */
5
+ // noinspection JSMismatchedCollectionQueryUpdate
6
+ /**
7
+ * @type {Array.<{body:RenderFunction,ctx:Object}>}
8
+ */
9
+ var readQueue = [];
10
+ // noinspection JSMismatchedCollectionQueryUpdate
11
+ /**
12
+ * @type {Array.<{body:RenderFunction,ctx:Object,value:*}>}
13
+ */
14
+ var renderQueue = [];
15
+ var renderPhase = false;
16
+ var lastTime = 0.0;
17
+ /**
18
+ * @param {RenderFunction} body
19
+ * @param {Object} [context]
20
+ */
21
+ EasyGem.read = function (body, context) {
22
+ if (renderPhase) {
23
+ readQueue.push({body: body, ctx: context});
24
+ } else {
25
+ body.call(context);
26
+ }
27
+ };
28
+ /**
29
+ * @param {RenderFunction} body
30
+ * @param {Object} [context]
31
+ */
32
+ EasyGem.render = function (body, context) {
33
+ if (renderPhase) {
34
+ body.call(context, lastTime);
35
+ } else {
36
+ renderQueue.push({body: body, ctx: context});
37
+ }
38
+ };
39
+ /**
40
+ * @param {RenderFunction} read
41
+ * @param {RenderFunction} render
42
+ * @param {Object} [context]
43
+ */
44
+ EasyGem.readAndRender = function (read, render, context) {
45
+ if (renderPhase) {
46
+ readQueue.push({
47
+ body: function () {
48
+ var value = read.call(context);
49
+ renderQueue.push({body: render, ctx: context, value: value});
50
+ }, ctx: context
51
+ });
52
+ } else {
53
+ var value = read.call(context);
54
+ renderQueue.push({body: render, ctx: context, value: value});
55
+ }
56
+ };
57
+ EasyGem.schedule.main(function () {
58
+ var loop = function (time) {
59
+ renderPhase = true;
60
+ lastTime=time;
61
+
62
+ setTimeout(function () {
63
+ renderPhase = false;
64
+ if (readQueue.length) {
65
+ var queue = readQueue;
66
+ readQueue = [];
67
+ for (i = 0; i < queue.length; i++) {
68
+ var pack = queue[i];
69
+ pack.body.call(pack.ctx);
70
+ }
71
+ }
72
+ }, 0);
73
+ if (renderQueue.length) {
74
+ var queue = renderQueue;
75
+ renderQueue = [];
76
+ for (var i = 0; i < queue.length; i++) {
77
+ var pack = queue[i];
78
+ pack.body.call(pack.ctx, time, pack.value);
79
+ }
80
+ renderQueue = [];
81
+ }
82
+ requestAnimationFrame(loop);
83
+ };
84
+ requestAnimationFrame(loop);
85
+ });
86
+ EasyGem.test.render = {
87
+ getPhase: function () {
88
+ return renderPhase ? "render" : "read";
89
+ }
90
+ // ,
91
+ // test1: function () {
92
+ // console.log("Phase "+this.getPhase());
93
+ // EasyGem.render(function (time) {
94
+ // console.assert(this.getPhase() === "render", "Phase should be render, not ", this.getPhase());
95
+ // console.assert(typeof time === "number", "Time ", time, " should be number, not ", typeof time);
96
+ // console.log("render done");
97
+ // }, this);
98
+ // EasyGem.read(function () {
99
+ // console.assert(this.getPhase() === "read", "Phase should be read, not ", this.getPhase());
100
+ // console.log("read done");
101
+ // }, this);
102
+ // EasyGem.readAndRender(function () {
103
+ // console.assert(this.getPhase() === "read", "Phase should be read, not ", this.getPhase());
104
+ // return 562;
105
+ // }, function (time, value) {
106
+ // console.assert(this.getPhase() === "render", "Phase should be render, not ", this.getPhase());
107
+ // console.assert(value === 562, "Value should be 562, not ", value);
108
+ // console.log("readAndRender done");
109
+ // }, this)
110
+ // }
111
+ };
112
+ })();
@@ -1,20 +1,35 @@
1
1
  (function () {
2
2
  "use strict";
3
3
  /**
4
- * @typedef {Function} SchedulePrerequisite
4
+ * @callback SchedulePrerequisite
5
5
  * @return {boolean}
6
6
  */
7
7
  /**
8
- * @typedef {{func:Function,[priority]:number,[pre]:SchedulePrerequisite}} ScheduleTask
8
+ * @typedef {{func:Function,[priority]:number,[pre]:SchedulePrerequisite,[pres]:Array.<SchedulePrerequisite>}} ScheduleTask
9
9
  */
10
- var lateMaxDelay = 3;
11
- var lateDelay = lateMaxDelay;
10
+ // noinspection JSMismatchedCollectionQueryUpdate
12
11
  /** @type {Array.<ScheduleTask>} */
13
12
  var mainArray = [];
14
13
  /** @type {Array.<ScheduleTask>} */
15
14
  var lateArray = [];
16
- /** @type {Array.<ScheduleTask|null>} */
15
+ /** @type {Array.<?ScheduleTask>} */
17
16
  var prerequisiteArray = [];
17
+ var moduleGetters = {
18
+ jquery: function () {
19
+ return window.jQuery;
20
+ },
21
+ jqueryui: function () {
22
+ return window.jQuery && jQuery.Widget;
23
+ },
24
+ c3:function () {
25
+ return window.c3;
26
+ },
27
+ ckeditor:function () {
28
+ return window.CKEDITOR;
29
+ }
30
+ };
31
+ var moduleInstances = {};
32
+ var writeOut = false;
18
33
 
19
34
  /** @param {ScheduleTask} a
20
35
  * @param {ScheduleTask} b
@@ -28,39 +43,35 @@
28
43
  if (mainArray.length > 0) {
29
44
  count1 = mainArray.length;
30
45
  mainArray.sort(sortFunction);
31
- for (var i = 0; i < mainArray.length; i++) {
32
- mainArray[i].func();
33
- }
46
+ var queue = mainArray;
34
47
  mainArray = [];
35
- lateDelay = lateMaxDelay;
48
+ for (var i = 0; i < queue.length; i++) {
49
+ queue[i].func();
50
+ }
36
51
  }
37
52
  var count2 = executePrerequisites();
38
53
  var count3 = 0;
39
- if (lateArray.length) {
40
- if (lateDelay === 0) {
41
- lateArray.sort(sortFunction);
42
- // console.log(lateArray.map(function (p1) {
43
- // return p1.priority
44
- // }));
45
- var limitPriority = lateArray[0].priority - 5;
46
- for (i = 0; i < lateArray.length; i++) {
47
- if (lateArray[i].priority <= limitPriority) break;
48
- lateArray[i].func.call(window);
49
- }
50
- if (i === lateArray.length) {
51
- count3 = lateArray.length;
52
- lateArray = [];
53
- lateDelay = lateMaxDelay;
54
- } else {
55
- lateArray = lateArray.slice(i);
56
- count3 = i;
57
- }
54
+ if (lateArray.length && count1 === 0 && count2 === 0) {
55
+ lateArray.sort(sortFunction);
56
+ var limitPriority = lateArray[0].priority - 5;
57
+ for (i = 0; i < lateArray.length; i++) {
58
+ if (lateArray[i].priority <= limitPriority) break;
59
+ }
60
+ count3 = i;
61
+ if (i === lateArray.length) {
62
+ queue = lateArray;
63
+ lateArray = [];
58
64
  } else {
59
- lateDelay--;
65
+ queue = lateArray.slice(0, i);
66
+ lateArray = lateArray.slice(i);
67
+ }
68
+ for (i = 0; i < queue.length; i++) {
69
+ if (queue[i].priority <= limitPriority) break;
70
+ queue[i].func.call(window);
60
71
  }
61
72
  }
62
- if (EASY.schedule.out && (count1 || count2 || count3)) {
63
- console.log("EE: " + count1 + " REQ: " + count2 + " LATE: " + count3);
73
+ if (writeOut && (count1 || count2 || count3)) {
74
+ console.log("MAIN: " + count1 + " REQ: " + count2 + " LATE: " + count3);
64
75
  }
65
76
  };
66
77
  var isNotNull = function (a) {
@@ -71,9 +82,8 @@
71
82
  if (prerequisiteArray.length === 0) return 0;
72
83
  var count = 0;
73
84
  for (var i = 0; i < prerequisiteArray.length; i++) {
74
- if (prerequisiteArray[i].pre()) {
85
+ if(executeOnePrerequisite(prerequisiteArray[i])) {
75
86
  count++;
76
- prerequisiteArray[i].func.call(window);
77
87
  prerequisiteArray[i] = null;
78
88
  }
79
89
  }
@@ -83,19 +93,60 @@
83
93
  }
84
94
  return count;
85
95
  };
96
+ var executeOnePrerequisite = function (pack) {
97
+ var getter, getters, instance, instances;
98
+ if (getter = pack.pre) {
99
+ instance = preparePrerequisite(getter);
100
+ if (instance) {
101
+ pack.func.call(window, instance);
102
+ return true;
103
+ }
104
+ return false;
105
+ } else if (getters = pack.pres) {
106
+ instances = [];
107
+ for (var j = 0; j < getters.length; j++) {
108
+ getter = getters[j];
109
+ instance = preparePrerequisite(getter);
110
+ if (!instance) break;
111
+ instances.push(instance);
112
+ }
113
+ if (instances.length !== getters.length) return false;
114
+ pack.func.apply(window, instances);
115
+ return true;
116
+ }
117
+ };
118
+ /**
119
+ * @param {(Function|string)} getter
120
+ * @return {(Object|null)}
121
+ */
122
+ var preparePrerequisite = function (getter) {
123
+ var instance;
124
+ if (typeof getter === "string") {
125
+ if (moduleInstances[getter]) {
126
+ return moduleInstances[getter];
127
+ } else if (moduleGetters[getter]) {
128
+ instance = moduleGetters[getter]();
129
+ if (instance) {
130
+ moduleInstances[getter] = instance;
131
+ }
132
+ return instance;
133
+ }
134
+ return null;
135
+ } else {
136
+ return getter();
137
+ }
138
+ };
86
139
 
87
140
  var cycle = function scheduleCycle() {
141
+ setTimeout(cycle, 30);
88
142
  tick();
89
- window.requestAnimationFrame(cycle);
90
143
  };
91
144
  document.addEventListener("DOMContentLoaded", cycle);
92
- window.EASY = window.EASY || {};
93
145
  /**
94
146
  *
95
- * @type {{out: boolean, late: EASY.schedule.late, require: EASY.schedule.require, main: EASY.schedule.main}}
147
+ * @type {{out: boolean, late: EASY.schedule.late, require: EASY.schedule.require, main: EASY.schedule.main, define: EASY.schedule.define}}
96
148
  */
97
- EASY.schedule = {
98
- out: false,
149
+ EasyGem.schedule = {
99
150
  /**
100
151
  * Functions, which should be executed right after "DOMContentLoaded" event
101
152
  * @param {Function} func
@@ -105,20 +156,83 @@
105
156
  mainArray.push({func: func, priority: priority || 0})
106
157
  },
107
158
  /**
108
- * Functions, which should wait for prerequisite fulfillment
159
+ * Functions, which should wait for [prerequisite] fulfillment
160
+ * After that [func] is executed with return value of [prerequisite] as parameter
109
161
  * @param {Function} func
110
- * @param {SchedulePrerequisite} prerequisite
162
+ * @param {...(SchedulePrerequisite|string)} prerequisite
111
163
  */
112
164
  require: function (func, prerequisite) {
113
- prerequisiteArray.push({func: func, pre: prerequisite})
165
+ if (arguments.length > 2) {
166
+ var pres = [];
167
+ for (var i = 1; i < arguments.length; i++) {
168
+ if (typeof arguments[i] === "string") {
169
+ pres.push(arguments[i].toLocaleLowerCase());
170
+ } else {
171
+ pres.push(arguments[i]);
172
+ }
173
+ }
174
+ var pack = {func: func, pres: pres};
175
+ if (!executeOnePrerequisite(pack)) {
176
+ prerequisiteArray.push(pack);
177
+ }
178
+ } else {
179
+ if (typeof prerequisite === "string") {
180
+ prerequisite = prerequisite.toLocaleLowerCase();
181
+ }
182
+ pack = {func: func, pre: prerequisite};
183
+ if (!executeOnePrerequisite(pack)) {
184
+ prerequisiteArray.push(pack);
185
+ }
186
+ }
114
187
  },
115
188
  /**
116
189
  * Functions, which should be executed after several render loops after "DOMContentLoaded" event
190
+ * each 5 levels of priority increase delay by one stack
117
191
  * @param {Function} func
118
192
  * @param {number} [priority]
119
193
  */
120
194
  late: function (func, priority) {
121
195
  lateArray.push({func: func, priority: priority || 0})
196
+ },
197
+ /**
198
+ * Define module, which will be loaded by [require] function with [name] argument
199
+ * Only one instance will be created
200
+ * @param {string} name
201
+ * @param {Function} getter
202
+ */
203
+ define: function (name, getter) {
204
+ moduleGetters[name.toLocaleLowerCase()] = getter;
205
+ }
206
+ };
207
+ EASY.schedule = EasyGem.schedule;
208
+ EasyGem.test.schedule = {
209
+ setOut: function (state) {
210
+ writeOut = state;
211
+ },
212
+ isLoaded: function () {
213
+ if (mainArray.length > 0) return false;
214
+ if (prerequisiteArray.length > 0) return false;
215
+ return lateArray.length <= 0;
216
+ },
217
+ lateIsLoaded: function () {
218
+ return lateArray.length <= 0;
219
+ },
220
+ queueContents: function () {
221
+ var modules = [];
222
+ for (var i = 0; i < prerequisiteArray.length; i++) {
223
+ var prerequisite = prerequisiteArray[i];
224
+ if (typeof prerequisite.pre === "string") {
225
+ modules.push(prerequisite.pre);
226
+ } else if (prerequisite.pres) {
227
+ for (var j = 0; j < prerequisite.pres.length; j++) {
228
+ var pre = prerequisite.pres[j];
229
+ if (typeof pre === "string") {
230
+ modules.push(pre);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ return {main: mainArray.length, late: lateArray, require: prerequisiteArray.length, waitsFor: modules};
122
236
  }
123
237
  };
124
238
  })();