vis-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.gitmodules +3 -0
  4. data/.project +11 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +202 -0
  7. data/README.md +29 -0
  8. data/Rakefile +1 -0
  9. data/lib/vis/rails/engine.rb +6 -0
  10. data/lib/vis/rails/version.rb +5 -0
  11. data/lib/vis/rails.rb +7 -0
  12. data/vendor/assets/javascripts/vis.js +1 -0
  13. data/vendor/assets/stylesheets/vis.css +3 -0
  14. data/vendor/assets/vis/DataSet.js +936 -0
  15. data/vendor/assets/vis/DataView.js +281 -0
  16. data/vendor/assets/vis/EventBus.js +89 -0
  17. data/vendor/assets/vis/events.js +116 -0
  18. data/vendor/assets/vis/graph/ClusterMixin.js +1019 -0
  19. data/vendor/assets/vis/graph/Edge.js +620 -0
  20. data/vendor/assets/vis/graph/Graph.js +2111 -0
  21. data/vendor/assets/vis/graph/Groups.js +80 -0
  22. data/vendor/assets/vis/graph/Images.js +41 -0
  23. data/vendor/assets/vis/graph/NavigationMixin.js +245 -0
  24. data/vendor/assets/vis/graph/Node.js +978 -0
  25. data/vendor/assets/vis/graph/Popup.js +105 -0
  26. data/vendor/assets/vis/graph/SectorsMixin.js +547 -0
  27. data/vendor/assets/vis/graph/SelectionMixin.js +515 -0
  28. data/vendor/assets/vis/graph/dotparser.js +829 -0
  29. data/vendor/assets/vis/graph/img/downarrow.png +0 -0
  30. data/vendor/assets/vis/graph/img/leftarrow.png +0 -0
  31. data/vendor/assets/vis/graph/img/minus.png +0 -0
  32. data/vendor/assets/vis/graph/img/plus.png +0 -0
  33. data/vendor/assets/vis/graph/img/rightarrow.png +0 -0
  34. data/vendor/assets/vis/graph/img/uparrow.png +0 -0
  35. data/vendor/assets/vis/graph/img/zoomExtends.png +0 -0
  36. data/vendor/assets/vis/graph/shapes.js +225 -0
  37. data/vendor/assets/vis/module/exports.js +68 -0
  38. data/vendor/assets/vis/module/header.js +24 -0
  39. data/vendor/assets/vis/module/imports.js +32 -0
  40. data/vendor/assets/vis/shim.js +252 -0
  41. data/vendor/assets/vis/timeline/Controller.js +172 -0
  42. data/vendor/assets/vis/timeline/Range.js +553 -0
  43. data/vendor/assets/vis/timeline/Stack.js +192 -0
  44. data/vendor/assets/vis/timeline/TimeStep.js +449 -0
  45. data/vendor/assets/vis/timeline/Timeline.js +476 -0
  46. data/vendor/assets/vis/timeline/component/Component.js +148 -0
  47. data/vendor/assets/vis/timeline/component/ContentPanel.js +113 -0
  48. data/vendor/assets/vis/timeline/component/CurrentTime.js +101 -0
  49. data/vendor/assets/vis/timeline/component/CustomTime.js +255 -0
  50. data/vendor/assets/vis/timeline/component/Group.js +129 -0
  51. data/vendor/assets/vis/timeline/component/GroupSet.js +546 -0
  52. data/vendor/assets/vis/timeline/component/ItemSet.js +612 -0
  53. data/vendor/assets/vis/timeline/component/Panel.js +112 -0
  54. data/vendor/assets/vis/timeline/component/RootPanel.js +215 -0
  55. data/vendor/assets/vis/timeline/component/TimeAxis.js +522 -0
  56. data/vendor/assets/vis/timeline/component/css/currenttime.css +5 -0
  57. data/vendor/assets/vis/timeline/component/css/customtime.css +6 -0
  58. data/vendor/assets/vis/timeline/component/css/groupset.css +59 -0
  59. data/vendor/assets/vis/timeline/component/css/item.css +93 -0
  60. data/vendor/assets/vis/timeline/component/css/itemset.css +17 -0
  61. data/vendor/assets/vis/timeline/component/css/panel.css +14 -0
  62. data/vendor/assets/vis/timeline/component/css/timeaxis.css +41 -0
  63. data/vendor/assets/vis/timeline/component/css/timeline.css +2 -0
  64. data/vendor/assets/vis/timeline/component/item/Item.js +81 -0
  65. data/vendor/assets/vis/timeline/component/item/ItemBox.js +302 -0
  66. data/vendor/assets/vis/timeline/component/item/ItemPoint.js +237 -0
  67. data/vendor/assets/vis/timeline/component/item/ItemRange.js +251 -0
  68. data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +91 -0
  69. data/vendor/assets/vis/util.js +673 -0
  70. data/vis-rails.gemspec +47 -0
  71. metadata +142 -0
@@ -0,0 +1,14 @@
1
+
2
+ .vis.timeline.rootpanel {
3
+ position: relative;
4
+ overflow: hidden;
5
+
6
+ border: 1px solid #bfbfbf;
7
+ -moz-box-sizing: border-box;
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .vis.timeline .panel {
12
+ position: absolute;
13
+ overflow: hidden;
14
+ }
@@ -0,0 +1,41 @@
1
+ .vis.timeline .axis {
2
+ position: relative;
3
+ }
4
+
5
+ .vis.timeline .axis .text {
6
+ position: absolute;
7
+ color: #4d4d4d;
8
+ padding: 3px;
9
+ white-space: nowrap;
10
+ }
11
+
12
+ .vis.timeline .axis .text.measure {
13
+ position: absolute;
14
+ padding-left: 0;
15
+ padding-right: 0;
16
+ margin-left: 0;
17
+ margin-right: 0;
18
+ visibility: hidden;
19
+ }
20
+
21
+ .vis.timeline .axis .grid.vertical {
22
+ position: absolute;
23
+ width: 0;
24
+ border-right: 1px solid;
25
+ }
26
+
27
+ .vis.timeline .axis .grid.horizontal {
28
+ position: absolute;
29
+ left: 0;
30
+ width: 100%;
31
+ height: 0;
32
+ border-bottom: 1px solid;
33
+ }
34
+
35
+ .vis.timeline .axis .grid.minor {
36
+ border-color: #e5e5e5;
37
+ }
38
+
39
+ .vis.timeline .axis .grid.major {
40
+ border-color: #bfbfbf;
41
+ }
@@ -0,0 +1,2 @@
1
+ .vis.timeline {
2
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @constructor Item
3
+ * @param {ItemSet} parent
4
+ * @param {Object} data Object containing (optional) parameters type,
5
+ * start, end, content, group, className.
6
+ * @param {Object} [options] Options to set initial property values
7
+ * @param {Object} [defaultOptions] default options
8
+ * // TODO: describe available options
9
+ */
10
+ function Item (parent, data, options, defaultOptions) {
11
+ this.parent = parent;
12
+ this.data = data;
13
+ this.dom = null;
14
+ this.options = options || {};
15
+ this.defaultOptions = defaultOptions || {};
16
+
17
+ this.selected = false;
18
+ this.visible = false;
19
+ this.top = 0;
20
+ this.left = 0;
21
+ this.width = 0;
22
+ this.height = 0;
23
+ }
24
+
25
+ /**
26
+ * Select current item
27
+ */
28
+ Item.prototype.select = function select() {
29
+ this.selected = true;
30
+ if (this.visible) this.repaint();
31
+ };
32
+
33
+ /**
34
+ * Unselect current item
35
+ */
36
+ Item.prototype.unselect = function unselect() {
37
+ this.selected = false;
38
+ if (this.visible) this.repaint();
39
+ };
40
+
41
+ /**
42
+ * Show the Item in the DOM (when not already visible)
43
+ * @return {Boolean} changed
44
+ */
45
+ Item.prototype.show = function show() {
46
+ return false;
47
+ };
48
+
49
+ /**
50
+ * Hide the Item from the DOM (when visible)
51
+ * @return {Boolean} changed
52
+ */
53
+ Item.prototype.hide = function hide() {
54
+ return false;
55
+ };
56
+
57
+ /**
58
+ * Repaint the item
59
+ * @return {Boolean} changed
60
+ */
61
+ Item.prototype.repaint = function repaint() {
62
+ // should be implemented by the item
63
+ return false;
64
+ };
65
+
66
+ /**
67
+ * Reflow the item
68
+ * @return {Boolean} resized
69
+ */
70
+ Item.prototype.reflow = function reflow() {
71
+ // should be implemented by the item
72
+ return false;
73
+ };
74
+
75
+ /**
76
+ * Return the items width
77
+ * @return {Integer} width
78
+ */
79
+ Item.prototype.getWidth = function getWidth() {
80
+ return this.width;
81
+ }
@@ -0,0 +1,302 @@
1
+ /**
2
+ * @constructor ItemBox
3
+ * @extends Item
4
+ * @param {ItemSet} parent
5
+ * @param {Object} data Object containing parameters start
6
+ * content, className.
7
+ * @param {Object} [options] Options to set initial property values
8
+ * @param {Object} [defaultOptions] default options
9
+ * // TODO: describe available options
10
+ */
11
+ function ItemBox (parent, data, options, defaultOptions) {
12
+ this.props = {
13
+ dot: {
14
+ left: 0,
15
+ top: 0,
16
+ width: 0,
17
+ height: 0
18
+ },
19
+ line: {
20
+ top: 0,
21
+ left: 0,
22
+ width: 0,
23
+ height: 0
24
+ }
25
+ };
26
+
27
+ Item.call(this, parent, data, options, defaultOptions);
28
+ }
29
+
30
+ ItemBox.prototype = new Item (null, null);
31
+
32
+ /**
33
+ * Repaint the item
34
+ * @return {Boolean} changed
35
+ */
36
+ ItemBox.prototype.repaint = function repaint() {
37
+ // TODO: make an efficient repaint
38
+ var changed = false;
39
+ var dom = this.dom;
40
+
41
+ if (!dom) {
42
+ this._create();
43
+ dom = this.dom;
44
+ changed = true;
45
+ }
46
+
47
+ if (dom) {
48
+ if (!this.parent) {
49
+ throw new Error('Cannot repaint item: no parent attached');
50
+ }
51
+
52
+ if (!dom.box.parentNode) {
53
+ var foreground = this.parent.getForeground();
54
+ if (!foreground) {
55
+ throw new Error('Cannot repaint time axis: ' +
56
+ 'parent has no foreground container element');
57
+ }
58
+ foreground.appendChild(dom.box);
59
+ changed = true;
60
+ }
61
+
62
+ if (!dom.line.parentNode) {
63
+ var background = this.parent.getBackground();
64
+ if (!background) {
65
+ throw new Error('Cannot repaint time axis: ' +
66
+ 'parent has no background container element');
67
+ }
68
+ background.appendChild(dom.line);
69
+ changed = true;
70
+ }
71
+
72
+ if (!dom.dot.parentNode) {
73
+ var axis = this.parent.getAxis();
74
+ if (!background) {
75
+ throw new Error('Cannot repaint time axis: ' +
76
+ 'parent has no axis container element');
77
+ }
78
+ axis.appendChild(dom.dot);
79
+ changed = true;
80
+ }
81
+
82
+ // update contents
83
+ if (this.data.content != this.content) {
84
+ this.content = this.data.content;
85
+ if (this.content instanceof Element) {
86
+ dom.content.innerHTML = '';
87
+ dom.content.appendChild(this.content);
88
+ }
89
+ else if (this.data.content != undefined) {
90
+ dom.content.innerHTML = this.content;
91
+ }
92
+ else {
93
+ throw new Error('Property "content" missing in item ' + this.data.id);
94
+ }
95
+ changed = true;
96
+ }
97
+
98
+ // update class
99
+ var className = (this.data.className? ' ' + this.data.className : '') +
100
+ (this.selected ? ' selected' : '');
101
+ if (this.className != className) {
102
+ this.className = className;
103
+ dom.box.className = 'item box' + className;
104
+ dom.line.className = 'item line' + className;
105
+ dom.dot.className = 'item dot' + className;
106
+ changed = true;
107
+ }
108
+ }
109
+
110
+ return changed;
111
+ };
112
+
113
+ /**
114
+ * Show the item in the DOM (when not already visible). The items DOM will
115
+ * be created when needed.
116
+ * @return {Boolean} changed
117
+ */
118
+ ItemBox.prototype.show = function show() {
119
+ if (!this.dom || !this.dom.box.parentNode) {
120
+ return this.repaint();
121
+ }
122
+ else {
123
+ return false;
124
+ }
125
+ };
126
+
127
+ /**
128
+ * Hide the item from the DOM (when visible)
129
+ * @return {Boolean} changed
130
+ */
131
+ ItemBox.prototype.hide = function hide() {
132
+ var changed = false,
133
+ dom = this.dom;
134
+ if (dom) {
135
+ if (dom.box.parentNode) {
136
+ dom.box.parentNode.removeChild(dom.box);
137
+ changed = true;
138
+ }
139
+ if (dom.line.parentNode) {
140
+ dom.line.parentNode.removeChild(dom.line);
141
+ }
142
+ if (dom.dot.parentNode) {
143
+ dom.dot.parentNode.removeChild(dom.dot);
144
+ }
145
+ }
146
+ return changed;
147
+ };
148
+
149
+ /**
150
+ * Reflow the item: calculate its actual size and position from the DOM
151
+ * @return {boolean} resized returns true if the axis is resized
152
+ * @override
153
+ */
154
+ ItemBox.prototype.reflow = function reflow() {
155
+ var changed = 0,
156
+ update,
157
+ dom,
158
+ props,
159
+ options,
160
+ margin,
161
+ start,
162
+ align,
163
+ orientation,
164
+ top,
165
+ left,
166
+ data,
167
+ range;
168
+
169
+ if (this.data.start == undefined) {
170
+ throw new Error('Property "start" missing in item ' + this.data.id);
171
+ }
172
+
173
+ data = this.data;
174
+ range = this.parent && this.parent.range;
175
+ if (data && range) {
176
+ // TODO: account for the width of the item
177
+ var interval = (range.end - range.start);
178
+ this.visible = (data.start > range.start - interval) && (data.start < range.end + interval);
179
+ }
180
+ else {
181
+ this.visible = false;
182
+ }
183
+
184
+ if (this.visible) {
185
+ dom = this.dom;
186
+ if (dom) {
187
+ update = util.updateProperty;
188
+ props = this.props;
189
+ options = this.options;
190
+ start = this.parent.toScreen(this.data.start);
191
+ align = options.align || this.defaultOptions.align;
192
+ margin = options.margin && options.margin.axis || this.defaultOptions.margin.axis;
193
+ orientation = options.orientation || this.defaultOptions.orientation;
194
+
195
+ changed += update(props.dot, 'height', dom.dot.offsetHeight);
196
+ changed += update(props.dot, 'width', dom.dot.offsetWidth);
197
+ changed += update(props.line, 'width', dom.line.offsetWidth);
198
+ changed += update(props.line, 'height', dom.line.offsetHeight);
199
+ changed += update(props.line, 'top', dom.line.offsetTop);
200
+ changed += update(this, 'width', dom.box.offsetWidth);
201
+ changed += update(this, 'height', dom.box.offsetHeight);
202
+ if (align == 'right') {
203
+ left = start - this.width;
204
+ }
205
+ else if (align == 'left') {
206
+ left = start;
207
+ }
208
+ else {
209
+ // default or 'center'
210
+ left = start - this.width / 2;
211
+ }
212
+ changed += update(this, 'left', left);
213
+
214
+ changed += update(props.line, 'left', start - props.line.width / 2);
215
+ changed += update(props.dot, 'left', start - props.dot.width / 2);
216
+ changed += update(props.dot, 'top', -props.dot.height / 2);
217
+ if (orientation == 'top') {
218
+ top = margin;
219
+
220
+ changed += update(this, 'top', top);
221
+ }
222
+ else {
223
+ // default or 'bottom'
224
+ var parentHeight = this.parent.height;
225
+ top = parentHeight - this.height - margin;
226
+
227
+ changed += update(this, 'top', top);
228
+ }
229
+ }
230
+ else {
231
+ changed += 1;
232
+ }
233
+ }
234
+
235
+ return (changed > 0);
236
+ };
237
+
238
+ /**
239
+ * Create an items DOM
240
+ * @private
241
+ */
242
+ ItemBox.prototype._create = function _create() {
243
+ var dom = this.dom;
244
+ if (!dom) {
245
+ this.dom = dom = {};
246
+
247
+ // create the box
248
+ dom.box = document.createElement('DIV');
249
+ // className is updated in repaint()
250
+
251
+ // contents box (inside the background box). used for making margins
252
+ dom.content = document.createElement('DIV');
253
+ dom.content.className = 'content';
254
+ dom.box.appendChild(dom.content);
255
+
256
+ // line to axis
257
+ dom.line = document.createElement('DIV');
258
+ dom.line.className = 'line';
259
+
260
+ // dot on axis
261
+ dom.dot = document.createElement('DIV');
262
+ dom.dot.className = 'dot';
263
+
264
+ // attach this item as attribute
265
+ dom.box['timeline-item'] = this;
266
+ }
267
+ };
268
+
269
+ /**
270
+ * Reposition the item, recalculate its left, top, and width, using the current
271
+ * range and size of the items itemset
272
+ * @override
273
+ */
274
+ ItemBox.prototype.reposition = function reposition() {
275
+ var dom = this.dom,
276
+ props = this.props,
277
+ orientation = this.options.orientation || this.defaultOptions.orientation;
278
+
279
+ if (dom) {
280
+ var box = dom.box,
281
+ line = dom.line,
282
+ dot = dom.dot;
283
+
284
+ box.style.left = this.left + 'px';
285
+ box.style.top = this.top + 'px';
286
+
287
+ line.style.left = props.line.left + 'px';
288
+ if (orientation == 'top') {
289
+ line.style.top = 0 + 'px';
290
+ line.style.height = this.top + 'px';
291
+ }
292
+ else {
293
+ // orientation 'bottom'
294
+ line.style.top = (this.top + this.height) + 'px';
295
+ line.style.height = Math.max(this.parent.height - this.top - this.height +
296
+ this.props.dot.height / 2, 0) + 'px';
297
+ }
298
+
299
+ dot.style.left = props.dot.left + 'px';
300
+ dot.style.top = props.dot.top + 'px';
301
+ }
302
+ };
@@ -0,0 +1,237 @@
1
+ /**
2
+ * @constructor ItemPoint
3
+ * @extends Item
4
+ * @param {ItemSet} parent
5
+ * @param {Object} data Object containing parameters start
6
+ * content, className.
7
+ * @param {Object} [options] Options to set initial property values
8
+ * @param {Object} [defaultOptions] default options
9
+ * // TODO: describe available options
10
+ */
11
+ function ItemPoint (parent, data, options, defaultOptions) {
12
+ this.props = {
13
+ dot: {
14
+ top: 0,
15
+ width: 0,
16
+ height: 0
17
+ },
18
+ content: {
19
+ height: 0,
20
+ marginLeft: 0
21
+ }
22
+ };
23
+
24
+ Item.call(this, parent, data, options, defaultOptions);
25
+ }
26
+
27
+ ItemPoint.prototype = new Item (null, null);
28
+
29
+ /**
30
+ * Repaint the item
31
+ * @return {Boolean} changed
32
+ */
33
+ ItemPoint.prototype.repaint = function repaint() {
34
+ // TODO: make an efficient repaint
35
+ var changed = false;
36
+ var dom = this.dom;
37
+
38
+ if (!dom) {
39
+ this._create();
40
+ dom = this.dom;
41
+ changed = true;
42
+ }
43
+
44
+ if (dom) {
45
+ if (!this.parent) {
46
+ throw new Error('Cannot repaint item: no parent attached');
47
+ }
48
+ var foreground = this.parent.getForeground();
49
+ if (!foreground) {
50
+ throw new Error('Cannot repaint time axis: ' +
51
+ 'parent has no foreground container element');
52
+ }
53
+
54
+ if (!dom.point.parentNode) {
55
+ foreground.appendChild(dom.point);
56
+ foreground.appendChild(dom.point);
57
+ changed = true;
58
+ }
59
+
60
+ // update contents
61
+ if (this.data.content != this.content) {
62
+ this.content = this.data.content;
63
+ if (this.content instanceof Element) {
64
+ dom.content.innerHTML = '';
65
+ dom.content.appendChild(this.content);
66
+ }
67
+ else if (this.data.content != undefined) {
68
+ dom.content.innerHTML = this.content;
69
+ }
70
+ else {
71
+ throw new Error('Property "content" missing in item ' + this.data.id);
72
+ }
73
+ changed = true;
74
+ }
75
+
76
+ // update class
77
+ var className = (this.data.className? ' ' + this.data.className : '') +
78
+ (this.selected ? ' selected' : '');
79
+ if (this.className != className) {
80
+ this.className = className;
81
+ dom.point.className = 'item point' + className;
82
+ changed = true;
83
+ }
84
+ }
85
+
86
+ return changed;
87
+ };
88
+
89
+ /**
90
+ * Show the item in the DOM (when not already visible). The items DOM will
91
+ * be created when needed.
92
+ * @return {Boolean} changed
93
+ */
94
+ ItemPoint.prototype.show = function show() {
95
+ if (!this.dom || !this.dom.point.parentNode) {
96
+ return this.repaint();
97
+ }
98
+ else {
99
+ return false;
100
+ }
101
+ };
102
+
103
+ /**
104
+ * Hide the item from the DOM (when visible)
105
+ * @return {Boolean} changed
106
+ */
107
+ ItemPoint.prototype.hide = function hide() {
108
+ var changed = false,
109
+ dom = this.dom;
110
+ if (dom) {
111
+ if (dom.point.parentNode) {
112
+ dom.point.parentNode.removeChild(dom.point);
113
+ changed = true;
114
+ }
115
+ }
116
+ return changed;
117
+ };
118
+
119
+ /**
120
+ * Reflow the item: calculate its actual size from the DOM
121
+ * @return {boolean} resized returns true if the axis is resized
122
+ * @override
123
+ */
124
+ ItemPoint.prototype.reflow = function reflow() {
125
+ var changed = 0,
126
+ update,
127
+ dom,
128
+ props,
129
+ options,
130
+ margin,
131
+ orientation,
132
+ start,
133
+ top,
134
+ data,
135
+ range;
136
+
137
+ if (this.data.start == undefined) {
138
+ throw new Error('Property "start" missing in item ' + this.data.id);
139
+ }
140
+
141
+ data = this.data;
142
+ range = this.parent && this.parent.range;
143
+ if (data && range) {
144
+ // TODO: account for the width of the item
145
+ var interval = (range.end - range.start);
146
+ this.visible = (data.start > range.start - interval) && (data.start < range.end);
147
+ }
148
+ else {
149
+ this.visible = false;
150
+ }
151
+
152
+ if (this.visible) {
153
+ dom = this.dom;
154
+ if (dom) {
155
+ update = util.updateProperty;
156
+ props = this.props;
157
+ options = this.options;
158
+ orientation = options.orientation || this.defaultOptions.orientation;
159
+ margin = options.margin && options.margin.axis || this.defaultOptions.margin.axis;
160
+ start = this.parent.toScreen(this.data.start);
161
+
162
+ changed += update(this, 'width', dom.point.offsetWidth);
163
+ changed += update(this, 'height', dom.point.offsetHeight);
164
+ changed += update(props.dot, 'width', dom.dot.offsetWidth);
165
+ changed += update(props.dot, 'height', dom.dot.offsetHeight);
166
+ changed += update(props.content, 'height', dom.content.offsetHeight);
167
+
168
+ if (orientation == 'top') {
169
+ top = margin;
170
+ }
171
+ else {
172
+ // default or 'bottom'
173
+ var parentHeight = this.parent.height;
174
+ top = Math.max(parentHeight - this.height - margin, 0);
175
+ }
176
+ changed += update(this, 'top', top);
177
+ changed += update(this, 'left', start - props.dot.width / 2);
178
+ changed += update(props.content, 'marginLeft', 1.5 * props.dot.width);
179
+ //changed += update(props.content, 'marginRight', 0.5 * props.dot.width); // TODO
180
+
181
+ changed += update(props.dot, 'top', (this.height - props.dot.height) / 2);
182
+ }
183
+ else {
184
+ changed += 1;
185
+ }
186
+ }
187
+
188
+ return (changed > 0);
189
+ };
190
+
191
+ /**
192
+ * Create an items DOM
193
+ * @private
194
+ */
195
+ ItemPoint.prototype._create = function _create() {
196
+ var dom = this.dom;
197
+ if (!dom) {
198
+ this.dom = dom = {};
199
+
200
+ // background box
201
+ dom.point = document.createElement('div');
202
+ // className is updated in repaint()
203
+
204
+ // contents box, right from the dot
205
+ dom.content = document.createElement('div');
206
+ dom.content.className = 'content';
207
+ dom.point.appendChild(dom.content);
208
+
209
+ // dot at start
210
+ dom.dot = document.createElement('div');
211
+ dom.dot.className = 'dot';
212
+ dom.point.appendChild(dom.dot);
213
+
214
+ // attach this item as attribute
215
+ dom.point['timeline-item'] = this;
216
+ }
217
+ };
218
+
219
+ /**
220
+ * Reposition the item, recalculate its left, top, and width, using the current
221
+ * range and size of the items itemset
222
+ * @override
223
+ */
224
+ ItemPoint.prototype.reposition = function reposition() {
225
+ var dom = this.dom,
226
+ props = this.props;
227
+
228
+ if (dom) {
229
+ dom.point.style.top = this.top + 'px';
230
+ dom.point.style.left = this.left + 'px';
231
+
232
+ dom.content.style.marginLeft = props.content.marginLeft + 'px';
233
+ //dom.content.style.marginRight = props.content.marginRight + 'px'; // TODO
234
+
235
+ dom.dot.style.top = props.dot.top + 'px';
236
+ }
237
+ };