vis-rails 2.0.0 → 2.0.1

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vis/rails/version.rb +1 -1
  3. data/vendor/assets/javascripts/vis.js +26 -26
  4. metadata +16 -85
  5. data/vendor/assets/vis/DataSet.js +0 -926
  6. data/vendor/assets/vis/DataView.js +0 -283
  7. data/vendor/assets/vis/graph/Edge.js +0 -957
  8. data/vendor/assets/vis/graph/Graph.js +0 -2291
  9. data/vendor/assets/vis/graph/Groups.js +0 -80
  10. data/vendor/assets/vis/graph/Images.js +0 -41
  11. data/vendor/assets/vis/graph/Node.js +0 -966
  12. data/vendor/assets/vis/graph/Popup.js +0 -132
  13. data/vendor/assets/vis/graph/css/graph-manipulation.css +0 -128
  14. data/vendor/assets/vis/graph/css/graph-navigation.css +0 -66
  15. data/vendor/assets/vis/graph/dotparser.js +0 -829
  16. data/vendor/assets/vis/graph/graphMixins/ClusterMixin.js +0 -1143
  17. data/vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js +0 -311
  18. data/vendor/assets/vis/graph/graphMixins/ManipulationMixin.js +0 -576
  19. data/vendor/assets/vis/graph/graphMixins/MixinLoader.js +0 -199
  20. data/vendor/assets/vis/graph/graphMixins/NavigationMixin.js +0 -205
  21. data/vendor/assets/vis/graph/graphMixins/SectorsMixin.js +0 -552
  22. data/vendor/assets/vis/graph/graphMixins/SelectionMixin.js +0 -648
  23. data/vendor/assets/vis/graph/graphMixins/physics/BarnesHut.js +0 -398
  24. data/vendor/assets/vis/graph/graphMixins/physics/HierarchialRepulsion.js +0 -64
  25. data/vendor/assets/vis/graph/graphMixins/physics/PhysicsMixin.js +0 -697
  26. data/vendor/assets/vis/graph/graphMixins/physics/Repulsion.js +0 -66
  27. data/vendor/assets/vis/graph/img/acceptDeleteIcon.png +0 -0
  28. data/vendor/assets/vis/graph/img/addNodeIcon.png +0 -0
  29. data/vendor/assets/vis/graph/img/backIcon.png +0 -0
  30. data/vendor/assets/vis/graph/img/connectIcon.png +0 -0
  31. data/vendor/assets/vis/graph/img/cross.png +0 -0
  32. data/vendor/assets/vis/graph/img/cross2.png +0 -0
  33. data/vendor/assets/vis/graph/img/deleteIcon.png +0 -0
  34. data/vendor/assets/vis/graph/img/downArrow.png +0 -0
  35. data/vendor/assets/vis/graph/img/editIcon.png +0 -0
  36. data/vendor/assets/vis/graph/img/leftArrow.png +0 -0
  37. data/vendor/assets/vis/graph/img/minus.png +0 -0
  38. data/vendor/assets/vis/graph/img/plus.png +0 -0
  39. data/vendor/assets/vis/graph/img/rightArrow.png +0 -0
  40. data/vendor/assets/vis/graph/img/upArrow.png +0 -0
  41. data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
  42. data/vendor/assets/vis/graph/shapes.js +0 -225
  43. data/vendor/assets/vis/graph3d/Graph3d.js +0 -3306
  44. data/vendor/assets/vis/module/exports.js +0 -65
  45. data/vendor/assets/vis/module/header.js +0 -24
  46. data/vendor/assets/vis/module/imports.js +0 -31
  47. data/vendor/assets/vis/shim.js +0 -252
  48. data/vendor/assets/vis/timeline/Range.js +0 -532
  49. data/vendor/assets/vis/timeline/TimeStep.js +0 -466
  50. data/vendor/assets/vis/timeline/Timeline.js +0 -851
  51. data/vendor/assets/vis/timeline/component/Component.js +0 -52
  52. data/vendor/assets/vis/timeline/component/CurrentTime.js +0 -128
  53. data/vendor/assets/vis/timeline/component/CustomTime.js +0 -182
  54. data/vendor/assets/vis/timeline/component/Group.js +0 -470
  55. data/vendor/assets/vis/timeline/component/ItemSet.js +0 -1332
  56. data/vendor/assets/vis/timeline/component/TimeAxis.js +0 -389
  57. data/vendor/assets/vis/timeline/component/css/animation.css +0 -33
  58. data/vendor/assets/vis/timeline/component/css/currenttime.css +0 -5
  59. data/vendor/assets/vis/timeline/component/css/customtime.css +0 -6
  60. data/vendor/assets/vis/timeline/component/css/item.css +0 -107
  61. data/vendor/assets/vis/timeline/component/css/itemset.css +0 -33
  62. data/vendor/assets/vis/timeline/component/css/labelset.css +0 -36
  63. data/vendor/assets/vis/timeline/component/css/panel.css +0 -71
  64. data/vendor/assets/vis/timeline/component/css/timeaxis.css +0 -48
  65. data/vendor/assets/vis/timeline/component/css/timeline.css +0 -2
  66. data/vendor/assets/vis/timeline/component/item/Item.js +0 -139
  67. data/vendor/assets/vis/timeline/component/item/ItemBox.js +0 -230
  68. data/vendor/assets/vis/timeline/component/item/ItemPoint.js +0 -190
  69. data/vendor/assets/vis/timeline/component/item/ItemRange.js +0 -262
  70. data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +0 -57
  71. data/vendor/assets/vis/timeline/img/delete.png +0 -0
  72. data/vendor/assets/vis/timeline/stack.js +0 -112
  73. data/vendor/assets/vis/util.js +0 -990
@@ -1,697 +0,0 @@
1
- /**
2
- * Created by Alex on 2/6/14.
3
- */
4
-
5
-
6
- var physicsMixin = {
7
-
8
- /**
9
- * Toggling barnes Hut calculation on and off.
10
- *
11
- * @private
12
- */
13
- _toggleBarnesHut: function () {
14
- this.constants.physics.barnesHut.enabled = !this.constants.physics.barnesHut.enabled;
15
- this._loadSelectedForceSolver();
16
- this.moving = true;
17
- this.start();
18
- },
19
-
20
-
21
- /**
22
- * This loads the node force solver based on the barnes hut or repulsion algorithm
23
- *
24
- * @private
25
- */
26
- _loadSelectedForceSolver: function () {
27
- // this overloads the this._calculateNodeForces
28
- if (this.constants.physics.barnesHut.enabled == true) {
29
- this._clearMixin(repulsionMixin);
30
- this._clearMixin(hierarchalRepulsionMixin);
31
-
32
- this.constants.physics.centralGravity = this.constants.physics.barnesHut.centralGravity;
33
- this.constants.physics.springLength = this.constants.physics.barnesHut.springLength;
34
- this.constants.physics.springConstant = this.constants.physics.barnesHut.springConstant;
35
- this.constants.physics.damping = this.constants.physics.barnesHut.damping;
36
-
37
- this._loadMixin(barnesHutMixin);
38
- }
39
- else if (this.constants.physics.hierarchicalRepulsion.enabled == true) {
40
- this._clearMixin(barnesHutMixin);
41
- this._clearMixin(repulsionMixin);
42
-
43
- this.constants.physics.centralGravity = this.constants.physics.hierarchicalRepulsion.centralGravity;
44
- this.constants.physics.springLength = this.constants.physics.hierarchicalRepulsion.springLength;
45
- this.constants.physics.springConstant = this.constants.physics.hierarchicalRepulsion.springConstant;
46
- this.constants.physics.damping = this.constants.physics.hierarchicalRepulsion.damping;
47
-
48
- this._loadMixin(hierarchalRepulsionMixin);
49
- }
50
- else {
51
- this._clearMixin(barnesHutMixin);
52
- this._clearMixin(hierarchalRepulsionMixin);
53
- this.barnesHutTree = undefined;
54
-
55
- this.constants.physics.centralGravity = this.constants.physics.repulsion.centralGravity;
56
- this.constants.physics.springLength = this.constants.physics.repulsion.springLength;
57
- this.constants.physics.springConstant = this.constants.physics.repulsion.springConstant;
58
- this.constants.physics.damping = this.constants.physics.repulsion.damping;
59
-
60
- this._loadMixin(repulsionMixin);
61
- }
62
- },
63
-
64
- /**
65
- * Before calculating the forces, we check if we need to cluster to keep up performance and we check
66
- * if there is more than one node. If it is just one node, we dont calculate anything.
67
- *
68
- * @private
69
- */
70
- _initializeForceCalculation: function () {
71
- // stop calculation if there is only one node
72
- if (this.nodeIndices.length == 1) {
73
- this.nodes[this.nodeIndices[0]]._setForce(0, 0);
74
- }
75
- else {
76
- // if there are too many nodes on screen, we cluster without repositioning
77
- if (this.nodeIndices.length > this.constants.clustering.clusterThreshold && this.constants.clustering.enabled == true) {
78
- this.clusterToFit(this.constants.clustering.reduceToNodes, false);
79
- }
80
-
81
- // we now start the force calculation
82
- this._calculateForces();
83
- }
84
- },
85
-
86
-
87
- /**
88
- * Calculate the external forces acting on the nodes
89
- * Forces are caused by: edges, repulsing forces between nodes, gravity
90
- * @private
91
- */
92
- _calculateForces: function () {
93
- // Gravity is required to keep separated groups from floating off
94
- // the forces are reset to zero in this loop by using _setForce instead
95
- // of _addForce
96
-
97
- this._calculateGravitationalForces();
98
- this._calculateNodeForces();
99
-
100
- if (this.constants.smoothCurves == true) {
101
- this._calculateSpringForcesWithSupport();
102
- }
103
- else {
104
- this._calculateSpringForces();
105
- }
106
- },
107
-
108
-
109
- /**
110
- * Smooth curves are created by adding invisible nodes in the center of the edges. These nodes are also
111
- * handled in the calculateForces function. We then use a quadratic curve with the center node as control.
112
- * This function joins the datanodes and invisible (called support) nodes into one object.
113
- * We do this so we do not contaminate this.nodes with the support nodes.
114
- *
115
- * @private
116
- */
117
- _updateCalculationNodes: function () {
118
- if (this.constants.smoothCurves == true) {
119
- this.calculationNodes = {};
120
- this.calculationNodeIndices = [];
121
-
122
- for (var nodeId in this.nodes) {
123
- if (this.nodes.hasOwnProperty(nodeId)) {
124
- this.calculationNodes[nodeId] = this.nodes[nodeId];
125
- }
126
- }
127
- var supportNodes = this.sectors['support']['nodes'];
128
- for (var supportNodeId in supportNodes) {
129
- if (supportNodes.hasOwnProperty(supportNodeId)) {
130
- if (this.edges.hasOwnProperty(supportNodes[supportNodeId].parentEdgeId)) {
131
- this.calculationNodes[supportNodeId] = supportNodes[supportNodeId];
132
- }
133
- else {
134
- supportNodes[supportNodeId]._setForce(0, 0);
135
- }
136
- }
137
- }
138
-
139
- for (var idx in this.calculationNodes) {
140
- if (this.calculationNodes.hasOwnProperty(idx)) {
141
- this.calculationNodeIndices.push(idx);
142
- }
143
- }
144
- }
145
- else {
146
- this.calculationNodes = this.nodes;
147
- this.calculationNodeIndices = this.nodeIndices;
148
- }
149
- },
150
-
151
-
152
- /**
153
- * this function applies the central gravity effect to keep groups from floating off
154
- *
155
- * @private
156
- */
157
- _calculateGravitationalForces: function () {
158
- var dx, dy, distance, node, i;
159
- var nodes = this.calculationNodes;
160
- var gravity = this.constants.physics.centralGravity;
161
- var gravityForce = 0;
162
-
163
- for (i = 0; i < this.calculationNodeIndices.length; i++) {
164
- node = nodes[this.calculationNodeIndices[i]];
165
- node.damping = this.constants.physics.damping; // possibly add function to alter damping properties of clusters.
166
- // gravity does not apply when we are in a pocket sector
167
- if (this._sector() == "default" && gravity != 0) {
168
- dx = -node.x;
169
- dy = -node.y;
170
- distance = Math.sqrt(dx * dx + dy * dy);
171
-
172
- gravityForce = (distance == 0) ? 0 : (gravity / distance);
173
- node.fx = dx * gravityForce;
174
- node.fy = dy * gravityForce;
175
- }
176
- else {
177
- node.fx = 0;
178
- node.fy = 0;
179
- }
180
- }
181
- },
182
-
183
-
184
- /**
185
- * this function calculates the effects of the springs in the case of unsmooth curves.
186
- *
187
- * @private
188
- */
189
- _calculateSpringForces: function () {
190
- var edgeLength, edge, edgeId;
191
- var dx, dy, fx, fy, springForce, distance;
192
- var edges = this.edges;
193
-
194
- // forces caused by the edges, modelled as springs
195
- for (edgeId in edges) {
196
- if (edges.hasOwnProperty(edgeId)) {
197
- edge = edges[edgeId];
198
- if (edge.connected) {
199
- // only calculate forces if nodes are in the same sector
200
- if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) {
201
- edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength;
202
- // this implies that the edges between big clusters are longer
203
- edgeLength += (edge.to.clusterSize + edge.from.clusterSize - 2) * this.constants.clustering.edgeGrowth;
204
-
205
- dx = (edge.from.x - edge.to.x);
206
- dy = (edge.from.y - edge.to.y);
207
- distance = Math.sqrt(dx * dx + dy * dy);
208
-
209
- if (distance == 0) {
210
- distance = 0.01;
211
- }
212
-
213
- // the 1/distance is so the fx and fy can be calculated without sine or cosine.
214
- springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance;
215
-
216
- fx = dx * springForce;
217
- fy = dy * springForce;
218
-
219
- edge.from.fx += fx;
220
- edge.from.fy += fy;
221
- edge.to.fx -= fx;
222
- edge.to.fy -= fy;
223
- }
224
- }
225
- }
226
- }
227
- },
228
-
229
-
230
- /**
231
- * This function calculates the springforces on the nodes, accounting for the support nodes.
232
- *
233
- * @private
234
- */
235
- _calculateSpringForcesWithSupport: function () {
236
- var edgeLength, edge, edgeId, combinedClusterSize;
237
- var edges = this.edges;
238
-
239
- // forces caused by the edges, modelled as springs
240
- for (edgeId in edges) {
241
- if (edges.hasOwnProperty(edgeId)) {
242
- edge = edges[edgeId];
243
- if (edge.connected) {
244
- // only calculate forces if nodes are in the same sector
245
- if (this.nodes.hasOwnProperty(edge.toId) && this.nodes.hasOwnProperty(edge.fromId)) {
246
- if (edge.via != null) {
247
- var node1 = edge.to;
248
- var node2 = edge.via;
249
- var node3 = edge.from;
250
-
251
- edgeLength = edge.customLength ? edge.length : this.constants.physics.springLength;
252
-
253
- combinedClusterSize = node1.clusterSize + node3.clusterSize - 2;
254
-
255
- // this implies that the edges between big clusters are longer
256
- edgeLength += combinedClusterSize * this.constants.clustering.edgeGrowth;
257
- this._calculateSpringForce(node1, node2, 0.5 * edgeLength);
258
- this._calculateSpringForce(node2, node3, 0.5 * edgeLength);
259
- }
260
- }
261
- }
262
- }
263
- }
264
- },
265
-
266
-
267
- /**
268
- * This is the code actually performing the calculation for the function above. It is split out to avoid repetition.
269
- *
270
- * @param node1
271
- * @param node2
272
- * @param edgeLength
273
- * @private
274
- */
275
- _calculateSpringForce: function (node1, node2, edgeLength) {
276
- var dx, dy, fx, fy, springForce, distance;
277
-
278
- dx = (node1.x - node2.x);
279
- dy = (node1.y - node2.y);
280
- distance = Math.sqrt(dx * dx + dy * dy);
281
-
282
- if (distance == 0) {
283
- distance = 0.01;
284
- }
285
-
286
- // the 1/distance is so the fx and fy can be calculated without sine or cosine.
287
- springForce = this.constants.physics.springConstant * (edgeLength - distance) / distance;
288
-
289
- fx = dx * springForce;
290
- fy = dy * springForce;
291
-
292
- node1.fx += fx;
293
- node1.fy += fy;
294
- node2.fx -= fx;
295
- node2.fy -= fy;
296
- },
297
-
298
-
299
- /**
300
- * Load the HTML for the physics config and bind it
301
- * @private
302
- */
303
- _loadPhysicsConfiguration: function () {
304
- if (this.physicsConfiguration === undefined) {
305
- this.backupConstants = {};
306
- util.copyObject(this.constants, this.backupConstants);
307
-
308
- var hierarchicalLayoutDirections = ["LR", "RL", "UD", "DU"];
309
- this.physicsConfiguration = document.createElement('div');
310
- this.physicsConfiguration.className = "PhysicsConfiguration";
311
- this.physicsConfiguration.innerHTML = '' +
312
- '<table><tr><td><b>Simulation Mode:</b></td></tr>' +
313
- '<tr>' +
314
- '<td width="120px"><input type="radio" name="graph_physicsMethod" id="graph_physicsMethod1" value="BH" checked="checked">Barnes Hut</td>' +
315
- '<td width="120px"><input type="radio" name="graph_physicsMethod" id="graph_physicsMethod2" value="R">Repulsion</td>' +
316
- '<td width="120px"><input type="radio" name="graph_physicsMethod" id="graph_physicsMethod3" value="H">Hierarchical</td>' +
317
- '</tr>' +
318
- '</table>' +
319
- '<table id="graph_BH_table" style="display:none">' +
320
- '<tr><td><b>Barnes Hut</b></td></tr>' +
321
- '<tr>' +
322
- '<td width="150px">gravitationalConstant</td><td>0</td><td><input type="range" min="0" max="20000" value="' + (-1 * this.constants.physics.barnesHut.gravitationalConstant) + '" step="25" style="width:300px" id="graph_BH_gc"></td><td width="50px">-20000</td><td><input value="' + (-1 * this.constants.physics.barnesHut.gravitationalConstant) + '" id="graph_BH_gc_value" style="width:60px"></td>' +
323
- '</tr>' +
324
- '<tr>' +
325
- '<td width="150px">centralGravity</td><td>0</td><td><input type="range" min="0" max="3" value="' + this.constants.physics.barnesHut.centralGravity + '" step="0.05" style="width:300px" id="graph_BH_cg"></td><td>3</td><td><input value="' + this.constants.physics.barnesHut.centralGravity + '" id="graph_BH_cg_value" style="width:60px"></td>' +
326
- '</tr>' +
327
- '<tr>' +
328
- '<td width="150px">springLength</td><td>0</td><td><input type="range" min="0" max="500" value="' + this.constants.physics.barnesHut.springLength + '" step="1" style="width:300px" id="graph_BH_sl"></td><td>500</td><td><input value="' + this.constants.physics.barnesHut.springLength + '" id="graph_BH_sl_value" style="width:60px"></td>' +
329
- '</tr>' +
330
- '<tr>' +
331
- '<td width="150px">springConstant</td><td>0</td><td><input type="range" min="0" max="0.5" value="' + this.constants.physics.barnesHut.springConstant + '" step="0.001" style="width:300px" id="graph_BH_sc"></td><td>0.5</td><td><input value="' + this.constants.physics.barnesHut.springConstant + '" id="graph_BH_sc_value" style="width:60px"></td>' +
332
- '</tr>' +
333
- '<tr>' +
334
- '<td width="150px">damping</td><td>0</td><td><input type="range" min="0" max="0.3" value="' + this.constants.physics.barnesHut.damping + '" step="0.005" style="width:300px" id="graph_BH_damp"></td><td>0.3</td><td><input value="' + this.constants.physics.barnesHut.damping + '" id="graph_BH_damp_value" style="width:60px"></td>' +
335
- '</tr>' +
336
- '</table>' +
337
- '<table id="graph_R_table" style="display:none">' +
338
- '<tr><td><b>Repulsion</b></td></tr>' +
339
- '<tr>' +
340
- '<td width="150px">nodeDistance</td><td>0</td><td><input type="range" min="0" max="300" value="' + this.constants.physics.repulsion.nodeDistance + '" step="1" style="width:300px" id="graph_R_nd"></td><td width="50px">300</td><td><input value="' + this.constants.physics.repulsion.nodeDistance + '" id="graph_R_nd_value" style="width:60px"></td>' +
341
- '</tr>' +
342
- '<tr>' +
343
- '<td width="150px">centralGravity</td><td>0</td><td><input type="range" min="0" max="3" value="' + this.constants.physics.repulsion.centralGravity + '" step="0.05" style="width:300px" id="graph_R_cg"></td><td>3</td><td><input value="' + this.constants.physics.repulsion.centralGravity + '" id="graph_R_cg_value" style="width:60px"></td>' +
344
- '</tr>' +
345
- '<tr>' +
346
- '<td width="150px">springLength</td><td>0</td><td><input type="range" min="0" max="500" value="' + this.constants.physics.repulsion.springLength + '" step="1" style="width:300px" id="graph_R_sl"></td><td>500</td><td><input value="' + this.constants.physics.repulsion.springLength + '" id="graph_R_sl_value" style="width:60px"></td>' +
347
- '</tr>' +
348
- '<tr>' +
349
- '<td width="150px">springConstant</td><td>0</td><td><input type="range" min="0" max="0.5" value="' + this.constants.physics.repulsion.springConstant + '" step="0.001" style="width:300px" id="graph_R_sc"></td><td>0.5</td><td><input value="' + this.constants.physics.repulsion.springConstant + '" id="graph_R_sc_value" style="width:60px"></td>' +
350
- '</tr>' +
351
- '<tr>' +
352
- '<td width="150px">damping</td><td>0</td><td><input type="range" min="0" max="0.3" value="' + this.constants.physics.repulsion.damping + '" step="0.005" style="width:300px" id="graph_R_damp"></td><td>0.3</td><td><input value="' + this.constants.physics.repulsion.damping + '" id="graph_R_damp_value" style="width:60px"></td>' +
353
- '</tr>' +
354
- '</table>' +
355
- '<table id="graph_H_table" style="display:none">' +
356
- '<tr><td width="150"><b>Hierarchical</b></td></tr>' +
357
- '<tr>' +
358
- '<td width="150px">nodeDistance</td><td>0</td><td><input type="range" min="0" max="300" value="' + this.constants.physics.hierarchicalRepulsion.nodeDistance + '" step="1" style="width:300px" id="graph_H_nd"></td><td width="50px">300</td><td><input value="' + this.constants.physics.hierarchicalRepulsion.nodeDistance + '" id="graph_H_nd_value" style="width:60px"></td>' +
359
- '</tr>' +
360
- '<tr>' +
361
- '<td width="150px">centralGravity</td><td>0</td><td><input type="range" min="0" max="3" value="' + this.constants.physics.hierarchicalRepulsion.centralGravity + '" step="0.05" style="width:300px" id="graph_H_cg"></td><td>3</td><td><input value="' + this.constants.physics.hierarchicalRepulsion.centralGravity + '" id="graph_H_cg_value" style="width:60px"></td>' +
362
- '</tr>' +
363
- '<tr>' +
364
- '<td width="150px">springLength</td><td>0</td><td><input type="range" min="0" max="500" value="' + this.constants.physics.hierarchicalRepulsion.springLength + '" step="1" style="width:300px" id="graph_H_sl"></td><td>500</td><td><input value="' + this.constants.physics.hierarchicalRepulsion.springLength + '" id="graph_H_sl_value" style="width:60px"></td>' +
365
- '</tr>' +
366
- '<tr>' +
367
- '<td width="150px">springConstant</td><td>0</td><td><input type="range" min="0" max="0.5" value="' + this.constants.physics.hierarchicalRepulsion.springConstant + '" step="0.001" style="width:300px" id="graph_H_sc"></td><td>0.5</td><td><input value="' + this.constants.physics.hierarchicalRepulsion.springConstant + '" id="graph_H_sc_value" style="width:60px"></td>' +
368
- '</tr>' +
369
- '<tr>' +
370
- '<td width="150px">damping</td><td>0</td><td><input type="range" min="0" max="0.3" value="' + this.constants.physics.hierarchicalRepulsion.damping + '" step="0.005" style="width:300px" id="graph_H_damp"></td><td>0.3</td><td><input value="' + this.constants.physics.hierarchicalRepulsion.damping + '" id="graph_H_damp_value" style="width:60px"></td>' +
371
- '</tr>' +
372
- '<tr>' +
373
- '<td width="150px">direction</td><td>1</td><td><input type="range" min="0" max="3" value="' + hierarchicalLayoutDirections.indexOf(this.constants.hierarchicalLayout.direction) + '" step="1" style="width:300px" id="graph_H_direction"></td><td>4</td><td><input value="' + this.constants.hierarchicalLayout.direction + '" id="graph_H_direction_value" style="width:60px"></td>' +
374
- '</tr>' +
375
- '<tr>' +
376
- '<td width="150px">levelSeparation</td><td>1</td><td><input type="range" min="0" max="500" value="' + this.constants.hierarchicalLayout.levelSeparation + '" step="1" style="width:300px" id="graph_H_levsep"></td><td>500</td><td><input value="' + this.constants.hierarchicalLayout.levelSeparation + '" id="graph_H_levsep_value" style="width:60px"></td>' +
377
- '</tr>' +
378
- '<tr>' +
379
- '<td width="150px">nodeSpacing</td><td>1</td><td><input type="range" min="0" max="500" value="' + this.constants.hierarchicalLayout.nodeSpacing + '" step="1" style="width:300px" id="graph_H_nspac"></td><td>500</td><td><input value="' + this.constants.hierarchicalLayout.nodeSpacing + '" id="graph_H_nspac_value" style="width:60px"></td>' +
380
- '</tr>' +
381
- '</table>' +
382
- '<table><tr><td><b>Options:</b></td></tr>' +
383
- '<tr>' +
384
- '<td width="180px"><input type="button" id="graph_toggleSmooth" value="Toggle smoothCurves" style="width:150px"></td>' +
385
- '<td width="180px"><input type="button" id="graph_repositionNodes" value="Reinitialize" style="width:150px"></td>' +
386
- '<td width="180px"><input type="button" id="graph_generateOptions" value="Generate Options" style="width:150px"></td>' +
387
- '</tr>' +
388
- '</table>'
389
- this.containerElement.parentElement.insertBefore(this.physicsConfiguration, this.containerElement);
390
- this.optionsDiv = document.createElement("div");
391
- this.optionsDiv.style.fontSize = "14px";
392
- this.optionsDiv.style.fontFamily = "verdana";
393
- this.containerElement.parentElement.insertBefore(this.optionsDiv, this.containerElement);
394
-
395
- var rangeElement;
396
- rangeElement = document.getElementById('graph_BH_gc');
397
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_gc', -1, "physics_barnesHut_gravitationalConstant");
398
- rangeElement = document.getElementById('graph_BH_cg');
399
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_cg', 1, "physics_centralGravity");
400
- rangeElement = document.getElementById('graph_BH_sc');
401
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sc', 1, "physics_springConstant");
402
- rangeElement = document.getElementById('graph_BH_sl');
403
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_sl', 1, "physics_springLength");
404
- rangeElement = document.getElementById('graph_BH_damp');
405
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_BH_damp', 1, "physics_damping");
406
-
407
- rangeElement = document.getElementById('graph_R_nd');
408
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_nd', 1, "physics_repulsion_nodeDistance");
409
- rangeElement = document.getElementById('graph_R_cg');
410
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_cg', 1, "physics_centralGravity");
411
- rangeElement = document.getElementById('graph_R_sc');
412
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sc', 1, "physics_springConstant");
413
- rangeElement = document.getElementById('graph_R_sl');
414
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_sl', 1, "physics_springLength");
415
- rangeElement = document.getElementById('graph_R_damp');
416
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_R_damp', 1, "physics_damping");
417
-
418
- rangeElement = document.getElementById('graph_H_nd');
419
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nd', 1, "physics_hierarchicalRepulsion_nodeDistance");
420
- rangeElement = document.getElementById('graph_H_cg');
421
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_cg', 1, "physics_centralGravity");
422
- rangeElement = document.getElementById('graph_H_sc');
423
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sc', 1, "physics_springConstant");
424
- rangeElement = document.getElementById('graph_H_sl');
425
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_sl', 1, "physics_springLength");
426
- rangeElement = document.getElementById('graph_H_damp');
427
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_damp', 1, "physics_damping");
428
- rangeElement = document.getElementById('graph_H_direction');
429
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_direction', hierarchicalLayoutDirections, "hierarchicalLayout_direction");
430
- rangeElement = document.getElementById('graph_H_levsep');
431
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_levsep', 1, "hierarchicalLayout_levelSeparation");
432
- rangeElement = document.getElementById('graph_H_nspac');
433
- rangeElement.onchange = showValueOfRange.bind(this, 'graph_H_nspac', 1, "hierarchicalLayout_nodeSpacing");
434
-
435
- var radioButton1 = document.getElementById("graph_physicsMethod1");
436
- var radioButton2 = document.getElementById("graph_physicsMethod2");
437
- var radioButton3 = document.getElementById("graph_physicsMethod3");
438
- radioButton2.checked = true;
439
- if (this.constants.physics.barnesHut.enabled) {
440
- radioButton1.checked = true;
441
- }
442
- if (this.constants.hierarchicalLayout.enabled) {
443
- radioButton3.checked = true;
444
- }
445
-
446
- var graph_toggleSmooth = document.getElementById("graph_toggleSmooth");
447
- var graph_repositionNodes = document.getElementById("graph_repositionNodes");
448
- var graph_generateOptions = document.getElementById("graph_generateOptions");
449
-
450
- graph_toggleSmooth.onclick = graphToggleSmoothCurves.bind(this);
451
- graph_repositionNodes.onclick = graphRepositionNodes.bind(this);
452
- graph_generateOptions.onclick = graphGenerateOptions.bind(this);
453
- if (this.constants.smoothCurves == true) {
454
- graph_toggleSmooth.style.background = "#A4FF56";
455
- }
456
- else {
457
- graph_toggleSmooth.style.background = "#FF8532";
458
- }
459
-
460
-
461
- switchConfigurations.apply(this);
462
-
463
- radioButton1.onchange = switchConfigurations.bind(this);
464
- radioButton2.onchange = switchConfigurations.bind(this);
465
- radioButton3.onchange = switchConfigurations.bind(this);
466
- }
467
- },
468
-
469
- /**
470
- * This overwrites the this.constants.
471
- *
472
- * @param constantsVariableName
473
- * @param value
474
- * @private
475
- */
476
- _overWriteGraphConstants: function (constantsVariableName, value) {
477
- var nameArray = constantsVariableName.split("_");
478
- if (nameArray.length == 1) {
479
- this.constants[nameArray[0]] = value;
480
- }
481
- else if (nameArray.length == 2) {
482
- this.constants[nameArray[0]][nameArray[1]] = value;
483
- }
484
- else if (nameArray.length == 3) {
485
- this.constants[nameArray[0]][nameArray[1]][nameArray[2]] = value;
486
- }
487
- }
488
- };
489
-
490
- /**
491
- * this function is bound to the toggle smooth curves button. That is also why it is not in the prototype.
492
- */
493
- function graphToggleSmoothCurves () {
494
- this.constants.smoothCurves = !this.constants.smoothCurves;
495
- var graph_toggleSmooth = document.getElementById("graph_toggleSmooth");
496
- if (this.constants.smoothCurves == true) {graph_toggleSmooth.style.background = "#A4FF56";}
497
- else {graph_toggleSmooth.style.background = "#FF8532";}
498
-
499
- this._configureSmoothCurves(false);
500
- };
501
-
502
- /**
503
- * this function is used to scramble the nodes
504
- *
505
- */
506
- function graphRepositionNodes () {
507
- for (var nodeId in this.calculationNodes) {
508
- if (this.calculationNodes.hasOwnProperty(nodeId)) {
509
- this.calculationNodes[nodeId].vx = 0; this.calculationNodes[nodeId].vy = 0;
510
- this.calculationNodes[nodeId].fx = 0; this.calculationNodes[nodeId].fy = 0;
511
- }
512
- }
513
- if (this.constants.hierarchicalLayout.enabled == true) {
514
- this._setupHierarchicalLayout();
515
- }
516
- else {
517
- this.repositionNodes();
518
- }
519
- this.moving = true;
520
- this.start();
521
- };
522
-
523
- /**
524
- * this is used to generate an options file from the playing with physics system.
525
- */
526
- function graphGenerateOptions () {
527
- var options = "No options are required, default values used.";
528
- var optionsSpecific = [];
529
- var radioButton1 = document.getElementById("graph_physicsMethod1");
530
- var radioButton2 = document.getElementById("graph_physicsMethod2");
531
- if (radioButton1.checked == true) {
532
- if (this.constants.physics.barnesHut.gravitationalConstant != this.backupConstants.physics.barnesHut.gravitationalConstant) {optionsSpecific.push("gravitationalConstant: " + this.constants.physics.barnesHut.gravitationalConstant);}
533
- if (this.constants.physics.centralGravity != this.backupConstants.physics.barnesHut.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);}
534
- if (this.constants.physics.springLength != this.backupConstants.physics.barnesHut.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);}
535
- if (this.constants.physics.springConstant != this.backupConstants.physics.barnesHut.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);}
536
- if (this.constants.physics.damping != this.backupConstants.physics.barnesHut.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);}
537
- if (optionsSpecific.length != 0) {
538
- options = "var options = {";
539
- options += "physics: {barnesHut: {";
540
- for (var i = 0; i < optionsSpecific.length; i++) {
541
- options += optionsSpecific[i];
542
- if (i < optionsSpecific.length - 1) {
543
- options += ", "
544
- }
545
- }
546
- options += '}}'
547
- }
548
- if (this.constants.smoothCurves != this.backupConstants.smoothCurves) {
549
- if (optionsSpecific.length == 0) {options = "var options = {";}
550
- else {options += ", "}
551
- options += "smoothCurves: " + this.constants.smoothCurves;
552
- }
553
- if (options != "No options are required, default values used.") {
554
- options += '};'
555
- }
556
- }
557
- else if (radioButton2.checked == true) {
558
- options = "var options = {";
559
- options += "physics: {barnesHut: {enabled: false}";
560
- if (this.constants.physics.repulsion.nodeDistance != this.backupConstants.physics.repulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.repulsion.nodeDistance);}
561
- if (this.constants.physics.centralGravity != this.backupConstants.physics.repulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);}
562
- if (this.constants.physics.springLength != this.backupConstants.physics.repulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);}
563
- if (this.constants.physics.springConstant != this.backupConstants.physics.repulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);}
564
- if (this.constants.physics.damping != this.backupConstants.physics.repulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);}
565
- if (optionsSpecific.length != 0) {
566
- options += ", repulsion: {";
567
- for (var i = 0; i < optionsSpecific.length; i++) {
568
- options += optionsSpecific[i];
569
- if (i < optionsSpecific.length - 1) {
570
- options += ", "
571
- }
572
- }
573
- options += '}}'
574
- }
575
- if (optionsSpecific.length == 0) {options += "}"}
576
- if (this.constants.smoothCurves != this.backupConstants.smoothCurves) {
577
- options += ", smoothCurves: " + this.constants.smoothCurves;
578
- }
579
- options += '};'
580
- }
581
- else {
582
- options = "var options = {";
583
- if (this.constants.physics.hierarchicalRepulsion.nodeDistance != this.backupConstants.physics.hierarchicalRepulsion.nodeDistance) {optionsSpecific.push("nodeDistance: " + this.constants.physics.hierarchicalRepulsion.nodeDistance);}
584
- if (this.constants.physics.centralGravity != this.backupConstants.physics.hierarchicalRepulsion.centralGravity) {optionsSpecific.push("centralGravity: " + this.constants.physics.centralGravity);}
585
- if (this.constants.physics.springLength != this.backupConstants.physics.hierarchicalRepulsion.springLength) {optionsSpecific.push("springLength: " + this.constants.physics.springLength);}
586
- if (this.constants.physics.springConstant != this.backupConstants.physics.hierarchicalRepulsion.springConstant) {optionsSpecific.push("springConstant: " + this.constants.physics.springConstant);}
587
- if (this.constants.physics.damping != this.backupConstants.physics.hierarchicalRepulsion.damping) {optionsSpecific.push("damping: " + this.constants.physics.damping);}
588
- if (optionsSpecific.length != 0) {
589
- options += "physics: {hierarchicalRepulsion: {";
590
- for (var i = 0; i < optionsSpecific.length; i++) {
591
- options += optionsSpecific[i];
592
- if (i < optionsSpecific.length - 1) {
593
- options += ", ";
594
- }
595
- }
596
- options += '}},';
597
- }
598
- options += 'hierarchicalLayout: {';
599
- optionsSpecific = [];
600
- if (this.constants.hierarchicalLayout.direction != this.backupConstants.hierarchicalLayout.direction) {optionsSpecific.push("direction: " + this.constants.hierarchicalLayout.direction);}
601
- if (Math.abs(this.constants.hierarchicalLayout.levelSeparation) != this.backupConstants.hierarchicalLayout.levelSeparation) {optionsSpecific.push("levelSeparation: " + this.constants.hierarchicalLayout.levelSeparation);}
602
- if (this.constants.hierarchicalLayout.nodeSpacing != this.backupConstants.hierarchicalLayout.nodeSpacing) {optionsSpecific.push("nodeSpacing: " + this.constants.hierarchicalLayout.nodeSpacing);}
603
- if (optionsSpecific.length != 0) {
604
- for (var i = 0; i < optionsSpecific.length; i++) {
605
- options += optionsSpecific[i];
606
- if (i < optionsSpecific.length - 1) {
607
- options += ", "
608
- }
609
- }
610
- options += '}'
611
- }
612
- else {
613
- options += "enabled:true}";
614
- }
615
- options += '};'
616
- }
617
-
618
-
619
- this.optionsDiv.innerHTML = options;
620
-
621
- };
622
-
623
- /**
624
- * this is used to switch between barnesHut, repulsion and hierarchical.
625
- *
626
- */
627
- function switchConfigurations () {
628
- var ids = ["graph_BH_table", "graph_R_table", "graph_H_table"];
629
- var radioButton = document.querySelector('input[name="graph_physicsMethod"]:checked').value;
630
- var tableId = "graph_" + radioButton + "_table";
631
- var table = document.getElementById(tableId);
632
- table.style.display = "block";
633
- for (var i = 0; i < ids.length; i++) {
634
- if (ids[i] != tableId) {
635
- table = document.getElementById(ids[i]);
636
- table.style.display = "none";
637
- }
638
- }
639
- this._restoreNodes();
640
- if (radioButton == "R") {
641
- this.constants.hierarchicalLayout.enabled = false;
642
- this.constants.physics.hierarchicalRepulsion.enabled = false;
643
- this.constants.physics.barnesHut.enabled = false;
644
- }
645
- else if (radioButton == "H") {
646
- if (this.constants.hierarchicalLayout.enabled == false) {
647
- this.constants.hierarchicalLayout.enabled = true;
648
- this.constants.physics.hierarchicalRepulsion.enabled = true;
649
- this.constants.physics.barnesHut.enabled = false;
650
- this._setupHierarchicalLayout();
651
- }
652
- }
653
- else {
654
- this.constants.hierarchicalLayout.enabled = false;
655
- this.constants.physics.hierarchicalRepulsion.enabled = false;
656
- this.constants.physics.barnesHut.enabled = true;
657
- }
658
- this._loadSelectedForceSolver();
659
- var graph_toggleSmooth = document.getElementById("graph_toggleSmooth");
660
- if (this.constants.smoothCurves == true) {graph_toggleSmooth.style.background = "#A4FF56";}
661
- else {graph_toggleSmooth.style.background = "#FF8532";}
662
- this.moving = true;
663
- this.start();
664
-
665
- }
666
-
667
-
668
- /**
669
- * this generates the ranges depending on the iniital values.
670
- *
671
- * @param id
672
- * @param map
673
- * @param constantsVariableName
674
- */
675
- function showValueOfRange (id,map,constantsVariableName) {
676
- var valueId = id + "_value";
677
- var rangeValue = document.getElementById(id).value;
678
-
679
- if (map instanceof Array) {
680
- document.getElementById(valueId).value = map[parseInt(rangeValue)];
681
- this._overWriteGraphConstants(constantsVariableName,map[parseInt(rangeValue)]);
682
- }
683
- else {
684
- document.getElementById(valueId).value = parseInt(map) * parseFloat(rangeValue);
685
- this._overWriteGraphConstants(constantsVariableName, parseInt(map) * parseFloat(rangeValue));
686
- }
687
-
688
- if (constantsVariableName == "hierarchicalLayout_direction" ||
689
- constantsVariableName == "hierarchicalLayout_levelSeparation" ||
690
- constantsVariableName == "hierarchicalLayout_nodeSpacing") {
691
- this._setupHierarchicalLayout();
692
- }
693
- this.moving = true;
694
- this.start();
695
- };
696
-
697
-