vis-rails 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,52 +0,0 @@
1
- /**
2
- * Prototype for visual components
3
- * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body]
4
- * @param {Object} [options]
5
- */
6
- function Component (body, options) {
7
- this.options = null;
8
- this.props = null;
9
- }
10
-
11
- /**
12
- * Set options for the component. The new options will be merged into the
13
- * current options.
14
- * @param {Object} options
15
- */
16
- Component.prototype.setOptions = function(options) {
17
- if (options) {
18
- util.extend(this.options, options);
19
- }
20
- };
21
-
22
- /**
23
- * Repaint the component
24
- * @return {boolean} Returns true if the component is resized
25
- */
26
- Component.prototype.redraw = function() {
27
- // should be implemented by the component
28
- return false;
29
- };
30
-
31
- /**
32
- * Destroy the component. Cleanup DOM and event listeners
33
- */
34
- Component.prototype.destroy = function() {
35
- // should be implemented by the component
36
- };
37
-
38
- /**
39
- * Test whether the component is resized since the last time _isResized() was
40
- * called.
41
- * @return {Boolean} Returns true if the component is resized
42
- * @protected
43
- */
44
- Component.prototype._isResized = function() {
45
- var resized = (this.props._previousWidth !== this.props.width ||
46
- this.props._previousHeight !== this.props.height);
47
-
48
- this.props._previousWidth = this.props.width;
49
- this.props._previousHeight = this.props.height;
50
-
51
- return resized;
52
- };
@@ -1,128 +0,0 @@
1
- /**
2
- * A current time bar
3
- * @param {{range: Range, dom: Object, domProps: Object}} body
4
- * @param {Object} [options] Available parameters:
5
- * {Boolean} [showCurrentTime]
6
- * @constructor CurrentTime
7
- * @extends Component
8
- */
9
-
10
- function CurrentTime (body, options) {
11
- this.body = body;
12
-
13
- // default options
14
- this.defaultOptions = {
15
- showCurrentTime: true
16
- };
17
- this.options = util.extend({}, this.defaultOptions);
18
-
19
- this._create();
20
-
21
- this.setOptions(options);
22
- }
23
-
24
- CurrentTime.prototype = new Component();
25
-
26
- /**
27
- * Create the HTML DOM for the current time bar
28
- * @private
29
- */
30
- CurrentTime.prototype._create = function() {
31
- var bar = document.createElement('div');
32
- bar.className = 'currenttime';
33
- bar.style.position = 'absolute';
34
- bar.style.top = '0px';
35
- bar.style.height = '100%';
36
-
37
- this.bar = bar;
38
- };
39
-
40
- /**
41
- * Destroy the CurrentTime bar
42
- */
43
- CurrentTime.prototype.destroy = function () {
44
- this.options.showCurrentTime = false;
45
- this.redraw(); // will remove the bar from the DOM and stop refreshing
46
-
47
- this.body = null;
48
- };
49
-
50
- /**
51
- * Set options for the component. Options will be merged in current options.
52
- * @param {Object} options Available parameters:
53
- * {boolean} [showCurrentTime]
54
- */
55
- CurrentTime.prototype.setOptions = function(options) {
56
- if (options) {
57
- // copy all options that we know
58
- util.selectiveExtend(['showCurrentTime'], this.options, options);
59
- }
60
- };
61
-
62
- /**
63
- * Repaint the component
64
- * @return {boolean} Returns true if the component is resized
65
- */
66
- CurrentTime.prototype.redraw = function() {
67
- if (this.options.showCurrentTime) {
68
- var parent = this.body.dom.backgroundVertical;
69
- if (this.bar.parentNode != parent) {
70
- // attach to the dom
71
- if (this.bar.parentNode) {
72
- this.bar.parentNode.removeChild(this.bar);
73
- }
74
- parent.appendChild(this.bar);
75
-
76
- this.start();
77
- }
78
-
79
- var now = new Date();
80
- var x = this.body.util.toScreen(now);
81
-
82
- this.bar.style.left = x + 'px';
83
- this.bar.title = 'Current time: ' + now;
84
- }
85
- else {
86
- // remove the line from the DOM
87
- if (this.bar.parentNode) {
88
- this.bar.parentNode.removeChild(this.bar);
89
- }
90
- this.stop();
91
- }
92
-
93
- return false;
94
- };
95
-
96
- /**
97
- * Start auto refreshing the current time bar
98
- */
99
- CurrentTime.prototype.start = function() {
100
- var me = this;
101
-
102
- function update () {
103
- me.stop();
104
-
105
- // determine interval to refresh
106
- var scale = me.body.range.conversion(me.body.domProps.center.width).scale;
107
- var interval = 1 / scale / 10;
108
- if (interval < 30) interval = 30;
109
- if (interval > 1000) interval = 1000;
110
-
111
- me.redraw();
112
-
113
- // start a timer to adjust for the new time
114
- me.currentTimeTimer = setTimeout(update, interval);
115
- }
116
-
117
- update();
118
- };
119
-
120
- /**
121
- * Stop auto refreshing the current time bar
122
- */
123
- CurrentTime.prototype.stop = function() {
124
- if (this.currentTimeTimer !== undefined) {
125
- clearTimeout(this.currentTimeTimer);
126
- delete this.currentTimeTimer;
127
- }
128
- };
@@ -1,182 +0,0 @@
1
- /**
2
- * A custom time bar
3
- * @param {{range: Range, dom: Object}} body
4
- * @param {Object} [options] Available parameters:
5
- * {Boolean} [showCustomTime]
6
- * @constructor CustomTime
7
- * @extends Component
8
- */
9
-
10
- function CustomTime (body, options) {
11
- this.body = body;
12
-
13
- // default options
14
- this.defaultOptions = {
15
- showCustomTime: false
16
- };
17
- this.options = util.extend({}, this.defaultOptions);
18
-
19
- this.customTime = new Date();
20
- this.eventParams = {}; // stores state parameters while dragging the bar
21
-
22
- // create the DOM
23
- this._create();
24
-
25
- this.setOptions(options);
26
- }
27
-
28
- CustomTime.prototype = new Component();
29
-
30
- /**
31
- * Set options for the component. Options will be merged in current options.
32
- * @param {Object} options Available parameters:
33
- * {boolean} [showCustomTime]
34
- */
35
- CustomTime.prototype.setOptions = function(options) {
36
- if (options) {
37
- // copy all options that we know
38
- util.selectiveExtend(['showCustomTime'], this.options, options);
39
- }
40
- };
41
-
42
- /**
43
- * Create the DOM for the custom time
44
- * @private
45
- */
46
- CustomTime.prototype._create = function() {
47
- var bar = document.createElement('div');
48
- bar.className = 'customtime';
49
- bar.style.position = 'absolute';
50
- bar.style.top = '0px';
51
- bar.style.height = '100%';
52
- this.bar = bar;
53
-
54
- var drag = document.createElement('div');
55
- drag.style.position = 'relative';
56
- drag.style.top = '0px';
57
- drag.style.left = '-10px';
58
- drag.style.height = '100%';
59
- drag.style.width = '20px';
60
- bar.appendChild(drag);
61
-
62
- // attach event listeners
63
- this.hammer = Hammer(bar, {
64
- prevent_default: true
65
- });
66
- this.hammer.on('dragstart', this._onDragStart.bind(this));
67
- this.hammer.on('drag', this._onDrag.bind(this));
68
- this.hammer.on('dragend', this._onDragEnd.bind(this));
69
- };
70
-
71
- /**
72
- * Destroy the CustomTime bar
73
- */
74
- CustomTime.prototype.destroy = function () {
75
- this.options.showCustomTime = false;
76
- this.redraw(); // will remove the bar from the DOM
77
-
78
- this.hammer.enable(false);
79
- this.hammer = null;
80
-
81
- this.body = null;
82
- };
83
-
84
- /**
85
- * Repaint the component
86
- * @return {boolean} Returns true if the component is resized
87
- */
88
- CustomTime.prototype.redraw = function () {
89
- if (this.options.showCustomTime) {
90
- var parent = this.body.dom.backgroundVertical;
91
- if (this.bar.parentNode != parent) {
92
- // attach to the dom
93
- if (this.bar.parentNode) {
94
- this.bar.parentNode.removeChild(this.bar);
95
- }
96
- parent.appendChild(this.bar);
97
- }
98
-
99
- var x = this.body.util.toScreen(this.customTime);
100
-
101
- this.bar.style.left = x + 'px';
102
- this.bar.title = 'Time: ' + this.customTime;
103
- }
104
- else {
105
- // remove the line from the DOM
106
- if (this.bar.parentNode) {
107
- this.bar.parentNode.removeChild(this.bar);
108
- }
109
- }
110
-
111
- return false;
112
- };
113
-
114
- /**
115
- * Set custom time.
116
- * @param {Date} time
117
- */
118
- CustomTime.prototype.setCustomTime = function(time) {
119
- this.customTime = new Date(time.valueOf());
120
- this.redraw();
121
- };
122
-
123
- /**
124
- * Retrieve the current custom time.
125
- * @return {Date} customTime
126
- */
127
- CustomTime.prototype.getCustomTime = function() {
128
- return new Date(this.customTime.valueOf());
129
- };
130
-
131
- /**
132
- * Start moving horizontally
133
- * @param {Event} event
134
- * @private
135
- */
136
- CustomTime.prototype._onDragStart = function(event) {
137
- this.eventParams.dragging = true;
138
- this.eventParams.customTime = this.customTime;
139
-
140
- event.stopPropagation();
141
- event.preventDefault();
142
- };
143
-
144
- /**
145
- * Perform moving operating.
146
- * @param {Event} event
147
- * @private
148
- */
149
- CustomTime.prototype._onDrag = function (event) {
150
- if (!this.eventParams.dragging) return;
151
-
152
- var deltaX = event.gesture.deltaX,
153
- x = this.body.util.toScreen(this.eventParams.customTime) + deltaX,
154
- time = this.body.util.toTime(x);
155
-
156
- this.setCustomTime(time);
157
-
158
- // fire a timechange event
159
- this.body.emitter.emit('timechange', {
160
- time: new Date(this.customTime.valueOf())
161
- });
162
-
163
- event.stopPropagation();
164
- event.preventDefault();
165
- };
166
-
167
- /**
168
- * Stop moving operating.
169
- * @param {event} event
170
- * @private
171
- */
172
- CustomTime.prototype._onDragEnd = function (event) {
173
- if (!this.eventParams.dragging) return;
174
-
175
- // fire a timechanged event
176
- this.body.emitter.emit('timechanged', {
177
- time: new Date(this.customTime.valueOf())
178
- });
179
-
180
- event.stopPropagation();
181
- event.preventDefault();
182
- };
@@ -1,470 +0,0 @@
1
- /**
2
- * @constructor Group
3
- * @param {Number | String} groupId
4
- * @param {Object} data
5
- * @param {ItemSet} itemSet
6
- */
7
- function Group (groupId, data, itemSet) {
8
- this.groupId = groupId;
9
-
10
- this.itemSet = itemSet;
11
-
12
- this.dom = {};
13
- this.props = {
14
- label: {
15
- width: 0,
16
- height: 0
17
- }
18
- };
19
- this.className = null;
20
-
21
- this.items = {}; // items filtered by groupId of this group
22
- this.visibleItems = []; // items currently visible in window
23
- this.orderedItems = { // items sorted by start and by end
24
- byStart: [],
25
- byEnd: []
26
- };
27
-
28
- this._create();
29
-
30
- this.setData(data);
31
- }
32
-
33
- /**
34
- * Create DOM elements for the group
35
- * @private
36
- */
37
- Group.prototype._create = function() {
38
- var label = document.createElement('div');
39
- label.className = 'vlabel';
40
- this.dom.label = label;
41
-
42
- var inner = document.createElement('div');
43
- inner.className = 'inner';
44
- label.appendChild(inner);
45
- this.dom.inner = inner;
46
-
47
- var foreground = document.createElement('div');
48
- foreground.className = 'group';
49
- foreground['timeline-group'] = this;
50
- this.dom.foreground = foreground;
51
-
52
- this.dom.background = document.createElement('div');
53
- this.dom.background.className = 'group';
54
-
55
- this.dom.axis = document.createElement('div');
56
- this.dom.axis.className = 'group';
57
-
58
- // create a hidden marker to detect when the Timelines container is attached
59
- // to the DOM, or the style of a parent of the Timeline is changed from
60
- // display:none is changed to visible.
61
- this.dom.marker = document.createElement('div');
62
- this.dom.marker.style.visibility = 'hidden';
63
- this.dom.marker.innerHTML = '?';
64
- this.dom.background.appendChild(this.dom.marker);
65
- };
66
-
67
- /**
68
- * Set the group data for this group
69
- * @param {Object} data Group data, can contain properties content and className
70
- */
71
- Group.prototype.setData = function(data) {
72
- // update contents
73
- var content = data && data.content;
74
- if (content instanceof Element) {
75
- this.dom.inner.appendChild(content);
76
- }
77
- else if (content != undefined) {
78
- this.dom.inner.innerHTML = content;
79
- }
80
- else {
81
- this.dom.inner.innerHTML = this.groupId;
82
- }
83
-
84
- if (!this.dom.inner.firstChild) {
85
- util.addClassName(this.dom.inner, 'hidden');
86
- }
87
- else {
88
- util.removeClassName(this.dom.inner, 'hidden');
89
- }
90
-
91
- // update className
92
- var className = data && data.className || null;
93
- if (className != this.className) {
94
- if (this.className) {
95
- util.removeClassName(this.dom.label, className);
96
- util.removeClassName(this.dom.foreground, className);
97
- util.removeClassName(this.dom.background, className);
98
- util.removeClassName(this.dom.axis, className);
99
- }
100
- util.addClassName(this.dom.label, className);
101
- util.addClassName(this.dom.foreground, className);
102
- util.addClassName(this.dom.background, className);
103
- util.addClassName(this.dom.axis, className);
104
- }
105
- };
106
-
107
- /**
108
- * Get the width of the group label
109
- * @return {number} width
110
- */
111
- Group.prototype.getLabelWidth = function() {
112
- return this.props.label.width;
113
- };
114
-
115
-
116
- /**
117
- * Repaint this group
118
- * @param {{start: number, end: number}} range
119
- * @param {{item: number, axis: number}} margin
120
- * @param {boolean} [restack=false] Force restacking of all items
121
- * @return {boolean} Returns true if the group is resized
122
- */
123
- Group.prototype.redraw = function(range, margin, restack) {
124
- var resized = false;
125
-
126
- this.visibleItems = this._updateVisibleItems(this.orderedItems, this.visibleItems, range);
127
-
128
- // force recalculation of the height of the items when the marker height changed
129
- // (due to the Timeline being attached to the DOM or changed from display:none to visible)
130
- var markerHeight = this.dom.marker.clientHeight;
131
- if (markerHeight != this.lastMarkerHeight) {
132
- this.lastMarkerHeight = markerHeight;
133
-
134
- util.forEach(this.items, function (item) {
135
- item.dirty = true;
136
- if (item.displayed) item.redraw();
137
- });
138
-
139
- restack = true;
140
- }
141
-
142
- // reposition visible items vertically
143
- if (this.itemSet.options.stack) { // TODO: ugly way to access options...
144
- stack.stack(this.visibleItems, margin, restack);
145
- }
146
- else { // no stacking
147
- stack.nostack(this.visibleItems, margin);
148
- }
149
-
150
- // recalculate the height of the group
151
- var height;
152
- var visibleItems = this.visibleItems;
153
- if (visibleItems.length) {
154
- var min = visibleItems[0].top;
155
- var max = visibleItems[0].top + visibleItems[0].height;
156
- util.forEach(visibleItems, function (item) {
157
- min = Math.min(min, item.top);
158
- max = Math.max(max, (item.top + item.height));
159
- });
160
- height = (max - min) + margin.axis + margin.item;
161
- }
162
- else {
163
- height = margin.axis + margin.item;
164
- }
165
- height = Math.max(height, this.props.label.height);
166
-
167
- // calculate actual size and position
168
- var foreground = this.dom.foreground;
169
- this.top = foreground.offsetTop;
170
- this.left = foreground.offsetLeft;
171
- this.width = foreground.offsetWidth;
172
- resized = util.updateProperty(this, 'height', height) || resized;
173
-
174
- // recalculate size of label
175
- resized = util.updateProperty(this.props.label, 'width', this.dom.inner.clientWidth) || resized;
176
- resized = util.updateProperty(this.props.label, 'height', this.dom.inner.clientHeight) || resized;
177
-
178
- // apply new height
179
- foreground.style.height = height + 'px';
180
- this.dom.label.style.height = height + 'px';
181
-
182
- // update vertical position of items after they are re-stacked and the height of the group is calculated
183
- for (var i = 0, ii = this.visibleItems.length; i < ii; i++) {
184
- var item = this.visibleItems[i];
185
- item.repositionY();
186
- }
187
-
188
- return resized;
189
- };
190
-
191
- /**
192
- * Show this group: attach to the DOM
193
- */
194
- Group.prototype.show = function() {
195
- if (!this.dom.label.parentNode) {
196
- this.itemSet.dom.labelSet.appendChild(this.dom.label);
197
- }
198
-
199
- if (!this.dom.foreground.parentNode) {
200
- this.itemSet.dom.foreground.appendChild(this.dom.foreground);
201
- }
202
-
203
- if (!this.dom.background.parentNode) {
204
- this.itemSet.dom.background.appendChild(this.dom.background);
205
- }
206
-
207
- if (!this.dom.axis.parentNode) {
208
- this.itemSet.dom.axis.appendChild(this.dom.axis);
209
- }
210
- };
211
-
212
- /**
213
- * Hide this group: remove from the DOM
214
- */
215
- Group.prototype.hide = function() {
216
- var label = this.dom.label;
217
- if (label.parentNode) {
218
- label.parentNode.removeChild(label);
219
- }
220
-
221
- var foreground = this.dom.foreground;
222
- if (foreground.parentNode) {
223
- foreground.parentNode.removeChild(foreground);
224
- }
225
-
226
- var background = this.dom.background;
227
- if (background.parentNode) {
228
- background.parentNode.removeChild(background);
229
- }
230
-
231
- var axis = this.dom.axis;
232
- if (axis.parentNode) {
233
- axis.parentNode.removeChild(axis);
234
- }
235
- };
236
-
237
- /**
238
- * Add an item to the group
239
- * @param {Item} item
240
- */
241
- Group.prototype.add = function(item) {
242
- this.items[item.id] = item;
243
- item.setParent(this);
244
-
245
- if (item instanceof ItemRange && this.visibleItems.indexOf(item) == -1) {
246
- var range = this.itemSet.body.range; // TODO: not nice accessing the range like this
247
- this._checkIfVisible(item, this.visibleItems, range);
248
- }
249
- };
250
-
251
- /**
252
- * Remove an item from the group
253
- * @param {Item} item
254
- */
255
- Group.prototype.remove = function(item) {
256
- delete this.items[item.id];
257
- item.setParent(this.itemSet);
258
-
259
- // remove from visible items
260
- var index = this.visibleItems.indexOf(item);
261
- if (index != -1) this.visibleItems.splice(index, 1);
262
-
263
- // TODO: also remove from ordered items?
264
- };
265
-
266
- /**
267
- * Remove an item from the corresponding DataSet
268
- * @param {Item} item
269
- */
270
- Group.prototype.removeFromDataSet = function(item) {
271
- this.itemSet.removeItem(item.id);
272
- };
273
-
274
- /**
275
- * Reorder the items
276
- */
277
- Group.prototype.order = function() {
278
- var array = util.toArray(this.items);
279
- this.orderedItems.byStart = array;
280
- this.orderedItems.byEnd = this._constructByEndArray(array);
281
-
282
- stack.orderByStart(this.orderedItems.byStart);
283
- stack.orderByEnd(this.orderedItems.byEnd);
284
- };
285
-
286
- /**
287
- * Create an array containing all items being a range (having an end date)
288
- * @param {Item[]} array
289
- * @returns {ItemRange[]}
290
- * @private
291
- */
292
- Group.prototype._constructByEndArray = function(array) {
293
- var endArray = [];
294
-
295
- for (var i = 0; i < array.length; i++) {
296
- if (array[i] instanceof ItemRange) {
297
- endArray.push(array[i]);
298
- }
299
- }
300
- return endArray;
301
- };
302
-
303
- /**
304
- * Update the visible items
305
- * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date
306
- * @param {Item[]} visibleItems The previously visible items.
307
- * @param {{start: number, end: number}} range Visible range
308
- * @return {Item[]} visibleItems The new visible items.
309
- * @private
310
- */
311
- Group.prototype._updateVisibleItems = function(orderedItems, visibleItems, range) {
312
- var initialPosByStart,
313
- newVisibleItems = [],
314
- i;
315
-
316
- // first check if the items that were in view previously are still in view.
317
- // this handles the case for the ItemRange that is both before and after the current one.
318
- if (visibleItems.length > 0) {
319
- for (i = 0; i < visibleItems.length; i++) {
320
- this._checkIfVisible(visibleItems[i], newVisibleItems, range);
321
- }
322
- }
323
-
324
- // If there were no visible items previously, use binarySearch to find a visible ItemPoint or ItemRange (based on startTime)
325
- if (newVisibleItems.length == 0) {
326
- initialPosByStart = this._binarySearch(orderedItems, range, false);
327
- }
328
- else {
329
- initialPosByStart = orderedItems.byStart.indexOf(newVisibleItems[0]);
330
- }
331
-
332
- // use visible search to find a visible ItemRange (only based on endTime)
333
- var initialPosByEnd = this._binarySearch(orderedItems, range, true);
334
-
335
- // if we found a initial ID to use, trace it up and down until we meet an invisible item.
336
- if (initialPosByStart != -1) {
337
- for (i = initialPosByStart; i >= 0; i--) {
338
- if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;}
339
- }
340
- for (i = initialPosByStart + 1; i < orderedItems.byStart.length; i++) {
341
- if (this._checkIfInvisible(orderedItems.byStart[i], newVisibleItems, range)) {break;}
342
- }
343
- }
344
-
345
- // if we found a initial ID to use, trace it up and down until we meet an invisible item.
346
- if (initialPosByEnd != -1) {
347
- for (i = initialPosByEnd; i >= 0; i--) {
348
- if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;}
349
- }
350
- for (i = initialPosByEnd + 1; i < orderedItems.byEnd.length; i++) {
351
- if (this._checkIfInvisible(orderedItems.byEnd[i], newVisibleItems, range)) {break;}
352
- }
353
- }
354
-
355
- return newVisibleItems;
356
- };
357
-
358
- /**
359
- * This function does a binary search for a visible item. The user can select either the this.orderedItems.byStart or .byEnd
360
- * arrays. This is done by giving a boolean value true if you want to use the byEnd.
361
- * This is done to be able to select the correct if statement (we do not want to check if an item is visible, we want to check
362
- * if the time we selected (start or end) is within the current range).
363
- *
364
- * The trick is that every interval has to either enter the screen at the initial load or by dragging. The case of the ItemRange that is
365
- * before and after the current range is handled by simply checking if it was in view before and if it is again. For all the rest,
366
- * either the start OR end time has to be in the range.
367
- *
368
- * @param {{byStart: Item[], byEnd: Item[]}} orderedItems
369
- * @param {{start: number, end: number}} range
370
- * @param {Boolean} byEnd
371
- * @returns {number}
372
- * @private
373
- */
374
- Group.prototype._binarySearch = function(orderedItems, range, byEnd) {
375
- var array = [];
376
- var byTime = byEnd ? 'end' : 'start';
377
- if (byEnd == true) {array = orderedItems.byEnd; }
378
- else {array = orderedItems.byStart;}
379
-
380
- var interval = range.end - range.start;
381
-
382
- var found = false;
383
- var low = 0;
384
- var high = array.length;
385
- var guess = Math.floor(0.5*(high+low));
386
- var newGuess;
387
-
388
- if (high == 0) {guess = -1;}
389
- else if (high == 1) {
390
- if ((array[guess].data[byTime] > range.start - interval) && (array[guess].data[byTime] < range.end)) {
391
- guess = 0;
392
- }
393
- else {
394
- guess = -1;
395
- }
396
- }
397
- else {
398
- high -= 1;
399
- while (found == false) {
400
- if ((array[guess].data[byTime] > range.start - interval) && (array[guess].data[byTime] < range.end)) {
401
- found = true;
402
- }
403
- else {
404
- if (array[guess].data[byTime] < range.start - interval) { // it is too small --> increase low
405
- low = Math.floor(0.5*(high+low));
406
- }
407
- else { // it is too big --> decrease high
408
- high = Math.floor(0.5*(high+low));
409
- }
410
- newGuess = Math.floor(0.5*(high+low));
411
- // not in list;
412
- if (guess == newGuess) {
413
- guess = -1;
414
- found = true;
415
- }
416
- else {
417
- guess = newGuess;
418
- }
419
- }
420
- }
421
- }
422
- return guess;
423
- };
424
-
425
- /**
426
- * this function checks if an item is invisible. If it is NOT we make it visible
427
- * and add it to the global visible items. If it is, return true.
428
- *
429
- * @param {Item} item
430
- * @param {Item[]} visibleItems
431
- * @param {{start:number, end:number}} range
432
- * @returns {boolean}
433
- * @private
434
- */
435
- Group.prototype._checkIfInvisible = function(item, visibleItems, range) {
436
- if (item.isVisible(range)) {
437
- if (!item.displayed) item.show();
438
- item.repositionX();
439
- if (visibleItems.indexOf(item) == -1) {
440
- visibleItems.push(item);
441
- }
442
- return false;
443
- }
444
- else {
445
- return true;
446
- }
447
- };
448
-
449
- /**
450
- * this function is very similar to the _checkIfInvisible() but it does not
451
- * return booleans, hides the item if it should not be seen and always adds to
452
- * the visibleItems.
453
- * this one is for brute forcing and hiding.
454
- *
455
- * @param {Item} item
456
- * @param {Array} visibleItems
457
- * @param {{start:number, end:number}} range
458
- * @private
459
- */
460
- Group.prototype._checkIfVisible = function(item, visibleItems, range) {
461
- if (item.isVisible(range)) {
462
- if (!item.displayed) item.show();
463
- // reposition item horizontally
464
- item.repositionX();
465
- visibleItems.push(item);
466
- }
467
- else {
468
- if (item.displayed) item.hide();
469
- }
470
- };