targetj 1.0.2

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.
@@ -0,0 +1,378 @@
1
+ function TModelManager() {
2
+ this.init();
3
+ }
4
+
5
+ TModelManager.prototype.init = function() {
6
+ this.lists = {
7
+ visible: [],
8
+ invisibleDom: [],
9
+ deletedTModel: [],
10
+ visibleNoDom: []
11
+ };
12
+ this.visibleTypeMap = {};
13
+ this.visibleOidMap = {};
14
+
15
+ this.nextRuns = [];
16
+ this.runningStep = 0;
17
+ this.runningFlag = false;
18
+ };
19
+
20
+ TModelManager.prototype.visibles = function(type, list) {
21
+ list = !list ? this.lists.visible : list;
22
+ return this.lists.visible.filter(function(tmodel) { return tmodel.type === type || !type ; }).map(function(tmodel) { return tmodel.oid; });
23
+ };
24
+
25
+ TModelManager.prototype.findVisible = function(type) {
26
+ return this.lists.visible.find(function(tmodel) { return tmodel.type === type; });
27
+ };
28
+
29
+ TModelManager.prototype.findLastVisible = function(type) {
30
+ return this.lists.visible.findLast(function(tmodel) { return tmodel.type === type; });
31
+ };
32
+
33
+ TModelManager.prototype.analyze = function() {
34
+ var i, tmodel;
35
+
36
+ var lastVisibleMap = TUtil.list2map(this.lists.visible);
37
+
38
+ this.lists.visible.length = 0;
39
+ this.lists.visibleNoDom.length = 0;
40
+ this.visibleTypeMap = {};
41
+ this.visibleOidMap = {};
42
+
43
+ for (i = 0; i < tapp.locationManager.hasLocationList.length; i++) {
44
+ tmodel = tapp.locationManager.hasLocationList[i];
45
+ var visible = tmodel.isVisible();
46
+
47
+ if (tmodel.isMarkedDeleted() && this.lists.deletedTModel.indexOf(tmodel) === -1) {
48
+ this.lists.deletedTModel = [].concat(this.lists.deletedTModel, tmodel, tmodel.getAllNestedChildren());
49
+
50
+ lastVisibleMap[tmodel.oid] = null;
51
+ } else if (visible) {
52
+ lastVisibleMap[tmodel.oid] = null;
53
+
54
+ this.lists.visible.push(tmodel);
55
+
56
+ this.visibleOidMap[tmodel.oid] = tmodel;
57
+ if (!this.visibleTypeMap[tmodel.type]) {
58
+ this.visibleTypeMap[tmodel.type] = [];
59
+ }
60
+ this.visibleTypeMap[tmodel.type].push(tmodel);
61
+
62
+ if (tmodel.canHaveDom() && !tmodel.hasDom() && tmodel.getDomHolder() && tmodel.getDomHolder().exists() && this.lists.visibleNoDom.indexOf(tmodel) === -1) {
63
+ this.lists.visibleNoDom.push(tmodel);
64
+ }
65
+ }
66
+ }
67
+
68
+ var lastVisible = Object.values(lastVisibleMap).filter(function(tmodel) { return tmodel !== null; });
69
+
70
+ lastVisible.forEach(function(tmodel) {
71
+ if (tmodel.hasDom()) {
72
+ tapp.manager.lists.invisibleDom.push(tmodel);
73
+ }
74
+ });
75
+ };
76
+
77
+ TModelManager.prototype.renderTModels = function () {
78
+ var i, tmodel;
79
+
80
+ var rerendedList = [];
81
+ var holderChangedList = [];
82
+ this.lists.visible.forEach(function(tmodel) {
83
+ if (tmodel.hasDom() && TUtil.isDefined(tmodel.getHtml())) {
84
+
85
+ if (tmodel.$dom.html() !== tmodel.getHtml() || tmodel.$dom.textOnly !== tmodel.isTextOnly()) {
86
+ rerendedList.push(tmodel);
87
+ }
88
+ }
89
+
90
+ if (tmodel.hasDom() && tmodel.hasDomHolderChanged()) {
91
+ holderChangedList.push(tmodel);
92
+ }
93
+ });
94
+
95
+ for (i = 0; i < rerendedList.length; i++) {
96
+ tmodel = rerendedList[i];
97
+
98
+ tmodel.isTextOnly() ? tmodel.$dom.text(tmodel.getHtml()) : tmodel.$dom.html(tmodel.getHtml());
99
+ tmodel.setActualValueLastUpdate('html');
100
+
101
+ //we might need to re-measure dim from dom if tmodel has no measure method
102
+ tmodel.domHeight = undefined;
103
+ tmodel.domWidth = undefined;
104
+ }
105
+
106
+ for (i = 0; i < holderChangedList.length; i++) {
107
+ tmodel = holderChangedList[i];
108
+ tmodel.$dom.detach();
109
+ tmodel.getDomHolder().appendTModel$Dom(tmodel);
110
+ }
111
+ };
112
+
113
+ TModelManager.prototype.deleteDoms = function () {
114
+ var i;
115
+
116
+ for (i = 0; i < this.lists.invisibleDom.length; i++) {
117
+ var tmodel = this.lists.invisibleDom[i];
118
+
119
+ tmodel.domValues = {};
120
+ tmodel.xVisible = false;
121
+ tmodel.yVisible = false;
122
+
123
+ if (tmodel.invisibleFunctions) {
124
+ tmodel.invisibleFunctions.forEach(function(invisible) {
125
+ var key = invisible.key;
126
+ invisible.fn.call(tmodel, key, tmodel.getTargetStep(key), tmodel.getTargetCycle(key), tmodel.getTargetSteps(key), tmodel.getTargetCycles(key));
127
+ });
128
+ }
129
+
130
+ if (tmodel.isDomDeletable()) {
131
+ tmodel.$dom.detach();
132
+ tmodel.$dom = null;
133
+ }
134
+ }
135
+
136
+ for (i = 0; i < this.lists.deletedTModel.length; i++) {
137
+ this.removeTModel(this.lists.deletedTModel[i]);
138
+ }
139
+
140
+ var rerun = this.lists.invisibleDom.length > 0 || this.lists.deletedTModel.length > 0;
141
+
142
+ this.lists.invisibleDom.length = 0;
143
+ this.lists.deletedTModel.length = 0;
144
+
145
+ if (rerun) {
146
+ this.scheduleRun(0, "deleteDoms");
147
+ }
148
+ };
149
+
150
+ TModelManager.prototype.removeTModel = function(tmodel) {
151
+ tmodel.markAsDeleted();
152
+
153
+ var parent = tmodel.getParent();
154
+
155
+ var childIndex;
156
+ if (parent && parent.hasChildren()) {
157
+ parent.removeUpdatingChild(tmodel);
158
+
159
+
160
+ childIndex = parent.getValue('children').indexOf(tmodel);
161
+
162
+ if (childIndex >= 0) {
163
+ parent.getValue('children').splice(childIndex, 1);
164
+ parent.setActualValueLastUpdate('children');
165
+ }
166
+
167
+ childIndex = parent.getValue('addedChildren').indexOf(tmodel);
168
+
169
+ if (childIndex >= 0) {
170
+ parent.getValue('addedChildren').splice(childIndex, 1);
171
+ parent.setActualValueLastUpdate('addedChildren');
172
+ }
173
+
174
+ parent.setActualValueLastUpdate('allChildren');
175
+ }
176
+
177
+ if (tmodel.$dom) {
178
+ tmodel.$dom.detach();
179
+ tmodel.$dom = null;
180
+ }
181
+ };
182
+
183
+ TModelManager.prototype.createDoms = function () {
184
+ var i;
185
+ var $dom, tmodel;
186
+ var contentList = [];
187
+ var needsDom = [];
188
+
189
+ this.lists.visibleNoDom.sort(function(a, b) {
190
+ if (a.hasChildren() && b.hasChildren()) {
191
+ return a.getUIDepth() < b.getUIDepth() ? -1 : 1;
192
+ } else {
193
+ return a.hasChildren() ? -1 : 1;
194
+ }
195
+ });
196
+
197
+ for (i = 0; i < this.lists.visibleNoDom.length; i++) {
198
+ tmodel = this.lists.visibleNoDom[i];
199
+ if ($Dom.query('#' + tmodel.oid)) {
200
+ $dom = new $Dom('#' + tmodel.oid);
201
+ tmodel.$dom = $dom;
202
+ } else {
203
+ needsDom.push(tmodel);
204
+ }
205
+ }
206
+
207
+ for (i = 0; i < needsDom.length; i++) {
208
+ tmodel = needsDom[i];
209
+
210
+ var x = Math.floor(tmodel.getX()), y = Math.floor(tmodel.getY()), rotate = Math.floor(tmodel.getRotate()), scale = TUtil.formatNum(tmodel.getScale(), 2);
211
+
212
+ var width = Math.floor(tmodel.getWidth());
213
+ var height = Math.floor(tmodel.getHeight());
214
+ var zIndex = Math.floor(tmodel.getZIndex());
215
+ var opacity = tmodel.getOpacity().toFixed(2);
216
+
217
+ var styles = {
218
+ position: 'absolute',
219
+ top: 0,
220
+ left: 0,
221
+ transform: [ x, y, rotate, scale ],
222
+ width: width + "px",
223
+ opacity: opacity,
224
+ height: height + "px",
225
+ zIndex: zIndex
226
+ };
227
+
228
+ $dom = new $Dom();
229
+ $dom.create('div');
230
+ $dom.setSelector("#" + tmodel.oid);
231
+ $dom.setId(tmodel.oid);
232
+ $dom.css(tmodel.getCss());
233
+ $dom.setStyleByMap(styles);
234
+
235
+ tmodel.domValues = {};
236
+ tmodel.domValues.x = x;
237
+ tmodel.domValues.y = y;
238
+ tmodel.domValues.rotate = rotate;
239
+ tmodel.domValues.scale = scale;
240
+
241
+ tmodel.$dom = $dom;
242
+
243
+ var contentItem = contentList.find(function(item) {
244
+ return item.domHolder === tmodel.getDomHolder();
245
+ });
246
+
247
+ if (contentItem) {
248
+ contentItem.tmodels.push(tmodel);
249
+ } else {
250
+ contentList.push({ domHolder: tmodel.getDomHolder(), tmodels: [tmodel]});
251
+ }
252
+ }
253
+
254
+ contentList.map(function(content) {
255
+ content.tmodels.map(function(tmodel) {
256
+ content.domHolder.appendTModel$Dom(tmodel);
257
+ });
258
+ });
259
+
260
+ if (contentList.length) {
261
+ tapp.manager.scheduleRun(1, "createDom");
262
+ }
263
+ };
264
+
265
+ TModelManager.prototype.scheduleRun = function(delay, oid) {
266
+ if (delay < 1 && tapp.throttle === 0) {
267
+ tapp.manager.run(oid, delay);
268
+ } else {
269
+ var nextRun = browser.delay(function() {
270
+ tapp.manager.run(oid, delay);
271
+ }, oid, tapp.throttle === 0 ? delay || 0 : tapp.throttle);
272
+
273
+ var lastRun = this.nextRuns.length > 0 ? this.nextRuns[this.nextRuns.length - 1] : null;
274
+ if (nextRun && (!lastRun || nextRun.delay > lastRun.delay)) {
275
+ this.nextRuns.push(nextRun);
276
+ }
277
+ }
278
+ };
279
+
280
+ TModelManager.prototype.run = function(oid, delay) {
281
+ if (!tapp.isRunning()) {
282
+ this.getNextRun();
283
+ return;
284
+ }
285
+
286
+ if (tapp.manager.runningFlag) {
287
+ tapp.manager.scheduleRun(1, oid);
288
+ return;
289
+ }
290
+
291
+ tapp.manager.runningFlag = true;
292
+
293
+ window.requestAnimationFrame(function () {
294
+ var frameTime = browser.now();
295
+ while((browser.now() - frameTime) < 25 && tapp.manager.runningStep < 7 && tapp.isRunning()) {
296
+ switch(tapp.manager.runningStep) {
297
+ case 0:
298
+
299
+ tapp.events.captureEvents();
300
+
301
+ tapp.locationManager.calculateTargets(tapp.ui);
302
+
303
+ tapp.locationManager.calculateAll();
304
+
305
+ tapp.events.resetEvents();
306
+
307
+ break;
308
+
309
+ case 1:
310
+ tapp.manager.analyze();
311
+ break;
312
+
313
+ case 2:
314
+ tapp.manager.createDoms();
315
+ break;
316
+
317
+ case 3:
318
+ tapp.manager.renderTModels();
319
+ break;
320
+
321
+ case 4:
322
+ for (var i = 0; i < tapp.manager.lists.visible.length; i++) {
323
+ var tmodel = tapp.manager.lists.visible[i];
324
+ if (tmodel.hasDom()) {
325
+ tmodel.fixXYRotateScale();
326
+ tmodel.fixOpacity();
327
+ tmodel.fixZIndex();
328
+ tmodel.fixCss();
329
+ tmodel.fixStyle();
330
+ tmodel.fixDim();
331
+ }
332
+
333
+ }
334
+ break;
335
+
336
+ case 5:
337
+ tapp.manager.deleteDoms();
338
+ break;
339
+
340
+ case 6:
341
+ tapp.loader.singleLoad();
342
+ tapp.loader.groupLoad();
343
+ tapp.loader.imgLoad();
344
+ break;
345
+ }
346
+
347
+ tapp.manager.runningStep++;
348
+ }
349
+
350
+ if (tapp.debugLevel > 0) {
351
+ browser.log(tapp.debugLevel > 0 && browser.now() - frameTime > 10)("it took: " + (browser.now() - frameTime) + ", " + oid);
352
+ browser.log(tapp.debugLevel > 0 && browser.now() - frameTime > 10)("count: " + tapp.locationManager.locationCount);
353
+ browser.log(tapp.debugLevel > 1)("request from: " + oid + " delay: " + delay);
354
+ }
355
+
356
+ tapp.manager.runningFlag = false;
357
+
358
+ if (tapp.manager.runningStep !== 7) {
359
+ tapp.manager.run("rendering: " + tapp.manager.runningStep);
360
+ } else {
361
+ tapp.manager.runningStep = 0;
362
+
363
+ tapp.manager.getNextRun();
364
+ }
365
+ });
366
+
367
+ };
368
+
369
+ TModelManager.prototype.getNextRun = function() {
370
+ if (this.nextRuns.length > 0 && tapp.isRunning()) {
371
+ var nextRun = this.nextRuns.pop();
372
+ if (nextRun) {
373
+ tapp.manager.scheduleRun(nextRun.timeStamp - browser.now(), nextRun.oid);
374
+ }
375
+ }
376
+ };
377
+
378
+
package/src/TUtil.js ADDED
@@ -0,0 +1,202 @@
1
+ function TUtil() {}
2
+
3
+ TUtil.getTypeFromCallerFile = function() {
4
+ var stack = new Error("PRINTING CALL STACK").stack;
5
+ var lines = stack.split("\n");
6
+ var index = lines.findIndex(function(s) { return s.indexOf("TModel") >= 0; });
7
+ var typeLine = index < lines.length - 1 ? lines[index + 1] : '';
8
+
9
+ var type = typeLine.match(/[a-zA-Z]{3,}/);
10
+
11
+ return TUtil.isDefined(type) ? type[0] : '';
12
+ };
13
+
14
+ TUtil.initDoms = function(visibleList) {
15
+
16
+ var elements = $Dom.findByClass('tgt');
17
+
18
+ visibleList.forEach(function(tmodel) {
19
+ tmodel.$dom = null;
20
+ });
21
+
22
+ var visibleMap = TUtil.list2map(visibleList.filter(function(item) { return item.type !== 'BI'; }));
23
+
24
+ for (var i = 0; i < elements.length; i++) {
25
+ var element = elements[i];
26
+
27
+ var id = element.getAttribute("id");
28
+
29
+ var tmodel = visibleMap[id];
30
+
31
+ if (tmodel && !tmodel.hasDom()) {
32
+ tmodel.$dom = new $Dom("#" + id);
33
+ } else {
34
+ $Dom.detach(element);
35
+ }
36
+ }
37
+ };
38
+
39
+ TUtil.list2map = function(list, defaultValue) {
40
+ var map = list.reduce(function(a, c){
41
+ a[c.oid] = TUtil.isDefined(defaultValue) ? defaultValue : c;
42
+ return a;
43
+ }, {});
44
+
45
+ return map;
46
+ };
47
+
48
+ TUtil.getDeepList = function(parent) {
49
+ var deepList = [];
50
+
51
+ function traverse(tmodel) {
52
+ if (tmodel.hasChildren()) {
53
+ var list = tmodel.getChildren();
54
+ deepList = deepList.concat(list);
55
+ list.forEach(function(t) {
56
+ traverse(t);
57
+ });
58
+ }
59
+ }
60
+
61
+ traverse(parent);
62
+ return deepList;
63
+ };
64
+
65
+ TUtil.getDeepUpdatingList = function(parent) {
66
+ var deepList = [];
67
+
68
+ function traverse(tmodel) {
69
+ if (tmodel.updatingChildren) {
70
+ deepList = deepList.concat(tmodel.updatingChildren);
71
+ tmodel.updatingChildren.forEach(function(t) {
72
+ traverse(t);
73
+ });
74
+ }
75
+ }
76
+
77
+ traverse(parent);
78
+
79
+ return deepList;
80
+ };
81
+
82
+ TUtil.areEqual = function(a, b, deepEquality) {
83
+
84
+ if (deepEquality) {
85
+ return JSON.stringify(a) === JSON.stringify(b);
86
+ } else if (TUtil.isDefined(a) && TUtil.isDefined(b)) {
87
+ return a === b;
88
+ } else {
89
+ return false;
90
+ }
91
+ };
92
+
93
+ TUtil.momentum = function (past, current, time) {
94
+ time = time || 1;
95
+
96
+ var distance = current - past;
97
+ var speed = Math.abs(distance) / time;
98
+ var duration = speed * 5000;
99
+ var initialVelocity = 100;
100
+ var momentum = initialVelocity * duration;
101
+
102
+ var momentumDistance = momentum / 10;
103
+ if (distance > 0) {
104
+ distance += momentumDistance;
105
+ } else {
106
+ distance -= momentumDistance;
107
+ }
108
+
109
+ return {distance: Math.round(distance) / 50, duration: duration, momentumDistance: momentumDistance, time: time * 5 };
110
+ };
111
+
112
+ TUtil.isDefined = function (obj) {
113
+ return typeof (obj) !== "undefined" && obj !== null;
114
+ };
115
+
116
+ TUtil.isNumber = function(num) {
117
+ return typeof num === 'number' && !isNaN(num);
118
+ };
119
+
120
+ TUtil.limit = function (num, low, high) {
121
+ num = !TUtil.isDefined(num) ? low : num;
122
+ num = num > high ? high : num;
123
+ num = num < low ? low : num;
124
+
125
+ return num;
126
+ };
127
+
128
+ TUtil.getOptionValue = function(option, defaultValue, tmodel) {
129
+ return !TUtil.isDefined(option) ? defaultValue : typeof option === 'function' ? option.call(tmodel) : option;
130
+ };
131
+
132
+ TUtil.executeFunctionByName = function (functionName, context /*, args */) {
133
+ if (!functionName)
134
+ return null;
135
+
136
+ var args = Array.prototype.slice.call(arguments, 2);
137
+ var namespaces = functionName.split(".");
138
+ var func = namespaces.pop();
139
+ for (var i = 0; i < namespaces.length; i++) {
140
+ context = context[namespaces[i]];
141
+ }
142
+
143
+ if (context && context[func]) {
144
+ return context[func].apply(context, args);
145
+ }
146
+ };
147
+
148
+ TUtil.formatPeriod = function (seconds) {
149
+ seconds = seconds < 0 ? 0 : seconds;
150
+ if (seconds < 120) {
151
+ return seconds + " sec";
152
+ } else if (seconds < 7200) {
153
+ return Math.floor(seconds / 60) + " min";
154
+ } else if (seconds < 172800) {
155
+ return Math.floor(seconds / 3600) + " hours";
156
+ } else {
157
+ return Math.floor(seconds / 86400) + " days";
158
+ }
159
+ };
160
+
161
+ TUtil.formatNum = function (num, precision) {
162
+ if (!num) return 0;
163
+ var s = num.toString();
164
+ var n = parseFloat(s);
165
+ return n.toFixed(precision);
166
+ };
167
+
168
+ TUtil.distance = function(x1, y1, x2, y2) {
169
+ return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
170
+ };
171
+
172
+ TUtil.getFullLink = function(link) {
173
+ if (!TUtil.isDefined(link)) return;
174
+
175
+ if (link.indexOf('http') === 0) {
176
+ return link;
177
+ } else {
178
+ var protocol = window.location.protocol;
179
+ protocol += protocol.endsWith(":") ? "//" : "://";
180
+ var base = protocol + window.location.hostname;
181
+ return link.startsWith("/") ? base + link : base + "/" + link;
182
+ }
183
+ };
184
+
185
+ function EasingEffects() {}
186
+
187
+ EasingEffects.linear =function (t) {
188
+ return t;
189
+ };
190
+
191
+ EasingEffects.easeInQuad = function (t) {
192
+ return t * t;
193
+ };
194
+
195
+ EasingEffects.easeOutExpo = function (t) {
196
+ return 1 - (1 - t) * (1 - t);
197
+ };
198
+
199
+ EasingEffects.circular = function (t) {
200
+ return Math.sqrt(1 - (--t * t));
201
+ };
202
+