vis-rails 1.0.2 → 2.0.0

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -1
  3. data/README.md +2 -0
  4. data/lib/vis/rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/module/exports-only-timeline.js +55 -0
  6. data/vendor/assets/javascripts/vis-only-timeline.js +23 -0
  7. data/vendor/assets/javascripts/vis.js +3 -3
  8. data/vendor/assets/stylesheets/vis-only-timeline.css +3 -0
  9. data/vendor/assets/vis/DataSet.js +106 -130
  10. data/vendor/assets/vis/DataView.js +35 -37
  11. data/vendor/assets/vis/graph/Edge.js +225 -45
  12. data/vendor/assets/vis/graph/Graph.js +120 -24
  13. data/vendor/assets/vis/graph/Node.js +16 -16
  14. data/vendor/assets/vis/graph/graphMixins/HierarchicalLayoutMixin.js +1 -1
  15. data/vendor/assets/vis/graph/graphMixins/ManipulationMixin.js +143 -0
  16. data/vendor/assets/vis/graph/graphMixins/SelectionMixin.js +81 -3
  17. data/vendor/assets/vis/graph3d/Graph3d.js +3306 -0
  18. data/vendor/assets/vis/module/exports.js +2 -3
  19. data/vendor/assets/vis/timeline/Range.js +93 -80
  20. data/vendor/assets/vis/timeline/Timeline.js +525 -428
  21. data/vendor/assets/vis/timeline/component/Component.js +19 -53
  22. data/vendor/assets/vis/timeline/component/CurrentTime.js +57 -25
  23. data/vendor/assets/vis/timeline/component/CustomTime.js +55 -19
  24. data/vendor/assets/vis/timeline/component/Group.js +47 -50
  25. data/vendor/assets/vis/timeline/component/ItemSet.js +402 -206
  26. data/vendor/assets/vis/timeline/component/TimeAxis.js +112 -169
  27. data/vendor/assets/vis/timeline/component/css/animation.css +33 -0
  28. data/vendor/assets/vis/timeline/component/css/currenttime.css +1 -1
  29. data/vendor/assets/vis/timeline/component/css/customtime.css +1 -1
  30. data/vendor/assets/vis/timeline/component/css/item.css +1 -11
  31. data/vendor/assets/vis/timeline/component/css/itemset.css +13 -18
  32. data/vendor/assets/vis/timeline/component/css/labelset.css +8 -6
  33. data/vendor/assets/vis/timeline/component/css/panel.css +56 -13
  34. data/vendor/assets/vis/timeline/component/css/timeaxis.css +15 -8
  35. data/vendor/assets/vis/timeline/component/item/Item.js +16 -15
  36. data/vendor/assets/vis/timeline/component/item/ItemBox.js +30 -30
  37. data/vendor/assets/vis/timeline/component/item/ItemPoint.js +20 -21
  38. data/vendor/assets/vis/timeline/component/item/ItemRange.js +23 -24
  39. data/vendor/assets/vis/timeline/component/item/ItemRangeOverflow.js +10 -10
  40. data/vendor/assets/vis/timeline/stack.js +5 -5
  41. data/vendor/assets/vis/util.js +81 -35
  42. metadata +7 -4
  43. data/vendor/assets/vis/timeline/component/Panel.js +0 -170
  44. data/vendor/assets/vis/timeline/component/RootPanel.js +0 -176
@@ -3,11 +3,12 @@
3
3
  * @extends Item
4
4
  * @param {Object} data Object containing parameters start
5
5
  * content, className.
6
- * @param {Object} [options] Options to set initial property values
7
- * @param {Object} [defaultOptions] default options
6
+ * @param {{toScreen: function, toTime: function}} conversion
7
+ * Conversion functions from time to screen and vice versa
8
+ * @param {Object} [options] Configuration options
8
9
  * // TODO: describe available options
9
10
  */
10
- function ItemPoint (data, options, defaultOptions) {
11
+ function ItemPoint (data, conversion, options) {
11
12
  this.props = {
12
13
  dot: {
13
14
  top: 0,
@@ -27,17 +28,17 @@ function ItemPoint (data, options, defaultOptions) {
27
28
  }
28
29
  }
29
30
 
30
- Item.call(this, data, options, defaultOptions);
31
+ Item.call(this, data, conversion, options);
31
32
  }
32
33
 
33
- ItemPoint.prototype = new Item (null);
34
+ ItemPoint.prototype = new Item (null, null, null);
34
35
 
35
36
  /**
36
37
  * Check whether this item is visible inside given range
37
38
  * @returns {{start: Number, end: Number}} range with a timestamp for start and end
38
39
  * @returns {boolean} True if visible
39
40
  */
40
- ItemPoint.prototype.isVisible = function isVisible (range) {
41
+ ItemPoint.prototype.isVisible = function(range) {
41
42
  // determine visibility
42
43
  // TODO: account for the real width of the item. Right now we just add 1/4 to the window
43
44
  var interval = (range.end - range.start) / 4;
@@ -47,7 +48,7 @@ ItemPoint.prototype.isVisible = function isVisible (range) {
47
48
  /**
48
49
  * Repaint the item
49
50
  */
50
- ItemPoint.prototype.repaint = function repaint() {
51
+ ItemPoint.prototype.redraw = function() {
51
52
  var dom = this.dom;
52
53
  if (!dom) {
53
54
  // create DOM
@@ -56,7 +57,7 @@ ItemPoint.prototype.repaint = function repaint() {
56
57
 
57
58
  // background box
58
59
  dom.point = document.createElement('div');
59
- // className is updated in repaint()
60
+ // className is updated in redraw()
60
61
 
61
62
  // contents box, right from the dot
62
63
  dom.content = document.createElement('div');
@@ -73,12 +74,12 @@ ItemPoint.prototype.repaint = function repaint() {
73
74
 
74
75
  // append DOM to parent DOM
75
76
  if (!this.parent) {
76
- throw new Error('Cannot repaint item: no parent attached');
77
+ throw new Error('Cannot redraw item: no parent attached');
77
78
  }
78
79
  if (!dom.point.parentNode) {
79
- var foreground = this.parent.getForeground();
80
+ var foreground = this.parent.dom.foreground;
80
81
  if (!foreground) {
81
- throw new Error('Cannot repaint time axis: parent has no foreground container element');
82
+ throw new Error('Cannot redraw time axis: parent has no foreground container element');
82
83
  }
83
84
  foreground.appendChild(dom.point);
84
85
  }
@@ -137,16 +138,16 @@ ItemPoint.prototype.repaint = function repaint() {
137
138
  * Show the item in the DOM (when not already visible). The items DOM will
138
139
  * be created when needed.
139
140
  */
140
- ItemPoint.prototype.show = function show() {
141
+ ItemPoint.prototype.show = function() {
141
142
  if (!this.displayed) {
142
- this.repaint();
143
+ this.redraw();
143
144
  }
144
145
  };
145
146
 
146
147
  /**
147
148
  * Hide the item from the DOM (when visible)
148
149
  */
149
- ItemPoint.prototype.hide = function hide() {
150
+ ItemPoint.prototype.hide = function() {
150
151
  if (this.displayed) {
151
152
  if (this.dom.point.parentNode) {
152
153
  this.dom.point.parentNode.removeChild(this.dom.point);
@@ -163,8 +164,8 @@ ItemPoint.prototype.hide = function hide() {
163
164
  * Reposition the item horizontally
164
165
  * @Override
165
166
  */
166
- ItemPoint.prototype.repositionX = function repositionX() {
167
- var start = this.defaultOptions.toScreen(this.data.start);
167
+ ItemPoint.prototype.repositionX = function() {
168
+ var start = this.conversion.toScreen(this.data.start);
168
169
 
169
170
  this.left = start - this.props.dot.width;
170
171
 
@@ -176,16 +177,14 @@ ItemPoint.prototype.repositionX = function repositionX() {
176
177
  * Reposition the item vertically
177
178
  * @Override
178
179
  */
179
- ItemPoint.prototype.repositionY = function repositionY () {
180
- var orientation = this.options.orientation || this.defaultOptions.orientation,
180
+ ItemPoint.prototype.repositionY = function() {
181
+ var orientation = this.options.orientation,
181
182
  point = this.dom.point;
182
183
 
183
184
  if (orientation == 'top') {
184
185
  point.style.top = this.top + 'px';
185
- point.style.bottom = '';
186
186
  }
187
187
  else {
188
- point.style.top = '';
189
- point.style.bottom = this.top + 'px';
188
+ point.style.top = (this.parent.height - this.top - this.height) + 'px';
190
189
  }
191
190
  };
@@ -3,11 +3,12 @@
3
3
  * @extends Item
4
4
  * @param {Object} data Object containing parameters start, end
5
5
  * content, className.
6
- * @param {Object} [options] Options to set initial property values
7
- * @param {Object} [defaultOptions] default options
8
- * // TODO: describe available options
6
+ * @param {{toScreen: function, toTime: function}} conversion
7
+ * Conversion functions from time to screen and vice versa
8
+ * @param {Object} [options] Configuration options
9
+ * // TODO: describe options
9
10
  */
10
- function ItemRange (data, options, defaultOptions) {
11
+ function ItemRange (data, conversion, options) {
11
12
  this.props = {
12
13
  content: {
13
14
  width: 0
@@ -24,10 +25,10 @@ function ItemRange (data, options, defaultOptions) {
24
25
  }
25
26
  }
26
27
 
27
- Item.call(this, data, options, defaultOptions);
28
+ Item.call(this, data, conversion, options);
28
29
  }
29
30
 
30
- ItemRange.prototype = new Item (null);
31
+ ItemRange.prototype = new Item (null, null, null);
31
32
 
32
33
  ItemRange.prototype.baseClassName = 'item range';
33
34
 
@@ -36,7 +37,7 @@ ItemRange.prototype.baseClassName = 'item range';
36
37
  * @returns {{start: Number, end: Number}} range with a timestamp for start and end
37
38
  * @returns {boolean} True if visible
38
39
  */
39
- ItemRange.prototype.isVisible = function isVisible (range) {
40
+ ItemRange.prototype.isVisible = function(range) {
40
41
  // determine visibility
41
42
  return (this.data.start < range.end) && (this.data.end > range.start);
42
43
  };
@@ -44,7 +45,7 @@ ItemRange.prototype.isVisible = function isVisible (range) {
44
45
  /**
45
46
  * Repaint the item
46
47
  */
47
- ItemRange.prototype.repaint = function repaint() {
48
+ ItemRange.prototype.redraw = function() {
48
49
  var dom = this.dom;
49
50
  if (!dom) {
50
51
  // create DOM
@@ -53,7 +54,7 @@ ItemRange.prototype.repaint = function repaint() {
53
54
 
54
55
  // background box
55
56
  dom.box = document.createElement('div');
56
- // className is updated in repaint()
57
+ // className is updated in redraw()
57
58
 
58
59
  // contents box
59
60
  dom.content = document.createElement('div');
@@ -66,12 +67,12 @@ ItemRange.prototype.repaint = function repaint() {
66
67
 
67
68
  // append DOM to parent DOM
68
69
  if (!this.parent) {
69
- throw new Error('Cannot repaint item: no parent attached');
70
+ throw new Error('Cannot redraw item: no parent attached');
70
71
  }
71
72
  if (!dom.box.parentNode) {
72
- var foreground = this.parent.getForeground();
73
+ var foreground = this.parent.dom.foreground;
73
74
  if (!foreground) {
74
- throw new Error('Cannot repaint time axis: parent has no foreground container element');
75
+ throw new Error('Cannot redraw time axis: parent has no foreground container element');
75
76
  }
76
77
  foreground.appendChild(dom.box);
77
78
  }
@@ -121,9 +122,9 @@ ItemRange.prototype.repaint = function repaint() {
121
122
  * Show the item in the DOM (when not already visible). The items DOM will
122
123
  * be created when needed.
123
124
  */
124
- ItemRange.prototype.show = function show() {
125
+ ItemRange.prototype.show = function() {
125
126
  if (!this.displayed) {
126
- this.repaint();
127
+ this.redraw();
127
128
  }
128
129
  };
129
130
 
@@ -131,7 +132,7 @@ ItemRange.prototype.show = function show() {
131
132
  * Hide the item from the DOM (when visible)
132
133
  * @return {Boolean} changed
133
134
  */
134
- ItemRange.prototype.hide = function hide() {
135
+ ItemRange.prototype.hide = function() {
135
136
  if (this.displayed) {
136
137
  var box = this.dom.box;
137
138
 
@@ -150,12 +151,12 @@ ItemRange.prototype.hide = function hide() {
150
151
  * Reposition the item horizontally
151
152
  * @Override
152
153
  */
153
- ItemRange.prototype.repositionX = function repositionX() {
154
+ ItemRange.prototype.repositionX = function() {
154
155
  var props = this.props,
155
156
  parentWidth = this.parent.width,
156
- start = this.defaultOptions.toScreen(this.data.start),
157
- end = this.defaultOptions.toScreen(this.data.end),
158
- padding = 'padding' in this.options ? this.options.padding : this.defaultOptions.padding,
157
+ start = this.conversion.toScreen(this.data.start),
158
+ end = this.conversion.toScreen(this.data.end),
159
+ padding = this.options.padding,
159
160
  contentLeft;
160
161
 
161
162
  // limit the width of the this, as browsers cannot draw very wide divs
@@ -188,17 +189,15 @@ ItemRange.prototype.repositionX = function repositionX() {
188
189
  * Reposition the item vertically
189
190
  * @Override
190
191
  */
191
- ItemRange.prototype.repositionY = function repositionY() {
192
- var orientation = this.options.orientation || this.defaultOptions.orientation,
192
+ ItemRange.prototype.repositionY = function() {
193
+ var orientation = this.options.orientation,
193
194
  box = this.dom.box;
194
195
 
195
196
  if (orientation == 'top') {
196
197
  box.style.top = this.top + 'px';
197
- box.style.bottom = '';
198
198
  }
199
199
  else {
200
- box.style.top = '';
201
- box.style.bottom = this.top + 'px';
200
+ box.style.top = (this.parent.height - this.top - this.height) + 'px';
202
201
  }
203
202
  };
204
203
 
@@ -3,11 +3,12 @@
3
3
  * @extends ItemRange
4
4
  * @param {Object} data Object containing parameters start, end
5
5
  * content, className.
6
- * @param {Object} [options] Options to set initial property values
7
- * @param {Object} [defaultOptions] default options
8
- * // TODO: describe available options
6
+ * @param {{toScreen: function, toTime: function}} conversion
7
+ * Conversion functions from time to screen and vice versa
8
+ * @param {Object} [options] Configuration options
9
+ * // TODO: describe options
9
10
  */
10
- function ItemRangeOverflow (data, options, defaultOptions) {
11
+ function ItemRangeOverflow (data, conversion, options) {
11
12
  this.props = {
12
13
  content: {
13
14
  left: 0,
@@ -15,10 +16,10 @@ function ItemRangeOverflow (data, options, defaultOptions) {
15
16
  }
16
17
  };
17
18
 
18
- ItemRange.call(this, data, options, defaultOptions);
19
+ ItemRange.call(this, data, conversion, options);
19
20
  }
20
21
 
21
- ItemRangeOverflow.prototype = new ItemRange (null);
22
+ ItemRangeOverflow.prototype = new ItemRange (null, null, null);
22
23
 
23
24
  ItemRangeOverflow.prototype.baseClassName = 'item rangeoverflow';
24
25
 
@@ -26,11 +27,10 @@ ItemRangeOverflow.prototype.baseClassName = 'item rangeoverflow';
26
27
  * Reposition the item horizontally
27
28
  * @Override
28
29
  */
29
- ItemRangeOverflow.prototype.repositionX = function repositionX() {
30
+ ItemRangeOverflow.prototype.repositionX = function() {
30
31
  var parentWidth = this.parent.width,
31
- start = this.defaultOptions.toScreen(this.data.start),
32
- end = this.defaultOptions.toScreen(this.data.end),
33
- padding = 'padding' in this.options ? this.options.padding : this.defaultOptions.padding,
32
+ start = this.conversion.toScreen(this.data.start),
33
+ end = this.conversion.toScreen(this.data.end),
34
34
  contentLeft;
35
35
 
36
36
  // limit the width of the this, as browsers cannot draw very wide divs
@@ -7,7 +7,7 @@ var stack = {};
7
7
  * Order items by their start data
8
8
  * @param {Item[]} items
9
9
  */
10
- stack.orderByStart = function orderByStart(items) {
10
+ stack.orderByStart = function(items) {
11
11
  items.sort(function (a, b) {
12
12
  return a.data.start - b.data.start;
13
13
  });
@@ -18,7 +18,7 @@ stack.orderByStart = function orderByStart(items) {
18
18
  * is used.
19
19
  * @param {Item[]} items
20
20
  */
21
- stack.orderByEnd = function orderByEnd(items) {
21
+ stack.orderByEnd = function(items) {
22
22
  items.sort(function (a, b) {
23
23
  var aTime = ('end' in a.data) ? a.data.end : a.data.start,
24
24
  bTime = ('end' in b.data) ? b.data.end : b.data.start;
@@ -38,7 +38,7 @@ stack.orderByEnd = function orderByEnd(items) {
38
38
  * If true, all items will be repositioned. If false (default), only
39
39
  * items having a top===null will be re-stacked
40
40
  */
41
- stack.stack = function _stack (items, margin, force) {
41
+ stack.stack = function(items, margin, force) {
42
42
  var i, iMax;
43
43
 
44
44
  if (force) {
@@ -83,7 +83,7 @@ stack.stack = function _stack (items, margin, force) {
83
83
  * @param {{item: number, axis: number}} margin
84
84
  * Margins between items and between items and the axis.
85
85
  */
86
- stack.nostack = function nostack (items, margin) {
86
+ stack.nostack = function(items, margin) {
87
87
  var i, iMax;
88
88
 
89
89
  // reset top position of all items
@@ -104,7 +104,7 @@ stack.nostack = function nostack (items, margin) {
104
104
  * the requested margin.
105
105
  * @return {boolean} true if a and b collide, else false
106
106
  */
107
- stack.collision = function collision (a, b, margin) {
107
+ stack.collision = function(a, b, margin) {
108
108
  return ((a.left - margin) < (b.left + b.width) &&
109
109
  (a.left + a.width + margin) > b.left &&
110
110
  (a.top - margin) < (b.top + b.height) &&
@@ -8,7 +8,7 @@ var util = {};
8
8
  * @param {*} object
9
9
  * @return {Boolean} isNumber
10
10
  */
11
- util.isNumber = function isNumber(object) {
11
+ util.isNumber = function(object) {
12
12
  return (object instanceof Number || typeof object == 'number');
13
13
  };
14
14
 
@@ -17,7 +17,7 @@ util.isNumber = function isNumber(object) {
17
17
  * @param {*} object
18
18
  * @return {Boolean} isString
19
19
  */
20
- util.isString = function isString(object) {
20
+ util.isString = function(object) {
21
21
  return (object instanceof String || typeof object == 'string');
22
22
  };
23
23
 
@@ -26,7 +26,7 @@ util.isString = function isString(object) {
26
26
  * @param {Date | String} object
27
27
  * @return {Boolean} isDate
28
28
  */
29
- util.isDate = function isDate(object) {
29
+ util.isDate = function(object) {
30
30
  if (object instanceof Date) {
31
31
  return true;
32
32
  }
@@ -49,7 +49,7 @@ util.isDate = function isDate(object) {
49
49
  * @param {*} object
50
50
  * @return {Boolean} isDataTable
51
51
  */
52
- util.isDataTable = function isDataTable(object) {
52
+ util.isDataTable = function(object) {
53
53
  return (typeof (google) !== 'undefined') &&
54
54
  (google.visualization) &&
55
55
  (google.visualization.DataTable) &&
@@ -61,7 +61,7 @@ util.isDataTable = function isDataTable(object) {
61
61
  * source: http://stackoverflow.com/a/105074/1262753
62
62
  * @return {String} uuid
63
63
  */
64
- util.randomUUID = function randomUUID () {
64
+ util.randomUUID = function() {
65
65
  var S4 = function () {
66
66
  return Math.floor(
67
67
  Math.random() * 0x10000 /* 65536 */
@@ -88,7 +88,34 @@ util.extend = function (a, b) {
88
88
  for (var i = 1, len = arguments.length; i < len; i++) {
89
89
  var other = arguments[i];
90
90
  for (var prop in other) {
91
- if (other.hasOwnProperty(prop) && other[prop] !== undefined) {
91
+ if (other.hasOwnProperty(prop)) {
92
+ a[prop] = other[prop];
93
+ }
94
+ }
95
+ }
96
+
97
+ return a;
98
+ };
99
+
100
+ /**
101
+ * Extend object a with selected properties of object b or a series of objects
102
+ * Only properties with defined values are copied
103
+ * @param {Array.<String>} props
104
+ * @param {Object} a
105
+ * @param {... Object} b
106
+ * @return {Object} a
107
+ */
108
+ util.selectiveExtend = function (props, a, b) {
109
+ if (!Array.isArray(props)) {
110
+ throw new Error('Array with property names expected as first argument');
111
+ }
112
+
113
+ for (var i = 1, len = arguments.length; i < len; i++) {
114
+ var other = arguments[i];
115
+
116
+ for (var p = 0, pp = props.length; p < pp; p++) {
117
+ var prop = props[p];
118
+ if (other.hasOwnProperty(prop)) {
92
119
  a[prop] = other[prop];
93
120
  }
94
121
  }
@@ -103,7 +130,7 @@ util.extend = function (a, b) {
103
130
  * @param {Object} b
104
131
  * @returns {Object}
105
132
  */
106
- util.deepExtend = function deepExtend (a, b) {
133
+ util.deepExtend = function(a, b) {
107
134
  // TODO: add support for Arrays to deepExtend
108
135
  if (Array.isArray(b)) {
109
136
  throw new TypeError('Arrays are not supported by deepExtend');
@@ -116,7 +143,7 @@ util.deepExtend = function deepExtend (a, b) {
116
143
  a[prop] = {};
117
144
  }
118
145
  if (a[prop].constructor === Object) {
119
- deepExtend(a[prop], b[prop]);
146
+ util.deepExtend(a[prop], b[prop]);
120
147
  }
121
148
  else {
122
149
  a[prop] = b[prop];
@@ -157,7 +184,7 @@ util.equalArray = function (a, b) {
157
184
  * @return {*} object
158
185
  * @throws Error
159
186
  */
160
- util.convert = function convert(object, type) {
187
+ util.convert = function(object, type) {
161
188
  var match;
162
189
 
163
190
  if (object === undefined) {
@@ -292,8 +319,7 @@ util.convert = function convert(object, type) {
292
319
  }
293
320
 
294
321
  default:
295
- throw new Error('Cannot convert object of type ' + util.getType(object) +
296
- ' to type "' + type + '"');
322
+ throw new Error('Unknown type "' + type + '"');
297
323
  }
298
324
  };
299
325
 
@@ -307,7 +333,7 @@ var ASPDateRegex = /^\/?Date\((\-?\d+)/i;
307
333
  * @param {*} object
308
334
  * @return {String} type
309
335
  */
310
- util.getType = function getType(object) {
336
+ util.getType = function(object) {
311
337
  var type = typeof object;
312
338
 
313
339
  if (type == 'object') {
@@ -350,7 +376,7 @@ util.getType = function getType(object) {
350
376
  * @return {number} left The absolute left position of this element
351
377
  * in the browser page.
352
378
  */
353
- util.getAbsoluteLeft = function getAbsoluteLeft (elem) {
379
+ util.getAbsoluteLeft = function(elem) {
354
380
  var doc = document.documentElement;
355
381
  var body = document.body;
356
382
 
@@ -370,7 +396,7 @@ util.getAbsoluteLeft = function getAbsoluteLeft (elem) {
370
396
  * @return {number} top The absolute top position of this element
371
397
  * in the browser page.
372
398
  */
373
- util.getAbsoluteTop = function getAbsoluteTop (elem) {
399
+ util.getAbsoluteTop = function(elem) {
374
400
  var doc = document.documentElement;
375
401
  var body = document.body;
376
402
 
@@ -389,7 +415,7 @@ util.getAbsoluteTop = function getAbsoluteTop (elem) {
389
415
  * @param {Event} event
390
416
  * @return {Number} pageY
391
417
  */
392
- util.getPageY = function getPageY (event) {
418
+ util.getPageY = function(event) {
393
419
  if ('pageY' in event) {
394
420
  return event.pageY;
395
421
  }
@@ -415,7 +441,7 @@ util.getPageY = function getPageY (event) {
415
441
  * @param {Event} event
416
442
  * @return {Number} pageX
417
443
  */
418
- util.getPageX = function getPageX (event) {
444
+ util.getPageX = function(event) {
419
445
  if ('pageY' in event) {
420
446
  return event.pageX;
421
447
  }
@@ -441,7 +467,7 @@ util.getPageX = function getPageX (event) {
441
467
  * @param {Element} elem
442
468
  * @param {String} className
443
469
  */
444
- util.addClassName = function addClassName(elem, className) {
470
+ util.addClassName = function(elem, className) {
445
471
  var classes = elem.className.split(' ');
446
472
  if (classes.indexOf(className) == -1) {
447
473
  classes.push(className); // add the class to the array
@@ -454,7 +480,7 @@ util.addClassName = function addClassName(elem, className) {
454
480
  * @param {Element} elem
455
481
  * @param {String} className
456
482
  */
457
- util.removeClassName = function removeClassname(elem, className) {
483
+ util.removeClassName = function(elem, className) {
458
484
  var classes = elem.className.split(' ');
459
485
  var index = classes.indexOf(className);
460
486
  if (index != -1) {
@@ -472,7 +498,7 @@ util.removeClassName = function removeClassname(elem, className) {
472
498
  * the object or array with three parameters:
473
499
  * callback(value, index, object)
474
500
  */
475
- util.forEach = function forEach (object, callback) {
501
+ util.forEach = function(object, callback) {
476
502
  var i,
477
503
  len;
478
504
  if (object instanceof Array) {
@@ -497,7 +523,7 @@ util.forEach = function forEach (object, callback) {
497
523
  * @param {Object} object
498
524
  * @param {Array} array
499
525
  */
500
- util.toArray = function toArray(object) {
526
+ util.toArray = function(object) {
501
527
  var array = [];
502
528
 
503
529
  for (var prop in object) {
@@ -514,7 +540,7 @@ util.toArray = function toArray(object) {
514
540
  * @param {*} value
515
541
  * @return {Boolean} changed
516
542
  */
517
- util.updateProperty = function updateProperty (object, key, value) {
543
+ util.updateProperty = function(object, key, value) {
518
544
  if (object[key] !== value) {
519
545
  object[key] = value;
520
546
  return true;
@@ -532,7 +558,7 @@ util.updateProperty = function updateProperty (object, key, value) {
532
558
  * @param {function} listener The callback function to be executed
533
559
  * @param {boolean} [useCapture]
534
560
  */
535
- util.addEventListener = function addEventListener(element, action, listener, useCapture) {
561
+ util.addEventListener = function(element, action, listener, useCapture) {
536
562
  if (element.addEventListener) {
537
563
  if (useCapture === undefined)
538
564
  useCapture = false;
@@ -554,7 +580,7 @@ util.addEventListener = function addEventListener(element, action, listener, use
554
580
  * @param {function} listener The listener function
555
581
  * @param {boolean} [useCapture]
556
582
  */
557
- util.removeEventListener = function removeEventListener(element, action, listener, useCapture) {
583
+ util.removeEventListener = function(element, action, listener, useCapture) {
558
584
  if (element.removeEventListener) {
559
585
  // non-IE browsers
560
586
  if (useCapture === undefined)
@@ -577,7 +603,7 @@ util.removeEventListener = function removeEventListener(element, action, listene
577
603
  * @param {Event} event
578
604
  * @return {Element} target element
579
605
  */
580
- util.getTarget = function getTarget(event) {
606
+ util.getTarget = function(event) {
581
607
  // code from http://www.quirksmode.org/js/events_properties.html
582
608
  if (!event) {
583
609
  event = window.event;
@@ -605,7 +631,7 @@ util.getTarget = function getTarget(event) {
605
631
  * @param {Element} element
606
632
  * @param {Event} event
607
633
  */
608
- util.fakeGesture = function fakeGesture (element, event) {
634
+ util.fakeGesture = function(element, event) {
609
635
  var eventType = null;
610
636
 
611
637
  // for hammer.js 1.0.5
@@ -721,7 +747,7 @@ util.option.asElement = function (value, defaultValue) {
721
747
 
722
748
 
723
749
 
724
- util.GiveDec = function GiveDec(Hex) {
750
+ util.GiveDec = function(Hex) {
725
751
  var Value;
726
752
 
727
753
  if (Hex == "A")
@@ -742,7 +768,7 @@ util.GiveDec = function GiveDec(Hex) {
742
768
  return Value;
743
769
  };
744
770
 
745
- util.GiveHex = function GiveHex(Dec) {
771
+ util.GiveHex = function(Dec) {
746
772
  var Value;
747
773
 
748
774
  if(Dec == 10)
@@ -785,6 +811,10 @@ util.parseColor = function(color) {
785
811
  highlight: {
786
812
  background:lighterColorHex,
787
813
  border:darkerColorHex
814
+ },
815
+ hover: {
816
+ background:lighterColorHex,
817
+ border:darkerColorHex
788
818
  }
789
819
  };
790
820
  }
@@ -795,6 +825,10 @@ util.parseColor = function(color) {
795
825
  highlight: {
796
826
  background:color,
797
827
  border:color
828
+ },
829
+ hover: {
830
+ background:color,
831
+ border:color
798
832
  }
799
833
  };
800
834
  }
@@ -815,6 +849,18 @@ util.parseColor = function(color) {
815
849
  c.highlight.background = color.highlight && color.highlight.background || c.background;
816
850
  c.highlight.border = color.highlight && color.highlight.border || c.border;
817
851
  }
852
+
853
+ if (util.isString(color.hover)) {
854
+ c.hover = {
855
+ border: color.hover,
856
+ background: color.hover
857
+ }
858
+ }
859
+ else {
860
+ c.hover = {};
861
+ c.hover.background = color.hover && color.hover.background || c.background;
862
+ c.hover.border = color.hover && color.hover.border || c.border;
863
+ }
818
864
  }
819
865
 
820
866
  return c;
@@ -826,7 +872,7 @@ util.parseColor = function(color) {
826
872
  * @param {String} hex
827
873
  * @returns {{r: *, g: *, b: *}}
828
874
  */
829
- util.hexToRGB = function hexToRGB(hex) {
875
+ util.hexToRGB = function(hex) {
830
876
  hex = hex.replace("#","").toUpperCase();
831
877
 
832
878
  var a = util.GiveDec(hex.substring(0, 1));
@@ -843,7 +889,7 @@ util.hexToRGB = function hexToRGB(hex) {
843
889
  return {r:r,g:g,b:b};
844
890
  };
845
891
 
846
- util.RGBToHex = function RGBToHex(red,green,blue) {
892
+ util.RGBToHex = function(red,green,blue) {
847
893
  var a = util.GiveHex(Math.floor(red / 16));
848
894
  var b = util.GiveHex(red % 16);
849
895
  var c = util.GiveHex(Math.floor(green / 16));
@@ -865,7 +911,7 @@ util.RGBToHex = function RGBToHex(red,green,blue) {
865
911
  * @returns {*}
866
912
  * @constructor
867
913
  */
868
- util.RGBToHSV = function RGBToHSV (red,green,blue) {
914
+ util.RGBToHSV = function(red,green,blue) {
869
915
  red=red/255; green=green/255; blue=blue/255;
870
916
  var minRGB = Math.min(red,Math.min(green,blue));
871
917
  var maxRGB = Math.max(red,Math.max(green,blue));
@@ -893,7 +939,7 @@ util.RGBToHSV = function RGBToHSV (red,green,blue) {
893
939
  * @returns {{r: number, g: number, b: number}}
894
940
  * @constructor
895
941
  */
896
- util.HSVToRGB = function HSVToRGB(h, s, v) {
942
+ util.HSVToRGB = function(h, s, v) {
897
943
  var r, g, b;
898
944
 
899
945
  var i = Math.floor(h * 6);
@@ -914,22 +960,22 @@ util.HSVToRGB = function HSVToRGB(h, s, v) {
914
960
  return {r:Math.floor(r * 255), g:Math.floor(g * 255), b:Math.floor(b * 255) };
915
961
  };
916
962
 
917
- util.HSVToHex = function HSVToHex(h, s, v) {
963
+ util.HSVToHex = function(h, s, v) {
918
964
  var rgb = util.HSVToRGB(h, s, v);
919
965
  return util.RGBToHex(rgb.r, rgb.g, rgb.b);
920
966
  };
921
967
 
922
- util.hexToHSV = function hexToHSV(hex) {
968
+ util.hexToHSV = function(hex) {
923
969
  var rgb = util.hexToRGB(hex);
924
970
  return util.RGBToHSV(rgb.r, rgb.g, rgb.b);
925
971
  };
926
972
 
927
- util.isValidHex = function isValidHex(hex) {
973
+ util.isValidHex = function(hex) {
928
974
  var isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex);
929
975
  return isOk;
930
976
  };
931
977
 
932
- util.copyObject = function copyObject(objectFrom, objectTo) {
978
+ util.copyObject = function(objectFrom, objectTo) {
933
979
  for (var i in objectFrom) {
934
980
  if (objectFrom.hasOwnProperty(i)) {
935
981
  if (typeof objectFrom[i] == "object") {